--- /dev/null
+#------------------------------------------------------------------------------\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