diff -up linux-2.6.18.x86_64/arch/i386/kernel/nmi.c.orignmi linux-2.6.18.x86_64/arch/i386/kernel/nmi.c
--- linux-2.6.18.x86_64/arch/i386/kernel/nmi.c.orignmi	2011-05-31 16:36:17.000000000 +0800
+++ linux-2.6.18.x86_64/arch/i386/kernel/nmi.c	2011-05-31 16:37:01.000000000 +0800
@@ -152,7 +152,8 @@ static int __init check_nmi_watchdog(voi
 			if (nmi_watchdog == NMI_LOCAL_APIC)
 				lapic_watchdog_stop();
 			else
-				apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
+				if(!skip_ioapic_setup)
+					apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
 			kfree(prev_nmi_count);
 			return -1;
 		} else {
diff -up linux-2.6.18.x86_64/arch/x86_64/kernel/nmi.c.orignmi linux-2.6.18.x86_64/arch/x86_64/kernel/nmi.c
--- linux-2.6.18.x86_64/arch/x86_64/kernel/nmi.c.orignmi	2011-05-31 16:36:07.000000000 +0800
+++ linux-2.6.18.x86_64/arch/x86_64/kernel/nmi.c	2011-05-31 16:38:57.000000000 +0800
@@ -158,7 +158,8 @@ int __init check_nmi_watchdog (void)
 			if (nmi_watchdog == NMI_LOCAL_APIC)
 				lapic_watchdog_stop();
 			else
-				apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
+				if(!skip_ioapic_setup)
+					apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
 			kfree(counts);
 			return -1;
 		} else {
