:: commit a800f4b1c455bb4dda545f76851ae773fb34f539

Mintsuki <mintsuki@protonmail.com> — 2025-09-20 12:00

parents: 13ccc30b23

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
tab: 248 wrap: offon