]>
Commit | Line | Data |
---|---|---|
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 | |
24 | MISMATCH: "EXTERNDEF C mCode16Size:DWORD"\r | |
25 | \r | |
26 | MISMATCH: "CONST SEGMENT FLAT "DATA" READONLY"\r | |
27 | \r | |
28 | MISMATCH: "mCode16Size DD _TEXT16SIZE"\r | |
29 | \r | |
30 | MISMATCH: "CONSTS"\r | |
31 | \r | |
32 | MISMATCH: "_DATA SEGMENT FLAT "DATA""\r | |
33 | \r | |
34 | MISMATCH: "NullSegSel DQ 0"\r | |
35 | MISMATCH: "_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 | |
43 | MISMATCH: "_16Gdtr LABEL FWORD"\r | |
44 | MISMATCH: " DW $ - offset NullSegSel - 1"\r | |
45 | MISMATCH: " DD offset NullSegSel"\r | |
46 | \r | |
47 | MISMATCH: "_DATAS"\r | |
48 | \r | |
49 | MISMATCH: "_TEXT SEGMENT FLAT "CODE" PARA"\r | |
50 | \r | |
51 | MISMATCH: "IA32_REGS STRUC 4t"\r | |
52 | MISMATCH: "_EDI DD ?"\r | |
53 | MISMATCH: "_ESI DD ?"\r | |
54 | MISMATCH: "_EBP DD ?"\r | |
55 | MISMATCH: "_ESP DD ?"\r | |
56 | MISMATCH: "_EBX DD ?"\r | |
57 | MISMATCH: "_EDX DD ?"\r | |
58 | MISMATCH: "_ECX DD ?"\r | |
59 | MISMATCH: "_EAX DD ?"\r | |
60 | MISMATCH: "_DS DW ?"\r | |
61 | MISMATCH: "_ES DW ?"\r | |
62 | MISMATCH: "_FS DW ?"\r | |
63 | MISMATCH: "_GS DW ?"\r | |
64 | MISMATCH: "_EFLAGS DD ?"\r | |
65 | MISMATCH: "_EIP DD ?"\r | |
66 | MISMATCH: "_CS DW ?"\r | |
67 | MISMATCH: "_SS DW ?"\r | |
68 | MISMATCH: "IA32_REGSS"\r | |
69 | \r | |
70 | MISMATCH: "_STK16 STRUC 1t"\r | |
71 | MISMATCH: "RetEip DD ?"\r | |
72 | MISMATCH: "RetCs DW ?"\r | |
73 | MISMATCH: "ThunkFlags DW ?"\r | |
74 | MISMATCH: "SavedEsp DD ?"\r | |
75 | MISMATCH: "SavedSs DW ?"\r | |
76 | MISMATCH: "SavedGdtr FWORD ?"\r | |
77 | MISMATCH: "SavedCr0 DD ?"\r | |
78 | MISMATCH: "SavedCr4 DD ?"\r | |
79 | MISMATCH: "_STK16S"\r | |
80 | \r | |
81 | .global _InternalAsmThunk16\r | |
82 | MISMATCH: "_InternalAsmThunk16: USES ebp ebx esi edi ds es fs gs"\r | |
83 | MISMATCH: " ASSUME esi:PTR IA32_REGS"\r | |
84 | movl 36(%esp),%esi\r | |
85 | MISMATCH: " movzx edx, [esi]._SS"\r | |
86 | movl $[esi]._ESP, %edi\r | |
87 | MISMATCH: " 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 | |
91 | MISMATCH: " 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 | |
96 | MISMATCH: " 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 | |
106 | MISMATCH: " sgdt fword ptr [edi] "\r | |
107 | MISMATCH: " sidt fword ptr [esp + 36] "\r | |
108 | movl %cr0, %esi\r | |
109 | movl %esi,6(%edi) # save CR0\r | |
110 | MISMATCH: " and esi, NOT 80000001h "\r | |
111 | movl %cr4, %eax\r | |
112 | movl %eax,10(%edi) # save CR4\r | |
113 | MISMATCH: " 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 | |
118 | MISMATCH: " lgdt _16Gdtr "\r | |
119 | .byte 0xea\r | |
120 | MISMATCH: " 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 | |
130 | MISMATCH: " lss esp, fword ptr (_STK16 ptr [esp + sizeof (IA32_REGS)]).SavedEsp"\r | |
131 | MISMATCH: " lidt fword ptr [esp + 36] "\r | |
132 | ret\r | |
133 | \r | |
134 | \r | |
135 | MISMATCH: "_TEXTS"\r | |
136 | \r | |
137 | MISMATCH: "_TEXT16 SEGMENT USE16 "CODE" PARA"\r | |
138 | \r | |
139 | .global _Code16Addr\r | |
140 | MISMATCH: "_Code16Addr: C"\r | |
141 | \r | |
142 | \r | |
143 | .global RealMode\r | |
144 | RealMode: \r | |
145 | MISMATCH: " ASSUME bp:PTR _STK16"\r | |
146 | movw %di,%ss # set up stack\r | |
147 | movl %ebx,%esp\r | |
148 | MISMATCH: " 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 | |
155 | MISMATCH: " test (_STK16 ptr [esp + 8]).ThunkFlags, 1"\r | |
156 | jz @F\r | |
157 | pushf\r | |
158 | @@: \r | |
159 | pushw %cs\r | |
160 | MISMATCH: " push @FarCallRet - _Code16Addr"\r | |
161 | jz @F\r | |
162 | MISMATCH: " jmp fword ptr [esp + 6]"\r | |
163 | @@: \r | |
164 | MISMATCH: " 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 | |
173 | MISMATCH: " lea bp, [esp + sizeof (IA32_REGS)]"\r | |
174 | .byte 0x66\r | |
175 | MISMATCH: " 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 | |
180 | MISMATCH: " jmp fword ptr [bp].RetEip"\r | |
181 | \r | |
182 | \r | |
183 | MISMATCH: "_16Idtr FWORD (1 SHL 10) - 1"\r | |
184 | \r | |
185 | _TEXT16: \r | |
186 | \r | |
187 | MISMATCH: "_TEXT16SIZE = _TEXT16- _Code16Addr"\r | |
188 | \r | |
189 | MISMATCH: "_TEXT16S"\r | |
190 | \r | |
191 | \r |