#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);
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)
{
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)
oops_begin();
handle_BUG(regs);
__die(str, regs, err);
- try_crashdump(regs);
oops_end();
do_exit(SIGSEGV);
}
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;
}
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)
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)
}
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)
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)
{
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 */
set_intr_gate(0,÷_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);
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