diff options
Diffstat (limited to 'arch/i386/kernel/traps.c')
-rw-r--r-- | arch/i386/kernel/traps.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 2bf8b55b91f8..313ac1f7dc5a 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
@@ -100,13 +100,13 @@ int register_die_notifier(struct notifier_block *nb) | |||
100 | vmalloc_sync_all(); | 100 | vmalloc_sync_all(); |
101 | return atomic_notifier_chain_register(&i386die_chain, nb); | 101 | return atomic_notifier_chain_register(&i386die_chain, nb); |
102 | } | 102 | } |
103 | EXPORT_SYMBOL(register_die_notifier); | 103 | EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */ |
104 | 104 | ||
105 | int unregister_die_notifier(struct notifier_block *nb) | 105 | int unregister_die_notifier(struct notifier_block *nb) |
106 | { | 106 | { |
107 | return atomic_notifier_chain_unregister(&i386die_chain, nb); | 107 | return atomic_notifier_chain_unregister(&i386die_chain, nb); |
108 | } | 108 | } |
109 | EXPORT_SYMBOL(unregister_die_notifier); | 109 | EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */ |
110 | 110 | ||
111 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) | 111 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) |
112 | { | 112 | { |
@@ -324,35 +324,35 @@ void show_registers(struct pt_regs *regs) | |||
324 | 324 | ||
325 | static void handle_BUG(struct pt_regs *regs) | 325 | static void handle_BUG(struct pt_regs *regs) |
326 | { | 326 | { |
327 | unsigned long eip = regs->eip; | ||
327 | unsigned short ud2; | 328 | unsigned short ud2; |
328 | unsigned short line; | ||
329 | char *file; | ||
330 | char c; | ||
331 | unsigned long eip; | ||
332 | |||
333 | eip = regs->eip; | ||
334 | 329 | ||
335 | if (eip < PAGE_OFFSET) | 330 | if (eip < PAGE_OFFSET) |
336 | goto no_bug; | 331 | return; |
337 | if (__get_user(ud2, (unsigned short __user *)eip)) | 332 | if (__get_user(ud2, (unsigned short __user *)eip)) |
338 | goto no_bug; | 333 | return; |
339 | if (ud2 != 0x0b0f) | 334 | if (ud2 != 0x0b0f) |
340 | goto no_bug; | 335 | return; |
341 | if (__get_user(line, (unsigned short __user *)(eip + 2))) | ||
342 | goto bug; | ||
343 | if (__get_user(file, (char * __user *)(eip + 4)) || | ||
344 | (unsigned long)file < PAGE_OFFSET || __get_user(c, file)) | ||
345 | file = "<bad filename>"; | ||
346 | 336 | ||
347 | printk(KERN_EMERG "------------[ cut here ]------------\n"); | 337 | printk(KERN_EMERG "------------[ cut here ]------------\n"); |
348 | printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line); | ||
349 | 338 | ||
350 | no_bug: | 339 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
351 | return; | 340 | do { |
341 | unsigned short line; | ||
342 | char *file; | ||
343 | char c; | ||
352 | 344 | ||
353 | /* Here we know it was a BUG but file-n-line is unavailable */ | 345 | if (__get_user(line, (unsigned short __user *)(eip + 2))) |
354 | bug: | 346 | break; |
355 | printk(KERN_EMERG "Kernel BUG\n"); | 347 | if (__get_user(file, (char * __user *)(eip + 4)) || |
348 | (unsigned long)file < PAGE_OFFSET || __get_user(c, file)) | ||
349 | file = "<bad filename>"; | ||
350 | |||
351 | printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line); | ||
352 | return; | ||
353 | } while (0); | ||
354 | #endif | ||
355 | printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n"); | ||
356 | } | 356 | } |
357 | 357 | ||
358 | /* This is gone through when something in the kernel | 358 | /* This is gone through when something in the kernel |