Commit 4b62ac9a authored by Ingo Molnar's avatar Ingo Molnar

Merge branch 'x86/nmi' into x86/devel

Conflicts:

	arch/x86/kernel/nmi.c
	arch/x86/kernel/nmi_32.c
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parents 2b4fa851 8700600a
...@@ -52,7 +52,7 @@ obj-$(CONFIG_X86_32_SMP) += smpcommon.o ...@@ -52,7 +52,7 @@ obj-$(CONFIG_X86_32_SMP) += smpcommon.o
obj-$(CONFIG_X86_64_SMP) += tsc_sync.o smpcommon.o obj-$(CONFIG_X86_64_SMP) += tsc_sync.o smpcommon.o
obj-$(CONFIG_X86_TRAMPOLINE) += trampoline_$(BITS).o obj-$(CONFIG_X86_TRAMPOLINE) += trampoline_$(BITS).o
obj-$(CONFIG_X86_MPPARSE) += mpparse.o obj-$(CONFIG_X86_MPPARSE) += mpparse.o
obj-$(CONFIG_X86_LOCAL_APIC) += apic_$(BITS).o nmi_$(BITS).o obj-$(CONFIG_X86_LOCAL_APIC) += apic_$(BITS).o nmi.o
obj-$(CONFIG_X86_IO_APIC) += io_apic_$(BITS).o obj-$(CONFIG_X86_IO_APIC) += io_apic_$(BITS).o
obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o
obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o
......
...@@ -181,6 +181,8 @@ void disable_lapic_nmi_watchdog(void) ...@@ -181,6 +181,8 @@ void disable_lapic_nmi_watchdog(void)
return; return;
on_each_cpu(stop_apic_nmi_watchdog, NULL, 0, 1); on_each_cpu(stop_apic_nmi_watchdog, NULL, 0, 1);
if (wd_ops)
wd_ops->unreserve(); wd_ops->unreserve();
BUG_ON(atomic_read(&nmi_active) != 0); BUG_ON(atomic_read(&nmi_active) != 0);
......
This diff is collapsed.
...@@ -756,9 +756,9 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs) ...@@ -756,9 +756,9 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
static DEFINE_SPINLOCK(nmi_print_lock); static DEFINE_SPINLOCK(nmi_print_lock);
void notrace __kprobes die_nmi(struct pt_regs *regs, const char *msg) void notrace __kprobes die_nmi(char *str, struct pt_regs *regs, int do_panic)
{ {
if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 2, SIGINT) == NOTIFY_STOP) if (notify_die(DIE_NMIWATCHDOG, str, regs, 0, 2, SIGINT) == NOTIFY_STOP)
return; return;
spin_lock(&nmi_print_lock); spin_lock(&nmi_print_lock);
...@@ -767,10 +767,12 @@ void notrace __kprobes die_nmi(struct pt_regs *regs, const char *msg) ...@@ -767,10 +767,12 @@ void notrace __kprobes die_nmi(struct pt_regs *regs, const char *msg)
* to get a message out: * to get a message out:
*/ */
bust_spinlocks(1); bust_spinlocks(1);
printk(KERN_EMERG "%s", msg); printk(KERN_EMERG "%s", str);
printk(" on CPU%d, ip %08lx, registers:\n", printk(" on CPU%d, ip %08lx, registers:\n",
smp_processor_id(), regs->ip); smp_processor_id(), regs->ip);
show_registers(regs); show_registers(regs);
if (do_panic)
panic("Non maskable interrupt");
console_silent(); console_silent();
spin_unlock(&nmi_print_lock); spin_unlock(&nmi_print_lock);
bust_spinlocks(0); bust_spinlocks(0);
......
...@@ -75,7 +75,9 @@ asmlinkage void alignment_check(void); ...@@ -75,7 +75,9 @@ asmlinkage void alignment_check(void);
asmlinkage void machine_check(void); asmlinkage void machine_check(void);
asmlinkage void spurious_interrupt_bug(void); asmlinkage void spurious_interrupt_bug(void);
int panic_on_unrecovered_nmi;
static unsigned int code_bytes = 64; static unsigned int code_bytes = 64;
static unsigned ignore_nmis;
static inline void conditional_sti(struct pt_regs *regs) static inline void conditional_sti(struct pt_regs *regs)
{ {
...@@ -613,7 +615,9 @@ die_nmi(char *str, struct pt_regs *regs, int do_panic) ...@@ -613,7 +615,9 @@ die_nmi(char *str, struct pt_regs *regs, int do_panic)
* We are in trouble anyway, lets at least try * We are in trouble anyway, lets at least try
* to get a message out. * to get a message out.
*/ */
printk(str, smp_processor_id()); printk(KERN_EMERG "%s", str);
printk(" on CPU%d, ip %08lx, registers:\n",
smp_processor_id(), regs->ip);
show_registers(regs); show_registers(regs);
if (kexec_should_crash(current)) if (kexec_should_crash(current))
crash_kexec(regs); crash_kexec(regs);
...@@ -862,6 +866,28 @@ asmlinkage notrace __kprobes void default_do_nmi(struct pt_regs *regs) ...@@ -862,6 +866,28 @@ asmlinkage notrace __kprobes void default_do_nmi(struct pt_regs *regs)
io_check_error(reason, regs); io_check_error(reason, regs);
} }
asmlinkage notrace __kprobes void
do_nmi(struct pt_regs *regs, long error_code)
{
nmi_enter();
add_pda(__nmi_count, 1);
if (!ignore_nmis)
default_do_nmi(regs);
nmi_exit();
}
void stop_nmi(void)
{
acpi_nmi_disable();
ignore_nmis++;
}
void restart_nmi(void)
{
ignore_nmis--;
acpi_nmi_enable();
}
/* runs on IST stack. */ /* runs on IST stack. */
asmlinkage void __kprobes do_int3(struct pt_regs * regs, long error_code) asmlinkage void __kprobes do_int3(struct pt_regs * regs, long error_code)
{ {
......
...@@ -17,12 +17,10 @@ int do_nmi_callback(struct pt_regs *regs, int cpu); ...@@ -17,12 +17,10 @@ int do_nmi_callback(struct pt_regs *regs, int cpu);
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
extern void default_do_nmi(struct pt_regs *); extern void default_do_nmi(struct pt_regs *);
extern void die_nmi(char *str, struct pt_regs *regs, int do_panic);
extern void nmi_watchdog_default(void);
#else
#define nmi_watchdog_default() do {} while (0)
#endif #endif
extern void die_nmi(char *str, struct pt_regs *regs, int do_panic);
extern void nmi_watchdog_default(void);
extern int check_nmi_watchdog(void); extern int check_nmi_watchdog(void);
extern int nmi_watchdog_enabled; extern int nmi_watchdog_enabled;
extern int avail_to_resrv_perfctr_nmi_bit(unsigned int); extern int avail_to_resrv_perfctr_nmi_bit(unsigned int);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment