]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseLib/X64/Thunk16.asm
Enabled 4G+ memory in thunk.
[mirror_edk2.git] / MdePkg / Library / BaseLib / X64 / Thunk16.asm
index 631b0fd1e13fca0089401ccb272de4859fc3c347..b77ba680429ce4db049a53d53954fc3620796720 100644 (file)
@@ -100,6 +100,11 @@ _ThunkAttr  DD      ?
     mov     ebx, (IA32_REGS ptr [rsi - sizeof (IA32_REGS)])._EIP\r
     shl     ax, 4                       ; shl eax, 4\r
     add     bp, ax                      ; add ebp, eax\r
+    mov     ax, cs\r
+    shl     ax, 4\r
+    lea     ax, [eax + ebx + (@64BitCode - @Base)]\r
+    DB      2eh                         ; cs:\r
+    mov     [rdi + (@64Eip - @Base)], ax\r
     DB      66h, 0b8h                   ; mov eax, imm32\r
 SavedCr4    DD      ?\r
     mov     cr4, rax\r
@@ -113,13 +118,13 @@ SavedCr4    DD      ?
     DB      66h, 0b8h                   ; mov eax, imm32\r
 SavedCr0    DD      ?\r
     mov     cr0, rax\r
-    DB      0b8h                        ; mov ax, imm16\r
-SavedSs     DW      ?\r
-    mov     ss, eax\r
-    DB      66h, 0bch                   ; mov esp, imm32\r
-SavedEsp    DD      ?\r
-    DB      66h\r
-    retf                                ; return to protected mode\r
+    DB      66h, 0eah                   ; jmp far cs:@64Bit\r
+@64Eip      DD      ?\r
+SavedCs     DW      ?\r
+@64BitCode:\r
+    DB      48h, 0b8h                   ; mov rax, imm64\r
+SavedRip    DQ      ?\r
+    jmp     rax                         ; return to caller\r
 _BackFromUserCode   ENDP\r
 \r
 _EntryPoint DD      _ToUserCode - m16Start\r
@@ -147,7 +152,7 @@ _ToUserCode PROC
     wrmsr\r
     mov     cr4, rbp\r
     mov     ss, esi                     ; set up 16-bit stack segment\r
-    xchg    sp, bx                      ; set up 16-bit stack pointer\r
+    mov     sp, bx                      ; set up 16-bit stack pointer\r
     DB      66h\r
     call    @Base                       ; push eip\r
 @Base:\r
@@ -157,11 +162,6 @@ _ToUserCode PROC
     push    rax\r
     retf\r
 @RealMode:\r
-    DB      6ah, DATA32\r
-    DB      2eh                         ; cs:\r
-    pop     [rsi + (SavedSs - @Base)]\r
-    DB      2eh                         ; cs:\r
-    mov     [rsi + (SavedEsp - @Base)], bx\r
     DB      66h, 2eh                    ; CS and operand size override\r
     lidt    fword ptr [rsi + (_16Idtr - @Base)]\r
     DB      66h, 61h                    ; popad\r
@@ -232,8 +232,7 @@ InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi
     mov     eax, edx                    ; eax <- transition code address\r
     and     edx, 0fh\r
     shl     eax, 12\r
-    lea     edx, [rdx + (_BackFromUserCode - m16Start)]\r
-    mov     ax, dx\r
+    lea     ax, [rdx + (_BackFromUserCode - m16Start)]\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
@@ -250,7 +249,14 @@ InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi
     mov     ss, edx\r
     pushfq\r
     lea     edx, [rdx + DATA16 - DATA32]\r
-    call    fword ptr [rcx + (_EntryPoint - SavedCr4)]\r
+    lea     r8, @RetFromRealMode\r
+    mov     [rcx + (SavedRip - SavedCr4)], r8\r
+    mov     r8d, cs\r
+    mov     [rcx + (SavedCs - SavedCr4)], r8w\r
+    mov     r8, rsp\r
+    jmp     fword ptr [rcx + (_EntryPoint - SavedCr4)]\r
+@RetFromRealMode:\r
+    mov     rsp, r8\r
     popfq\r
     lidt    fword ptr [rsp + 38h]       ; restore protected mode IDTR\r
     lea     eax, [rbp - sizeof (IA32_REGS)]\r