On 6/25/19 5:10 AM, Nadav Amit wrote:
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.
Is there any issue if apic_ops is reset ?
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
Why not use MSR_IA32_APICBASE instead of 0x1b ?
+ 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