]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg BaseLib NASM Thunk16: Remove remaining 'DB' code
authorJordan Justen <jordan.l.justen@intel.com>
Mon, 1 Sep 2014 17:23:57 +0000 (17:23 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Sep 2014 17:23:57 +0000 (17:23 +0000)
Convert remaining 'DB' code to assembly code by:
* Move instruction immediate data labels to end of instruction
* Use strict keyword to make sure immediate data size is not optimized

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16024 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Library/BaseLib/Ia32/Thunk16.nasm
MdePkg/Library/BaseLib/X64/Thunk16.nasm

index a1093e0107a0c059eb7954a261d4ec2e332e338e..c08e41de9d3b6452d5435967db6d0b932279d4a6 100644 (file)
@@ -59,7 +59,7 @@ SECTION .data
 ; These are global constant to convey information to C code.\r
 ;\r
 ASM_PFX(m16Size)         DW      InternalAsmThunk16 - ASM_PFX(m16Start)\r
-ASM_PFX(mThunk16Attr)    DW      _BackFromUserCode.ThunkAttr - ASM_PFX(m16Start)\r
+ASM_PFX(mThunk16Attr)    DW      _BackFromUserCode.ThunkAttrEnd - 4 - ASM_PFX(m16Start)\r
 ASM_PFX(m16Gdt)          DW      _NullSegDesc - ASM_PFX(m16Start)\r
 ASM_PFX(m16GdtrBase)     DW      _16GdtrBase - ASM_PFX(m16Start)\r
 ASM_PFX(mTransition)     DW      _EntryPoint - ASM_PFX(m16Start)\r
@@ -94,8 +94,8 @@ o32 call    dword .Base                 ; push eip
     push    es\r
     push    ds\r
     pushad\r
-    DB      66h, 0bah                   ; mov edx, imm32\r
-.ThunkAttr: dd   0\r
+    mov     edx, strict dword 0\r
+.ThunkAttrEnd:\r
     test    dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15\r
     jz      .1\r
     mov     ax, 2401h\r
@@ -116,18 +116,18 @@ o32 call    dword .Base                 ; push eip
     mov     bx, [bp - IA32_REGS.size + IA32_REGS._EIP]\r
     shl     eax, 4                      ; shl eax, 4\r
     add     ebp, eax                    ; add ebp, eax\r
-    DB      66h, 0b8h                   ; mov eax, imm32\r
-.SavedCr4:  DD      0\r
+    mov     eax, strict dword 0\r
+.SavedCr4End:\r
     mov     cr4, eax\r
 o32 lgdt [cs:bx + (SavedGdt - .Base)]\r
-    DB      66h, 0b8h                   ; mov eax, imm32\r
-.SavedCr0:  DD      0\r
+    mov     eax, strict dword 0\r
+.SavedCr0End:\r
     mov     cr0, eax\r
-    DB      0b8h                        ; mov ax, imm16\r
-.SavedSs    DW      0\r
+    mov     ax, strict word 0\r
+.SavedSsEnd:\r
     mov     ss, eax\r
-    DB      66h, 0bch                   ; mov esp, imm32\r
-.SavedEsp   DD      0\r
+    mov     esp, strict dword 0\r
+.SavedEspEnd:\r
 o32 retf                                ; return to protected mode\r
 \r
 _EntryPoint:\r
@@ -155,15 +155,14 @@ BITS    16
     mov     gs, cx\r
     mov     cr0, eax                    ; real mode starts at next instruction\r
                                         ;  which (per SDM) *must* be a far JMP.\r
-    DB      0eah\r
-.RealAddr: DW 0, 0\r
-\r
+    jmp     0:strict word 0\r
+.RealAddrEnd:\r
     mov     cr4, ebp\r
     mov     ss, si                      ; set up 16-bit stack segment\r
     xchg    esp, ebx                    ; set up 16-bit stack pointer\r
     mov     bp, [esp + IA32_REGS.size]\r
-    mov     [cs:bp + (_BackFromUserCode.SavedSs - _BackFromUserCode)], dx\r
-    mov     [cs:bp + (_BackFromUserCode.SavedEsp - _BackFromUserCode)], ebx\r
+    mov     [cs:bp + (_BackFromUserCode.SavedSsEnd - 2 - _BackFromUserCode)], dx\r
+    mov     [cs:bp + (_BackFromUserCode.SavedEspEnd - 4 - _BackFromUserCode)], ebx\r
     lidt    [cs:bp + (_16Idtr - _BackFromUserCode)]\r
 \r
     popad\r
@@ -224,28 +223,28 @@ BITS    32
     rep     movsd                       ; copy RegSet\r
     mov     eax, [esp + 40]             ; eax <- address of transition code\r
     mov     esi, edx                    ; esi <- 16-bit stack segment\r
-    lea     edx, [eax + (_BackFromUserCode.SavedCr0 - ASM_PFX(m16Start))]\r
+    lea     edx, [eax + (_BackFromUserCode.SavedCr0End - ASM_PFX(m16Start))]\r
     mov     ecx, eax\r
     and     ecx, 0fh\r
     shl     eax, 12\r
     lea     ecx, [ecx + (_BackFromUserCode - ASM_PFX(m16Start))]\r
     mov     ax, cx\r
     stosd                               ; [edi] <- return address of user code\r
-    add     eax, _ToUserCode.RealAddr + 4 - _BackFromUserCode\r
-    mov     [edx + (_ToUserCode.RealAddr - _BackFromUserCode.SavedCr0)], eax\r
-    sgdt    [edx + (SavedGdt - _BackFromUserCode.SavedCr0)]\r
+    add     eax, _ToUserCode.RealAddrEnd - _BackFromUserCode\r
+    mov     [edx + (_ToUserCode.RealAddrEnd - 4 - _BackFromUserCode.SavedCr0End)], eax\r
+    sgdt    [edx + (SavedGdt - _BackFromUserCode.SavedCr0End)]\r
     sidt    [esp + 36]        ; save IDT stack in argument space\r
     mov     eax, cr0\r
-    mov     [edx], eax                  ; save CR0 in _BackFromUserCode.SavedCr0\r
+    mov     [edx - 4], eax                  ; save CR0 in _BackFromUserCode.SavedCr0End - 4\r
     and     eax, 7ffffffeh              ; clear PE, PG bits\r
     mov     ebp, cr4\r
-    mov     [edx + (_BackFromUserCode.SavedCr4 - _BackFromUserCode.SavedCr0)], ebp\r
+    mov     [edx + (_BackFromUserCode.SavedCr4End - 4 - _BackFromUserCode.SavedCr0End)], ebp\r
     and     ebp, ~30h                ; clear PAE, PSE bits\r
     push    10h\r
     pop     ecx                         ; ecx <- selector for data segments\r
-    lgdt    [edx + (_16Gdtr - _BackFromUserCode.SavedCr0)]\r
+    lgdt    [edx + (_16Gdtr - _BackFromUserCode.SavedCr0End)]\r
     pushfd                              ; Save df/if indeed\r
-    call    dword far [edx + (_EntryPoint - _BackFromUserCode.SavedCr0)]\r
+    call    dword far [edx + (_EntryPoint - _BackFromUserCode.SavedCr0End)]\r
     popfd\r
     lidt    [esp + 36]        ; restore protected mode IDTR\r
     lea     eax, [ebp - IA32_REGS.size] ; eax <- the address of IA32_REGS\r
index 5fa705998e1a8a431e7e28a114cf2e307a9a846c..d15984b01c9ba9b38319987e3c892533bacdca08 100644 (file)
@@ -57,7 +57,7 @@ SECTION .data
 ; These are global constant to convey information to C code.\r
 ;\r
 ASM_PFX(m16Size)         DW      InternalAsmThunk16 - ASM_PFX(m16Start)\r
-ASM_PFX(mThunk16Attr)    DW      _BackFromUserCode.ThunkAttr - ASM_PFX(m16Start)\r
+ASM_PFX(mThunk16Attr)    DW      _BackFromUserCode.ThunkAttrEnd - 4 - ASM_PFX(m16Start)\r
 ASM_PFX(m16Gdt)          DW      _NullSeg - ASM_PFX(m16Start)\r
 ASM_PFX(m16GdtrBase)     DW      _16GdtrBase - ASM_PFX(m16Start)\r
 ASM_PFX(mTransition)     DW      _EntryPoint - ASM_PFX(m16Start)\r
@@ -93,8 +93,8 @@ o32 call    dword .Base                 ; push eip
     push    es\r
     push    ds\r
     pushad\r
-    DB      66h, 0bah                   ; mov edx, imm32\r
-.ThunkAttr: dd   0\r
+    mov     edx, strict dword 0\r
+.ThunkAttrEnd:\r
     test    dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15\r
     jz      .1\r
     mov     ax, 2401h\r
@@ -117,27 +117,25 @@ o32 call    dword .Base                 ; push eip
     add     ebp, eax                    ; add ebp, eax\r
     mov     eax, cs\r
     shl     eax, 4\r
-    lea     eax, [eax + ebx + (.64BitCode - .Base)]\r
-    mov     [cs:bx + (.64Eip - .Base)], eax\r
-    DB      66h, 0b8h                   ; mov eax, imm32\r
-.SavedCr4:  DD      0\r
+    lea     eax, [eax + ebx + (.X64JmpEnd - .Base)]\r
+    mov     [cs:bx + (.X64JmpEnd - 6 - .Base)], eax\r
+    mov     eax, strict dword 0\r
+.SavedCr4End:\r
     mov     cr4, eax\r
 o32 lgdt [cs:bx + (SavedGdt - .Base)]\r
     mov     ecx, 0c0000080h\r
     rdmsr\r
     or      ah, 1\r
     wrmsr\r
-    DB      66h, 0b8h                   ; mov eax, imm32\r
-.SavedCr0:  DD      0\r
+    mov     eax, strict dword 0\r
+.SavedCr0End:\r
     mov     cr0, eax\r
-    DB      66h, 0eah                   ; jmp far cs:.64Bit\r
-.64Eip:     DD      0\r
-.SavedCs:   DW      0\r
-.64BitCode:\r
+    jmp     0:strict dword 0\r
+.X64JmpEnd:\r
 BITS    64\r
     nop\r
-    db      048h, 0bch                 ; mov rsp, imm64\r
-.SavedSp:   DQ   0                     ; restore stack\r
+    mov rsp, strict qword 0\r
+.SavedSpEnd:\r
     nop\r
     ret\r
 \r
@@ -258,7 +256,7 @@ BITS    64
     add     edi, eax                    ; edi <- linear address of 16-bit stack\r
     pop     rcx\r
     rep     movsd                       ; copy RegSet\r
-    lea     ecx, [rdx + (_BackFromUserCode.SavedCr4 - ASM_PFX(m16Start))]\r
+    lea     ecx, [rdx + (_BackFromUserCode.SavedCr4End - ASM_PFX(m16Start))]\r
     mov     eax, edx                    ; eax <- transition code address\r
     and     edx, 0fh\r
     shl     eax, 12                     ; segment address in high order 16 bits\r
@@ -267,11 +265,11 @@ BITS    64
   \r
     sgdt    [rsp + 60h]       ; save GDT stack in argument space\r
     movzx   r10, word [rsp + 60h]   ; r10 <- GDT limit \r
-    lea     r11, [rcx + (InternalAsmThunk16 - _BackFromUserCode.SavedCr4) + 0xf]\r
+    lea     r11, [rcx + (InternalAsmThunk16 - _BackFromUserCode.SavedCr4End) + 0xf]\r
     and     r11, ~0xf            ; r11 <- 16-byte aligned shadowed GDT table in real mode buffer\r
     \r
-    mov     [rcx + (SavedGdt - _BackFromUserCode.SavedCr4)], r10w      ; save the limit of shadowed GDT table\r
-    mov     [rcx + (SavedGdt - _BackFromUserCode.SavedCr4) + 2], r11  ; save the base address of shadowed GDT table\r
+    mov     [rcx + (SavedGdt - _BackFromUserCode.SavedCr4End)], r10w      ; save the limit of shadowed GDT table\r
+    mov     [rcx + (SavedGdt - _BackFromUserCode.SavedCr4End) + 2], r11  ; save the base address of shadowed GDT table\r
     \r
     mov     rsi, [rsp + 62h]  ; rsi <- the original GDT base address\r
     xchg    rcx, r10                    ; save rcx to r10 and initialize rcx to be the limit of GDT table\r
@@ -283,24 +281,24 @@ BITS    64
     \r
     sidt    [rsp + 50h]       ; save IDT stack in argument space\r
     mov     rax, cr0\r
-    mov     [rcx + (_BackFromUserCode.SavedCr0 - _BackFromUserCode.SavedCr4)], eax\r
+    mov     [rcx + (_BackFromUserCode.SavedCr0End - 4 - _BackFromUserCode.SavedCr4End)], eax\r
     and     eax, 7ffffffeh              ; clear PE, PG bits\r
     mov     rbp, cr4\r
-    mov     [rcx], ebp                  ; save CR4 in _BackFromUserCode.SavedCr4\r
+    mov     [rcx - 4], ebp              ; save CR4 in _BackFromUserCode.SavedCr4End - 4\r
     and     ebp, ~30h                ; clear PAE, PSE bits\r
     mov     esi, r8d                    ; esi <- 16-bit stack segment\r
     push    DATA32\r
     pop     rdx                         ; rdx <- 32-bit data segment selector\r
-    lgdt    [rcx + (_16Gdtr - _BackFromUserCode.SavedCr4)]\r
+    lgdt    [rcx + (_16Gdtr - _BackFromUserCode.SavedCr4End)]\r
     mov     ss, edx\r
     pushfq\r
     lea     edx, [rdx + DATA16 - DATA32]\r
     lea     r8, [REL .RetFromRealMode]\r
     push    r8\r
     mov     r8d, cs\r
-    mov     [rcx + (_BackFromUserCode.SavedCs - _BackFromUserCode.SavedCr4)], r8w\r
-    mov     [rcx + (_BackFromUserCode.SavedSp - _BackFromUserCode.SavedCr4)], rsp\r
-    jmp     dword far [rcx + (_EntryPoint - _BackFromUserCode.SavedCr4)]\r
+    mov     [rcx + (_BackFromUserCode.X64JmpEnd - 2 - _BackFromUserCode.SavedCr4End)], r8w\r
+    mov     [rcx + (_BackFromUserCode.SavedSpEnd - 8 - _BackFromUserCode.SavedCr4End)], rsp\r
+    jmp     dword far [rcx + (_EntryPoint - _BackFromUserCode.SavedCr4End)]\r
 .RetFromRealMode:\r
     popfq\r
     lgdt    [rsp + 60h]       ; restore protected mode GDTR\r