 064a59b6dd
			
		
	
	
	064a59b6dd
	
	
	
		
			
			Moorestown/Medfield platform does not have port 0x61 to report NMI status, nor does it have external NMI sources. The only NMI sources are from lapic, as results of perf counter overflow or IPI, e.g. NMI watchdog or spin lock debug. Reading port 0x61 on Moorestown will return 0xff which misled NMI handlers to false critical errors such memory parity error. The subsequent ioport access for NMI handling can also cause undefined behavior on Moorestown. This patch allows kernel process NMI due to watchdog or backrace dump without unnecessary hangs. Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> [hand applied] Signed-off-by: Alan Cox <alan@linux.intel.com>
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			974 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			974 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  *  Machine specific NMI handling for generic.
 | |
|  *  Split out from traps.c by Osamu Tomita <tomita@cinet.co.jp>
 | |
|  */
 | |
| #ifndef _ASM_X86_MACH_DEFAULT_MACH_TRAPS_H
 | |
| #define _ASM_X86_MACH_DEFAULT_MACH_TRAPS_H
 | |
| 
 | |
| #include <asm/mc146818rtc.h>
 | |
| 
 | |
| #define NMI_REASON_PORT		0x61
 | |
| 
 | |
| #define NMI_REASON_SERR		0x80
 | |
| #define NMI_REASON_IOCHK	0x40
 | |
| #define NMI_REASON_MASK		(NMI_REASON_SERR | NMI_REASON_IOCHK)
 | |
| 
 | |
| #define NMI_REASON_CLEAR_SERR	0x04
 | |
| #define NMI_REASON_CLEAR_IOCHK	0x08
 | |
| #define NMI_REASON_CLEAR_MASK	0x0f
 | |
| 
 | |
| static inline unsigned char default_get_nmi_reason(void)
 | |
| {
 | |
| 	return inb(NMI_REASON_PORT);
 | |
| }
 | |
| 
 | |
| static inline void reassert_nmi(void)
 | |
| {
 | |
| 	int old_reg = -1;
 | |
| 
 | |
| 	if (do_i_have_lock_cmos())
 | |
| 		old_reg = current_lock_cmos_reg();
 | |
| 	else
 | |
| 		lock_cmos(0); /* register doesn't matter here */
 | |
| 	outb(0x8f, 0x70);
 | |
| 	inb(0x71);		/* dummy */
 | |
| 	outb(0x0f, 0x70);
 | |
| 	inb(0x71);		/* dummy */
 | |
| 	if (old_reg >= 0)
 | |
| 		outb(old_reg, 0x70);
 | |
| 	else
 | |
| 		unlock_cmos();
 | |
| }
 | |
| 
 | |
| #endif /* _ASM_X86_MACH_DEFAULT_MACH_TRAPS_H */
 |