]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Thunk16/Ia32/Thunk16.asm
Update the copyright notice format
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Thunk16 / Ia32 / Thunk16.asm
CommitLineData
3eb9473e 1;*****************************************************************************\r
2;*\r
4ea9375a
HT
3;* Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>\r
4;* This program and the accompanying materials \r
3eb9473e 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 .686p\r
23\r
24EXTERNDEF C mCode16Size:DWORD\r
25\r
26CONST SEGMENT FLAT "DATA" READONLY\r
27\r
28mCode16Size DD _TEXT16SIZE\r
29\r
30CONST ENDS\r
31\r
32_DATA SEGMENT FLAT "DATA"\r
33\r
34NullSegSel DQ 0\r
35_16BitCsSel LABEL QWORD\r
36 DW -1\r
37 DW 0\r
38 DB 0\r
39 DB 9bh\r
40 DB 8fh ; 16-bit segment\r
41 DB 0\r
42_16BitSsSel LABEL QWORD\r
43 DW -1\r
44 DW 0\r
45 DB 0\r
46 DB 93h\r
47 DB 8fh ; 16-bit segment\r
48 DB 0\r
49\r
50_16Gdtr LABEL FWORD\r
51 DW $ - offset NullSegSel - 1\r
52 DD offset NullSegSel\r
53\r
54_DATA ENDS\r
55\r
56_TEXT SEGMENT FLAT "CODE" PARA\r
57\r
58IA32_REGS STRUC 4t\r
59_EDI DD ?\r
60_ESI DD ?\r
61_EBP DD ?\r
62_ESP DD ?\r
63_EBX DD ?\r
64_EDX DD ?\r
65_ECX DD ?\r
66_EAX DD ?\r
67_DS DW ?\r
68_ES DW ?\r
69_FS DW ?\r
70_GS DW ?\r
71_EFLAGS DD ?\r
72_EIP DD ?\r
73_CS DW ?\r
74_SS DW ?\r
75IA32_REGS ENDS\r
76\r
77_STK16 STRUC 1t\r
78RetEip DD ?\r
79RetCs DW ?\r
80ThunkFlags DW ?\r
81SavedEsp DD ?\r
82SavedSs DW ?\r
83SavedGdtr FWORD ?\r
84SavedCr0 DD ?\r
85SavedCr4 DD ?\r
86_STK16 ENDS\r
87\r
88 ASSUME ds:_DATA\r
89\r
90__Thunk16 PROC USES ebp ebx esi edi ds es fs gs\r
91 ASSUME esi:PTR IA32_REGS\r
92 mov esi, [esp + 36]\r
93 movzx edx, [esi]._SS\r
94 mov edi, [esi]._ESP\r
95 add edi, - sizeof (_STK16) - sizeof (IA32_REGS)\r
96 push edi ; save stack offset\r
97 imul eax, edx, 16 ; eax <- edx*16\r
98 add edi, eax ; edi <- linear address of 16-bit stack\r
99 push sizeof (IA32_REGS) / 4\r
100 pop ecx\r
101 rep movsd ; copy context to 16-bit stack\r
102 pop ebx ; ebx <- 16-bit stack offset\r
103 mov eax, offset @F ; return offset\r
104 stosd\r
105 mov eax, cs ; return segment\r
106 stosw\r
107 mov eax, [esp + 40] ; THUNK flags\r
108 stosw\r
109 mov eax, esp\r
110 stosd ; save esp\r
111 mov eax, ss ; save ss\r
112 stosw\r
113 sgdt fword ptr [edi] ; save GDTR\r
114 sidt fword ptr [esp + 36] ; save IDTR\r
115 mov esi, cr0\r
116 mov [edi + 6], esi ; save CR0\r
117 and esi, NOT 80000001h ; esi <- CR0 to set\r
118 mov eax, cr4\r
119 mov [edi + 10], eax ; save CR4\r
120 and al, NOT 30h ; clear PAE & PSE\r
121 mov edi, edx ; edi <- 16-bit stack segment\r
122 mov edx, [esp + 44]\r
123 shl edx, 16\r
124 push edx\r
125 pop edx\r
126 mov dx, _16BitSsSel - NullSegSel\r
127 lgdt _16Gdtr ; load 16-bit GDTR\r
128 DB 0eah\r
129 DD offset @16Bit\r
130 DW _16BitCsSel - NullSegSel ; jmp far 8:@16Bit\r
131@16Bit:\r
132 mov ss, dx\r
133 mov cr0, esi ; disable protected mode\r
134 mov cr4, eax ; disable PAE & PSE\r
135 db 67h, 0FFh, 06Ch, 024h, 0FCh ; jmp dword ptr [esp-4]\r
136@@:\r
137 mov eax, ss\r
138 shl eax, 4\r
139 add eax, esp ; eax <- address of 16-bit stack\r
140 lss esp, fword ptr (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedEsp\r
141 lidt fword ptr [esp + 36] ; restore IDTR\r
142 ret\r
143__Thunk16 ENDP\r
144\r
145_TEXT ENDS\r
146\r
147_TEXT16 SEGMENT USE16 "CODE" PARA\r
148\r
149_Code16Addr PROC C\r
150_Code16Addr ENDP\r
151\r
152RealMode PROC\r
153 mov ss, di ; set up stack\r
154 mov esp, ebx\r
155 lidt fword ptr cs:[_16Idtr - _Code16Addr]\r
156 popad\r
157 pop ds\r
158 pop es\r
159 pop fs\r
160 pop gs\r
161 add sp, 4 ; skip EFlags\r
162 test (_STK16 ptr [esp + 8]).ThunkFlags, 1\r
163 jz @F\r
164 pushf\r
165@@:\r
166 push cs\r
167; push @FarCallRet - _Code16Addr\r
168 DB 68h ; push /iw\r
169 DW @FarCallRet - _Code16Addr\r
170 jz @F\r
171 jmp fword ptr [esp + 6]\r
172@@:\r
173 jmp fword ptr [esp + 4]\r
174@FarCallRet:\r
175 pushfd\r
176 push gs\r
177 push fs\r
178 push es\r
179 push ds\r
180 pushad\r
181 cli\r
182 DB 66h\r
183 lgdt (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedGdtr\r
184 mov eax, (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedCr4\r
185 mov cr4, eax\r
186 mov eax, (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedCr0\r
187 mov cr0, eax ; restore CR0\r
188 jmp fword ptr (_STK16 ptr [esp + sizeof (IA32_REGS)]).RetEip\r
189RealMode ENDP\r
190\r
191_16Idtr FWORD (1 SHL 10) - 1\r
192\r
193_TEXT16END:\r
194\r
195_TEXT16SIZE = _TEXT16END - _Code16Addr\r
196\r
197_TEXT16 ENDS\r
198\r
199 END\r