Do not assume that the local APIC is in a xAPIC mode after reset. Instead reset it first, since it might be in x2APIC mode, from which a transition in xAPIC is invalid. Note that we do not use the existing disable_apic() for the matter, since it also re-initializes apic_ops. Signed-off-by: Nadav Amit <nadav.amit@xxxxxxxxx> --- x86/cstart64.S | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/x86/cstart64.S b/x86/cstart64.S index 9791282..03726a6 100644 --- a/x86/cstart64.S +++ b/x86/cstart64.S @@ -118,6 +118,15 @@ MSR_GS_BASE = 0xc0000101 wrmsr .endm +lapic_reset: + mov $0x1b, %ecx + rdmsr + and $~(APIC_EN | APIC_EXTD), %eax + wrmsr + or $(APIC_EN), %eax + wrmsr + ret + .macro setup_segments mov $MSR_GS_BASE, %ecx rdmsr @@ -228,6 +237,7 @@ save_id: retq ap_start64: + call lapic_reset call load_tss call enable_apic call save_id @@ -240,6 +250,7 @@ ap_start64: jmp 1b start64: + call lapic_reset call load_tss call mask_pic_interrupts call enable_apic -- 2.17.1