:: commit 77616a02188e5713d911b136c2e447dd52075c27

mintsuki <mintsuki@protonmail.com> — 2022-07-10 16:58

parents: b800cbb2da

bios: Get rid of self-modifying interrupt call code

diff --git a/common/lib/real.asm_bios_ia32 b/common/lib/real.asm_bios_ia32
index 4c43af98..5f2b5b2f 100644
--- a/common/lib/real.asm_bios_ia32
+++ b/common/lib/real.asm_bios_ia32
@@ -39,8 +39,9 @@ rm_hcf:
 global rm_int
 rm_int:
     ; Self-modifying code: int $int_no
-    mov al, byte [esp+4]
-    mov byte [.int_no], al
+    mov eax, dword [esp+4]
+    mov eax, dword [0 + eax*4]
+    mov dword [.int_offset], eax
 
     ; Save out_regs
     mov eax, dword [esp+8]
@@ -100,14 +101,9 @@ rm_int:
     pop eax
     mov esp, dword [ss:.esp]
 
-    sti
-
     ; Indirect interrupt call
-    db 0xcd
-  .int_no:
-    db 0
-
-    cli
+    pushf
+    call far [ss:.int_offset]
 
     ; Load out_regs
     mov dword [ss:.esp], esp
@@ -164,3 +160,5 @@ align 16
   .idt:      dq 0
   .rm_idt:   dw 0x3ff
              dd 0
+             dw 0
+  .int_offset: dd 0
tab: 248 wrap: offon