From: Eric W. Biederman Likewise we need to place the local apic in virtual wire mode on reboot for x86_64. Signed-off-by: Andrew Morton --- 25-akpm/arch/x86_64/kernel/apic.c | 30 ++++++++++++++++++++++++++++++ 25-akpm/include/asm-x86_64/apicdef.h | 3 +++ 2 files changed, 33 insertions(+) diff -puN arch/x86_64/kernel/apic.c~kexec-apic-virtwire-on-shutdownx86_64 arch/x86_64/kernel/apic.c --- 25/arch/x86_64/kernel/apic.c~kexec-apic-virtwire-on-shutdownx86_64 2004-10-16 01:30:50.549815904 -0700 +++ 25-akpm/arch/x86_64/kernel/apic.c 2004-10-16 01:30:50.554815144 -0700 @@ -145,6 +145,36 @@ void disconnect_bsp_APIC(void) 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 -puN include/asm-x86_64/apicdef.h~kexec-apic-virtwire-on-shutdownx86_64 include/asm-x86_64/apicdef.h --- 25/include/asm-x86_64/apicdef.h~kexec-apic-virtwire-on-shutdownx86_64 2004-10-16 01:30:50.550815752 -0700 +++ 25-akpm/include/asm-x86_64/apicdef.h 2004-10-16 01:30:50.555814992 -0700 @@ -32,6 +32,8 @@ #define SET_APIC_LOGICAL_ID(x) (((x)<<24)) #define APIC_ALL_CPUS 0xFFu #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) @@ -87,6 +89,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 _