3 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4 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 EFILDRHANDOFF HandoffCopy
;
142 CopyMem ((VOID
*) &HandoffCopy
, (VOID
*) Handoff
, sizeof (EFILDRHANDOFF
));
143 Handoff
= &HandoffCopy
;
150 "Handoff.BfvBase = %p, BfvLength = %x\n"
151 "Handoff.DxeIplImageBase = %p, DxeIplImageSize = %x\n"
152 "Handoff.DxeCoreImageBase = %p, DxeCoreImageSize = %x\n",
153 Handoff
->BfvBase
, Handoff
->BfvSize
,
154 Handoff
->DxeIplImageBase
, Handoff
->DxeIplImageSize
,
155 Handoff
->DxeCoreImageBase
, Handoff
->DxeCoreImageSize
159 // Hob Generation Guild line:
160 // * Don't report FV as physical memory
161 // * MemoryAllocation Hob should only cover physical memory
162 // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped
163 PrintString ("Prepare Cpu HOB information ...\n");
169 PrintString ("Prepare BFV HOB information ...\n");
170 PrepareHobBfv (Handoff
->BfvBase
, Handoff
->BfvSize
);
173 // 2. Updates Memory information, and get the top free address under 4GB
175 PrintString ("Prepare Memory HOB information ...\n");
176 MemoryTopOnDescriptor
= PrepareHobMemory (Handoff
->MemDescCount
, Handoff
->MemDesc
);
179 // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB]
183 PrintString ("Prepare NV Storage information ...\n");
184 NvStorageBase
= PrepareHobNvStorage (MemoryTopOnDescriptor
);
185 PrintString ("NV Storage Base = %p\n", NvStorageBase
);
187 StackTop
= NvStorageBase
;
188 StackBottom
= PrepareHobStack (StackTop
);
189 PrintString ("Stack Top=0x%x, Stack Bottom=0x%x\n", StackTop
, StackBottom
);
191 PageTableBase
= PreparePageTable (StackBottom
, gHob
->Cpu
.SizeOfMemorySpace
);
192 // 3.4 MemDesc (will be used in PlatformBds)
193 MemoryDescriptor
= PrepareHobMemoryDescriptor (PageTableBase
, Handoff
->MemDescCount
, Handoff
->MemDesc
);
194 // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob
195 PrepareHobPhit (StackTop
, MemoryDescriptor
);
198 // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore
200 PrintString ("Prepare DxeCore memory Hob ...\n");
202 Handoff
->DxeCoreEntryPoint
,
203 (EFI_PHYSICAL_ADDRESS
)(UINTN
)Handoff
->DxeCoreImageBase
,
204 (UINTN
)Handoff
->DxeIplImageBase
+ (UINTN
)Handoff
->DxeIplImageSize
- (UINTN
)Handoff
->DxeCoreImageBase
207 PrepareHobLegacyTable (gHob
);
209 PreparePpisNeededByDxeCore (gHob
);
211 CompleteHobGeneration ();
219 "Memory Top = %lx, Bottom = %lx\n"
220 "Free Memory Top = %lx, Bottom = %lx\n"
221 "NvStorageFvb = %lx, Length = %lx\n"
222 "BfvResource = %lx, Length = %lx\n"
223 "NvStorageFvResource = %lx, Length = %lx\n"
224 "NvStorage = %lx, Length = %lx\n"
225 "NvFtwFvResource = %lx, Length = %lx\n"
226 "NvFtwWorking = %lx, Length = %lx\n"
227 "NvFtwSpare = %lx, Length = %lx\n"
228 "Stack = %lx, StackLength = %lx\n"
230 "MemoryFreeUnder1MB = %lx, MemoryFreeUnder1MBLength = %lx\n"
231 "MemoryAbove1MB = %lx, MemoryAbove1MBLength = %lx\n"
232 "MemoryAbove4GB = %lx, MemoryAbove4GBLength = %lx\n"
233 "DxeCore = %lx, DxeCoreLength = %lx\n"
234 "MemoryAllocation = %lx, MemoryLength = %lx\n"
237 gHob
->Phit
.EfiMemoryTop
, gHob
->Phit
.EfiMemoryBottom
,
238 gHob
->Phit
.EfiFreeMemoryTop
, gHob
->Phit
.EfiFreeMemoryBottom
,
239 gHob
->NvStorageFvb
.FvbInfo
.Entries
[0].Base
, gHob
->NvFtwFvb
.FvbInfo
.Entries
[0].Length
,
240 gHob
->BfvResource
.PhysicalStart
, gHob
->BfvResource
.ResourceLength
,
241 gHob
->NvStorageFvResource
.PhysicalStart
, gHob
->NvStorageFvResource
.ResourceLength
,
242 gHob
->NvStorage
.FvbInfo
.Entries
[0].Base
, gHob
->NvStorage
.FvbInfo
.Entries
[0].Length
,
243 gHob
->NvFtwFvResource
.PhysicalStart
, gHob
->NvFtwFvResource
.ResourceLength
,
244 gHob
->NvFtwWorking
.FvbInfo
.Entries
[0].Base
, gHob
->NvFtwWorking
.FvbInfo
.Entries
[0].Length
,
245 gHob
->NvFtwSpare
.FvbInfo
.Entries
[0].Base
, gHob
->NvFtwSpare
.FvbInfo
.Entries
[0].Length
,
246 gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
, gHob
->Stack
.AllocDescriptor
.MemoryLength
,
248 gHob
->MemoryFreeUnder1MB
.PhysicalStart
, gHob
->MemoryFreeUnder1MB
.ResourceLength
,
249 gHob
->MemoryAbove1MB
.PhysicalStart
, gHob
->MemoryAbove1MB
.ResourceLength
,
250 gHob
->MemoryAbove4GB
.PhysicalStart
, gHob
->MemoryAbove4GB
.ResourceLength
,
251 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryBaseAddress
, gHob
->DxeCore
.MemoryAllocationHeader
.MemoryLength
,
252 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryBaseAddress
, gHob
->MemoryAllocation
.AllocDescriptor
.MemoryLength
257 "\n\n\n\n\n\n\n\n\n\n"
258 " WELCOME TO EFI WORLD!\n"
261 EnterDxeMain (StackTop
, Handoff
->DxeCoreEntryPoint
, gHob
, PageTableBase
);
262 PrintString ("Fail to enter DXE main!\n");
265 // Should never get here
273 IN EFILDRHANDOFF
*Handoff