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.
21 #include "HobGeneration.h"
22 #include "PpisNeededByDxeCore.h"
23 #include "FlashLayout.h"
26 #define EFI_CPUID_EXTENDED_FUNCTION 0x80000000
27 #define CPUID_EXTENDED_ADD_SIZE 0x80000008
29 HOB_TEMPLATE gHobTemplate
= {
32 EFI_HOB_TYPE_HANDOFF
, // HobType
33 sizeof (EFI_HOB_HANDOFF_INFO_TABLE
), // HobLength
36 EFI_HOB_HANDOFF_TABLE_VERSION
, // Version
37 BOOT_WITH_FULL_CONFIGURATION
, // BootMode
40 0, // EfiFreeMemoryTop
41 0, // EfiFreeMemoryBottom
46 EFI_HOB_TYPE_FV
, // HobType
47 sizeof (EFI_HOB_FIRMWARE_VOLUME
), // HobLength
55 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
56 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
62 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
63 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
64 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
65 EFI_RESOURCE_ATTRIBUTE_TESTED
|
66 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
72 EFI_HOB_TYPE_CPU
, // HobType
73 sizeof (EFI_HOB_CPU
), // HobLength
76 52, // SizeOfMemorySpace - Architecture Max
79 0, 0, 0, 0, 0, 0 // Reserved[6]
84 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // Hob type
85 sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK
), // Hob size
89 EFI_HOB_MEMORY_ALLOC_STACK_GUID
,
90 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
91 0x0, // UINT64 MemoryLength;
92 EfiBootServicesData
, // EFI_MEMORY_TYPE MemoryType;
93 {0, 0, 0, 0} // Reserved Reserved[4];
96 { // MemoryAllocation for HOB's & Images
98 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // HobType
99 sizeof (EFI_HOB_MEMORY_ALLOCATION
), // HobLength
104 0, //EFI_HOB_MEMORY_ALLOC_MODULE_GUID // Name
106 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
107 0x0, // UINT64 MemoryLength;
108 EfiBootServicesData
, // EFI_MEMORY_TYPE MemoryType;
110 0, 0, 0, 0 // Reserved Reserved[4];
114 { // MemoryFreeUnder1MB for unused memory that DXE core will claim
116 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
117 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
123 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
124 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
125 EFI_RESOURCE_ATTRIBUTE_TESTED
|
126 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
127 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
128 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
129 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
130 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
131 0x0, // PhysicalStart
134 { // MemoryFreeAbove1MB for unused memory that DXE core will claim
136 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
137 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
143 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
144 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
145 EFI_RESOURCE_ATTRIBUTE_TESTED
|
146 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
147 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
148 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
149 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
150 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
151 0x0, // PhysicalStart
154 { // MemoryFreeAbove4GB for unused memory that DXE core will claim
156 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
157 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
163 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
164 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
165 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
166 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
167 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
168 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
169 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
170 0x0, // PhysicalStart
173 { // Memory Allocation Module for DxeCore
175 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // Hob type
176 sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE
), // Hob size
180 EFI_HOB_MEMORY_ALLOC_MODULE_GUID
,
181 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
182 0x0, // UINT64 MemoryLength;
183 EfiBootServicesCode
, // EFI_MEMORY_TYPE MemoryType;
185 0, 0, 0, 0 // UINT8 Reserved[4];
188 DXE_CORE_FILE_NAME_GUID
,
189 0x0 // EFI_PHYSICAL_ADDRESS of EntryPoint;
193 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
194 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
200 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
201 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
202 // EFI_RESOURCE_ATTRIBUTE_TESTED | // Do not mark as TESTED, or DxeCore will find it and use it before check Allocation
203 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
204 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
205 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
206 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
207 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
208 0x0, // PhysicalStart
211 { // Memory Map Hints to reduce fragmentation in the memory map
214 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
215 sizeof (MEMORY_TYPE_INFORMATION_HOB
), // Hob size
218 EFI_MEMORY_TYPE_INFORMATION_GUID
222 EfiACPIReclaimMemory
,
224 }, // 0x80 pages = 512k for ASL
228 }, // 0x100 pages = 1024k for S3, SMM, etc
230 EfiReservedMemoryType
,
232 }, // 16k for BIOS Reserved
234 EfiRuntimeServicesData
,
238 EfiRuntimeServicesCode
,
263 { // Pointer to ACPI Table
266 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
267 sizeof (TABLE_HOB
), // Hob size
274 { // Pointer to ACPI20 Table
277 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
278 sizeof (TABLE_HOB
), // Hob size
281 EFI_ACPI_20_TABLE_GUID
285 { // Pointer to SMBIOS Table
288 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
289 sizeof (TABLE_HOB
), // Hob size
296 { // Pointer to MPS Table
299 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
300 sizeof (TABLE_HOB
), // Hob size
308 { // Pointer to FlushInstructionCache
309 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
310 sizeof (PROTOCOL_HOB), // Hob size
312 EFI_PEI_FLUSH_INSTRUCTION_CACHE_GUID,
315 { // Pointer to TransferControl
316 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
317 sizeof (PROTOCOL_HOB), // Hob size
319 EFI_PEI_TRANSFER_CONTROL_GUID,
322 { // Pointer to PeCoffLoader
323 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
324 sizeof (PROTOCOL_HOB), // Hob size
326 EFI_PEI_PE_COFF_LOADER_GUID,
329 { // Pointer to EfiDecompress
330 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
331 sizeof (PROTOCOL_HOB), // Hob size
333 EFI_DECOMPRESS_PROTOCOL_GUID,
336 { // Pointer to TianoDecompress
337 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
338 sizeof (PROTOCOL_HOB), // Hob size
340 EFI_TIANO_DECOMPRESS_PROTOCOL_GUID,
344 { // Pointer to ReportStatusCode
347 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
348 sizeof (PROTOCOL_HOB
), // Hob size
351 EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID
355 { // EFILDR Memory Descriptor
358 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
359 sizeof (MEMORY_DESC_HOB
), // Hob size
362 LDR_MEMORY_DESCRIPTOR_GUID
367 { // Pci Express Base Address Hob
370 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
371 sizeof (PCI_EXPRESS_BASE_HOB
), // Hob size
374 EFI_PCI_EXPRESS_BASE_ADDRESS_GUID
382 { // Acpi Description Hob
385 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
386 sizeof (ACPI_DESCRIPTION_HOB
), // Hob size
389 EFI_ACPI_DESCRIPTION_GUID
397 { // NV Storage FV Resource
399 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
400 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
406 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
407 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
408 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
409 EFI_RESOURCE_ATTRIBUTE_TESTED
|
410 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
411 0, // PhysicalStart (Fixed later)
412 NV_STORAGE_FVB_SIZE
// ResourceLength
414 { // FVB holding NV Storage
417 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
421 EFI_FLASH_MAP_HOB_GUID
424 {0, 0, 0}, // Reserved[3]
425 EFI_FLASH_AREA_GUID_DEFINED
, // AreaType
426 EFI_SYSTEM_NV_DATA_FV_GUID
, // AreaTypeGuid
430 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
431 0, // SubAreaData.Reserved
432 0, // SubAreaData.Base (Fixed later)
433 NV_STORAGE_FVB_SIZE
, // SubAreaData.Length
434 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
437 0, // VolumeSignature (Fixed later)
438 NV_STORAGE_FILE_PATH
, // Mapped file without padding
439 // TotalFVBSize = FileSize + PaddingSize = multiple of BLOCK_SIZE
440 NV_STORAGE_SIZE
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
442 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
448 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
449 sizeof (FVB_HOB
), // Hob size
452 EFI_FLASH_MAP_HOB_GUID
455 {0, 0, 0}, // Reserved[3]
456 EFI_FLASH_AREA_EFI_VARIABLES
, // AreaType
457 { 0 }, // AreaTypeGuid
461 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
462 0, // SubAreaData.Reserved
463 0, // SubAreaData.Base (Fixed later)
464 NV_STORAGE_SIZE
, // SubAreaData.Length
465 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
469 NV_STORAGE_FILE_PATH
,
474 { // NV Ftw FV Resource
476 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
477 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
483 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
484 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
485 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
486 EFI_RESOURCE_ATTRIBUTE_TESTED
|
487 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
488 0, // PhysicalStart (Fixed later)
489 NV_FTW_FVB_SIZE
// ResourceLength
491 { // FVB holding FTW spaces including Working & Spare space
494 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
498 EFI_FLASH_MAP_HOB_GUID
501 {0, 0, 0}, // Reserved[3]
502 EFI_FLASH_AREA_GUID_DEFINED
, // AreaType
503 EFI_SYSTEM_NV_DATA_FV_GUID
, // AreaTypeGuid
507 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
508 0, // SubAreaData.Reserved
509 0, // SubAreaData.Base (Fixed later)
510 NV_FTW_FVB_SIZE
, // SubAreaData.Length
511 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
515 L
"", // Empty String indicates using memory
520 { // NV Ftw working Hob
523 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
524 sizeof (FVB_HOB
), // Hob size
527 EFI_FLASH_MAP_HOB_GUID
530 {0, 0, 0}, // Reserved[3]
531 EFI_FLASH_AREA_FTW_STATE
, // AreaType
532 { 0 }, // AreaTypeGuid
536 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
537 0, // SubAreaData.Reserved
538 0, // SubAreaData.Base (Fixed later)
539 NV_FTW_WORKING_SIZE
, // SubAreaData.Length
540 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
543 0, // VolumeSignature
549 { // NV Ftw spare Hob
552 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
553 sizeof (FVB_HOB
), // Hob size
556 EFI_FLASH_MAP_HOB_GUID
559 {0, 0, 0}, // Reserved[3]
560 EFI_FLASH_AREA_FTW_BACKUP
, // AreaType
561 { 0 }, // AreaTypeGuid
565 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
566 0, // SubAreaData.Reserved
567 0, // SubAreaData.Base (Fixed later)
568 NV_FTW_SPARE_SIZE
, // SubAreaData.Length
569 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
579 EFI_HOB_TYPE_END_OF_HOB_LIST
, // HobType
580 sizeof (EFI_HOB_GENERIC_HEADER
), // HobLength
585 HOB_TEMPLATE
*gHob
= &gHobTemplate
;
589 IN UINTN NumberOfMemoryMapEntries
,
590 IN EFI_MEMORY_DESCRIPTOR
*EfiMemoryDescriptor
594 Update the Hob filling MemoryFreeUnder1MB, MemoryAbove1MB, MemoryAbove4GB
597 NumberOfMemoryMapEntries - Count of Memory Descriptors
598 EfiMemoryDescriptor - Point to the buffer containing NumberOfMemoryMapEntries Memory Descriptors
601 VOID * : The end address of MemoryAbove1MB (or the top free memory under 4GB)
607 // Prepare Low Memory
608 // 0x18 pages is 72 KB.
610 gHob
->MemoryFreeUnder1MB
.ResourceLength
= EFI_MEMORY_BELOW_1MB_END
- EFI_MEMORY_BELOW_1MB_START
;
611 gHob
->MemoryFreeUnder1MB
.PhysicalStart
= EFI_MEMORY_BELOW_1MB_START
;
614 // Prepare High Memory
615 // Assume Memory Map is ordered from low to high
617 gHob
->MemoryAbove1MB
.PhysicalStart
= 0;
618 gHob
->MemoryAbove1MB
.ResourceLength
= 0;
619 gHob
->MemoryAbove4GB
.PhysicalStart
= 0;
620 gHob
->MemoryAbove4GB
.ResourceLength
= 0;
622 for (Index
= 0; Index
< NumberOfMemoryMapEntries
; Index
++) {
624 // Skip regions below 1MB
626 if (EfiMemoryDescriptor
[Index
].PhysicalStart
< 0x100000) {
630 // Process regions above 1MB
632 if (EfiMemoryDescriptor
[Index
].PhysicalStart
>= 0x100000) {
633 if (EfiMemoryDescriptor
[Index
].Type
== EfiConventionalMemory
) {
634 if (gHob
->MemoryAbove1MB
.PhysicalStart
== 0) {
635 gHob
->MemoryAbove1MB
.PhysicalStart
= EfiMemoryDescriptor
[Index
].PhysicalStart
;
636 gHob
->MemoryAbove1MB
.ResourceLength
= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
637 } else if (gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
== EfiMemoryDescriptor
[Index
].PhysicalStart
) {
638 gHob
->MemoryAbove1MB
.ResourceLength
+= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
641 if ((EfiMemoryDescriptor
[Index
].Type
== EfiReservedMemoryType
) ||
642 (EfiMemoryDescriptor
[Index
].Type
>= EfiACPIReclaimMemory
) ) {
645 if ((EfiMemoryDescriptor
[Index
].Type
== EfiRuntimeServicesCode
) ||
646 (EfiMemoryDescriptor
[Index
].Type
== EfiRuntimeServicesData
)) {
651 // Process region above 4GB
653 if (EfiMemoryDescriptor
[Index
].PhysicalStart
>= 0x100000000LL
) {
654 if (EfiMemoryDescriptor
[Index
].Type
== EfiConventionalMemory
) {
655 if (gHob
->MemoryAbove4GB
.PhysicalStart
== 0) {
656 gHob
->MemoryAbove4GB
.PhysicalStart
= EfiMemoryDescriptor
[Index
].PhysicalStart
;
657 gHob
->MemoryAbove4GB
.ResourceLength
= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
659 if (gHob
->MemoryAbove4GB
.PhysicalStart
+ gHob
->MemoryAbove4GB
.ResourceLength
==
660 EfiMemoryDescriptor
[Index
].PhysicalStart
) {
661 gHob
->MemoryAbove4GB
.ResourceLength
+= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
667 if (gHob
->MemoryAbove4GB
.ResourceLength
== 0) {
669 // If there is no memory above 4GB then change the resource descriptor HOB
670 // into another type. I'm doing this as it's unclear if a resource
671 // descriptor HOB of length zero is valid. Spec does not say it's illegal,
672 // but code in EDK does not seem to handle this case.
674 gHob
->MemoryAbove4GB
.Header
.HobType
= EFI_HOB_TYPE_UNUSED
;
677 return (VOID
*)(UINTN
)(gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
);
685 gHob
->Stack
.AllocDescriptor
.MemoryLength
= EFI_MEMORY_STACK_PAGE_NUM
* EFI_PAGE_SIZE
;
686 gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)StackTop
- gHob
->Stack
.AllocDescriptor
.MemoryLength
;
688 return (VOID
*)(UINTN
)gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
;
692 PrepareHobMemoryDescriptor (
693 VOID
*MemoryDescriptorTop
,
695 EFI_MEMORY_DESCRIPTOR
*MemDesc
698 gHob
->MemoryDescriptor
.MemDescCount
= MemDescCount
;
699 gHob
->MemoryDescriptor
.MemDesc
= (EFI_MEMORY_DESCRIPTOR
*)((UINTN
)MemoryDescriptorTop
- MemDescCount
* sizeof(EFI_MEMORY_DESCRIPTOR
));
701 // Make MemoryDescriptor.MemDesc page aligned
703 gHob
->MemoryDescriptor
.MemDesc
= (EFI_MEMORY_DESCRIPTOR
*)((UINTN
) gHob
->MemoryDescriptor
.MemDesc
& ~EFI_PAGE_MASK
);
705 CopyMem (gHob
->MemoryDescriptor
.MemDesc
, MemDesc
, MemDescCount
* sizeof(EFI_MEMORY_DESCRIPTOR
));
707 return gHob
->MemoryDescriptor
.MemDesc
;
716 //UINTN BfvLengthPageSize;
719 // Calculate BFV location at top of the memory region.
720 // This is like a RAM Disk. Align to page boundry.
722 //BfvLengthPageSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BfvLength));
724 gHob
->Bfv
.BaseAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)Bfv
;
725 gHob
->Bfv
.Length
= BfvLength
;
728 // Resource descriptor for the FV
730 gHob
->BfvResource
.PhysicalStart
= gHob
->Bfv
.BaseAddress
;
731 gHob
->BfvResource
.ResourceLength
= gHob
->Bfv
.Length
;
736 VOID
*DxeCoreEntryPoint
,
737 EFI_PHYSICAL_ADDRESS DxeCoreImageBase
,
741 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryBaseAddress
= DxeCoreImageBase
;
742 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryLength
= DxeCoreLength
;
743 gHob
->DxeCore
.EntryPoint
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)DxeCoreEntryPoint
;
746 gHob
->MemoryDxeCore
.PhysicalStart
= DxeCoreImageBase
;
747 gHob
->MemoryDxeCore
.ResourceLength
= DxeCoreLength
;
751 PrepareHobNvStorage (
755 Initialize Block-Aligned Firmware Block.
758 +-------------------+
760 +-------------------+
762 |VAR_STORAGE(0x4000)|
764 +-------------------+
766 +-------------------+
768 +-------------------+
772 +-------------------+
776 +-------------------+
779 STATIC VARIABLE_STORE_HEADER VarStoreHeader
= {
780 VARIABLE_STORE_SIGNATURE
,
781 0xffffffff, // will be fixed in Variable driver
782 VARIABLE_STORE_FORMATTED
,
783 VARIABLE_STORE_HEALTHY
,
788 STATIC EFI_FIRMWARE_VOLUME_HEADER NvStorageFvbHeader
= {
792 EFI_SYSTEM_NV_DATA_FV_GUID
,
795 EFI_FVB_READ_ENABLED_CAP
|
796 EFI_FVB_READ_STATUS
|
797 EFI_FVB_WRITE_ENABLED_CAP
|
798 EFI_FVB_WRITE_STATUS
|
799 EFI_FVB_ERASE_POLARITY
,
800 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
802 0, // ExtHeaderOffset
809 NV_STORAGE_FVB_BLOCK_NUM
,
815 STATIC EFI_FV_BLOCK_MAP_ENTRY BlockMapEntryEnd
= {0, 0};
817 EFI_PHYSICAL_ADDRESS StorageFvbBase
;
818 EFI_PHYSICAL_ADDRESS FtwFvbBase
;
825 // Use first 16-byte Reset Vector of FVB to store extra information
826 // UINT32 Offset 0 stores the volume signature
827 // UINT8 Offset 4 : should init the Variable Store Header if non-zero
829 gHob
->NvStorageFvb
.FvbInfo
.VolumeId
= *(UINT32
*) (UINTN
) (NV_STORAGE_STATE
);
830 gHob
->NvStorage
. FvbInfo
.VolumeId
= *(UINT32
*) (UINTN
) (NV_STORAGE_STATE
);
833 // *(NV_STORAGE_STATE + 4):
835 // 1 - File not exist
836 // 0 - File exist with correct size
838 if (*(UINT8
*) (UINTN
) (NV_STORAGE_STATE
+ 4) == 2) {
840 PrintString ("Error: Size of Efivar.bin should be 16k!\n");
844 if (*(UINT8
*) (UINTN
) (NV_STORAGE_STATE
+ 4) != 0) {
846 // Efivar.bin doesn't exist
847 // 1. Init variable storage header to valid header
850 (VOID
*) (UINTN
) NV_STORAGE_START
,
852 sizeof (VARIABLE_STORE_HEADER
)
855 // 2. set all bits in variable storage body to 1
858 (VOID
*) (UINTN
) (NV_STORAGE_START
+ sizeof (VARIABLE_STORE_HEADER
)),
859 NV_STORAGE_SIZE
- sizeof (VARIABLE_STORE_HEADER
),
865 // Relocate variable storage
867 // 1. Init FVB Header to valid header: First 0x48 bytes
868 // In real platform, these fields are fixed by tools
873 Ptr
= (UINT16
*) &NvStorageFvbHeader
;
874 Ptr
< (UINT16
*) ((UINTN
) (UINT8
*) &NvStorageFvbHeader
+ sizeof (EFI_FIRMWARE_VOLUME_HEADER
));
877 Checksum
= (UINT16
) (Checksum
+ (*Ptr
));
879 NvStorageFvbHeader
.Checksum
= (UINT16
) (0x10000 - Checksum
);
880 StorageFvbBase
= (EFI_PHYSICAL_ADDRESS
)(((UINTN
)NvStorageTop
- NV_STORAGE_FVB_SIZE
- NV_FTW_FVB_SIZE
) & ~EFI_PAGE_MASK
);
881 CopyMem ((VOID
*) (UINTN
) StorageFvbBase
, &NvStorageFvbHeader
, sizeof (EFI_FIRMWARE_VOLUME_HEADER
));
883 (VOID
*) (UINTN
) (StorageFvbBase
+ sizeof (EFI_FIRMWARE_VOLUME_HEADER
)),
885 sizeof (EFI_FV_BLOCK_MAP_ENTRY
)
889 // 2. Relocate variable data
892 (VOID
*) (UINTN
) (StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
),
893 (VOID
*) (UINTN
) NV_STORAGE_START
,
898 // 3. Set the remaining memory to 0xff
901 (VOID
*) (UINTN
) (StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
+ NV_STORAGE_SIZE
),
902 NV_STORAGE_FVB_SIZE
- NV_STORAGE_SIZE
- EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
907 // Create the FVB holding NV Storage in memory
909 gHob
->NvStorageFvResource
.PhysicalStart
=
910 gHob
->NvStorageFvb
.FvbInfo
.Entries
[0].Base
= StorageFvbBase
;
912 // Create the NV Storage Hob
914 gHob
->NvStorage
.FvbInfo
.Entries
[0].Base
= StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
;
917 // Create the FVB holding FTW spaces
919 FtwFvbBase
= (EFI_PHYSICAL_ADDRESS
)((UINTN
) StorageFvbBase
+ NV_STORAGE_FVB_SIZE
);
920 gHob
->NvFtwFvResource
.PhysicalStart
=
921 gHob
->NvFtwFvb
.FvbInfo
.Entries
[0].Base
= FtwFvbBase
;
923 // Put FTW Working in front
925 gHob
->NvFtwWorking
.FvbInfo
.Entries
[0].Base
= FtwFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
;
928 // Put FTW Spare area after FTW Working area
930 gHob
->NvFtwSpare
.FvbInfo
.Entries
[0].Base
=
931 (EFI_PHYSICAL_ADDRESS
)((UINTN
) FtwFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
+ NV_FTW_WORKING_SIZE
);
933 return (VOID
*)(UINTN
)StorageFvbBase
;
942 gHob
->Phit
.EfiMemoryTop
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)MemoryTop
;
943 gHob
->Phit
.EfiMemoryBottom
= gHob
->Phit
.EfiMemoryTop
- CONSUMED_MEMORY
;
944 gHob
->Phit
.EfiFreeMemoryTop
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FreeMemoryTop
;
945 gHob
->Phit
.EfiFreeMemoryBottom
= gHob
->Phit
.EfiMemoryBottom
+ sizeof(HOB_TEMPLATE
);
947 CopyMem ((VOID
*)(UINTN
)gHob
->Phit
.EfiMemoryBottom
, gHob
, sizeof(HOB_TEMPLATE
));
948 gHob
= (HOB_TEMPLATE
*)(UINTN
)gHob
->Phit
.EfiMemoryBottom
;
950 gHob
->Phit
.EfiEndOfHobList
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)&gHob
->EndOfHobList
;
961 // Create a CPU hand-off information
963 gHob
->Cpu
.SizeOfMemorySpace
= 36;
965 AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION
, &CpuidEax
, NULL
, NULL
, NULL
);
966 if (CpuidEax
>= CPUID_EXTENDED_ADD_SIZE
) {
967 AsmCpuid (CPUID_EXTENDED_ADD_SIZE
, &CpuidEax
, NULL
, NULL
, NULL
);
968 gHob
->Cpu
.SizeOfMemorySpace
= (UINT8
)(CpuidEax
& 0xFF);
973 CompleteHobGeneration (
977 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryBaseAddress
= gHob
->Phit
.EfiFreeMemoryTop
;
979 // Reserve all the memory under Stack above FreeMemoryTop as allocated
981 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryLength
= gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
- gHob
->Phit
.EfiFreeMemoryTop
;
984 // adjust Above1MB ResourceLength
986 if (gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
> gHob
->Phit
.EfiMemoryTop
) {
987 gHob
->MemoryAbove1MB
.ResourceLength
= gHob
->Phit
.EfiMemoryTop
- gHob
->MemoryAbove1MB
.PhysicalStart
;