]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/DxeIpl/HobGeneration.c
1. delete Include/Guid/VariableInfo.h
[mirror_edk2.git] / DuetPkg / DxeIpl / HobGeneration.c
CommitLineData
18b84857 1/** @file\r
ca162103 2\r
3Copyright (c) 2006 - 2007, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
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 HobGeneration.c\r
14\r
15Abstract:\r
16\r
17Revision History:\r
18\r
18b84857 19**/\r
ca162103 20#include "DxeIpl.h"\r
21#include "HobGeneration.h"\r
22#include "PpisNeededByDxeCore.h"\r
23#include "FlashLayout.h"\r
24#include "Debug.h"\r
25\r
26#define EFI_DXE_FILE_GUID \\r
9008db4a 27 { 0xb1644c1a, 0xc16a, 0x4c5b, {0x88, 0xde, 0xea, 0xfb, 0xa9, 0x7e, 0x74, 0xd8 }}\r
ca162103 28\r
29#define CPUID_EXTENDED_ADD_SIZE 0x80000008\r
30\r
31HOB_TEMPLATE gHobTemplate = {\r
32 { // Phit\r
33 { // Header\r
34 EFI_HOB_TYPE_HANDOFF, // HobType\r
35 sizeof (EFI_HOB_HANDOFF_INFO_TABLE), // HobLength\r
36 0 // Reserved\r
37 },\r
38 EFI_HOB_HANDOFF_TABLE_VERSION, // Version\r
39 BOOT_WITH_FULL_CONFIGURATION, // BootMode\r
40 0, // EfiMemoryTop\r
41 0, // EfiMemoryBottom\r
42 0, // EfiFreeMemoryTop\r
43 0, // EfiFreeMemoryBottom\r
44 0 // EfiEndOfHobList\r
45 }, \r
46 { // Bfv\r
47 {\r
48 EFI_HOB_TYPE_FV, // HobType\r
49 sizeof (EFI_HOB_FIRMWARE_VOLUME), // HobLength\r
50 0 // Reserved\r
51 },\r
52 0, // BaseAddress\r
53 0 // Length\r
54 },\r
55 { // BfvResource\r
56 {\r
57 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
58 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
59 0 // Reserved\r
60 },\r
61 {\r
62 0 // Owner Guid\r
63 },\r
64 EFI_RESOURCE_FIRMWARE_DEVICE, // ResourceType\r
65 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
66 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
67 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
68 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), // ResourceAttribute\r
69 0, // PhysicalStart\r
70 0 // ResourceLength\r
71 },\r
72 { // Cpu\r
73 { // Header\r
74 EFI_HOB_TYPE_CPU, // HobType\r
75 sizeof (EFI_HOB_CPU), // HobLength\r
76 0 // Reserved\r
77 },\r
78 52, // SizeOfMemorySpace - Architecture Max\r
79 16, // SizeOfIoSpace,\r
80 {\r
81 0, 0, 0, 0, 0, 0 // Reserved[6]\r
82 }\r
83 },\r
84 { // Stack HOB\r
85 { // header\r
86 EFI_HOB_TYPE_MEMORY_ALLOCATION, // Hob type\r
87 sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK), // Hob size\r
88 0 // reserved\r
89 },\r
90 {\r
91 EFI_HOB_MEMORY_ALLOC_STACK_GUID,\r
92 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
93 0x0, // UINT64 MemoryLength;\r
94 EfiBootServicesData, // EFI_MEMORY_TYPE MemoryType; \r
9008db4a 95 {0, 0, 0, 0} // Reserved Reserved[4]; \r
ca162103 96 }\r
97 },\r
98 { // MemoryAllocation for HOB's & Images\r
99 {\r
100 EFI_HOB_TYPE_MEMORY_ALLOCATION, // HobType\r
101 sizeof (EFI_HOB_MEMORY_ALLOCATION), // HobLength\r
102 0 // Reserved\r
103 },\r
104 {\r
105 {\r
106 0, //EFI_HOB_MEMORY_ALLOC_MODULE_GUID // Name\r
107 },\r
108 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
109 0x0, // UINT64 MemoryLength;\r
110 EfiBootServicesData, // EFI_MEMORY_TYPE MemoryType; \r
111 {\r
112 0, 0, 0, 0 // Reserved Reserved[4]; \r
113 }\r
114 }\r
115 },\r
116 { // MemoryFreeUnder1MB for unused memory that DXE core will claim\r
117 {\r
118 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
119 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
120 0 // Reserved\r
121 },\r
122 {\r
123 0 // Owner Guid\r
124 },\r
125 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
126 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
127 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
128 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
129 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
130 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
131 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
132 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
133 0x0, // PhysicalStart\r
134 0 // ResourceLength\r
135 },\r
136 { // MemoryFreeAbove1MB for unused memory that DXE core will claim\r
137 {\r
138 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
139 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
140 0 // Reserved\r
141 },\r
142 {\r
143 0 // Owner Guid\r
144 },\r
145 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
146 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
147 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
148 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
149 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
150 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
151 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
152 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
153 0x0, // PhysicalStart\r
154 0 // ResourceLength\r
155 },\r
156 { // MemoryFreeAbove4GB for unused memory that DXE core will claim\r
157 {\r
158 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
159 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
160 0 // Reserved\r
161 },\r
162 {\r
163 0 // Owner Guid\r
164 },\r
165 EFI_RESOURCE_SYSTEM_MEMORY, // ResourceType\r
166 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
167 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
168 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | \r
169 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | \r
170 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | \r
171 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), \r
172 0x0, // PhysicalStart\r
173 0 // ResourceLength\r
174 },\r
175 { // Memory Allocation Module for DxeCore\r
176 { // header\r
177 EFI_HOB_TYPE_MEMORY_ALLOCATION, // Hob type\r
178 sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE), // Hob size\r
179 0 // reserved\r
180 },\r
181 {\r
182 EFI_HOB_MEMORY_ALLOC_MODULE_GUID,\r
183 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;\r
184 0x0, // UINT64 MemoryLength;\r
185 EfiBootServicesCode, // EFI_MEMORY_TYPE MemoryType; \r
186 {\r
187 0, 0, 0, 0 // UINT8 Reserved[4]; \r
188 },\r
189 },\r
190 EFI_DXE_FILE_GUID,\r
191 0x0 // EFI_PHYSICAL_ADDRESS of EntryPoint;\r
192 },\r
193 { // Memory Map Hints to reduce fragmentation in the memory map\r
9008db4a 194 {\r
195 {\r
196 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
197 sizeof (MEMORY_TYPE_INFORMATION_HOB), // Hob size\r
198 0, // reserved\r
199 },\r
200 EFI_MEMORY_TYPE_INFORMATION_GUID\r
201 },\r
ca162103 202 {\r
203 {\r
204 EfiACPIReclaimMemory,\r
205 0x80\r
206 }, // 0x80 pages = 512k for ASL\r
207 {\r
208 EfiACPIMemoryNVS,\r
209 0x100\r
210 }, // 0x100 pages = 1024k for S3, SMM, etc\r
211 {\r
212 EfiReservedMemoryType,\r
213 0x04\r
214 }, // 16k for BIOS Reserved\r
215 {\r
216 EfiRuntimeServicesData,\r
217 0x100\r
218 },\r
219 {\r
220 EfiRuntimeServicesCode,\r
221 0x100\r
222 },\r
223 {\r
224 EfiBootServicesCode,\r
225 0x200\r
226 },\r
227 {\r
228 EfiBootServicesData,\r
229 0x200\r
230 },\r
231 {\r
232 EfiLoaderCode,\r
233 0x100\r
234 },\r
235 {\r
236 EfiLoaderData,\r
237 0x100\r
238 },\r
239 {\r
240 EfiMaxMemoryType,\r
241 0\r
242 }\r
243 }\r
244 },\r
245 { // Pointer to ACPI Table\r
9008db4a 246 {\r
247 {\r
248 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
249 sizeof (TABLE_HOB), // Hob size\r
250 0 // reserved\r
251 },\r
252 EFI_ACPI_TABLE_GUID\r
253 },\r
ca162103 254 0\r
255 },\r
256 { // Pointer to ACPI20 Table\r
9008db4a 257 {\r
258 { \r
259 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
260 sizeof (TABLE_HOB), // Hob size\r
261 0 // reserved\r
262 },\r
263 EFI_ACPI_20_TABLE_GUID\r
264 },\r
ca162103 265 0\r
266 },\r
267 { // Pointer to SMBIOS Table\r
9008db4a 268 {\r
269 {\r
270 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
271 sizeof (TABLE_HOB), // Hob size\r
272 0 // reserved\r
273 },\r
274 EFI_SMBIOS_TABLE_GUID\r
275 },\r
ca162103 276 0\r
277 },\r
278 { // Pointer to MPS Table\r
9008db4a 279 {\r
280 {\r
281 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
282 sizeof (TABLE_HOB), // Hob size\r
283 0, // reserved\r
284 },\r
285 EFI_MPS_TABLE_GUID\r
286 },\r
ca162103 287 0\r
288 },\r
289 /**\r
290 { // Pointer to FlushInstructionCache\r
291 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
292 sizeof (PROTOCOL_HOB), // Hob size\r
293 0, // reserved\r
294 EFI_PEI_FLUSH_INSTRUCTION_CACHE_GUID,\r
295 NULL\r
296 },\r
297 { // Pointer to TransferControl\r
298 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
299 sizeof (PROTOCOL_HOB), // Hob size\r
300 0, // reserved\r
301 EFI_PEI_TRANSFER_CONTROL_GUID,\r
302 NULL\r
303 },\r
304 { // Pointer to PeCoffLoader\r
305 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
306 sizeof (PROTOCOL_HOB), // Hob size\r
307 0, // reserved\r
308 EFI_PEI_PE_COFF_LOADER_GUID,\r
309 NULL\r
310 },\r
311 { // Pointer to EfiDecompress\r
312 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
313 sizeof (PROTOCOL_HOB), // Hob size\r
314 0, // reserved\r
315 EFI_DECOMPRESS_PROTOCOL_GUID,\r
316 NULL\r
317 },\r
318 { // Pointer to TianoDecompress\r
319 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
320 sizeof (PROTOCOL_HOB), // Hob size\r
321 0, // reserved\r
322 EFI_TIANO_DECOMPRESS_PROTOCOL_GUID,\r
323 NULL\r
324 },\r
325 **/\r
326 { // Pointer to ReportStatusCode\r
9008db4a 327 {\r
328 {\r
329 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
330 sizeof (PROTOCOL_HOB), // Hob size\r
331 0 // reserved\r
332 },\r
333 EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID\r
334 },\r
ca162103 335 NULL\r
336 },\r
337 { // EFILDR Memory Descriptor\r
9008db4a 338 {\r
339 {\r
340 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
341 sizeof (MEMORY_DESC_HOB), // Hob size\r
342 0 // reserved\r
343 },\r
344 EFI_LDR_MEMORY_DESCRIPTOR_GUID\r
345 },\r
ca162103 346 0,\r
347 NULL\r
348 },\r
349 { // Pci Express Base Address Hob\r
9008db4a 350 {\r
351 {\r
352 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
353 sizeof (PCI_EXPRESS_BASE_HOB), // Hob size\r
354 0 // reserved\r
355 },\r
356 EFI_PCI_EXPRESS_BASE_ADDRESS_GUID\r
357 },\r
ca162103 358 {\r
359 0,\r
360 0,\r
361 0,\r
362 }\r
363 },\r
364 { // Acpi Description Hob\r
ca162103 365 {\r
9008db4a 366 {\r
367 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
368 sizeof (ACPI_DESCRIPTION_HOB), // Hob size\r
369 0 // reserved\r
370 },\r
371 EFI_ACPI_DESCRIPTION_GUID\r
372 },\r
373 {\r
374 {\r
375 0,\r
376 },\r
ca162103 377 }\r
378 },\r
379 { // NV Storage FV Resource\r
380 {\r
381 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, // HobType\r
382 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), // HobLength\r
383 0 // Reserved\r
384 },\r
385 {\r
386 0 // Owner Guid\r
387 },\r
388 EFI_RESOURCE_FIRMWARE_DEVICE, // ResourceType\r
389 (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
390 EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
391 EFI_RESOURCE_ATTRIBUTE_TESTED |\r
392 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE), // ResourceAttribute\r
393 0, // PhysicalStart (Fixed later)\r
394 NV_STORAGE_FVB_SIZE // ResourceLength\r
395 },\r
396 { // FVB holding NV Storage\r
ca162103 397 {\r
9008db4a 398 {\r
399 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
400 sizeof (FVB_HOB),\r
401 0\r
402 },\r
403 EFI_FLASH_MAP_HOB_GUID\r
404 },\r
405 {\r
406 {0, 0, 0}, // Reserved[3]\r
ca162103 407 EFI_FLASH_AREA_GUID_DEFINED, // AreaType\r
204d0e01 408 EFI_SYSTEM_NV_DATA_FV_GUID , // AreaTypeGuid\r
ca162103 409 1,\r
410 {\r
9008db4a 411 {\r
412 EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
413 0, // SubAreaData.Reserved\r
414 0, // SubAreaData.Base (Fixed later)\r
415 NV_STORAGE_FVB_SIZE, // SubAreaData.Length\r
416 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
417 }\r
ca162103 418 }, \r
419 0, // VolumeSignature (Fixed later)\r
420 NV_STORAGE_FILE_PATH, // Mapped file without padding\r
421 // TotalFVBSize = FileSize + PaddingSize = multiple of BLOCK_SIZE\r
422 NV_STORAGE_SIZE + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH,\r
423 // ActuralSize\r
424 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH\r
425 }\r
426 },\r
427 { // NV Storage Hob\r
ca162103 428 {\r
9008db4a 429 {\r
430 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
431 sizeof (FVB_HOB), // Hob size\r
432 0 // reserved\r
433 },\r
434 EFI_FLASH_MAP_HOB_GUID\r
435 },\r
436 {\r
437 {0, 0, 0}, // Reserved[3]\r
ca162103 438 EFI_FLASH_AREA_EFI_VARIABLES, // AreaType\r
439 { 0 }, // AreaTypeGuid\r
440 1,\r
441 {\r
9008db4a 442 {\r
443 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
444 0, // SubAreaData.Reserved\r
445 0, // SubAreaData.Base (Fixed later)\r
446 NV_STORAGE_SIZE, // SubAreaData.Length\r
447 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
448 }\r
ca162103 449 }, \r
450 0,\r
451 NV_STORAGE_FILE_PATH,\r
452 NV_STORAGE_SIZE,\r
453 0\r
454 }\r
455 },\r
456 { // FVB holding FTW spaces including Working & Spare space\r
ca162103 457 {\r
9008db4a 458 {\r
459 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
460 sizeof (FVB_HOB),\r
461 0\r
462 },\r
463 EFI_FLASH_MAP_HOB_GUID\r
464 },\r
465 {\r
466 {0, 0, 0}, // Reserved[3]\r
ca162103 467 EFI_FLASH_AREA_GUID_DEFINED, // AreaType\r
204d0e01 468 EFI_SYSTEM_NV_DATA_FV_GUID, // AreaTypeGuid\r
ca162103 469 1,\r
470 {\r
9008db4a 471 {\r
472 EFI_FLASH_AREA_FV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
473 0, // SubAreaData.Reserved\r
474 0, // SubAreaData.Base (Fixed later)\r
475 NV_FTW_FVB_SIZE, // SubAreaData.Length\r
476 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
477 }\r
ca162103 478 }, \r
479 0,\r
480 L"", // Empty String indicates using memory\r
481 0,\r
482 0\r
483 }\r
484 },\r
485 { // NV Ftw working Hob\r
ca162103 486 {\r
9008db4a 487 {\r
488 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
489 sizeof (FVB_HOB), // Hob size\r
490 0 // reserved\r
491 },\r
492 EFI_FLASH_MAP_HOB_GUID\r
493 },\r
494 {\r
495 {0, 0, 0}, // Reserved[3]\r
ca162103 496 EFI_FLASH_AREA_FTW_STATE, // AreaType\r
497 { 0 }, // AreaTypeGuid\r
498 1,\r
499 {\r
9008db4a 500 {\r
501 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
502 0, // SubAreaData.Reserved\r
503 0, // SubAreaData.Base (Fixed later)\r
504 NV_FTW_WORKING_SIZE, // SubAreaData.Length\r
505 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
506 }\r
ca162103 507 }, \r
508 0, // VolumeSignature\r
509 L"",\r
510 0,\r
511 0\r
512 }\r
513 },\r
514 { // NV Ftw spare Hob\r
ca162103 515 {\r
9008db4a 516 {\r
517 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type\r
518 sizeof (FVB_HOB), // Hob size\r
519 0 // reserved\r
520 },\r
521 EFI_FLASH_MAP_HOB_GUID\r
522 },\r
523 {\r
524 {0, 0, 0}, // Reserved[3]\r
ca162103 525 EFI_FLASH_AREA_FTW_BACKUP, // AreaType\r
526 { 0 }, // AreaTypeGuid\r
527 1,\r
528 {\r
9008db4a 529 {\r
530 EFI_FLASH_AREA_SUBFV | EFI_FLASH_AREA_MEMMAPPED_FV, // SubAreaData.Attributes\r
531 0, // SubAreaData.Reserved\r
532 0, // SubAreaData.Base (Fixed later)\r
533 NV_FTW_SPARE_SIZE, // SubAreaData.Length\r
534 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID // SubAreaData.FileSystem\r
535 }\r
ca162103 536 }, \r
537 0,\r
538 L"",\r
539 0,\r
540 0\r
541 }\r
542 },\r
543 { // EndOfHobList\r
544 EFI_HOB_TYPE_END_OF_HOB_LIST, // HobType\r
545 sizeof (EFI_HOB_GENERIC_HEADER), // HobLength\r
546 0 // Reserved\r
547 }\r
548};\r
549\r
550HOB_TEMPLATE *gHob = &gHobTemplate;\r
551\r
552VOID *\r
553PrepareHobMemory (\r
554 IN UINTN NumberOfMemoryMapEntries,\r
555 IN EFI_MEMORY_DESCRIPTOR *EfiMemoryDescriptor\r
556 )\r
557/*++\r
558Description:\r
559 Update the Hob filling MemoryFreeUnder1MB, MemoryAbove1MB, MemoryAbove4GB\r
560\r
561Arguments:\r
562 NumberOfMemoryMapEntries - Count of Memory Descriptors\r
563 EfiMemoryDescriptor - Point to the buffer containing NumberOfMemoryMapEntries Memory Descriptors\r
564\r
565Return:\r
566 VOID * : The end address of MemoryAbove1MB (or the top free memory under 4GB)\r
567--*/\r
568{\r
569 UINTN Index;\r
570\r
571 //\r
572 // Prepare Low Memory\r
573 // 0x18 pages is 72 KB.\r
574 //\r
575 gHob->MemoryFreeUnder1MB.ResourceLength = EFI_MEMORY_BELOW_1MB_END - EFI_MEMORY_BELOW_1MB_START;\r
576 gHob->MemoryFreeUnder1MB.PhysicalStart = EFI_MEMORY_BELOW_1MB_START;\r
577\r
578 //\r
579 // Prepare High Memory\r
580 // Assume Memory Map is ordered from low to high\r
581 //\r
582 gHob->MemoryAbove1MB.PhysicalStart = 0;\r
583 gHob->MemoryAbove1MB.ResourceLength = 0;\r
584 gHob->MemoryAbove4GB.PhysicalStart = 0;\r
585 gHob->MemoryAbove4GB.ResourceLength = 0;\r
586\r
587 for (Index = 0; Index < NumberOfMemoryMapEntries; Index++) {\r
588 //\r
589 // Skip regions below 1MB\r
590 //\r
591 if (EfiMemoryDescriptor[Index].PhysicalStart < 0x100000) {\r
592 continue;\r
593 }\r
594 //\r
595 // Process regions above 1MB\r
596 //\r
597 if (EfiMemoryDescriptor[Index].PhysicalStart >= 0x100000) {\r
598 if (EfiMemoryDescriptor[Index].Type == EfiConventionalMemory) {\r
599 if (gHob->MemoryAbove1MB.PhysicalStart == 0) {\r
600 gHob->MemoryAbove1MB.PhysicalStart = EfiMemoryDescriptor[Index].PhysicalStart;\r
601 gHob->MemoryAbove1MB.ResourceLength = LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
602 } else if (gHob->MemoryAbove1MB.PhysicalStart + gHob->MemoryAbove1MB.ResourceLength == EfiMemoryDescriptor[Index].PhysicalStart) {\r
603 gHob->MemoryAbove1MB.ResourceLength += LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
604 }\r
605 }\r
606 if ((EfiMemoryDescriptor[Index].Type == EfiReservedMemoryType) ||\r
607 (EfiMemoryDescriptor[Index].Type >= EfiACPIReclaimMemory) ) {\r
608 continue;\r
609 }\r
610 if ((EfiMemoryDescriptor[Index].Type == EfiRuntimeServicesCode) ||\r
611 (EfiMemoryDescriptor[Index].Type == EfiRuntimeServicesData)) {\r
612 break;\r
613 }\r
614 }\r
615 //\r
616 // Process region above 4GB\r
617 //\r
f40bbc08 618 if (EfiMemoryDescriptor[Index].PhysicalStart >= 0x100000000LL) {\r
ca162103 619 if (EfiMemoryDescriptor[Index].Type == EfiConventionalMemory) {\r
620 if (gHob->MemoryAbove4GB.PhysicalStart == 0) {\r
621 gHob->MemoryAbove4GB.PhysicalStart = EfiMemoryDescriptor[Index].PhysicalStart;\r
622 gHob->MemoryAbove4GB.ResourceLength = LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
623 }\r
624 if (gHob->MemoryAbove4GB.PhysicalStart + gHob->MemoryAbove4GB.ResourceLength == \r
625 EfiMemoryDescriptor[Index].PhysicalStart) {\r
626 gHob->MemoryAbove4GB.ResourceLength += LShiftU64 (EfiMemoryDescriptor[Index].NumberOfPages, EFI_PAGE_SHIFT);\r
627 }\r
628 }\r
629 }\r
630 }\r
631\r
632 if (gHob->MemoryAbove4GB.ResourceLength == 0) {\r
633 //\r
634 // If there is no memory above 4GB then change the resource descriptor HOB\r
635 // into another type. I'm doing this as it's unclear if a resource\r
636 // descriptor HOB of length zero is valid. Spec does not say it's illegal,\r
637 // but code in EDK does not seem to handle this case.\r
638 //\r
639 gHob->MemoryAbove4GB.Header.HobType = EFI_HOB_TYPE_UNUSED;\r
640 }\r
641\r
642 return (VOID *)(UINTN)(gHob->MemoryAbove1MB.PhysicalStart + gHob->MemoryAbove1MB.ResourceLength);\r
643}\r
644\r
645VOID *\r
646PrepareHobStack (\r
647 IN VOID *StackTop\r
648 )\r
649{\r
650 gHob->Stack.AllocDescriptor.MemoryLength = EFI_MEMORY_STACK_PAGE_NUM * EFI_PAGE_SIZE;\r
651 gHob->Stack.AllocDescriptor.MemoryBaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)StackTop - gHob->Stack.AllocDescriptor.MemoryLength;\r
652\r
653 return (VOID *)(UINTN)gHob->Stack.AllocDescriptor.MemoryBaseAddress;\r
654}\r
655\r
656VOID *\r
657PrepareHobMemoryDescriptor (\r
658 VOID *MemoryDescriptorTop,\r
659 UINTN MemDescCount,\r
660 EFI_MEMORY_DESCRIPTOR *MemDesc\r
661 )\r
662{\r
663 gHob->MemoryDescriptor.MemDescCount = MemDescCount;\r
664 gHob->MemoryDescriptor.MemDesc = (EFI_MEMORY_DESCRIPTOR *)((UINTN)MemoryDescriptorTop - MemDescCount * sizeof(EFI_MEMORY_DESCRIPTOR));\r
665 //\r
666 // Make MemoryDescriptor.MemDesc page aligned\r
667 //\r
668 gHob->MemoryDescriptor.MemDesc = (EFI_MEMORY_DESCRIPTOR *)((UINTN) gHob->MemoryDescriptor.MemDesc & ~EFI_PAGE_MASK);\r
669\r
670 CopyMem (gHob->MemoryDescriptor.MemDesc, MemDesc, MemDescCount * sizeof(EFI_MEMORY_DESCRIPTOR));\r
671\r
672 return gHob->MemoryDescriptor.MemDesc;\r
673}\r
674\r
675VOID\r
676PrepareHobBfv (\r
677 VOID *Bfv,\r
678 UINTN BfvLength\r
679 )\r
680{\r
e188a609 681 //UINTN BfvLengthPageSize;\r
ca162103 682\r
683 //\r
684 // Calculate BFV location at top of the memory region.\r
685 // This is like a RAM Disk. Align to page boundry.\r
686 //\r
e188a609 687 //BfvLengthPageSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BfvLength));\r
ca162103 688 \r
689 gHob->Bfv.BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)Bfv;\r
690 gHob->Bfv.Length = BfvLength;\r
691\r
692 //\r
693 // Resource descriptor for the FV\r
694 //\r
695 gHob->BfvResource.PhysicalStart = gHob->Bfv.BaseAddress;\r
696 gHob->BfvResource.ResourceLength = gHob->Bfv.Length;\r
697}\r
698\r
699VOID\r
700PrepareHobDxeCore (\r
701 VOID *DxeCoreEntryPoint,\r
702 EFI_PHYSICAL_ADDRESS DxeCoreImageBase,\r
703 UINT64 DxeCoreLength\r
704 )\r
705{\r
706 gHob->DxeCore.MemoryAllocationHeader.MemoryBaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)DxeCoreImageBase;\r
707 gHob->DxeCore.MemoryAllocationHeader.MemoryLength = DxeCoreLength;\r
708 gHob->DxeCore.EntryPoint = (EFI_PHYSICAL_ADDRESS)(UINTN)DxeCoreEntryPoint;\r
709}\r
710\r
711VOID *\r
712PrepareHobNvStorage (\r
713 VOID *NvStorageTop\r
714 )\r
715/*\r
716 Initialize Block-Aligned Firmware Block.\r
717\r
718 Variable:\r
719 +-------------------+\r
720 | FV_Header |\r
721 +-------------------+\r
722 | |\r
723 |VAR_STORAGE(0x4000)|\r
724 | |\r
725 +-------------------+\r
726 FTW:\r
727 +-------------------+\r
728 | FV_Header |\r
729 +-------------------+\r
730 | |\r
731 | Working(0x2000) |\r
732 | |\r
733 +-------------------+\r
734 | |\r
735 | Spare(0x10000) |\r
736 | |\r
737 +-------------------+\r
738*/\r
739{\r
e56dd2ce 740 STATIC VARIABLE_STORE_HEADER VarStoreHeader = {\r
3709c4cd 741 gEfiVariableGuid,\r
ca162103 742 0xffffffff, // will be fixed in Variable driver\r
743 VARIABLE_STORE_FORMATTED,\r
744 VARIABLE_STORE_HEALTHY,\r
745 0,\r
746 0\r
747 };\r
748 \r
e56dd2ce 749 STATIC EFI_FIRMWARE_VOLUME_HEADER NvStorageFvbHeader = {\r
ca162103 750 {\r
751 0,\r
752 }, // ZeroVector[16]\r
753 EFI_SYSTEM_NV_DATA_FV_GUID,\r
754 NV_STORAGE_FVB_SIZE,\r
755 EFI_FVH_SIGNATURE,\r
756 EFI_FVB_READ_ENABLED_CAP |\r
757 EFI_FVB_READ_STATUS |\r
758 EFI_FVB_WRITE_ENABLED_CAP |\r
759 EFI_FVB_WRITE_STATUS |\r
760 EFI_FVB_ERASE_POLARITY,\r
761 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH,\r
762 0, // CheckSum\r
763 0, // ExtHeaderOffset\r
764 {\r
765 0,\r
766 }, // Reserved[1]\r
767 1, // Revision\r
768 {\r
769 {\r
770 NV_STORAGE_FVB_BLOCK_NUM,\r
771 FV_BLOCK_SIZE,\r
772 }\r
773 }\r
774 };\r
775\r
e56dd2ce 776 STATIC EFI_FV_BLOCK_MAP_ENTRY BlockMapEntryEnd = {0, 0};\r
ca162103 777\r
778 EFI_PHYSICAL_ADDRESS StorageFvbBase;\r
779 EFI_PHYSICAL_ADDRESS FtwFvbBase;\r
780\r
781 UINT16 *Ptr;\r
782 UINT16 Checksum;\r
783\r
784\r
785 //\r
786 // Use first 16-byte Reset Vector of FVB to store extra information\r
787 // UINT32 Offset 0 stores the volume signature\r
788 // UINT8 Offset 4 : should init the Variable Store Header if non-zero\r
789 //\r
790 gHob->NvStorageFvb.FvbInfo.VolumeId = *(UINT32 *) (UINTN) (NV_STORAGE_STATE);\r
791 gHob->NvStorage. FvbInfo.VolumeId = *(UINT32 *) (UINTN) (NV_STORAGE_STATE);\r
792\r
793 //\r
794 // *(NV_STORAGE_STATE + 4):\r
795 // 2 - Size error\r
796 // 1 - File not exist\r
797 // 0 - File exist with correct size\r
798 //\r
799 if (*(UINT8 *) (UINTN) (NV_STORAGE_STATE + 4) == 2) {\r
800 ClearScreen ();\r
801 PrintString ("Error: Size of Efivar.bin should be 16k!\n");\r
802 CpuDeadLoop();\r
803 }\r
804 \r
805 if (*(UINT8 *) (UINTN) (NV_STORAGE_STATE + 4) != 0) {\r
806 //\r
807 // Efivar.bin doesn't exist\r
808 // 1. Init variable storage header to valid header\r
809 //\r
810 CopyMem (\r
811 (VOID *) (UINTN) NV_STORAGE_START,\r
812 &VarStoreHeader,\r
813 sizeof (VARIABLE_STORE_HEADER)\r
814 );\r
815 //\r
816 // 2. set all bits in variable storage body to 1\r
817 //\r
818 SetMem (\r
819 (VOID *) (UINTN) (NV_STORAGE_START + sizeof (VARIABLE_STORE_HEADER)),\r
820 NV_STORAGE_SIZE - sizeof (VARIABLE_STORE_HEADER),\r
821 0xff\r
822 );\r
823 }\r
824\r
825 //\r
826 // Relocate variable storage\r
827 // \r
828 // 1. Init FVB Header to valid header: First 0x48 bytes\r
829 // In real platform, these fields are fixed by tools\r
830 //\r
831 //\r
832 Checksum = 0;\r
833 for (\r
834 Ptr = (UINT16 *) &NvStorageFvbHeader; \r
835 Ptr < (UINT16 *) ((UINTN) (UINT8 *) &NvStorageFvbHeader + sizeof (EFI_FIRMWARE_VOLUME_HEADER));\r
836 ++Ptr\r
837 ) {\r
838 Checksum = (UINT16) (Checksum + (*Ptr));\r
839 }\r
840 NvStorageFvbHeader.Checksum = (UINT16) (0x10000 - Checksum);\r
841 StorageFvbBase = (EFI_PHYSICAL_ADDRESS)(((UINTN)NvStorageTop - NV_STORAGE_FVB_SIZE - NV_FTW_FVB_SIZE) & ~EFI_PAGE_MASK);\r
842 CopyMem ((VOID *) (UINTN) StorageFvbBase, &NvStorageFvbHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER));\r
843 CopyMem (\r
844 (VOID *) (UINTN) (StorageFvbBase + sizeof (EFI_FIRMWARE_VOLUME_HEADER)),\r
845 &BlockMapEntryEnd,\r
846 sizeof (EFI_FV_BLOCK_MAP_ENTRY)\r
847 );\r
848 \r
849 //\r
850 // 2. Relocate variable data\r
851 //\r
852 CopyMem (\r
853 (VOID *) (UINTN) (StorageFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH),\r
854 (VOID *) (UINTN) NV_STORAGE_START,\r
855 NV_STORAGE_SIZE\r
856 );\r
857\r
858 //\r
859 // 3. Set the remaining memory to 0xff\r
860 //\r
861 SetMem (\r
862 (VOID *) (UINTN) (StorageFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH + NV_STORAGE_SIZE),\r
863 NV_STORAGE_FVB_SIZE - NV_STORAGE_SIZE - EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH,\r
864 0xff\r
865 );\r
866\r
867 //\r
868 // Create the FVB holding NV Storage in memory\r
869 //\r
870 gHob->NvStorageFvResource.PhysicalStart =\r
871 gHob->NvStorageFvb.FvbInfo.Entries[0].Base = StorageFvbBase;\r
872 //\r
873 // Create the NV Storage Hob\r
874 //\r
875 gHob->NvStorage.FvbInfo.Entries[0].Base = StorageFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH;\r
876\r
877 //\r
878 // Create the FVB holding FTW spaces\r
879 //\r
880 FtwFvbBase = (EFI_PHYSICAL_ADDRESS)((UINTN) StorageFvbBase + NV_STORAGE_FVB_SIZE);\r
881 gHob->NvFtwFvb.FvbInfo.Entries[0].Base = FtwFvbBase;\r
882 //\r
883 // Put FTW Working in front\r
884 //\r
885 gHob->NvFtwWorking.FvbInfo.Entries[0].Base = FtwFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH;\r
886\r
887 //\r
888 // Put FTW Spare area after FTW Working area\r
889 //\r
890 gHob->NvFtwSpare.FvbInfo.Entries[0].Base = \r
891 (EFI_PHYSICAL_ADDRESS)((UINTN) FtwFvbBase + EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH + NV_FTW_WORKING_SIZE);\r
892 \r
893 return (VOID *)(UINTN)StorageFvbBase;\r
894}\r
895\r
896VOID\r
897PrepareHobPhit (\r
898 VOID *MemoryTop,\r
899 VOID *FreeMemoryTop\r
900 )\r
901{\r
902 gHob->Phit.EfiMemoryTop = (EFI_PHYSICAL_ADDRESS)(UINTN)MemoryTop;\r
903 gHob->Phit.EfiMemoryBottom = gHob->Phit.EfiMemoryTop - CONSUMED_MEMORY;\r
904 gHob->Phit.EfiFreeMemoryTop = (EFI_PHYSICAL_ADDRESS)(UINTN)FreeMemoryTop;\r
905 gHob->Phit.EfiFreeMemoryBottom = gHob->Phit.EfiMemoryBottom + sizeof(HOB_TEMPLATE);\r
906\r
907 CopyMem ((VOID *)(UINTN)gHob->Phit.EfiMemoryBottom, gHob, sizeof(HOB_TEMPLATE));\r
908 gHob = (HOB_TEMPLATE *)(UINTN)gHob->Phit.EfiMemoryBottom;\r
909\r
910 gHob->Phit.EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)&gHob->EndOfHobList;\r
911}\r
912\r
913VOID\r
914PrepareHobCpu (\r
915 VOID\r
916 )\r
917{\r
918 EFI_CPUID_REGISTER Reg;\r
919 UINT8 CpuMemoryAddrBitNumber;\r
920\r
921 //\r
922 // Create a CPU hand-off information\r
923 //\r
924 CpuMemoryAddrBitNumber = 36;\r
925 AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION, &Reg.RegEax, &Reg.RegEbx, &Reg.RegEcx, &Reg.RegEdx);\r
926\r
927 if (Reg.RegEax >= CPUID_EXTENDED_ADD_SIZE) {\r
928 AsmCpuid (CPUID_EXTENDED_ADD_SIZE, &Reg.RegEax, &Reg.RegEbx, &Reg.RegEcx, &Reg.RegEdx);\r
929 CpuMemoryAddrBitNumber = (UINT8)(UINTN)(Reg.RegEax & 0xFF);\r
930 }\r
931 \r
932 gHob->Cpu.SizeOfMemorySpace = CpuMemoryAddrBitNumber;\r
933}\r
934\r
935VOID\r
936CompleteHobGeneration (\r
937 VOID\r
938 )\r
939{\r
940 gHob->MemoryAllocation.AllocDescriptor.MemoryBaseAddress = gHob->Phit.EfiFreeMemoryTop;\r
941 //\r
942 // Reserve all the memory under Stack above FreeMemoryTop as allocated\r
943 //\r
944 gHob->MemoryAllocation.AllocDescriptor.MemoryLength = gHob->Stack.AllocDescriptor.MemoryBaseAddress - gHob->Phit.EfiFreeMemoryTop;\r
945\r
946 //\r
947 // adjust Above1MB ResourceLength\r
948 //\r
949 if (gHob->MemoryAbove1MB.PhysicalStart + gHob->MemoryAbove1MB.ResourceLength > gHob->Phit.EfiMemoryTop) {\r
950 gHob->MemoryAbove1MB.ResourceLength = gHob->Phit.EfiMemoryTop - gHob->MemoryAbove1MB.PhysicalStart;\r
951 }\r
952}\r
953\r