Address 0 is also used for the SIPI vector (which is probably something worth changing as well), and now that we call setup_idt very early the SIPI vector overwrites the first few bytes of the IDT, and in particular the #DE handler. Fix this for both 32-bit and 64-bit, even though the different form of the descriptors meant that only 32-bit showed a failure. Reported-by: Thomas Huth <thuth@xxxxxxxxxx> Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> --- x86/cstart.S | 10 +++++++--- x86/cstart64.S | 11 ++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/x86/cstart.S b/x86/cstart.S index 77dc34d..e93dbca 100644 --- a/x86/cstart.S +++ b/x86/cstart.S @@ -4,8 +4,6 @@ .globl boot_idt .global online_cpus -boot_idt = 0 - ipi_vector = 0x20 max_cpus = MAX_TEST_CPUS @@ -30,6 +28,12 @@ i = 0 i = i + 1 .endr +boot_idt: + .rept 256 + .quad 0 + .endr +end_boot_idt: + .globl gdt32 gdt32: .quad 0 @@ -71,7 +75,7 @@ tss: tss_end: idt_descr: - .word 16 * 256 - 1 + .word end_boot_idt - boot_idt - 1 .long boot_idt .section .init diff --git a/x86/cstart64.S b/x86/cstart64.S index 1ecfbdb..b44d0ae 100644 --- a/x86/cstart64.S +++ b/x86/cstart64.S @@ -9,6 +9,8 @@ boot_idt = 0 .globl gdt64_desc .globl online_cpus +boot_idt = 0 + ipi_vector = 0x20 max_cpus = MAX_TEST_CPUS @@ -51,6 +53,13 @@ ptl5: .align 4096 +boot_idt: + .rept 256 + .quad 0 + .quad 0 + .endr +end_boot_idt: + gdt64_desc: .word gdt64_end - gdt64 - 1 .quad gdt64 @@ -282,7 +291,7 @@ lvl5: retq idt_descr: - .word 16 * 256 - 1 + .word end_boot_idt - boot_idt - 1 .quad boot_idt online_cpus: -- 2.26.2