]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/BaseLib/ia32/Thunk16.s
Initial import.
[mirror_edk2.git] / MdePkg / Library / BaseLib / ia32 / Thunk16.s
1 #------------------------------------------------------------------------------
2 #
3 # Copyright (c) 2006, Intel Corporation
4 # All rights reserved. This program and the accompanying materials
5 # are licensed and made available under the terms and conditions of the BSD License
6 # which accompanies this distribution. The full text of the license may be found at
7 # http://opensource.org/licenses/bsd-license.php
8 #
9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 #
12 # Module Name:
13 #
14 # Thunk.asm
15 #
16 # Abstract:
17 #
18 # Real mode thunk
19 #
20 #------------------------------------------------------------------------------
21
22
23
24 MISMATCH: "EXTERNDEF C mCode16Size:DWORD"
25
26 MISMATCH: "CONST SEGMENT FLAT "DATA" READONLY"
27
28 MISMATCH: "mCode16Size DD _TEXT16SIZE"
29
30 MISMATCH: "CONSTS"
31
32 MISMATCH: "_DATA SEGMENT FLAT "DATA""
33
34 MISMATCH: "NullSegSel DQ 0"
35 MISMATCH: "_16BitCsSel LABEL QWORD"
36 .word -1
37 .word 0
38 .byte 0
39 .byte 0x9b
40 .byte 0x8f # 16-bit segment
41 .byte 0
42
43 MISMATCH: "_16Gdtr LABEL FWORD"
44 MISMATCH: " DW $ - offset NullSegSel - 1"
45 MISMATCH: " DD offset NullSegSel"
46
47 MISMATCH: "_DATAS"
48
49 MISMATCH: "_TEXT SEGMENT FLAT "CODE" PARA"
50
51 MISMATCH: "IA32_REGS STRUC 4t"
52 MISMATCH: "_EDI DD ?"
53 MISMATCH: "_ESI DD ?"
54 MISMATCH: "_EBP DD ?"
55 MISMATCH: "_ESP DD ?"
56 MISMATCH: "_EBX DD ?"
57 MISMATCH: "_EDX DD ?"
58 MISMATCH: "_ECX DD ?"
59 MISMATCH: "_EAX DD ?"
60 MISMATCH: "_DS DW ?"
61 MISMATCH: "_ES DW ?"
62 MISMATCH: "_FS DW ?"
63 MISMATCH: "_GS DW ?"
64 MISMATCH: "_EFLAGS DD ?"
65 MISMATCH: "_EIP DD ?"
66 MISMATCH: "_CS DW ?"
67 MISMATCH: "_SS DW ?"
68 MISMATCH: "IA32_REGSS"
69
70 MISMATCH: "_STK16 STRUC 1t"
71 MISMATCH: "RetEip DD ?"
72 MISMATCH: "RetCs DW ?"
73 MISMATCH: "ThunkFlags DW ?"
74 MISMATCH: "SavedEsp DD ?"
75 MISMATCH: "SavedSs DW ?"
76 MISMATCH: "SavedGdtr FWORD ?"
77 MISMATCH: "SavedCr0 DD ?"
78 MISMATCH: "SavedCr4 DD ?"
79 MISMATCH: "_STK16S"
80
81 .global _InternalAsmThunk16
82 MISMATCH: "_InternalAsmThunk16: USES ebp ebx esi edi ds es fs gs"
83 MISMATCH: " ASSUME esi:PTR IA32_REGS"
84 movl 36(%esp),%esi
85 MISMATCH: " movzx edx, [esi]._SS"
86 movl $[esi]._ESP, %edi
87 MISMATCH: " add edi, - sizeof (_STK16) - sizeof (IA32_REGS)"
88 pushl %edi # save stack offset
89 imull $16,%edx,%eax # eax <- edx*16
90 addl %eax,%edi # edi <- linear address of 16-bit stack
91 MISMATCH: " push sizeof (IA32_REGS) / 4"
92 popl %ecx
93 rep
94 movsl # copy context to 16-bit stack
95 popl %ebx # ebx <- 16-bit stack offset
96 MISMATCH: " mov eax, offset @F "
97 stosl
98 movl %cs,%eax # return segment
99 stosw
100 movl 40(%esp),%eax # THUNK flags
101 stosw
102 movl %esp,%eax
103 stosl # save esp
104 movl %ss,%eax # save ss
105 stosw
106 MISMATCH: " sgdt fword ptr [edi] "
107 MISMATCH: " sidt fword ptr [esp + 36] "
108 movl %cr0, %esi
109 movl %esi,6(%edi) # save CR0
110 MISMATCH: " and esi, NOT 80000001h "
111 movl %cr4, %eax
112 movl %eax,10(%edi) # save CR4
113 MISMATCH: " and al, NOT 30h "
114 movl %edx,%edi # edi <- 16-bit stack segment
115 movl 44(%esp),%edx
116 shll $16,%edx
117 pushl %edx
118 MISMATCH: " lgdt _16Gdtr "
119 .byte 0xea
120 MISMATCH: " DD offset @16Bit"
121 .word 8 # jmp far 8:@16Bit
122 @16Bit:
123 movl %esi, %cr0 # disable protected mode
124 movl %eax, %cr4 # disable PAE & PSE
125 lret
126 @@:
127 movl %ss,%eax
128 shll $4,%eax
129 addl %esp,%eax # eax <- address of 16-bit stack
130 MISMATCH: " lss esp, fword ptr (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedEsp"
131 MISMATCH: " lidt fword ptr [esp + 36] "
132 ret
133
134
135 MISMATCH: "_TEXTS"
136
137 MISMATCH: "_TEXT16 SEGMENT USE16 "CODE" PARA"
138
139 .global _Code16Addr
140 MISMATCH: "_Code16Addr: C"
141
142
143 .global RealMode
144 RealMode:
145 MISMATCH: " ASSUME bp:PTR _STK16"
146 movw %di,%ss # set up stack
147 movl %ebx,%esp
148 MISMATCH: " lidt fword ptr cs:[_16Idtr - _Code16Addr]"
149 popal
150 popl %ds
151 popl %es
152 popl %fs
153 popl %gs
154 addw $4,%sp # skip EFlags
155 MISMATCH: " test (_STK16 ptr [esp + 8]).ThunkFlags, 1"
156 jz @F
157 pushf
158 @@:
159 pushw %cs
160 MISMATCH: " push @FarCallRet - _Code16Addr"
161 jz @F
162 MISMATCH: " jmp fword ptr [esp + 6]"
163 @@:
164 MISMATCH: " jmp fword ptr [esp + 4]"
165 @FarCallRet:
166 pushfl
167 pushw %gs
168 pushw %fs
169 pushw %es
170 pushw %ds
171 pushal
172 cli
173 MISMATCH: " lea bp, [esp + sizeof (IA32_REGS)]"
174 .byte 0x66
175 MISMATCH: " lgdt [bp].SavedGdtr"
176 movl $[bp].SavedCr4, %eax
177 movl %eax, %cr4
178 movl $[bp].SavedCr0, %eax
179 movl %eax, %cr0 # restore CR0
180 MISMATCH: " jmp fword ptr [bp].RetEip"
181
182
183 MISMATCH: "_16Idtr FWORD (1 SHL 10) - 1"
184
185 _TEXT16:
186
187 MISMATCH: "_TEXT16SIZE = _TEXT16- _Code16Addr"
188
189 MISMATCH: "_TEXT16S"
190
191