]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Save segment registers on stack in case the thunk code assembly calls CF9 soft reset...
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 17 Apr 2009 07:38:57 +0000 (07:38 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 17 Apr 2009 07:38:57 +0000 (07:38 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8123 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Library/BaseLib/X64/Thunk16.S
MdePkg/Library/BaseLib/X64/Thunk16.asm

index b829685b43ca341fb5a109a514019063409867ab..f9770b258cb50f167f4ed7610b792c72119d1701 100644 (file)
@@ -136,10 +136,13 @@ SavedCr4:   .space  4
 SavedCr0:    .space      4\r
     movq    %rax, %cr0\r
     .byte 0x66,0xea                     # jmp far cs:L_64Bit\r
-L_64Eip:      .space      4\r
+L_64Eip:     .space      4\r
 SavedCs:     .space      2\r
 L_64BitCode: \r
-    movq     %r8, %rsp\r
+    .byte   0x90\r
+    .byte   0x67,0xbc                  # mov esp, imm32\r
+SavedSp:    .space 4                   # restore stack\r
+    nop\r
     ret\r
 \r
 _EntryPoint: .long      ASM_PFX(ToUserCode) - ASM_PFX(m16Start)\r
@@ -227,7 +230,6 @@ ASM_PFX(_32Data):
 #   IN OUT  VOID                      *Transition\r
 #   );\r
 #------------------------------------------------------------------------------\r
-# MISMATCH: "InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi"\r
 \r
 .globl ASM_PFX(InternalAsmThunk16)\r
 ASM_PFX(InternalAsmThunk16):\r
@@ -236,9 +238,13 @@ ASM_PFX(InternalAsmThunk16):
     pushq   %rsi\r
     pushq   %rdi\r
     \r
-    movl    %ds, %r10d                  # r9 ~ r11 are not accessible in 16-bit\r
-    movl    %es, %r11d                  # so use them for saving seg registers\r
-    movl    %ss, %r9d\r
+    movq    %ds, %rbx\r
+    pushq   %rbx      # Save ds segment register on the stack\r
+    movq    %es, %rbx\r
+    pushq   %rbx      # Save es segment register on the stack\r
+    movq    %ss, %rbx\r
+    pushq   %rbx      # Save ss segment register on the stack\r
+\r
     .byte   0x0f, 0xa0                  #push   fs\r
     .byte   0x0f, 0xa8                  #push   gs\r
     movq    %rcx, %rsi\r
@@ -259,7 +265,7 @@ ASM_PFX(InternalAsmThunk16):
     lea     (_BackFromUserCode - ASM_PFX(m16Start))(%rdx), %ax\r
     stosl                               # [edi] <- return address of user code\r
     sgdt    (SavedGdt - SavedCr4)(%rcx) \r
-    sidt    0x38(%rsp)\r
+    sidt    0x50(%rsp)\r
     movq    %cr0, %rax\r
     movl    %eax, (SavedCr0 - SavedCr4)(%rcx)\r
     andl    $0x7ffffffe,%eax            # clear PE, PG bits\r
@@ -277,18 +283,22 @@ ASM_PFX(InternalAsmThunk16):
     pushq   %r8\r
     movl    %cs, %r8d\r
     movw    %r8w, (SavedCs - SavedCr4)(%rcx)\r
-    movq     %rsp, %r8\r
+    movl    %esp, (SavedSp - SavedCr4)(%rcx)\r
     .byte   0xff, 0x69                  #  jmp (_EntryPoint - SavedCr4)(%rcx)\r
     .byte   _EntryPoint - SavedCr4\r
 L_RetFromRealMode: \r
     popfq\r
-    lidt    0x38(%rsp)\r
+    lidt    0x50(%rsp)\r
     lea     -IA32_REGS_SIZE(%rbp), %eax\r
     .byte 0x0f, 0xa9                    # pop gs\r
     .byte 0x0f, 0xa1                    # pop fs\r
-    movl    %r9d, %ss\r
-    movl    %r11d, %es\r
-    movl    %r10d, %ds\r
+    \r
+    popq     %rbx
+    movq     %rbx, %ss
+    popq     %rbx
+    movq     %rbx, %es
+    popq     %rbx
+    movq     %rbx, %ds
     \r
     popq    %rdi\r
     popq    %rsi\r
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