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