diff options
Diffstat (limited to 'drivers/watchdog/hpwdt.c')
-rw-r--r-- | drivers/watchdog/hpwdt.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c index 6a63535fc04d..2686f3eaeedf 100644 --- a/drivers/watchdog/hpwdt.c +++ b/drivers/watchdog/hpwdt.c | |||
@@ -145,8 +145,8 @@ MODULE_DEVICE_TABLE(pci, hpwdt_devices); | |||
145 | 145 | ||
146 | #define HPWDT_ARCH 32 | 146 | #define HPWDT_ARCH 32 |
147 | 147 | ||
148 | static void asminline_call(struct cmn_registers *pi86Regs, | 148 | asmlinkage void asminline_call(struct cmn_registers *pi86Regs, |
149 | unsigned long *pRomEntry) | 149 | unsigned long *pRomEntry) |
150 | { | 150 | { |
151 | asm("pushl %ebp \n\t" | 151 | asm("pushl %ebp \n\t" |
152 | "movl %esp, %ebp \n\t" | 152 | "movl %esp, %ebp \n\t" |
@@ -333,8 +333,8 @@ static int __devinit detect_cru_service(void) | |||
333 | 333 | ||
334 | #define HPWDT_ARCH 64 | 334 | #define HPWDT_ARCH 64 |
335 | 335 | ||
336 | static void asminline_call(struct cmn_registers *pi86Regs, | 336 | asmlinkage void asminline_call(struct cmn_registers *pi86Regs, |
337 | unsigned long *pRomEntry) | 337 | unsigned long *pRomEntry) |
338 | { | 338 | { |
339 | asm("pushq %rbp \n\t" | 339 | asm("pushq %rbp \n\t" |
340 | "movq %rsp, %rbp \n\t" | 340 | "movq %rsp, %rbp \n\t" |
@@ -418,20 +418,23 @@ static int hpwdt_pretimeout(struct notifier_block *nb, unsigned long ulReason, | |||
418 | static unsigned long rom_pl; | 418 | static unsigned long rom_pl; |
419 | static int die_nmi_called; | 419 | static int die_nmi_called; |
420 | 420 | ||
421 | if (ulReason == DIE_NMI || ulReason == DIE_NMI_IPI) { | 421 | if (ulReason != DIE_NMI && ulReason != DIE_NMI_IPI) |
422 | spin_lock_irqsave(&rom_lock, rom_pl); | 422 | return NOTIFY_OK; |
423 | if (!die_nmi_called) | 423 | |
424 | asminline_call(&cmn_regs, cru_rom_addr); | 424 | spin_lock_irqsave(&rom_lock, rom_pl); |
425 | die_nmi_called = 1; | 425 | if (!die_nmi_called) |
426 | spin_unlock_irqrestore(&rom_lock, rom_pl); | 426 | asminline_call(&cmn_regs, cru_rom_addr); |
427 | if (cmn_regs.u1.ral != 0) { | 427 | die_nmi_called = 1; |
428 | panic("An NMI occurred, please see the Integrated " | 428 | spin_unlock_irqrestore(&rom_lock, rom_pl); |
429 | "Management Log for details.\n"); | 429 | if (cmn_regs.u1.ral == 0) { |
430 | } | 430 | printk(KERN_WARNING "hpwdt: An NMI occurred, " |
431 | "but unable to determine source.\n"); | ||
432 | } else { | ||
433 | panic("An NMI occurred, please see the Integrated " | ||
434 | "Management Log for details.\n"); | ||
431 | } | 435 | } |
432 | 436 | ||
433 | die_nmi_called = 0; | 437 | return NOTIFY_STOP; |
434 | return NOTIFY_DONE; | ||
435 | } | 438 | } |
436 | 439 | ||
437 | /* | 440 | /* |