protos/linux_x86: For the 64-bit protocol, call flush_irqs() after disabling interrupts
And with an invalid IDT.
diff --git a/common/protos/linux_64.asm_uefi_x86_64 b/common/protos/linux_64.asm_uefi_x86_64
index bca9b46b..00ca10bb 100644
--- a/common/protos/linux_64.asm_uefi_x86_64
+++ b/common/protos/linux_64.asm_uefi_x86_64
@@ -1,3 +1,8 @@
+section .rodata
+
+invalid_idt:
+ dq 0, 0
+
section .data
align 16
@@ -31,12 +36,15 @@ section .text
bits 64
+extern flush_irqs
+
global linux_spinup64
linux_spinup64:
cli
cld
lgdt [rel linux_gdt64_ptr]
+ lidt [rel invalid_idt]
lea rbx, [rel .fj]
push 0x10
@@ -51,6 +59,20 @@ linux_spinup64:
mov gs, eax
mov ss, eax
+ push r8
+ push r9
+ push rcx
+ push rdx
+ push rsi
+ push rdi
+ call flush_irqs
+ pop rdi
+ pop rsi
+ pop rdx
+ pop rcx
+ pop r9
+ pop r8
+
mov rax, rdi
xor ebp, ebp
diff --git a/common/protos/linux_x86.c b/common/protos/linux_x86.c
index b9680e02..ec33c89f 100644
--- a/common/protos/linux_x86.c
+++ b/common/protos/linux_x86.c
@@ -609,7 +609,6 @@ no_fb:;
#if defined (UEFI) && defined (__x86_64__)
if ((setup_header->xloadflags & 3) == 3) {
- flush_irqs();
linux_spinup64((void *)kernel_load_addr + 0x200, boot_params);
}
#endif
