]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseLib/Ia32/Thunk16.s
Rename dirs
[mirror_edk2.git] / MdePkg / Library / BaseLib / Ia32 / Thunk16.s
diff --git a/MdePkg/Library/BaseLib/Ia32/Thunk16.s b/MdePkg/Library/BaseLib/Ia32/Thunk16.s
new file mode 100644 (file)
index 0000000..4236996
--- /dev/null
@@ -0,0 +1,191 @@
+#------------------------------------------------------------------------------\r
+#\r
+# Copyright (c) 2006, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+# Module Name:\r
+#\r
+#   Thunk.asm\r
+#\r
+# Abstract:\r
+#\r
+#   Real mode thunk\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+\r
+MISMATCH: "EXTERNDEF   C   mCode16Size:DWORD"\r
+\r
+MISMATCH: "CONST   SEGMENT FLAT    "DATA"  READONLY"\r
+\r
+MISMATCH: "mCode16Size     DD      _TEXT16SIZE"\r
+\r
+MISMATCH: "CONSTS"\r
+\r
+MISMATCH: "_DATA   SEGMENT FLAT    "DATA""\r
+\r
+MISMATCH: "NullSegSel      DQ      0"\r
+MISMATCH: "_16BitCsSel     LABEL   QWORD"\r
+                .word -1\r
+                .word 0\r
+                .byte 0\r
+                .byte 0x9b\r
+                .byte 0x8f              # 16-bit segment\r
+                .byte 0\r
+\r
+MISMATCH: "_16Gdtr         LABEL   FWORD"\r
+MISMATCH: "                DW      $ - offset NullSegSel - 1"\r
+MISMATCH: "                DD      offset NullSegSel"\r
+\r
+MISMATCH: "_DATAS"\r
+\r
+MISMATCH: "_TEXT   SEGMENT FLAT    "CODE"  PARA"\r
+\r
+MISMATCH: "IA32_REGS   STRUC   4t"\r
+MISMATCH: "_EDI        DD      ?"\r
+MISMATCH: "_ESI        DD      ?"\r
+MISMATCH: "_EBP        DD      ?"\r
+MISMATCH: "_ESP        DD      ?"\r
+MISMATCH: "_EBX        DD      ?"\r
+MISMATCH: "_EDX        DD      ?"\r
+MISMATCH: "_ECX        DD      ?"\r
+MISMATCH: "_EAX        DD      ?"\r
+MISMATCH: "_DS         DW      ?"\r
+MISMATCH: "_ES         DW      ?"\r
+MISMATCH: "_FS         DW      ?"\r
+MISMATCH: "_GS         DW      ?"\r
+MISMATCH: "_EFLAGS     DD      ?"\r
+MISMATCH: "_EIP        DD      ?"\r
+MISMATCH: "_CS         DW      ?"\r
+MISMATCH: "_SS         DW      ?"\r
+MISMATCH: "IA32_REGSS"\r
+\r
+MISMATCH: "_STK16      STRUC   1t"\r
+MISMATCH: "RetEip      DD      ?"\r
+MISMATCH: "RetCs       DW      ?"\r
+MISMATCH: "ThunkFlags  DW      ?"\r
+MISMATCH: "SavedEsp    DD      ?"\r
+MISMATCH: "SavedSs     DW      ?"\r
+MISMATCH: "SavedGdtr   FWORD   ?"\r
+MISMATCH: "SavedCr0    DD      ?"\r
+MISMATCH: "SavedCr4    DD      ?"\r
+MISMATCH: "_STK16S"\r
+\r
+.global _InternalAsmThunk16\r
+MISMATCH: "_InternalAsmThunk16:    USES    ebp ebx esi edi ds  es  fs  gs"\r
+MISMATCH: "    ASSUME  esi:PTR IA32_REGS"\r
+    movl    36(%esp),%esi\r
+MISMATCH: "    movzx   edx, [esi]._SS"\r
+    movl    $[esi]._ESP, %edi\r
+MISMATCH: "    add     edi, - sizeof (_STK16) - sizeof (IA32_REGS)"\r
+    pushl   %edi                        # save stack offset\r
+    imull   $16,%edx,%eax               # eax <- edx*16\r
+    addl    %eax,%edi                   # edi <- linear address of 16-bit stack\r
+MISMATCH: "    push    sizeof (IA32_REGS) / 4"\r
+    popl    %ecx\r
+    rep\r
+    movsl                               # copy context to 16-bit stack\r
+    popl    %ebx                        # ebx <- 16-bit stack offset\r
+MISMATCH: "    mov     eax, offset @F              "\r
+    stosl\r
+    movl    %cs,%eax                    # return segment\r
+    stosw\r
+    movl    40(%esp),%eax               # THUNK flags\r
+    stosw\r
+    movl    %esp,%eax\r
+    stosl                               # save esp\r
+    movl    %ss,%eax                    # save ss\r
+    stosw\r
+MISMATCH: "    sgdt    fword ptr [edi]             "\r
+MISMATCH: "    sidt    fword ptr [esp + 36]        "\r
+    movl    %cr0, %esi\r
+    movl    %esi,6(%edi)                # save CR0\r
+MISMATCH: "    and     esi, NOT 80000001h          "\r
+    movl    %cr4, %eax\r
+    movl    %eax,10(%edi)               # save CR4\r
+MISMATCH: "    and     al, NOT 30h                 "\r
+    movl    %edx,%edi                   # edi <- 16-bit stack segment\r
+    movl    44(%esp),%edx\r
+    shll    $16,%edx\r
+    pushl   %edx\r
+MISMATCH: "    lgdt    _16Gdtr                     "\r
+    .byte 0xea\r
+MISMATCH: "    DD      offset @16Bit"\r
+    .word 8                             # jmp far 8:@16Bit\r
+@16Bit: \r
+    movl    %esi, %cr0                  # disable protected mode\r
+    movl    %eax, %cr4                  # disable PAE & PSE\r
+    lret\r
+@@: \r
+    movl    %ss,%eax\r
+    shll    $4,%eax\r
+    addl    %esp,%eax                   # eax <- address of 16-bit stack\r
+MISMATCH: "    lss     esp, fword ptr (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedEsp"\r
+MISMATCH: "    lidt    fword ptr [esp + 36]        "\r
+    ret\r
+\r
+\r
+MISMATCH: "_TEXTS"\r
+\r
+MISMATCH: "_TEXT16 SEGMENT USE16   "CODE"  PARA"\r
+\r
+.global _Code16Addr\r
+MISMATCH: "_Code16Addr:    C"\r
+\r
+\r
+.global RealMode\r
+RealMode: \r
+MISMATCH: "    ASSUME  bp:PTR _STK16"\r
+    movw    %di,%ss                     # set up stack\r
+    movl    %ebx,%esp\r
+MISMATCH: "    lidt    fword ptr cs:[_16Idtr - _Code16Addr]"\r
+    popal\r
+    popl    %ds\r
+    popl    %es\r
+    popl    %fs\r
+    popl    %gs\r
+    addw    $4,%sp                      # skip EFlags\r
+MISMATCH: "    test    (_STK16 ptr [esp + 8]).ThunkFlags, 1"\r
+    jz      @F\r
+    pushf\r
+@@: \r
+    pushw   %cs\r
+MISMATCH: "    push    @FarCallRet - _Code16Addr"\r
+    jz      @F\r
+MISMATCH: "    jmp     fword ptr [esp + 6]"\r
+@@: \r
+MISMATCH: "    jmp     fword ptr [esp + 4]"\r
+@FarCallRet: \r
+    pushfl\r
+    pushw   %gs\r
+    pushw   %fs\r
+    pushw   %es\r
+    pushw   %ds\r
+    pushal\r
+    cli\r
+MISMATCH: "    lea     bp, [esp + sizeof (IA32_REGS)]"\r
+    .byte 0x66\r
+MISMATCH: "    lgdt    [bp].SavedGdtr"\r
+    movl    $[bp].SavedCr4, %eax\r
+    movl    %eax, %cr4\r
+    movl    $[bp].SavedCr0, %eax\r
+    movl    %eax, %cr0                  # restore CR0\r
+MISMATCH: "    jmp     fword ptr [bp].RetEip"\r
+\r
+\r
+MISMATCH: "_16Idtr     FWORD   (1 SHL 10) - 1"\r
+\r
+_TEXT16: \r
+\r
+MISMATCH: "_TEXT16SIZE = _TEXT16- _Code16Addr"\r
+\r
+MISMATCH: "_TEXT16S"\r
+\r
+\r