[PATCH 4/14] kexec: apic-virtwire-on-shutdown.x86_64

From: Eric W. Biederman
Date: Fri Aug 20 2004 - 13:10:16 EST



Likewise we need to place the local apic in virtual wire mode
on reboot for x86_64.

Eric

diff -uNr linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.i386/arch/x86_64/kernel/apic.c linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.x86_64/arch/x86_64/kernel/apic.c
--- linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.i386/arch/x86_64/kernel/apic.c Fri Aug 20 09:56:29 2004
+++ linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.x86_64/arch/x86_64/kernel/apic.c Fri Aug 20 10:12:49 2004
@@ -142,6 +142,36 @@
outb(0x70, 0x22);
outb(0x00, 0x23);
}
+ else {
+ /* Go back to Virtual Wire compatibility mode */
+ unsigned long value;
+
+ /* For the spurious interrupt use vector F, and enable it */
+ value = apic_read(APIC_SPIV);
+ value &= ~APIC_VECTOR_MASK;
+ value |= APIC_SPIV_APIC_ENABLED;
+ value |= 0xf;
+ apic_write_around(APIC_SPIV, value);
+
+ /* For LVT0 make it edge triggered, active high, external and enabled */
+ value = apic_read(APIC_LVT0);
+ value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
+ APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
+ APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
+ value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
+ value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXINT);
+ apic_write_around(APIC_LVT0, value);
+
+ /* For LVT1 make it edge triggered, active high, nmi and enabled */
+ value = apic_read(APIC_LVT1);
+ value &= ~(
+ APIC_MODE_MASK | APIC_SEND_PENDING |
+ APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
+ APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
+ value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
+ value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
+ apic_write_around(APIC_LVT1, value);
+ }
}

void disable_local_APIC(void)
diff -uNr linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.i386/include/asm-x86_64/apicdef.h linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.x86_64/include/asm-x86_64/apicdef.h
--- linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.i386/include/asm-x86_64/apicdef.h Mon May 17 05:40:57 2004
+++ linux-2.6.8.1-mm2-apic-virtwire-on-shutdown.x86_64/include/asm-x86_64/apicdef.h Fri Aug 20 10:12:49 2004
@@ -32,6 +32,8 @@
#define SET_APIC_LOGICAL_ID(x) (((x)<<24))
#define APIC_ALL_CPUS 0xFF
#define APIC_DFR 0xE0
+#define APIC_DFR_CLUSTER 0x0FFFFFFFul
+#define APIC_DFR_FLAT 0xFFFFFFFFul
#define APIC_SPIV 0xF0
#define APIC_SPIV_FOCUS_DISABLED (1<<9)
#define APIC_SPIV_APIC_ENABLED (1<<8)
@@ -86,6 +88,7 @@
#define APIC_LVT_REMOTE_IRR (1<<14)
#define APIC_INPUT_POLARITY (1<<13)
#define APIC_SEND_PENDING (1<<12)
+#define APIC_MODE_MASK 0x700
#define GET_APIC_DELIVERY_MODE(x) (((x)>>8)&0x7)
#define SET_APIC_DELIVERY_MODE(x,y) (((x)&~0x700)|((y)<<8))
#define APIC_MODE_FIXED 0x0
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/