]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseLib/X64/Thunk16.asm
Save segment registers on stack in case the thunk code assembly calls CF9 soft reset...
[mirror_edk2.git] / MdePkg / Library / BaseLib / X64 / Thunk16.asm
index d93af4459766d49cf04cc06fb1c9364216e5f5e2..cef63d98e1f41612574c124620e5ed545090a155 100644 (file)
@@ -140,7 +140,10 @@ SavedCr0    DD      ?
 @64Eip      DD      ?\r
 SavedCs     DW      ?\r
 @64BitCode:\r
-    mov     rsp, r8                     ; restore stack\r
+    db      090h \r
+    db      067h, 0bch                 ; mov esp, imm32\r
+SavedSp     DD   ?                     ; restore stack\r
+    nop\r
     ret\r
 _BackFromUserCode   ENDP\r
 \r
@@ -230,9 +233,13 @@ GDT_SIZE = $ - _NullSeg
 ;   );\r
 ;------------------------------------------------------------------------------\r
 InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi\r
-    mov     r10d, ds                    ; r9 ~ r11 are not accessible in 16-bit\r
-    mov     r11d, es                    ; so use them for saving seg registers\r
-    mov     r9d, ss\r
+    mov     rbx, ds\r
+    push    rbx          ; Save ds segment register on the stack\r
+    mov     rbx, es\r
+    push    rbx          ; Save es segment register on the stack\r
+    mov     rbx, ss\r
+    push    rbx          ; Save ss segment register on the stack\r
+    \r
     push    fs\r
     push    gs\r
     mov     rsi, rcx\r
@@ -252,7 +259,7 @@ InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi
     lea     ax, [rdx + (_BackFromUserCode - m16Start)]  ; offset address\r
     stosd                               ; [edi] <- return address of user code\r
     sgdt    fword ptr [rcx + (SavedGdt - SavedCr4)]\r
-    sidt    fword ptr [rsp + 38h]       ; save IDT stack in argument space\r
+    sidt    fword ptr [rsp + 50h]       ; save IDT stack in argument space\r
     mov     rax, cr0\r
     mov     [rcx + (SavedCr0 - SavedCr4)], eax\r
     and     eax, 7ffffffeh              ; clear PE, PG bits\r
@@ -270,17 +277,20 @@ InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi
     push    r8\r
     mov     r8d, cs\r
     mov     [rcx + (SavedCs - SavedCr4)], r8w\r
-    mov     r8, rsp\r
+    mov     [rcx + (SavedSp - SavedCr4)], esp\r
     jmp     fword ptr [rcx + (_EntryPoint - SavedCr4)]\r
 @RetFromRealMode:\r
     popfq\r
-    lidt    fword ptr [rsp + 38h]       ; restore protected mode IDTR\r
+    lidt    fword ptr [rsp + 50h]       ; restore protected mode IDTR\r
     lea     eax, [rbp - sizeof (IA32_REGS)]\r
     pop     gs\r
     pop     fs\r
-    mov     ss, r9d\r
-    mov     es, r11d\r
-    mov     ds, r10d\r
+    pop     rbx\r
+    mov     ss, rbx\r
+    pop     rbx\r
+    mov     es, rbx\r
+    pop     rbx\r
+    mov     ds, rbx\r
     ret\r
 InternalAsmThunk16  ENDP\r
 \r