]>
git.proxmox.com Git - mirror_edk2.git/blob - DuetPkg/DxeIpl/DxeInit.c
3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
23 #include "LegacyTable.h"
24 #include "HobGeneration.h"
25 #include "PpisNeededByDxeCore.h"
29 --------------------------------------------------------
30 Memory Map: (XX=32,64)
31 --------------------------------------------------------
41 EfiLdr (relocate by efiXX.COM)
43 Efivar.bin (Load by StartXX.COM)
45 StartXX.COM (E820 table, Temporary GDT, Temporary IDT)
47 EfiXX.COM (Temporary Interrupt Handler)
49 EfiLdr.efi + DxeIpl.Z + DxeMain.Z + BFV.Z
51 MemoryFreeUnder1M (For legacy driver DMA)
53 Temporary 4G PageTable for X64 (6 page)
66 MemoryAbove1MB.PhysicalStart <-----------------------------------------------------+
69 <- Phit.EfiMemoryBottom -------------------+ |
71 <- Phit.EfiFreeMemoryBottom | |
72 | MemoryFreeAbove1MB.ResourceLength
73 <- Phit.EfiFreeMemoryTop ------+ | |
74 MemoryDescriptor (For ACPINVS, ACPIReclaim) | 4M = CONSUMED_MEMORY |
76 Permament 4G PageTable for IA32 or MemoryAllocation | |
77 Permament 64G PageTable for X64 | | |
78 <------------------------------+ | |
79 Permament Stack (0x20 Pages = 128K) | |
80 <- Phit.EfiMemoryTop ----------+-----------+---------------+
84 <----------------------------------------------------------+<---------+
87 DxeIpl | Allocated in EfiLdr
88 <----------------------------------------------------------+ |
90 <- Top of Free Memory reported by E820 --------------------+<---------+
94 <- Memory Top on RealMemory
98 MemoryFreeAbove4G.Physicalstart <--------------------------------------------------+
101 MemoryFreeAbove4GB.ResourceLength
104 <--------------------------------------------------+
110 IN VOID
*DxeCoreEntryPoint
,
117 IN EFILDRHANDOFF
*Handoff
123 This is the entry point after this code has been loaded into memory.
130 Calls into EFI Firmware
137 VOID
*MemoryTopOnDescriptor
;
138 VOID
*MemoryDescriptor
;
140 CHAR8 PrintBuffer
[256];
143 PrintString("Enter DxeIpl ...\n");
147 PrintString("handoff:\n");
148 PrintString("Handoff.BfvBase = ");
149 PrintValue64((UINT64)(UINTN)Handoff->BfvBase);
151 PrintString("BfvLength = ");
152 PrintValue64(Handoff->BfvSize);
154 PrintString("Handoff.DxeIplImageBase = ");
155 PrintValue64((UINT64)(UINTN)Handoff->DxeIplImageBase);
157 PrintString("DxeIplImageSize = ");
158 PrintValue64(Handoff->DxeIplImageSize);
160 PrintString("Handoff.DxeCoreImageBase = ");
161 PrintValue64((UINT64)(UINTN)Handoff->DxeCoreImageBase);
163 PrintString("DxeCoreImageSize = ");
164 PrintValue64(Handoff->DxeCoreImageSize);
168 // Hob Generation Guild line:
169 // * Don't report FV as physical memory
170 // * MemoryAllocation Hob should only cover physical memory
171 // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped
172 PrintString("Prepare Cpu HOB information ...\n");
178 PrintString("Prepare BFV HOB information ...\n");
179 PrepareHobBfv (Handoff
->BfvBase
, Handoff
->BfvSize
);
182 // 2. Updates Memory information, and get the top free address under 4GB
184 PrintString("Prepare Memory HOB information ...\n");
185 MemoryTopOnDescriptor
= PrepareHobMemory (Handoff
->MemDescCount
, Handoff
->MemDesc
);
188 // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB]
192 PrintString("Prepare NV Storage information ...\n");
193 NvStorageBase
= PrepareHobNvStorage (MemoryTopOnDescriptor
);
194 AsciiSPrint (PrintBuffer
, 256, "NV Storage Base=0x%x\n", (UINTN
)NvStorageBase
);
195 PrintString (PrintBuffer
);
198 StackTop
= NvStorageBase
;
199 StackBottom
= PrepareHobStack (StackTop
);
200 AsciiSPrint (PrintBuffer
, 256, "Stack Top=0x%x, Stack Bottom=0x%x\n",
201 (UINTN
)StackTop
, (UINTN
)StackBottom
);
202 PrintString (PrintBuffer
);
204 PageTableBase
= PreparePageTable (StackBottom
, gHob
->Cpu
.SizeOfMemorySpace
);
205 // 3.4 MemDesc (will be used in PlatformBds)
206 MemoryDescriptor
= PrepareHobMemoryDescriptor (PageTableBase
, Handoff
->MemDescCount
, Handoff
->MemDesc
);
207 // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob
208 PrepareHobPhit (StackTop
, MemoryDescriptor
);
211 // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore
213 PrintString("Prepare DxeCore memory Hob ...\n");
215 Handoff
->DxeCoreEntryPoint
,
216 (EFI_PHYSICAL_ADDRESS
)(UINTN
)Handoff
->DxeCoreImageBase
,
217 (UINTN
)Handoff
->DxeIplImageBase
+ (UINTN
)Handoff
->DxeIplImageSize
- (UINTN
)Handoff
->DxeCoreImageBase
220 PrepareHobLegacyTable (gHob
);
222 PreparePpisNeededByDxeCore (gHob
);
224 CompleteHobGeneration ();
226 AsciiSPrint (PrintBuffer
, 256, "HobStart=0x%x\n", (UINTN
)gHob
);
227 PrintString (PrintBuffer
);
229 AsciiSPrint (PrintBuffer
, 256, "Memory Top=0x%x, Bottom=0x%x\n",
230 (UINTN
)gHob
->Phit
.EfiMemoryTop
, (UINTN
)gHob
->Phit
.EfiMemoryBottom
);
231 PrintString (PrintBuffer
);
233 AsciiSPrint (PrintBuffer
, 256, "Free Memory Top=0x%x, Bottom=0x%x\n",
234 (UINTN
)gHob
->Phit
.EfiFreeMemoryTop
, (UINTN
)gHob
->Phit
.EfiFreeMemoryBottom
);
235 PrintString (PrintBuffer
);
237 AsciiSPrint (PrintBuffer
, 256, "Nv Base=0x%x, Length=0x%x\n",
238 (UINTN
)gHob
->NvStorageFvb
.FvbInfo
.Entries
[0].Base
,
239 (UINTN
)gHob
->NvFtwFvb
.FvbInfo
.Entries
[0].Length
);
240 PrintString (PrintBuffer
);
246 PrintString("Hob Info\n");
247 PrintString("Phit.EfiMemoryTop = ");
248 PrintValue64(gHob->Phit.EfiMemoryTop);
249 PrintString(" Phit.EfiMemoryBottom = ");
250 PrintValue64(gHob->Phit.EfiMemoryBottom);
252 PrintString("Phit.EfiFreeMemoryTop = ");
253 PrintValue64(gHob->Phit.EfiFreeMemoryTop);
254 PrintString(" Phit.EfiFreeMemoryBottom = ");
255 PrintValue64(gHob->Phit.EfiFreeMemoryBottom);
257 PrintString("Bfv = ");
258 PrintValue64(gHob->Bfv.BaseAddress);
259 PrintString(" BfvLength = ");
260 PrintValue64(gHob->Bfv.Length);
262 PrintString("NvStorageFvb = ");
263 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Base);
264 PrintString(" Length = ");
265 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Length);
267 PrintString("NvFtwFvb = ");
268 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Base);
269 PrintString(" Length = ");
270 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Length);
272 PrintString("BfvResource = ");
273 PrintValue64(gHob->BfvResource.PhysicalStart);
274 PrintString(" Length = ");
275 PrintValue64(gHob->BfvResource.ResourceLength);
277 PrintString("NvStorageFvResource = ");
278 PrintValue64(gHob->NvStorageFvResource.PhysicalStart);
279 PrintString(" Length = ");
280 PrintValue64(gHob->NvStorageFvResource.ResourceLength);
282 PrintString("NvStorage = ");
283 PrintValue64(gHob->NvStorage.FvbInfo.Entries[0].Base);
284 PrintString(" Length = ");
285 PrintValue64(gHob->NvStorage.FvbInfo.Entries[0].Length);
287 PrintString("NvFtwFvResource = ");
288 PrintValue64(gHob->NvFtwFvResource.PhysicalStart);
289 PrintString(" Length = ");
290 PrintValue64(gHob->NvFtwFvResource.ResourceLength);
292 PrintString("NvFtwWorking = ");
293 PrintValue64(gHob->NvFtwWorking.FvbInfo.Entries[0].Base);
294 PrintString(" Length = ");
295 PrintValue64(gHob->NvFtwWorking.FvbInfo.Entries[0].Length);
297 PrintString("NvFtwSpare = ");
298 PrintValue64(gHob->NvFtwSpare.FvbInfo.Entries[0].Base);
299 PrintString(" Length = ");
300 PrintValue64(gHob->NvFtwSpare.FvbInfo.Entries[0].Length);
302 PrintString("Stack = ");
303 PrintValue64(gHob->Stack.AllocDescriptor.MemoryBaseAddress);
304 PrintString(" StackLength = ");
305 PrintValue64(gHob->Stack.AllocDescriptor.MemoryLength);
307 PrintString("PageTable = ");
308 PrintValue64((UINTN)PageTableBase);
310 PrintString("MemoryFreeUnder1MB = ");
311 PrintValue64(gHob->MemoryFreeUnder1MB.PhysicalStart);
312 PrintString(" MemoryFreeUnder1MBLength = ");
313 PrintValue64(gHob->MemoryFreeUnder1MB.ResourceLength);
315 PrintString("MemoryAbove1MB = ");
316 PrintValue64(gHob->MemoryAbove1MB.PhysicalStart);
317 PrintString(" MemoryAbove1MBLength = ");
318 PrintValue64(gHob->MemoryAbove1MB.ResourceLength);
320 PrintString("MemoryAbove4GB = ");
321 PrintValue64(gHob->MemoryAbove4GB.PhysicalStart);
322 PrintString(" MemoryAbove4GBLength = ");
323 PrintValue64(gHob->MemoryAbove4GB.ResourceLength);
325 PrintString("DxeCore = ");
326 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress);
327 PrintString(" DxeCoreLength = ");
328 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryLength);
330 PrintString("MemoryAllocation = ");
331 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress);
332 PrintString(" MemoryLength = ");
333 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryLength);
339 PrintString("\n\n\n\n\n\n\n\n\n\n");
340 PrintString(" WELCOME TO EFI WORLD!\n");
342 EnterDxeMain (StackTop
, Handoff
->DxeCoreEntryPoint
, gHob
, PageTableBase
);
344 PrintString("Fail to enter DXE main!\n");
346 // Should never get here
354 IN EFILDRHANDOFF
*Handoff