]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DxeIpl/DxeInit.c
1. Enabled SSP(StorageSecurityCommandProtocol) for ATA devices.
[mirror_edk2.git] / DuetPkg / DxeIpl / DxeInit.c
CommitLineData
18b84857 1/** @file\r
ca162103 2\r
b1f700a8
HT
3Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials \r
ca162103 5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13 DxeInit.c\r
14\r
15Abstract:\r
16\r
17Revision History:\r
18\r
18b84857 19**/\r
ca162103 20\r
21#include "DxeIpl.h"\r
22\r
23#include "LegacyTable.h"\r
24#include "HobGeneration.h"\r
25#include "PpisNeededByDxeCore.h"\r
26#include "Debug.h"\r
27\r
28/*\r
29--------------------------------------------------------\r
30 Memory Map: (XX=32,64)\r
31--------------------------------------------------------\r
320x0\r
33 IVT\r
340x400\r
35 BDA\r
360x500\r
37\r
380x7C00\r
39 BootSector\r
400x10000\r
41 EfiLdr (relocate by efiXX.COM)\r
420x15000\r
43 Efivar.bin (Load by StartXX.COM)\r
440x20000\r
45 StartXX.COM (E820 table, Temporary GDT, Temporary IDT)\r
460x21000\r
47 EfiXX.COM (Temporary Interrupt Handler)\r
480x22000\r
49 EfiLdr.efi + DxeIpl.Z + DxeMain.Z + BFV.Z\r
500x86000\r
51 MemoryFreeUnder1M (For legacy driver DMA)\r
520x90000\r
53 Temporary 4G PageTable for X64 (6 page)\r
540x9F800\r
55 EBDA\r
560xA0000\r
57 VGA\r
580xC0000\r
59 OPROM\r
600xE0000\r
61 FIRMEWARE\r
620x100000 (1M)\r
63 Temporary Stack (1M)\r
640x200000\r
65\r
66MemoryAbove1MB.PhysicalStart <-----------------------------------------------------+\r
67 ... |\r
68 ... |\r
69 <- Phit.EfiMemoryBottom -------------------+ |\r
70 HOB | |\r
71 <- Phit.EfiFreeMemoryBottom | |\r
72 | MemoryFreeAbove1MB.ResourceLength\r
73 <- Phit.EfiFreeMemoryTop ------+ | |\r
74 MemoryDescriptor (For ACPINVS, ACPIReclaim) | 4M = CONSUMED_MEMORY |\r
75 | | |\r
76 Permament 4G PageTable for IA32 or MemoryAllocation | |\r
77 Permament 64G PageTable for X64 | | |\r
78 <------------------------------+ | |\r
79 Permament Stack (0x20 Pages = 128K) | |\r
80 <- Phit.EfiMemoryTop ----------+-----------+---------------+\r
d569cbb0 81 NvFV (64K) |\r
ca162103 82 MMIO\r
d569cbb0 83 FtwFV (128K) | \r
84 <----------------------------------------------------------+<---------+\r
85 DxeCore | |\r
86 DxeCore |\r
87 DxeIpl | Allocated in EfiLdr\r
88 <----------------------------------------------------------+ |\r
89 BFV MMIO |\r
90 <- Top of Free Memory reported by E820 --------------------+<---------+\r
ca162103 91 ACPINVS or\r
92 ACPIReclaim or\r
93 Reserved\r
94 <- Memory Top on RealMemory\r
95\r
960x100000000 (4G)\r
97\r
98MemoryFreeAbove4G.Physicalstart <--------------------------------------------------+\r
99 |\r
100 |\r
101 MemoryFreeAbove4GB.ResourceLength\r
102 |\r
103 |\r
104 <--------------------------------------------------+\r
105*/\r
106\r
107VOID\r
108EnterDxeMain (\r
109 IN VOID *StackTop,\r
110 IN VOID *DxeCoreEntryPoint,\r
111 IN VOID *Hob,\r
112 IN VOID *PageTable\r
113 );\r
114\r
115VOID\r
116DxeInit (\r
117 IN EFILDRHANDOFF *Handoff\r
118 )\r
119/*++\r
120\r
121 Routine Description:\r
122\r
123 This is the entry point after this code has been loaded into memory. \r
124\r
125Arguments:\r
126\r
127\r
128Returns:\r
129\r
130 Calls into EFI Firmware\r
131\r
132--*/\r
133{\r
134 VOID *StackTop;\r
135 VOID *StackBottom;\r
136 VOID *PageTableBase;\r
137 VOID *MemoryTopOnDescriptor;\r
138 VOID *MemoryDescriptor;\r
139 VOID *NvStorageBase;\r
eb16e240 140 CHAR8 PrintBuffer[256];\r
dcb428da 141 EFILDRHANDOFF HandoffCopy;\r
142\r
143 CopyMem ((VOID*) &HandoffCopy, (VOID*) Handoff, sizeof (EFILDRHANDOFF));\r
144 Handoff = &HandoffCopy;\r
145\r
df166ce5 146 ClearScreen();\r
ff514e29 147 PrintString("Enter DxeIpl ...\n");\r
e25803f0 148 \r
ca162103 149/*\r
150 ClearScreen();\r
151 PrintString("handoff:\n");\r
152 PrintString("Handoff.BfvBase = "); \r
153 PrintValue64((UINT64)(UINTN)Handoff->BfvBase);\r
154 PrintString(", "); \r
155 PrintString("BfvLength = "); \r
156 PrintValue64(Handoff->BfvSize);\r
157 PrintString("\n"); \r
158 PrintString("Handoff.DxeIplImageBase = "); \r
159 PrintValue64((UINT64)(UINTN)Handoff->DxeIplImageBase);\r
160 PrintString(", "); \r
161 PrintString("DxeIplImageSize = "); \r
162 PrintValue64(Handoff->DxeIplImageSize);\r
163 PrintString("\n"); \r
164 PrintString("Handoff.DxeCoreImageBase = "); \r
165 PrintValue64((UINT64)(UINTN)Handoff->DxeCoreImageBase);\r
166 PrintString(", "); \r
167 PrintString("DxeCoreImageSize = "); \r
168 PrintValue64(Handoff->DxeCoreImageSize);\r
169 PrintString("\n"); \r
170*/\r
171 //\r
172 // Hob Generation Guild line:\r
173 // * Don't report FV as physical memory\r
174 // * MemoryAllocation Hob should only cover physical memory\r
175 // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped\r
e25803f0 176 PrintString("Prepare Cpu HOB information ...\n");\r
ca162103 177 PrepareHobCpu ();\r
e25803f0 178\r
ca162103 179 //\r
180 // 1. BFV\r
181 //\r
e25803f0 182 PrintString("Prepare BFV HOB information ...\n");\r
ca162103 183 PrepareHobBfv (Handoff->BfvBase, Handoff->BfvSize);\r
184\r
185 //\r
186 // 2. Updates Memory information, and get the top free address under 4GB\r
187 //\r
e25803f0 188 PrintString("Prepare Memory HOB information ...\n");\r
ca162103 189 MemoryTopOnDescriptor = PrepareHobMemory (Handoff->MemDescCount, Handoff->MemDesc);\r
e25803f0 190 \r
ca162103 191 //\r
192 // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB]\r
193 //\r
194 \r
195 // 3.1 NV data\r
e25803f0 196 PrintString("Prepare NV Storage information ...\n");\r
ca162103 197 NvStorageBase = PrepareHobNvStorage (MemoryTopOnDescriptor);\r
eb16e240 198 AsciiSPrint (PrintBuffer, 256, "NV Storage Base=0x%x\n", (UINTN)NvStorageBase);\r
199 PrintString (PrintBuffer);\r
e25803f0 200 \r
ca162103 201 // 3.2 Stack\r
202 StackTop = NvStorageBase;\r
203 StackBottom = PrepareHobStack (StackTop);\r
eb16e240 204 AsciiSPrint (PrintBuffer, 256, "Stack Top=0x%x, Stack Bottom=0x%x\n", \r
205 (UINTN)StackTop, (UINTN)StackBottom);\r
206 PrintString (PrintBuffer);\r
ca162103 207 // 3.3 Page Table\r
208 PageTableBase = PreparePageTable (StackBottom, gHob->Cpu.SizeOfMemorySpace);\r
209 // 3.4 MemDesc (will be used in PlatformBds)\r
210 MemoryDescriptor = PrepareHobMemoryDescriptor (PageTableBase, Handoff->MemDescCount, Handoff->MemDesc);\r
211 // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob\r
212 PrepareHobPhit (StackTop, MemoryDescriptor);\r
213\r
214 //\r
215 // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore\r
216 //\r
e25803f0 217 PrintString("Prepare DxeCore memory Hob ...\n");\r
ca162103 218 PrepareHobDxeCore (\r
219 Handoff->DxeCoreEntryPoint,\r
220 (EFI_PHYSICAL_ADDRESS)(UINTN)Handoff->DxeCoreImageBase,\r
221 (UINTN)Handoff->DxeIplImageBase + (UINTN)Handoff->DxeIplImageSize - (UINTN)Handoff->DxeCoreImageBase\r
222 );\r
223\r
224 PrepareHobLegacyTable (gHob);\r
e25803f0 225 \r
ca162103 226 PreparePpisNeededByDxeCore (gHob);\r
227\r
228 CompleteHobGeneration ();\r
229\r
eb16e240 230 AsciiSPrint (PrintBuffer, 256, "HobStart=0x%x\n", (UINTN)gHob);\r
231 PrintString (PrintBuffer);\r
232\r
233 AsciiSPrint (PrintBuffer, 256, "Memory Top=0x%x, Bottom=0x%x\n", \r
234 (UINTN)gHob->Phit.EfiMemoryTop, (UINTN)gHob->Phit.EfiMemoryBottom);\r
235 PrintString (PrintBuffer);\r
236\r
237 AsciiSPrint (PrintBuffer, 256, "Free Memory Top=0x%x, Bottom=0x%x\n", \r
238 (UINTN)gHob->Phit.EfiFreeMemoryTop, (UINTN)gHob->Phit.EfiFreeMemoryBottom);\r
239 PrintString (PrintBuffer);\r
240\r
241 AsciiSPrint (PrintBuffer, 256, "Nv Base=0x%x, Length=0x%x\n", \r
242 (UINTN)gHob->NvStorageFvb.FvbInfo.Entries[0].Base, \r
243 (UINTN)gHob->NvFtwFvb.FvbInfo.Entries[0].Length);\r
244 PrintString (PrintBuffer);\r
ca162103 245/*\r
246 //\r
247 // Print Hob Info\r
248 //\r
249 ClearScreen();\r
250 PrintString("Hob Info\n");\r
251 PrintString("Phit.EfiMemoryTop = "); \r
252 PrintValue64(gHob->Phit.EfiMemoryTop);\r
253 PrintString(" Phit.EfiMemoryBottom = "); \r
254 PrintValue64(gHob->Phit.EfiMemoryBottom);\r
255 PrintString("\n"); \r
256 PrintString("Phit.EfiFreeMemoryTop = "); \r
257 PrintValue64(gHob->Phit.EfiFreeMemoryTop);\r
258 PrintString(" Phit.EfiFreeMemoryBottom = "); \r
259 PrintValue64(gHob->Phit.EfiFreeMemoryBottom);\r
260 PrintString("\n"); \r
261 PrintString("Bfv = "); \r
262 PrintValue64(gHob->Bfv.BaseAddress);\r
263 PrintString(" BfvLength = "); \r
264 PrintValue64(gHob->Bfv.Length);\r
265 PrintString("\n");\r
266 PrintString("NvStorageFvb = ");\r
267 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Base);\r
268 PrintString(" Length = ");\r
269 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Length);\r
270 PrintString("\n");\r
271 PrintString("NvFtwFvb = ");\r
272 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Base);\r
273 PrintString(" Length = ");\r
274 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Length);\r
275 PrintString("\n");\r
d569cbb0 276 PrintString("BfvResource = ");\r
277 PrintValue64(gHob->BfvResource.PhysicalStart);\r
278 PrintString(" Length = ");\r
279 PrintValue64(gHob->BfvResource.ResourceLength);\r
280 PrintString("\n");\r
281 PrintString("NvStorageFvResource = ");\r
282 PrintValue64(gHob->NvStorageFvResource.PhysicalStart);\r
283 PrintString(" Length = ");\r
284 PrintValue64(gHob->NvStorageFvResource.ResourceLength);\r
285 PrintString("\n");\r
286 PrintString("NvStorage = ");\r
287 PrintValue64(gHob->NvStorage.FvbInfo.Entries[0].Base);\r
288 PrintString(" Length = ");\r
289 PrintValue64(gHob->NvStorage.FvbInfo.Entries[0].Length);\r
290 PrintString("\n");\r
291 PrintString("NvFtwFvResource = ");\r
292 PrintValue64(gHob->NvFtwFvResource.PhysicalStart);\r
293 PrintString(" Length = ");\r
294 PrintValue64(gHob->NvFtwFvResource.ResourceLength);\r
295 PrintString("\n");\r
296 PrintString("NvFtwWorking = ");\r
297 PrintValue64(gHob->NvFtwWorking.FvbInfo.Entries[0].Base);\r
298 PrintString(" Length = ");\r
299 PrintValue64(gHob->NvFtwWorking.FvbInfo.Entries[0].Length);\r
300 PrintString("\n");\r
301 PrintString("NvFtwSpare = ");\r
302 PrintValue64(gHob->NvFtwSpare.FvbInfo.Entries[0].Base);\r
303 PrintString(" Length = ");\r
304 PrintValue64(gHob->NvFtwSpare.FvbInfo.Entries[0].Length);\r
305 PrintString("\n");\r
ca162103 306 PrintString("Stack = "); \r
307 PrintValue64(gHob->Stack.AllocDescriptor.MemoryBaseAddress);\r
308 PrintString(" StackLength = "); \r
309 PrintValue64(gHob->Stack.AllocDescriptor.MemoryLength);\r
310 PrintString("\n"); \r
d569cbb0 311 PrintString("PageTable = "); \r
312 PrintValue64((UINTN)PageTableBase);\r
313 PrintString("\n"); \r
ca162103 314 PrintString("MemoryFreeUnder1MB = "); \r
315 PrintValue64(gHob->MemoryFreeUnder1MB.PhysicalStart);\r
316 PrintString(" MemoryFreeUnder1MBLength = "); \r
317 PrintValue64(gHob->MemoryFreeUnder1MB.ResourceLength);\r
318 PrintString("\n"); \r
319 PrintString("MemoryAbove1MB = "); \r
320 PrintValue64(gHob->MemoryAbove1MB.PhysicalStart);\r
321 PrintString(" MemoryAbove1MBLength = "); \r
322 PrintValue64(gHob->MemoryAbove1MB.ResourceLength);\r
323 PrintString("\n"); \r
324 PrintString("MemoryAbove4GB = "); \r
325 PrintValue64(gHob->MemoryAbove4GB.PhysicalStart);\r
326 PrintString(" MemoryAbove4GBLength = "); \r
327 PrintValue64(gHob->MemoryAbove4GB.ResourceLength);\r
328 PrintString("\n"); \r
329 PrintString("DxeCore = "); \r
330 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress);\r
331 PrintString(" DxeCoreLength = "); \r
332 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryLength);\r
333 PrintString("\n"); \r
334 PrintString("MemoryAllocation = "); \r
335 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress);\r
336 PrintString(" MemoryLength = "); \r
337 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryLength);\r
338 PrintString("\n"); \r
339 EFI_DEADLOOP();\r
340*/\r
a4f31daf 341\r
ca162103 342 ClearScreen();\r
343 PrintString("\n\n\n\n\n\n\n\n\n\n");\r
344 PrintString(" WELCOME TO EFI WORLD!\n");\r
e25803f0 345 \r
ca162103 346 EnterDxeMain (StackTop, Handoff->DxeCoreEntryPoint, gHob, PageTableBase);\r
9008db4a 347 \r
e25803f0 348 PrintString("Fail to enter DXE main!\n");\r
ca162103 349 //\r
350 // Should never get here\r
351 //\r
352 CpuDeadLoop ();\r
353}\r
354\r
df166ce5 355EFI_STATUS\r
356EFIAPI\r
357_ModuleEntryPoint (\r
358 IN EFILDRHANDOFF *Handoff\r
359 )\r
360{\r
361 DxeInit(Handoff);\r
362 return EFI_SUCCESS;\r
363}\r