]> git.proxmox.com Git - mirror_edk2.git/blob - DuetPkg/DxeIpl/DxeInit.c
sync comments, fix function header, rename variable name to follow coding style.
[mirror_edk2.git] / DuetPkg / DxeIpl / DxeInit.c
1 /** @file
2
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
8
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.
11
12 Module Name:
13 DxeInit.c
14
15 Abstract:
16
17 Revision History:
18
19 **/
20
21 #include "DxeIpl.h"
22
23 #include "LegacyTable.h"
24 #include "HobGeneration.h"
25 #include "PpisNeededByDxeCore.h"
26 #include "Debug.h"
27
28 /*
29 --------------------------------------------------------
30 Memory Map: (XX=32,64)
31 --------------------------------------------------------
32 0x0
33 IVT
34 0x400
35 BDA
36 0x500
37
38 0x7C00
39 BootSector
40 0x10000
41 EfiLdr (relocate by efiXX.COM)
42 0x15000
43 Efivar.bin (Load by StartXX.COM)
44 0x20000
45 StartXX.COM (E820 table, Temporary GDT, Temporary IDT)
46 0x21000
47 EfiXX.COM (Temporary Interrupt Handler)
48 0x22000
49 EfiLdr.efi + DxeIpl.Z + DxeMain.Z + BFV.Z
50 0x86000
51 MemoryFreeUnder1M (For legacy driver DMA)
52 0x90000
53 Temporary 4G PageTable for X64 (6 page)
54 0x9F800
55 EBDA
56 0xA0000
57 VGA
58 0xC0000
59 OPROM
60 0xE0000
61 FIRMEWARE
62 0x100000 (1M)
63 Temporary Stack (1M)
64 0x200000
65
66 MemoryAbove1MB.PhysicalStart <-----------------------------------------------------+
67 ... |
68 ... |
69 <- Phit.EfiMemoryBottom -------------------+ |
70 HOB | |
71 <- Phit.EfiFreeMemoryBottom | |
72 | MemoryFreeAbove1MB.ResourceLength
73 <- Phit.EfiFreeMemoryTop ------+ | |
74 MemoryDescriptor (For ACPINVS, ACPIReclaim) | 4M = CONSUMED_MEMORY |
75 | | |
76 Permament 4G PageTable for IA32 or MemoryAllocation | |
77 Permament 64G PageTable for X64 | | |
78 <------------------------------+ | |
79 Permament Stack (0x20 Pages = 128K) | |
80 <- Phit.EfiMemoryTop ----------+-----------+---------------+
81 DxeCore |
82 DxeCore
83 DxeIpl |
84 <----------------------------------------------------------+
85 NvFV + FtwFV |
86 MMIO
87 BFV |
88 <- Top of Free Memory reported by E820 --------------------+
89 ACPINVS or
90 ACPIReclaim or
91 Reserved
92 <- Memory Top on RealMemory
93
94 0x100000000 (4G)
95
96 MemoryFreeAbove4G.Physicalstart <--------------------------------------------------+
97 |
98 |
99 MemoryFreeAbove4GB.ResourceLength
100 |
101 |
102 <--------------------------------------------------+
103 */
104
105 VOID
106 EnterDxeMain (
107 IN VOID *StackTop,
108 IN VOID *DxeCoreEntryPoint,
109 IN VOID *Hob,
110 IN VOID *PageTable
111 );
112
113 VOID
114 DxeInit (
115 IN EFILDRHANDOFF *Handoff
116 )
117 /*++
118
119 Routine Description:
120
121 This is the entry point after this code has been loaded into memory.
122
123 Arguments:
124
125
126 Returns:
127
128 Calls into EFI Firmware
129
130 --*/
131 {
132 VOID *StackTop;
133 VOID *StackBottom;
134 VOID *PageTableBase;
135 VOID *MemoryTopOnDescriptor;
136 VOID *MemoryDescriptor;
137 VOID *NvStorageBase;
138 CHAR8 PrintBuffer[256];
139
140 ClearScreen();
141 PrintString("Enter DxeIpl ...\n");
142 /*
143 ClearScreen();
144 PrintString("handoff:\n");
145 PrintString("Handoff.BfvBase = ");
146 PrintValue64((UINT64)(UINTN)Handoff->BfvBase);
147 PrintString(", ");
148 PrintString("BfvLength = ");
149 PrintValue64(Handoff->BfvSize);
150 PrintString("\n");
151 PrintString("Handoff.DxeIplImageBase = ");
152 PrintValue64((UINT64)(UINTN)Handoff->DxeIplImageBase);
153 PrintString(", ");
154 PrintString("DxeIplImageSize = ");
155 PrintValue64(Handoff->DxeIplImageSize);
156 PrintString("\n");
157 PrintString("Handoff.DxeCoreImageBase = ");
158 PrintValue64((UINT64)(UINTN)Handoff->DxeCoreImageBase);
159 PrintString(", ");
160 PrintString("DxeCoreImageSize = ");
161 PrintValue64(Handoff->DxeCoreImageSize);
162 PrintString("\n");
163 */
164 //
165 // Hob Generation Guild line:
166 // * Don't report FV as physical memory
167 // * MemoryAllocation Hob should only cover physical memory
168 // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped
169
170 PrepareHobCpu ();
171 //
172 // 1. BFV
173 //
174 PrepareHobBfv (Handoff->BfvBase, Handoff->BfvSize);
175
176 //
177 // 2. Updates Memory information, and get the top free address under 4GB
178 //
179 MemoryTopOnDescriptor = PrepareHobMemory (Handoff->MemDescCount, Handoff->MemDesc);
180
181 //
182 // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB]
183 //
184
185 // 3.1 NV data
186 NvStorageBase = PrepareHobNvStorage (MemoryTopOnDescriptor);
187 AsciiSPrint (PrintBuffer, 256, "NV Storage Base=0x%x\n", (UINTN)NvStorageBase);
188 PrintString (PrintBuffer);
189
190 // 3.2 Stack
191 StackTop = NvStorageBase;
192 StackBottom = PrepareHobStack (StackTop);
193 AsciiSPrint (PrintBuffer, 256, "Stack Top=0x%x, Stack Bottom=0x%x\n",
194 (UINTN)StackTop, (UINTN)StackBottom);
195 PrintString (PrintBuffer);
196 // 3.3 Page Table
197 PageTableBase = PreparePageTable (StackBottom, gHob->Cpu.SizeOfMemorySpace);
198 // 3.4 MemDesc (will be used in PlatformBds)
199 MemoryDescriptor = PrepareHobMemoryDescriptor (PageTableBase, Handoff->MemDescCount, Handoff->MemDesc);
200 // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob
201 PrepareHobPhit (StackTop, MemoryDescriptor);
202
203 //
204 // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore
205 //
206 PrepareHobDxeCore (
207 Handoff->DxeCoreEntryPoint,
208 (EFI_PHYSICAL_ADDRESS)(UINTN)Handoff->DxeCoreImageBase,
209 (UINTN)Handoff->DxeIplImageBase + (UINTN)Handoff->DxeIplImageSize - (UINTN)Handoff->DxeCoreImageBase
210 );
211
212 PrepareHobLegacyTable (gHob);
213 PreparePpisNeededByDxeCore (gHob);
214
215 CompleteHobGeneration ();
216
217 AsciiSPrint (PrintBuffer, 256, "HobStart=0x%x\n", (UINTN)gHob);
218 PrintString (PrintBuffer);
219
220 AsciiSPrint (PrintBuffer, 256, "Memory Top=0x%x, Bottom=0x%x\n",
221 (UINTN)gHob->Phit.EfiMemoryTop, (UINTN)gHob->Phit.EfiMemoryBottom);
222 PrintString (PrintBuffer);
223
224 AsciiSPrint (PrintBuffer, 256, "Free Memory Top=0x%x, Bottom=0x%x\n",
225 (UINTN)gHob->Phit.EfiFreeMemoryTop, (UINTN)gHob->Phit.EfiFreeMemoryBottom);
226 PrintString (PrintBuffer);
227
228 AsciiSPrint (PrintBuffer, 256, "Nv Base=0x%x, Length=0x%x\n",
229 (UINTN)gHob->NvStorageFvb.FvbInfo.Entries[0].Base,
230 (UINTN)gHob->NvFtwFvb.FvbInfo.Entries[0].Length);
231 PrintString (PrintBuffer);
232 /*
233 //
234 // Print Hob Info
235 //
236 ClearScreen();
237 PrintString("Hob Info\n");
238 PrintString("Phit.EfiMemoryTop = ");
239 PrintValue64(gHob->Phit.EfiMemoryTop);
240 PrintString(" Phit.EfiMemoryBottom = ");
241 PrintValue64(gHob->Phit.EfiMemoryBottom);
242 PrintString("\n");
243 PrintString("Phit.EfiFreeMemoryTop = ");
244 PrintValue64(gHob->Phit.EfiFreeMemoryTop);
245 PrintString(" Phit.EfiFreeMemoryBottom = ");
246 PrintValue64(gHob->Phit.EfiFreeMemoryBottom);
247 PrintString("\n");
248 PrintString("Bfv = ");
249 PrintValue64(gHob->Bfv.BaseAddress);
250 PrintString(" BfvLength = ");
251 PrintValue64(gHob->Bfv.Length);
252 PrintString("\n");
253 PrintString("NvStorageFvb = ");
254 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Base);
255 PrintString(" Length = ");
256 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Length);
257 PrintString("\n");
258 PrintString("NvFtwFvb = ");
259 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Base);
260 PrintString(" Length = ");
261 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Length);
262 PrintString("\n");
263 PrintString("Stack = ");
264 PrintValue64(gHob->Stack.AllocDescriptor.MemoryBaseAddress);
265 PrintString(" StackLength = ");
266 PrintValue64(gHob->Stack.AllocDescriptor.MemoryLength);
267 PrintString("\n");
268 PrintString("MemoryFreeUnder1MB = ");
269 PrintValue64(gHob->MemoryFreeUnder1MB.PhysicalStart);
270 PrintString(" MemoryFreeUnder1MBLength = ");
271 PrintValue64(gHob->MemoryFreeUnder1MB.ResourceLength);
272 PrintString("\n");
273 PrintString("MemoryAbove1MB = ");
274 PrintValue64(gHob->MemoryAbove1MB.PhysicalStart);
275 PrintString(" MemoryAbove1MBLength = ");
276 PrintValue64(gHob->MemoryAbove1MB.ResourceLength);
277 PrintString("\n");
278 PrintString("MemoryAbove4GB = ");
279 PrintValue64(gHob->MemoryAbove4GB.PhysicalStart);
280 PrintString(" MemoryAbove4GBLength = ");
281 PrintValue64(gHob->MemoryAbove4GB.ResourceLength);
282 PrintString("\n");
283 PrintString("DxeCore = ");
284 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress);
285 PrintString(" DxeCoreLength = ");
286 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryLength);
287 PrintString("\n");
288 PrintString("MemoryAllocation = ");
289 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress);
290 PrintString(" MemoryLength = ");
291 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryLength);
292 PrintString("\n");
293 EFI_DEADLOOP();
294 */
295 ClearScreen();
296 PrintString("\n\n\n\n\n\n\n\n\n\n");
297 PrintString(" WELCOME TO EFI WORLD!\n");
298
299 EnterDxeMain (StackTop, Handoff->DxeCoreEntryPoint, gHob, PageTableBase);
300
301 //
302 // Should never get here
303 //
304 CpuDeadLoop ();
305 }
306
307 EFI_STATUS
308 EFIAPI
309 _ModuleEntryPoint (
310 IN EFILDRHANDOFF *Handoff
311 )
312 {
313 DxeInit(Handoff);
314 return EFI_SUCCESS;
315 }