]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/FspSupport/Library/SecFspPlatformSecLibVlv2/Ia32/SecEntry.asm
Vlv2TbltDevicePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Vlv2TbltDevicePkg / FspSupport / Library / SecFspPlatformSecLibVlv2 / Ia32 / SecEntry.asm
CommitLineData
3cbfba02
DW
1;------------------------------------------------------------------------------\r
2;\r
3; Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
9dc8036d 4; SPDX-License-Identifier: BSD-2-Clause-Patent\r
3cbfba02
DW
5;\r
6; Module Name:\r
7;\r
8; SecEntry.asm\r
9;\r
10; Abstract:\r
11;\r
12; This is the code that goes from real-mode to protected mode.\r
13; It consumes the reset vector, calls two basic APIs from FSP binary.\r
14;\r
15;------------------------------------------------------------------------------\r
16 INCLUDE Fsp.inc\r
17\r
18.686p\r
19.xmm\r
20.model small, c\r
21\r
22EXTRN CallPeiCoreEntryPoint:NEAR\r
23EXTRN TempRamInitParams:FAR\r
24\r
25; Pcds\r
26EXTRN PcdGet32 (PcdFlashFvFspBase):DWORD\r
27EXTRN PcdGet32 (PcdFlashFvFspSize):DWORD\r
28\r
29_TEXT_REALMODE SEGMENT PARA PUBLIC USE16 'CODE'\r
30 ASSUME CS:_TEXT_REALMODE, DS:_TEXT_REALMODE\r
31\r
32;----------------------------------------------------------------------------\r
33;\r
34; Procedure: _ModuleEntryPoint\r
35;\r
36; Input: None\r
37;\r
38; Output: None\r
39;\r
40; Destroys: Assume all registers\r
41;\r
42; Description:\r
43;\r
44; Transition to non-paged flat-model protected mode from a\r
45; hard-coded GDT that provides exactly two descriptors.\r
46; This is a bare bones transition to protected mode only\r
47; used for a while in PEI and possibly DXE.\r
48;\r
49; After enabling protected mode, a far jump is executed to\r
50; transfer to PEI using the newly loaded GDT.\r
51;\r
52; Return: None\r
53;\r
54; MMX Usage:\r
55; MM0 = BIST State\r
56; MM5 = Save time-stamp counter value high32bit\r
57; MM6 = Save time-stamp counter value low32bit.\r
58;\r
59;----------------------------------------------------------------------------\r
60\r
61align 4\r
62_ModuleEntryPoint PROC NEAR C PUBLIC\r
63 fninit ; clear any pending Floating point exceptions\r
64 ;\r
65 ; Store the BIST value in mm0\r
66 ;\r
67 movd mm0, eax\r
68\r
69 ;\r
70 ; Save time-stamp counter value\r
71 ; rdtsc load 64bit time-stamp counter to EDX:EAX\r
72 ;\r
73 rdtsc\r
74 movd mm5, edx\r
75 movd mm6, eax\r
76\r
77 ;\r
78 ; Load the GDT table in GdtDesc\r
79 ;\r
80 mov esi, OFFSET GdtDesc\r
81 DB 66h\r
82 lgdt fword ptr cs:[si]\r
83\r
84 ;\r
85 ; Transition to 16 bit protected mode\r
86 ;\r
87 mov eax, cr0 ; Get control register 0\r
88 or eax, 00000003h ; Set PE bit (bit #0) & MP bit (bit #1)\r
89 mov cr0, eax ; Activate protected mode\r
90\r
91 mov eax, cr4 ; Get control register 4\r
92 or eax, 00000600h ; Set OSFXSR bit (bit #9) & OSXMMEXCPT bit (bit #10)\r
93 mov cr4, eax\r
94\r
95 ;\r
96 ; Now we're in 16 bit protected mode\r
97 ; Set up the selectors for 32 bit protected mode entry\r
98 ;\r
99 mov ax, SYS_DATA_SEL\r
100 mov ds, ax\r
101 mov es, ax\r
102 mov fs, ax\r
103 mov gs, ax\r
104 mov ss, ax\r
105\r
106 ;\r
107 ; Transition to Flat 32 bit protected mode\r
108 ; The jump to a far pointer causes the transition to 32 bit mode\r
109 ;\r
110 mov esi, offset ProtectedModeEntryLinearAddress\r
111 jmp fword ptr cs:[si]\r
112\r
113_ModuleEntryPoint ENDP\r
114_TEXT_REALMODE ENDS\r
115\r
116_TEXT_PROTECTED_MODE SEGMENT PARA PUBLIC USE32 'CODE'\r
117 ASSUME CS:_TEXT_PROTECTED_MODE, DS:_TEXT_PROTECTED_MODE\r
118\r
119;----------------------------------------------------------------------------\r
120;\r
121; Procedure: ProtectedModeEntryPoint\r
122;\r
123; Input: None\r
124;\r
125; Output: None\r
126;\r
127; Destroys: Assume all registers\r
128;\r
129; Description:\r
130;\r
131; This function handles:\r
132; Call two basic APIs from FSP binary\r
133; Initializes stack with some early data (BIST, PEI entry, etc)\r
134;\r
135; Return: None\r
136;\r
137;----------------------------------------------------------------------------\r
138\r
139align 4\r
140ProtectedModeEntryPoint PROC NEAR PUBLIC\r
141\r
142 ; Find the fsp info header\r
143 mov edi, PcdGet32 (PcdFlashFvFspBase)\r
144 mov ecx, PcdGet32 (PcdFlashFvFspSize)\r
145\r
146 mov eax, dword ptr [edi + FVH_SIGINATURE_OFFSET]\r
147 cmp eax, FVH_SIGINATURE_VALID_VALUE\r
148 jnz FspHeaderNotFound\r
149\r
150 xor eax, eax\r
151 mov ax, word ptr [edi + FVH_EXTHEADER_OFFSET_OFFSET]\r
152 cmp ax, 0\r
153 jnz FspFvExtHeaderExist\r
154\r
155 xor eax, eax\r
156 mov ax, word ptr [edi + FVH_HEADER_LENGTH_OFFSET] ; Bypass Fv Header\r
157 add edi, eax\r
158 jmp FspCheckFfsHeader\r
159\r
160FspFvExtHeaderExist:\r
161 add edi, eax\r
162 mov eax, dword ptr [edi + FVH_EXTHEADER_SIZE_OFFSET] ; Bypass Ext Fv Header\r
163 add edi, eax\r
164\r
165 ; Round up to 8 byte alignment\r
166 mov eax, edi\r
167 and al, 07h\r
168 jz FspCheckFfsHeader\r
169\r
170 and edi, 0FFFFFFF8h\r
171 add edi, 08h\r
172\r
173FspCheckFfsHeader:\r
174 ; Check the ffs guid\r
175 mov eax, dword ptr [edi]\r
176 cmp eax, FSP_HEADER_GUID_DWORD1\r
177 jnz FspHeaderNotFound\r
178\r
179 mov eax, dword ptr [edi + 4]\r
180 cmp eax, FSP_HEADER_GUID_DWORD2\r
181 jnz FspHeaderNotFound\r
182\r
183 mov eax, dword ptr [edi + 8]\r
184 cmp eax, FSP_HEADER_GUID_DWORD3\r
185 jnz FspHeaderNotFound\r
186\r
187 mov eax, dword ptr [edi + 0Ch]\r
188 cmp eax, FSP_HEADER_GUID_DWORD4\r
189 jnz FspHeaderNotFound\r
190\r
191 add edi, FFS_HEADER_SIZE_VALUE ; Bypass the ffs header\r
192\r
193 ; Check the section type as raw section\r
194 mov al, byte ptr [edi + SECTION_HEADER_TYPE_OFFSET]\r
195 cmp al, 019h\r
196 jnz FspHeaderNotFound\r
197\r
198 add edi, RAW_SECTION_HEADER_SIZE_VALUE ; Bypass the section header\r
199 jmp FspHeaderFound\r
200\r
201FspHeaderNotFound:\r
202 jmp $\r
203\r
204FspHeaderFound:\r
205 ; Get the fsp TempRamInit Api address\r
206 mov eax, dword ptr [edi + FSP_HEADER_IMAGEBASE_OFFSET]\r
207 add eax, dword ptr [edi + FSP_HEADER_TEMPRAMINIT_OFFSET]\r
208\r
209 ; Setup the hardcode stack\r
210 mov esp, OFFSET TempRamInitStack\r
211\r
212 ; Call the fsp TempRamInit Api\r
213 jmp eax\r
214\r
215TempRamInitDone:\r
216 cmp eax, 0\r
217 jnz FspApiFailed\r
218\r
219 ; ECX: start of range\r
220 ; EDX: end of range\r
221 mov esp, edx\r
222 push edx\r
223 push ecx\r
224 push eax ; zero - no hob list yet\r
225 call CallPeiCoreEntryPoint\r
226\r
227FspApiFailed:\r
228 jmp $\r
229\r
230align 10h\r
231TempRamInitStack:\r
232 DD OFFSET TempRamInitDone\r
233 DD OFFSET TempRamInitParams\r
234\r
235ProtectedModeEntryPoint ENDP\r
236\r
237;\r
238; ROM-based Global-Descriptor Table for the Tiano PEI Phase\r
239;\r
240align 16\r
241PUBLIC BootGdtTable\r
242\r
243;\r
244; GDT[0]: 0x00: Null entry, never used.\r
245;\r
246NULL_SEL EQU $ - GDT_BASE ; Selector [0]\r
247GDT_BASE:\r
248BootGdtTable DD 0\r
249 DD 0\r
250;\r
251; Linear data segment descriptor\r
252;\r
253LINEAR_SEL EQU $ - GDT_BASE ; Selector [0x8]\r
254 DW 0FFFFh ; limit 0xFFFFF\r
255 DW 0 ; base 0\r
256 DB 0\r
257 DB 092h ; present, ring 0, data, expand-up, writable\r
258 DB 0CFh ; page-granular, 32-bit\r
259 DB 0\r
260;\r
261; Linear code segment descriptor\r
262;\r
263LINEAR_CODE_SEL EQU $ - GDT_BASE ; Selector [0x10]\r
264 DW 0FFFFh ; limit 0xFFFFF\r
265 DW 0 ; base 0\r
266 DB 0\r
267 DB 09Bh ; present, ring 0, data, expand-up, not-writable\r
268 DB 0CFh ; page-granular, 32-bit\r
269 DB 0\r
270;\r
271; System data segment descriptor\r
272;\r
273SYS_DATA_SEL EQU $ - GDT_BASE ; Selector [0x18]\r
274 DW 0FFFFh ; limit 0xFFFFF\r
275 DW 0 ; base 0\r
276 DB 0\r
277 DB 093h ; present, ring 0, data, expand-up, not-writable\r
278 DB 0CFh ; page-granular, 32-bit\r
279 DB 0\r
280\r
281;\r
282; System code segment descriptor\r
283;\r
284SYS_CODE_SEL EQU $ - GDT_BASE ; Selector [0x20]\r
285 DW 0FFFFh ; limit 0xFFFFF\r
286 DW 0 ; base 0\r
287 DB 0\r
288 DB 09Ah ; present, ring 0, data, expand-up, writable\r
289 DB 0CFh ; page-granular, 32-bit\r
290 DB 0\r
291;\r
292; Spare segment descriptor\r
293;\r
294SYS16_CODE_SEL EQU $ - GDT_BASE ; Selector [0x28]\r
295 DW 0FFFFh ; limit 0xFFFFF\r
296 DW 0 ; base 0\r
297 DB 0Eh ; Changed from F000 to E000.\r
298 DB 09Bh ; present, ring 0, code, expand-up, writable\r
299 DB 00h ; byte-granular, 16-bit\r
300 DB 0\r
301;\r
302; Spare segment descriptor\r
303;\r
304SYS16_DATA_SEL EQU $ - GDT_BASE ; Selector [0x30]\r
305 DW 0FFFFh ; limit 0xFFFF\r
306 DW 0 ; base 0\r
307 DB 0\r
308 DB 093h ; present, ring 0, data, expand-up, not-writable\r
309 DB 00h ; byte-granular, 16-bit\r
310 DB 0\r
311\r
312;\r
313; Spare segment descriptor\r
314;\r
315SPARE5_SEL EQU $ - GDT_BASE ; Selector [0x38]\r
316 DW 0 ; limit 0\r
317 DW 0 ; base 0\r
318 DB 0\r
319 DB 0 ; present, ring 0, data, expand-up, writable\r
320 DB 0 ; page-granular, 32-bit\r
321 DB 0\r
322GDT_SIZE EQU $ - BootGdtTable ; Size, in bytes\r
323\r
324;\r
325; GDT Descriptor\r
326;\r
327GdtDesc: ; GDT descriptor\r
328 DW GDT_SIZE - 1 ; GDT limit\r
329 DD OFFSET BootGdtTable ; GDT base address\r
330\r
331\r
332ProtectedModeEntryLinearAddress LABEL FWORD\r
333ProtectedModeEntryLinearOffset LABEL DWORD\r
334 DD OFFSET ProtectedModeEntryPoint ; Offset of our 32 bit code\r
335 DW LINEAR_CODE_SEL\r
336\r
337_TEXT_PROTECTED_MODE ENDS\r
338END\r