diff options
Diffstat (limited to 'arch/x86_64/kernel/traps.c')
-rw-r--r-- | arch/x86_64/kernel/traps.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index 28d50dc540e8..6bda322d3caf 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c | |||
@@ -47,8 +47,6 @@ | |||
47 | #include <asm/proto.h> | 47 | #include <asm/proto.h> |
48 | #include <asm/nmi.h> | 48 | #include <asm/nmi.h> |
49 | 49 | ||
50 | extern struct gate_struct idt_table[256]; | ||
51 | |||
52 | asmlinkage void divide_error(void); | 50 | asmlinkage void divide_error(void); |
53 | asmlinkage void debug(void); | 51 | asmlinkage void debug(void); |
54 | asmlinkage void nmi(void); | 52 | asmlinkage void nmi(void); |
@@ -71,18 +69,20 @@ asmlinkage void alignment_check(void); | |||
71 | asmlinkage void machine_check(void); | 69 | asmlinkage void machine_check(void); |
72 | asmlinkage void spurious_interrupt_bug(void); | 70 | asmlinkage void spurious_interrupt_bug(void); |
73 | 71 | ||
74 | struct notifier_block *die_chain; | 72 | ATOMIC_NOTIFIER_HEAD(die_chain); |
75 | static DEFINE_SPINLOCK(die_notifier_lock); | ||
76 | 73 | ||
77 | int register_die_notifier(struct notifier_block *nb) | 74 | int register_die_notifier(struct notifier_block *nb) |
78 | { | 75 | { |
79 | int err = 0; | 76 | vmalloc_sync_all(); |
80 | unsigned long flags; | 77 | return atomic_notifier_chain_register(&die_chain, nb); |
81 | spin_lock_irqsave(&die_notifier_lock, flags); | ||
82 | err = notifier_chain_register(&die_chain, nb); | ||
83 | spin_unlock_irqrestore(&die_notifier_lock, flags); | ||
84 | return err; | ||
85 | } | 78 | } |
79 | EXPORT_SYMBOL(register_die_notifier); | ||
80 | |||
81 | int unregister_die_notifier(struct notifier_block *nb) | ||
82 | { | ||
83 | return atomic_notifier_chain_unregister(&die_chain, nb); | ||
84 | } | ||
85 | EXPORT_SYMBOL(unregister_die_notifier); | ||
86 | 86 | ||
87 | static inline void conditional_sti(struct pt_regs *regs) | 87 | static inline void conditional_sti(struct pt_regs *regs) |
88 | { | 88 | { |
@@ -122,7 +122,7 @@ int printk_address(unsigned long address) | |||
122 | if (!modname) | 122 | if (!modname) |
123 | modname = delim = ""; | 123 | modname = delim = ""; |
124 | return printk("<%016lx>{%s%s%s%s%+ld}", | 124 | return printk("<%016lx>{%s%s%s%s%+ld}", |
125 | address,delim,modname,delim,symname,offset); | 125 | address, delim, modname, delim, symname, offset); |
126 | } | 126 | } |
127 | #else | 127 | #else |
128 | int printk_address(unsigned long address) | 128 | int printk_address(unsigned long address) |
@@ -334,13 +334,12 @@ void show_registers(struct pt_regs *regs) | |||
334 | show_stack(NULL, (unsigned long*)rsp); | 334 | show_stack(NULL, (unsigned long*)rsp); |
335 | 335 | ||
336 | printk("\nCode: "); | 336 | printk("\nCode: "); |
337 | if(regs->rip < PAGE_OFFSET) | 337 | if (regs->rip < PAGE_OFFSET) |
338 | goto bad; | 338 | goto bad; |
339 | 339 | ||
340 | for(i=0;i<20;i++) | 340 | for (i=0; i<20; i++) { |
341 | { | ||
342 | unsigned char c; | 341 | unsigned char c; |
343 | if(__get_user(c, &((unsigned char*)regs->rip)[i])) { | 342 | if (__get_user(c, &((unsigned char*)regs->rip)[i])) { |
344 | bad: | 343 | bad: |
345 | printk(" Bad RIP value."); | 344 | printk(" Bad RIP value."); |
346 | break; | 345 | break; |
@@ -479,7 +478,7 @@ static void __kprobes do_trap(int trapnr, int signr, char *str, | |||
479 | printk(KERN_INFO | 478 | printk(KERN_INFO |
480 | "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n", | 479 | "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n", |
481 | tsk->comm, tsk->pid, str, | 480 | tsk->comm, tsk->pid, str, |
482 | regs->rip,regs->rsp,error_code); | 481 | regs->rip, regs->rsp, error_code); |
483 | 482 | ||
484 | if (info) | 483 | if (info) |
485 | force_sig_info(signr, info, tsk); | 484 | force_sig_info(signr, info, tsk); |
@@ -493,9 +492,9 @@ static void __kprobes do_trap(int trapnr, int signr, char *str, | |||
493 | { | 492 | { |
494 | const struct exception_table_entry *fixup; | 493 | const struct exception_table_entry *fixup; |
495 | fixup = search_exception_tables(regs->rip); | 494 | fixup = search_exception_tables(regs->rip); |
496 | if (fixup) { | 495 | if (fixup) |
497 | regs->rip = fixup->fixup; | 496 | regs->rip = fixup->fixup; |
498 | } else | 497 | else |
499 | die(str, regs, error_code); | 498 | die(str, regs, error_code); |
500 | return; | 499 | return; |
501 | } | 500 | } |
@@ -568,7 +567,7 @@ asmlinkage void __kprobes do_general_protection(struct pt_regs * regs, | |||
568 | printk(KERN_INFO | 567 | printk(KERN_INFO |
569 | "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n", | 568 | "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n", |
570 | tsk->comm, tsk->pid, | 569 | tsk->comm, tsk->pid, |
571 | regs->rip,regs->rsp,error_code); | 570 | regs->rip, regs->rsp, error_code); |
572 | 571 | ||
573 | force_sig(SIGSEGV, tsk); | 572 | force_sig(SIGSEGV, tsk); |
574 | return; | 573 | return; |
@@ -974,14 +973,14 @@ void __init trap_init(void) | |||
974 | static int __init oops_dummy(char *s) | 973 | static int __init oops_dummy(char *s) |
975 | { | 974 | { |
976 | panic_on_oops = 1; | 975 | panic_on_oops = 1; |
977 | return -1; | 976 | return 1; |
978 | } | 977 | } |
979 | __setup("oops=", oops_dummy); | 978 | __setup("oops=", oops_dummy); |
980 | 979 | ||
981 | static int __init kstack_setup(char *s) | 980 | static int __init kstack_setup(char *s) |
982 | { | 981 | { |
983 | kstack_depth_to_print = simple_strtoul(s,NULL,0); | 982 | kstack_depth_to_print = simple_strtoul(s,NULL,0); |
984 | return 0; | 983 | return 1; |
985 | } | 984 | } |
986 | __setup("kstack=", kstack_setup); | 985 | __setup("kstack=", kstack_setup); |
987 | 986 | ||