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