aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/traps.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/traps.c')
-rw-r--r--arch/x86_64/kernel/traps.c41
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
50extern struct gate_struct idt_table[256];
51
52asmlinkage void divide_error(void); 50asmlinkage void divide_error(void);
53asmlinkage void debug(void); 51asmlinkage void debug(void);
54asmlinkage void nmi(void); 52asmlinkage void nmi(void);
@@ -71,18 +69,20 @@ asmlinkage void alignment_check(void);
71asmlinkage void machine_check(void); 69asmlinkage void machine_check(void);
72asmlinkage void spurious_interrupt_bug(void); 70asmlinkage void spurious_interrupt_bug(void);
73 71
74struct notifier_block *die_chain; 72ATOMIC_NOTIFIER_HEAD(die_chain);
75static DEFINE_SPINLOCK(die_notifier_lock);
76 73
77int register_die_notifier(struct notifier_block *nb) 74int 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}
79EXPORT_SYMBOL(register_die_notifier);
80
81int unregister_die_notifier(struct notifier_block *nb)
82{
83 return atomic_notifier_chain_unregister(&die_chain, nb);
84}
85EXPORT_SYMBOL(unregister_die_notifier);
86 86
87static inline void conditional_sti(struct pt_regs *regs) 87static 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
128int printk_address(unsigned long address) 128int 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])) {
344bad: 343bad:
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)
974static int __init oops_dummy(char *s) 973static 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
981static int __init kstack_setup(char *s) 980static 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