This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / arch / x86_64 / kernel / traps.c
index 885a4e9..5db14e9 100644 (file)
 #include <asm/pgalloc.h>
 #include <asm/pda.h>
 #include <asm/proto.h>
-#include <asm/nmi.h>
 
 #include <linux/irq.h>
 
-
 extern struct gate_struct idt_table[256]; 
 
 asmlinkage void divide_error(void);
@@ -74,17 +72,6 @@ asmlinkage void spurious_interrupt_bug(void);
 asmlinkage void call_debug(void);
 
 struct notifier_block *die_chain;
-static spinlock_t die_notifier_lock = SPIN_LOCK_UNLOCKED;
-
-int register_die_notifier(struct notifier_block *nb)
-{
-       int err = 0;
-       unsigned long flags;
-       spin_lock_irqsave(&die_notifier_lock, flags);
-       err = notifier_chain_register(&die_chain, nb);
-       spin_unlock_irqrestore(&die_notifier_lock, flags);
-       return err;
-}
 
 static inline void conditional_sti(struct pt_regs *regs)
 {
@@ -349,11 +336,8 @@ void oops_end(void)
        bust_spinlocks(0); 
        spin_unlock(&die_lock); 
        local_irq_enable();     /* make sure back scroll still works */
-       if (panic_on_oops) {
-               if (netdump_func)
-                       netdump_func = NULL;
+       if (panic_on_oops)
                panic("Oops"); 
-       }
 } 
 
 void __die(const char * str, struct pt_regs * regs, long err)
@@ -383,7 +367,6 @@ void die(const char * str, struct pt_regs * regs, long err)
        oops_begin();
        handle_BUG(regs);
        __die(str, regs, err);
-       try_crashdump(regs);
        oops_end();
        do_exit(SIGSEGV); 
 }
@@ -393,22 +376,6 @@ static inline void die_if_kernel(const char * str, struct pt_regs * regs, long e
                die(str, regs, err);
 }
 
-void die_nmi(char *str, struct pt_regs *regs)
-{
-       oops_begin();
-       /*
-        * We are in trouble anyway, lets at least try
-        * to get a message out.
-        */
-       printk(str, safe_smp_processor_id());
-       show_registers(regs);
-       if (panic_on_timeout || panic_on_oops)
-               panic("nmi watchdog");
-       printk("console shuts up ...\n");
-       oops_end();
-       do_exit(SIGSEGV);
-}
-
 static inline unsigned long get_cr2(void)
 {
        unsigned long address;
@@ -491,6 +458,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
 }
 
 DO_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->rip)
+DO_ERROR( 3, SIGTRAP, "int3", int3);
 DO_ERROR( 4, SIGSEGV, "overflow", overflow)
 DO_ERROR( 5, SIGSEGV, "bounds", bounds)
 DO_ERROR_INFO( 6, SIGILL,  "invalid operand", invalid_op, ILL_ILLOPN, regs->rip)
@@ -595,13 +563,9 @@ static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
        printk("Do you have a strange power saving mode enabled?\n");
 }
 
-asmlinkage void default_do_nmi(struct pt_regs *regs)
+asmlinkage void default_do_nmi(struct pt_regs * regs)
 {
-       unsigned char reason = 0;
-
-       /* Only the BSP gets external NMIs from the system.  */
-       if (!smp_processor_id())
-               reason = get_nmi_reason();
+       unsigned char reason = inb(0x61);
 
        if (!(reason & 0xc0)) {
                if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 0, SIGINT)
@@ -622,9 +586,6 @@ asmlinkage void default_do_nmi(struct pt_regs *regs)
        }
        if (notify_die(DIE_NMI, "nmi", regs, reason, 0, SIGINT) == NOTIFY_STOP)
                return; 
-
-       /* AK: following checks seem to be broken on modern chipsets. FIXME */
-
        if (reason & 0x80)
                mem_parity_error(reason, regs);
        if (reason & 0x40)
@@ -640,15 +601,6 @@ asmlinkage void default_do_nmi(struct pt_regs *regs)
        inb(0x71);              /* dummy */
 }
 
-asmlinkage void do_int3(struct pt_regs * regs, long error_code)
-{
-       if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) {
-               return;
-       }
-       do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
-       return;
-}
-
 /* runs on IST stack. */
 asmlinkage void *do_debug(struct pt_regs * regs, unsigned long error_code)
 {
@@ -678,10 +630,6 @@ asmlinkage void *do_debug(struct pt_regs * regs, unsigned long error_code)
 
        asm("movq %%db6,%0" : "=r" (condition));
 
-       if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
-                                               SIGTRAP) == NOTIFY_STOP) {
-               return regs;
-       }
        conditional_sti(regs);
 
        /* Mask out spurious debug traps due to lazy DR7 setting */
@@ -914,8 +862,8 @@ void __init trap_init(void)
        set_intr_gate(0,&divide_error);
        set_intr_gate_ist(1,&debug,DEBUG_STACK);
        set_intr_gate_ist(2,&nmi,NMI_STACK);
-       set_intr_gate(3,&int3);
-       set_system_gate(4,&overflow);   /* int4-5 can be called from all */
+       set_system_gate(3,&int3);       /* int3-5 can be called from all */
+       set_system_gate(4,&overflow);
        set_system_gate(5,&bounds);
        set_intr_gate(6,&invalid_op);
        set_intr_gate(7,&device_not_available);
@@ -929,9 +877,7 @@ void __init trap_init(void)
        set_intr_gate(15,&spurious_interrupt_bug);
        set_intr_gate(16,&coprocessor_error);
        set_intr_gate(17,&alignment_check);
-#ifdef CONFIG_X86_MCE
        set_intr_gate_ist(18,&machine_check, MCE_STACK); 
-#endif
        set_intr_gate(19,&simd_coprocessor_error);
 
 #ifdef CONFIG_IA32_EMULATION