]> git.proxmox.com Git - mirror_edk2.git/blob - DuetPkg/DxeIpl/DxeInit.c
9cce964ae2beb6da33f05b82ddce1c08b2376ba6
[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
139 PrintString("Enter DxeIpl ...\n");
140 /*
141 ClearScreen();
142 PrintString("handoff:\n");
143 PrintString("Handoff.BfvBase = ");
144 PrintValue64((UINT64)(UINTN)Handoff->BfvBase);
145 PrintString(", ");
146 PrintString("BfvLength = ");
147 PrintValue64(Handoff->BfvSize);
148 PrintString("\n");
149 PrintString("Handoff.DxeIplImageBase = ");
150 PrintValue64((UINT64)(UINTN)Handoff->DxeIplImageBase);
151 PrintString(", ");
152 PrintString("DxeIplImageSize = ");
153 PrintValue64(Handoff->DxeIplImageSize);
154 PrintString("\n");
155 PrintString("Handoff.DxeCoreImageBase = ");
156 PrintValue64((UINT64)(UINTN)Handoff->DxeCoreImageBase);
157 PrintString(", ");
158 PrintString("DxeCoreImageSize = ");
159 PrintValue64(Handoff->DxeCoreImageSize);
160 PrintString("\n");
161 */
162 //
163 // Hob Generation Guild line:
164 // * Don't report FV as physical memory
165 // * MemoryAllocation Hob should only cover physical memory
166 // * Use ResourceDescriptor Hob to report physical memory or Firmware Device and they shouldn't be overlapped
167
168 PrepareHobCpu ();
169 //
170 // 1. BFV
171 //
172 PrepareHobBfv (Handoff->BfvBase, Handoff->BfvSize);
173
174 //
175 // 2. Updates Memory information, and get the top free address under 4GB
176 //
177 MemoryTopOnDescriptor = PrepareHobMemory (Handoff->MemDescCount, Handoff->MemDesc);
178
179 //
180 // 3. Put [NV], [Stack], [PageTable], [MemDesc], [HOB] just below the [top free address under 4GB]
181 //
182
183 // 3.1 NV data
184 NvStorageBase = PrepareHobNvStorage (MemoryTopOnDescriptor);
185 // 3.2 Stack
186 StackTop = NvStorageBase;
187 StackBottom = PrepareHobStack (StackTop);
188 // 3.3 Page Table
189 PageTableBase = PreparePageTable (StackBottom, gHob->Cpu.SizeOfMemorySpace);
190 // 3.4 MemDesc (will be used in PlatformBds)
191 MemoryDescriptor = PrepareHobMemoryDescriptor (PageTableBase, Handoff->MemDescCount, Handoff->MemDesc);
192 // 3.5 Copy the Hob itself to EfiMemoryBottom, and update the PHIT Hob
193 PrepareHobPhit (StackTop, MemoryDescriptor);
194
195 //
196 // 4. Register the memory occupied by DxeCore and DxeIpl together as DxeCore
197 //
198 PrepareHobDxeCore (
199 Handoff->DxeCoreEntryPoint,
200 (EFI_PHYSICAL_ADDRESS)(UINTN)Handoff->DxeCoreImageBase,
201 (UINTN)Handoff->DxeIplImageBase + (UINTN)Handoff->DxeIplImageSize - (UINTN)Handoff->DxeCoreImageBase
202 );
203
204 PrepareHobLegacyTable (gHob);
205 PreparePpisNeededByDxeCore (gHob);
206
207 CompleteHobGeneration ();
208
209 /*
210 //
211 // Print Hob Info
212 //
213 ClearScreen();
214 PrintString("Hob Info\n");
215 PrintString("Phit.EfiMemoryTop = ");
216 PrintValue64(gHob->Phit.EfiMemoryTop);
217 PrintString(" Phit.EfiMemoryBottom = ");
218 PrintValue64(gHob->Phit.EfiMemoryBottom);
219 PrintString("\n");
220 PrintString("Phit.EfiFreeMemoryTop = ");
221 PrintValue64(gHob->Phit.EfiFreeMemoryTop);
222 PrintString(" Phit.EfiFreeMemoryBottom = ");
223 PrintValue64(gHob->Phit.EfiFreeMemoryBottom);
224 PrintString("\n");
225 PrintString("Bfv = ");
226 PrintValue64(gHob->Bfv.BaseAddress);
227 PrintString(" BfvLength = ");
228 PrintValue64(gHob->Bfv.Length);
229 PrintString("\n");
230 PrintString("NvStorageFvb = ");
231 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Base);
232 PrintString(" Length = ");
233 PrintValue64(gHob->NvStorageFvb.FvbInfo.Entries[0].Length);
234 PrintString("\n");
235 PrintString("NvFtwFvb = ");
236 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Base);
237 PrintString(" Length = ");
238 PrintValue64(gHob->NvFtwFvb.FvbInfo.Entries[0].Length);
239 PrintString("\n");
240 PrintString("Stack = ");
241 PrintValue64(gHob->Stack.AllocDescriptor.MemoryBaseAddress);
242 PrintString(" StackLength = ");
243 PrintValue64(gHob->Stack.AllocDescriptor.MemoryLength);
244 PrintString("\n");
245 PrintString("MemoryFreeUnder1MB = ");
246 PrintValue64(gHob->MemoryFreeUnder1MB.PhysicalStart);
247 PrintString(" MemoryFreeUnder1MBLength = ");
248 PrintValue64(gHob->MemoryFreeUnder1MB.ResourceLength);
249 PrintString("\n");
250 PrintString("MemoryAbove1MB = ");
251 PrintValue64(gHob->MemoryAbove1MB.PhysicalStart);
252 PrintString(" MemoryAbove1MBLength = ");
253 PrintValue64(gHob->MemoryAbove1MB.ResourceLength);
254 PrintString("\n");
255 PrintString("MemoryAbove4GB = ");
256 PrintValue64(gHob->MemoryAbove4GB.PhysicalStart);
257 PrintString(" MemoryAbove4GBLength = ");
258 PrintValue64(gHob->MemoryAbove4GB.ResourceLength);
259 PrintString("\n");
260 PrintString("DxeCore = ");
261 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress);
262 PrintString(" DxeCoreLength = ");
263 PrintValue64(gHob->DxeCore.MemoryAllocationHeader.MemoryLength);
264 PrintString("\n");
265 PrintString("MemoryAllocation = ");
266 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress);
267 PrintString(" MemoryLength = ");
268 PrintValue64(gHob->MemoryAllocation.AllocDescriptor.MemoryLength);
269 PrintString("\n");
270 EFI_DEADLOOP();
271 */
272
273 ClearScreen();
274 PrintString("\n\n\n\n\n\n\n\n\n\n");
275 PrintString(" WELCOME TO EFI WORLD!\n");
276
277 EnterDxeMain (StackTop, Handoff->DxeCoreEntryPoint, gHob, PageTableBase);
278
279 //
280 // Should never get here
281 //
282 CpuDeadLoop ();
283 }
284