3 Copyright (c) 2006 - 2010, 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_DXE_FILE_GUID \
27 { 0xb1644c1a, 0xc16a, 0x4c5b, {0x88, 0xde, 0xea, 0xfb, 0xa9, 0x7e, 0x74, 0xd8 }}
29 #define EFI_CPUID_EXTENDED_FUNCTION 0x80000000
30 #define CPUID_EXTENDED_ADD_SIZE 0x80000008
32 HOB_TEMPLATE gHobTemplate
= {
35 EFI_HOB_TYPE_HANDOFF
, // HobType
36 sizeof (EFI_HOB_HANDOFF_INFO_TABLE
), // HobLength
39 EFI_HOB_HANDOFF_TABLE_VERSION
, // Version
40 BOOT_WITH_FULL_CONFIGURATION
, // BootMode
43 0, // EfiFreeMemoryTop
44 0, // EfiFreeMemoryBottom
49 EFI_HOB_TYPE_FV
, // HobType
50 sizeof (EFI_HOB_FIRMWARE_VOLUME
), // HobLength
58 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
59 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
65 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
66 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
67 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
68 EFI_RESOURCE_ATTRIBUTE_TESTED
|
69 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
75 EFI_HOB_TYPE_CPU
, // HobType
76 sizeof (EFI_HOB_CPU
), // HobLength
79 52, // SizeOfMemorySpace - Architecture Max
82 0, 0, 0, 0, 0, 0 // Reserved[6]
87 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // Hob type
88 sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK
), // Hob size
92 EFI_HOB_MEMORY_ALLOC_STACK_GUID
,
93 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
94 0x0, // UINT64 MemoryLength;
95 EfiBootServicesData
, // EFI_MEMORY_TYPE MemoryType;
96 {0, 0, 0, 0} // Reserved Reserved[4];
99 { // MemoryAllocation for HOB's & Images
101 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // HobType
102 sizeof (EFI_HOB_MEMORY_ALLOCATION
), // HobLength
107 0, //EFI_HOB_MEMORY_ALLOC_MODULE_GUID // Name
109 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
110 0x0, // UINT64 MemoryLength;
111 EfiBootServicesData
, // EFI_MEMORY_TYPE MemoryType;
113 0, 0, 0, 0 // Reserved Reserved[4];
117 { // MemoryFreeUnder1MB for unused memory that DXE core will claim
119 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
120 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
126 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
127 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
128 EFI_RESOURCE_ATTRIBUTE_TESTED
|
129 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
130 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
131 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
132 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
133 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
134 0x0, // PhysicalStart
137 { // MemoryFreeAbove1MB for unused memory that DXE core will claim
139 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
140 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
146 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
147 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
148 EFI_RESOURCE_ATTRIBUTE_TESTED
|
149 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
150 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
151 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
152 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
153 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
154 0x0, // PhysicalStart
157 { // MemoryFreeAbove4GB for unused memory that DXE core will claim
159 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
160 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
166 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
167 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
168 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
169 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
170 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
171 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
172 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
173 0x0, // PhysicalStart
176 { // Memory Allocation Module for DxeCore
178 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // Hob type
179 sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE
), // Hob size
183 EFI_HOB_MEMORY_ALLOC_MODULE_GUID
,
184 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
185 0x0, // UINT64 MemoryLength;
186 EfiBootServicesCode
, // EFI_MEMORY_TYPE MemoryType;
188 0, 0, 0, 0 // UINT8 Reserved[4];
192 0x0 // EFI_PHYSICAL_ADDRESS of EntryPoint;
196 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
197 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
203 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
204 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
205 // EFI_RESOURCE_ATTRIBUTE_TESTED | // Do not mark as TESTED, or DxeCore will find it and use it before check Allocation
206 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
207 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
208 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
209 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
210 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
211 0x0, // PhysicalStart
214 { // Memory Map Hints to reduce fragmentation in the memory map
217 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
218 sizeof (MEMORY_TYPE_INFORMATION_HOB
), // Hob size
221 EFI_MEMORY_TYPE_INFORMATION_GUID
225 EfiACPIReclaimMemory
,
227 }, // 0x80 pages = 512k for ASL
231 }, // 0x100 pages = 1024k for S3, SMM, etc
233 EfiReservedMemoryType
,
235 }, // 16k for BIOS Reserved
237 EfiRuntimeServicesData
,
241 EfiRuntimeServicesCode
,
266 { // Pointer to ACPI Table
269 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
270 sizeof (TABLE_HOB
), // Hob size
277 { // Pointer to ACPI20 Table
280 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
281 sizeof (TABLE_HOB
), // Hob size
284 EFI_ACPI_20_TABLE_GUID
288 { // Pointer to SMBIOS Table
291 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
292 sizeof (TABLE_HOB
), // Hob size
299 { // Pointer to MPS Table
302 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
303 sizeof (TABLE_HOB
), // Hob size
311 { // Pointer to FlushInstructionCache
312 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
313 sizeof (PROTOCOL_HOB), // Hob size
315 EFI_PEI_FLUSH_INSTRUCTION_CACHE_GUID,
318 { // Pointer to TransferControl
319 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
320 sizeof (PROTOCOL_HOB), // Hob size
322 EFI_PEI_TRANSFER_CONTROL_GUID,
325 { // Pointer to PeCoffLoader
326 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
327 sizeof (PROTOCOL_HOB), // Hob size
329 EFI_PEI_PE_COFF_LOADER_GUID,
332 { // Pointer to EfiDecompress
333 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
334 sizeof (PROTOCOL_HOB), // Hob size
336 EFI_DECOMPRESS_PROTOCOL_GUID,
339 { // Pointer to TianoDecompress
340 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
341 sizeof (PROTOCOL_HOB), // Hob size
343 EFI_TIANO_DECOMPRESS_PROTOCOL_GUID,
347 { // Pointer to ReportStatusCode
350 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
351 sizeof (PROTOCOL_HOB
), // Hob size
354 EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID
358 { // EFILDR Memory Descriptor
361 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
362 sizeof (MEMORY_DESC_HOB
), // Hob size
365 EFI_LDR_MEMORY_DESCRIPTOR_GUID
370 { // Pci Express Base Address Hob
373 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
374 sizeof (PCI_EXPRESS_BASE_HOB
), // Hob size
377 EFI_PCI_EXPRESS_BASE_ADDRESS_GUID
385 { // Acpi Description Hob
388 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
389 sizeof (ACPI_DESCRIPTION_HOB
), // Hob size
392 EFI_ACPI_DESCRIPTION_GUID
400 { // NV Storage FV Resource
402 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
403 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
409 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
410 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
411 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
412 EFI_RESOURCE_ATTRIBUTE_TESTED
|
413 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
414 0, // PhysicalStart (Fixed later)
415 NV_STORAGE_FVB_SIZE
// ResourceLength
417 { // FVB holding NV Storage
420 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
424 EFI_FLASH_MAP_HOB_GUID
427 {0, 0, 0}, // Reserved[3]
428 EFI_FLASH_AREA_GUID_DEFINED
, // AreaType
429 EFI_SYSTEM_NV_DATA_FV_GUID
, // AreaTypeGuid
433 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
434 0, // SubAreaData.Reserved
435 0, // SubAreaData.Base (Fixed later)
436 NV_STORAGE_FVB_SIZE
, // SubAreaData.Length
437 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
440 0, // VolumeSignature (Fixed later)
441 NV_STORAGE_FILE_PATH
, // Mapped file without padding
442 // TotalFVBSize = FileSize + PaddingSize = multiple of BLOCK_SIZE
443 NV_STORAGE_SIZE
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
445 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
451 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
452 sizeof (FVB_HOB
), // Hob size
455 EFI_FLASH_MAP_HOB_GUID
458 {0, 0, 0}, // Reserved[3]
459 EFI_FLASH_AREA_EFI_VARIABLES
, // AreaType
460 { 0 }, // AreaTypeGuid
464 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
465 0, // SubAreaData.Reserved
466 0, // SubAreaData.Base (Fixed later)
467 NV_STORAGE_SIZE
, // SubAreaData.Length
468 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
472 NV_STORAGE_FILE_PATH
,
477 { // NV Ftw FV Resource
479 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
480 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
486 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
487 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
488 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
489 EFI_RESOURCE_ATTRIBUTE_TESTED
|
490 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
491 0, // PhysicalStart (Fixed later)
492 NV_FTW_FVB_SIZE
// ResourceLength
494 { // FVB holding FTW spaces including Working & Spare space
497 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
501 EFI_FLASH_MAP_HOB_GUID
504 {0, 0, 0}, // Reserved[3]
505 EFI_FLASH_AREA_GUID_DEFINED
, // AreaType
506 EFI_SYSTEM_NV_DATA_FV_GUID
, // AreaTypeGuid
510 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
511 0, // SubAreaData.Reserved
512 0, // SubAreaData.Base (Fixed later)
513 NV_FTW_FVB_SIZE
, // SubAreaData.Length
514 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
518 L
"", // Empty String indicates using memory
523 { // NV Ftw working Hob
526 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
527 sizeof (FVB_HOB
), // Hob size
530 EFI_FLASH_MAP_HOB_GUID
533 {0, 0, 0}, // Reserved[3]
534 EFI_FLASH_AREA_FTW_STATE
, // AreaType
535 { 0 }, // AreaTypeGuid
539 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
540 0, // SubAreaData.Reserved
541 0, // SubAreaData.Base (Fixed later)
542 NV_FTW_WORKING_SIZE
, // SubAreaData.Length
543 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
546 0, // VolumeSignature
552 { // NV Ftw spare Hob
555 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
556 sizeof (FVB_HOB
), // Hob size
559 EFI_FLASH_MAP_HOB_GUID
562 {0, 0, 0}, // Reserved[3]
563 EFI_FLASH_AREA_FTW_BACKUP
, // AreaType
564 { 0 }, // AreaTypeGuid
568 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
569 0, // SubAreaData.Reserved
570 0, // SubAreaData.Base (Fixed later)
571 NV_FTW_SPARE_SIZE
, // SubAreaData.Length
572 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
582 EFI_HOB_TYPE_END_OF_HOB_LIST
, // HobType
583 sizeof (EFI_HOB_GENERIC_HEADER
), // HobLength
588 HOB_TEMPLATE
*gHob
= &gHobTemplate
;
592 IN UINTN NumberOfMemoryMapEntries
,
593 IN EFI_MEMORY_DESCRIPTOR
*EfiMemoryDescriptor
597 Update the Hob filling MemoryFreeUnder1MB, MemoryAbove1MB, MemoryAbove4GB
600 NumberOfMemoryMapEntries - Count of Memory Descriptors
601 EfiMemoryDescriptor - Point to the buffer containing NumberOfMemoryMapEntries Memory Descriptors
604 VOID * : The end address of MemoryAbove1MB (or the top free memory under 4GB)
610 // Prepare Low Memory
611 // 0x18 pages is 72 KB.
613 gHob
->MemoryFreeUnder1MB
.ResourceLength
= EFI_MEMORY_BELOW_1MB_END
- EFI_MEMORY_BELOW_1MB_START
;
614 gHob
->MemoryFreeUnder1MB
.PhysicalStart
= EFI_MEMORY_BELOW_1MB_START
;
617 // Prepare High Memory
618 // Assume Memory Map is ordered from low to high
620 gHob
->MemoryAbove1MB
.PhysicalStart
= 0;
621 gHob
->MemoryAbove1MB
.ResourceLength
= 0;
622 gHob
->MemoryAbove4GB
.PhysicalStart
= 0;
623 gHob
->MemoryAbove4GB
.ResourceLength
= 0;
625 for (Index
= 0; Index
< NumberOfMemoryMapEntries
; Index
++) {
627 // Skip regions below 1MB
629 if (EfiMemoryDescriptor
[Index
].PhysicalStart
< 0x100000) {
633 // Process regions above 1MB
635 if (EfiMemoryDescriptor
[Index
].PhysicalStart
>= 0x100000) {
636 if (EfiMemoryDescriptor
[Index
].Type
== EfiConventionalMemory
) {
637 if (gHob
->MemoryAbove1MB
.PhysicalStart
== 0) {
638 gHob
->MemoryAbove1MB
.PhysicalStart
= EfiMemoryDescriptor
[Index
].PhysicalStart
;
639 gHob
->MemoryAbove1MB
.ResourceLength
= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
640 } else if (gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
== EfiMemoryDescriptor
[Index
].PhysicalStart
) {
641 gHob
->MemoryAbove1MB
.ResourceLength
+= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
644 if ((EfiMemoryDescriptor
[Index
].Type
== EfiReservedMemoryType
) ||
645 (EfiMemoryDescriptor
[Index
].Type
>= EfiACPIReclaimMemory
) ) {
648 if ((EfiMemoryDescriptor
[Index
].Type
== EfiRuntimeServicesCode
) ||
649 (EfiMemoryDescriptor
[Index
].Type
== EfiRuntimeServicesData
)) {
654 // Process region above 4GB
656 if (EfiMemoryDescriptor
[Index
].PhysicalStart
>= 0x100000000LL
) {
657 if (EfiMemoryDescriptor
[Index
].Type
== EfiConventionalMemory
) {
658 if (gHob
->MemoryAbove4GB
.PhysicalStart
== 0) {
659 gHob
->MemoryAbove4GB
.PhysicalStart
= EfiMemoryDescriptor
[Index
].PhysicalStart
;
660 gHob
->MemoryAbove4GB
.ResourceLength
= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
662 if (gHob
->MemoryAbove4GB
.PhysicalStart
+ gHob
->MemoryAbove4GB
.ResourceLength
==
663 EfiMemoryDescriptor
[Index
].PhysicalStart
) {
664 gHob
->MemoryAbove4GB
.ResourceLength
+= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
670 if (gHob
->MemoryAbove4GB
.ResourceLength
== 0) {
672 // If there is no memory above 4GB then change the resource descriptor HOB
673 // into another type. I'm doing this as it's unclear if a resource
674 // descriptor HOB of length zero is valid. Spec does not say it's illegal,
675 // but code in EDK does not seem to handle this case.
677 gHob
->MemoryAbove4GB
.Header
.HobType
= EFI_HOB_TYPE_UNUSED
;
680 return (VOID
*)(UINTN
)(gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
);
688 gHob
->Stack
.AllocDescriptor
.MemoryLength
= EFI_MEMORY_STACK_PAGE_NUM
* EFI_PAGE_SIZE
;
689 gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)StackTop
- gHob
->Stack
.AllocDescriptor
.MemoryLength
;
691 return (VOID
*)(UINTN
)gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
;
695 PrepareHobMemoryDescriptor (
696 VOID
*MemoryDescriptorTop
,
698 EFI_MEMORY_DESCRIPTOR
*MemDesc
701 gHob
->MemoryDescriptor
.MemDescCount
= MemDescCount
;
702 gHob
->MemoryDescriptor
.MemDesc
= (EFI_MEMORY_DESCRIPTOR
*)((UINTN
)MemoryDescriptorTop
- MemDescCount
* sizeof(EFI_MEMORY_DESCRIPTOR
));
704 // Make MemoryDescriptor.MemDesc page aligned
706 gHob
->MemoryDescriptor
.MemDesc
= (EFI_MEMORY_DESCRIPTOR
*)((UINTN
) gHob
->MemoryDescriptor
.MemDesc
& ~EFI_PAGE_MASK
);
708 CopyMem (gHob
->MemoryDescriptor
.MemDesc
, MemDesc
, MemDescCount
* sizeof(EFI_MEMORY_DESCRIPTOR
));
710 return gHob
->MemoryDescriptor
.MemDesc
;
719 //UINTN BfvLengthPageSize;
722 // Calculate BFV location at top of the memory region.
723 // This is like a RAM Disk. Align to page boundry.
725 //BfvLengthPageSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BfvLength));
727 gHob
->Bfv
.BaseAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)Bfv
;
728 gHob
->Bfv
.Length
= BfvLength
;
731 // Resource descriptor for the FV
733 gHob
->BfvResource
.PhysicalStart
= gHob
->Bfv
.BaseAddress
;
734 gHob
->BfvResource
.ResourceLength
= gHob
->Bfv
.Length
;
739 VOID
*DxeCoreEntryPoint
,
740 EFI_PHYSICAL_ADDRESS DxeCoreImageBase
,
744 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryBaseAddress
= DxeCoreImageBase
;
745 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryLength
= DxeCoreLength
;
746 gHob
->DxeCore
.EntryPoint
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)DxeCoreEntryPoint
;
749 gHob
->MemoryDxeCore
.PhysicalStart
= DxeCoreImageBase
;
750 gHob
->MemoryDxeCore
.ResourceLength
= DxeCoreLength
;
754 PrepareHobNvStorage (
758 Initialize Block-Aligned Firmware Block.
761 +-------------------+
763 +-------------------+
765 |VAR_STORAGE(0x4000)|
767 +-------------------+
769 +-------------------+
771 +-------------------+
775 +-------------------+
779 +-------------------+
782 STATIC VARIABLE_STORE_HEADER VarStoreHeader
= {
783 VARIABLE_STORE_SIGNATURE
,
784 0xffffffff, // will be fixed in Variable driver
785 VARIABLE_STORE_FORMATTED
,
786 VARIABLE_STORE_HEALTHY
,
791 STATIC EFI_FIRMWARE_VOLUME_HEADER NvStorageFvbHeader
= {
795 EFI_SYSTEM_NV_DATA_FV_GUID
,
798 EFI_FVB_READ_ENABLED_CAP
|
799 EFI_FVB_READ_STATUS
|
800 EFI_FVB_WRITE_ENABLED_CAP
|
801 EFI_FVB_WRITE_STATUS
|
802 EFI_FVB_ERASE_POLARITY
,
803 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
805 0, // ExtHeaderOffset
812 NV_STORAGE_FVB_BLOCK_NUM
,
818 STATIC EFI_FV_BLOCK_MAP_ENTRY BlockMapEntryEnd
= {0, 0};
820 EFI_PHYSICAL_ADDRESS StorageFvbBase
;
821 EFI_PHYSICAL_ADDRESS FtwFvbBase
;
828 // Use first 16-byte Reset Vector of FVB to store extra information
829 // UINT32 Offset 0 stores the volume signature
830 // UINT8 Offset 4 : should init the Variable Store Header if non-zero
832 gHob
->NvStorageFvb
.FvbInfo
.VolumeId
= *(UINT32
*) (UINTN
) (NV_STORAGE_STATE
);
833 gHob
->NvStorage
. FvbInfo
.VolumeId
= *(UINT32
*) (UINTN
) (NV_STORAGE_STATE
);
836 // *(NV_STORAGE_STATE + 4):
838 // 1 - File not exist
839 // 0 - File exist with correct size
841 if (*(UINT8
*) (UINTN
) (NV_STORAGE_STATE
+ 4) == 2) {
843 PrintString ("Error: Size of Efivar.bin should be 16k!\n");
847 if (*(UINT8
*) (UINTN
) (NV_STORAGE_STATE
+ 4) != 0) {
849 // Efivar.bin doesn't exist
850 // 1. Init variable storage header to valid header
853 (VOID
*) (UINTN
) NV_STORAGE_START
,
855 sizeof (VARIABLE_STORE_HEADER
)
858 // 2. set all bits in variable storage body to 1
861 (VOID
*) (UINTN
) (NV_STORAGE_START
+ sizeof (VARIABLE_STORE_HEADER
)),
862 NV_STORAGE_SIZE
- sizeof (VARIABLE_STORE_HEADER
),
868 // Relocate variable storage
870 // 1. Init FVB Header to valid header: First 0x48 bytes
871 // In real platform, these fields are fixed by tools
876 Ptr
= (UINT16
*) &NvStorageFvbHeader
;
877 Ptr
< (UINT16
*) ((UINTN
) (UINT8
*) &NvStorageFvbHeader
+ sizeof (EFI_FIRMWARE_VOLUME_HEADER
));
880 Checksum
= (UINT16
) (Checksum
+ (*Ptr
));
882 NvStorageFvbHeader
.Checksum
= (UINT16
) (0x10000 - Checksum
);
883 StorageFvbBase
= (EFI_PHYSICAL_ADDRESS
)(((UINTN
)NvStorageTop
- NV_STORAGE_FVB_SIZE
- NV_FTW_FVB_SIZE
) & ~EFI_PAGE_MASK
);
884 CopyMem ((VOID
*) (UINTN
) StorageFvbBase
, &NvStorageFvbHeader
, sizeof (EFI_FIRMWARE_VOLUME_HEADER
));
886 (VOID
*) (UINTN
) (StorageFvbBase
+ sizeof (EFI_FIRMWARE_VOLUME_HEADER
)),
888 sizeof (EFI_FV_BLOCK_MAP_ENTRY
)
892 // 2. Relocate variable data
895 (VOID
*) (UINTN
) (StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
),
896 (VOID
*) (UINTN
) NV_STORAGE_START
,
901 // 3. Set the remaining memory to 0xff
904 (VOID
*) (UINTN
) (StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
+ NV_STORAGE_SIZE
),
905 NV_STORAGE_FVB_SIZE
- NV_STORAGE_SIZE
- EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
910 // Create the FVB holding NV Storage in memory
912 gHob
->NvStorageFvResource
.PhysicalStart
=
913 gHob
->NvStorageFvb
.FvbInfo
.Entries
[0].Base
= StorageFvbBase
;
915 // Create the NV Storage Hob
917 gHob
->NvStorage
.FvbInfo
.Entries
[0].Base
= StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
;
920 // Create the FVB holding FTW spaces
922 FtwFvbBase
= (EFI_PHYSICAL_ADDRESS
)((UINTN
) StorageFvbBase
+ NV_STORAGE_FVB_SIZE
);
923 gHob
->NvFtwFvResource
.PhysicalStart
=
924 gHob
->NvFtwFvb
.FvbInfo
.Entries
[0].Base
= FtwFvbBase
;
926 // Put FTW Working in front
928 gHob
->NvFtwWorking
.FvbInfo
.Entries
[0].Base
= FtwFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
;
931 // Put FTW Spare area after FTW Working area
933 gHob
->NvFtwSpare
.FvbInfo
.Entries
[0].Base
=
934 (EFI_PHYSICAL_ADDRESS
)((UINTN
) FtwFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
+ NV_FTW_WORKING_SIZE
);
936 return (VOID
*)(UINTN
)StorageFvbBase
;
945 gHob
->Phit
.EfiMemoryTop
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)MemoryTop
;
946 gHob
->Phit
.EfiMemoryBottom
= gHob
->Phit
.EfiMemoryTop
- CONSUMED_MEMORY
;
947 gHob
->Phit
.EfiFreeMemoryTop
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FreeMemoryTop
;
948 gHob
->Phit
.EfiFreeMemoryBottom
= gHob
->Phit
.EfiMemoryBottom
+ sizeof(HOB_TEMPLATE
);
950 CopyMem ((VOID
*)(UINTN
)gHob
->Phit
.EfiMemoryBottom
, gHob
, sizeof(HOB_TEMPLATE
));
951 gHob
= (HOB_TEMPLATE
*)(UINTN
)gHob
->Phit
.EfiMemoryBottom
;
953 gHob
->Phit
.EfiEndOfHobList
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)&gHob
->EndOfHobList
;
964 // Create a CPU hand-off information
966 gHob
->Cpu
.SizeOfMemorySpace
= 36;
968 AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION
, &CpuidEax
, NULL
, NULL
, NULL
);
969 if (CpuidEax
>= CPUID_EXTENDED_ADD_SIZE
) {
970 AsmCpuid (CPUID_EXTENDED_ADD_SIZE
, &CpuidEax
, NULL
, NULL
, NULL
);
971 gHob
->Cpu
.SizeOfMemorySpace
= (UINT8
)(CpuidEax
& 0xFF);
976 CompleteHobGeneration (
980 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryBaseAddress
= gHob
->Phit
.EfiFreeMemoryTop
;
982 // Reserve all the memory under Stack above FreeMemoryTop as allocated
984 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryLength
= gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
- gHob
->Phit
.EfiFreeMemoryTop
;
987 // adjust Above1MB ResourceLength
989 if (gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
> gHob
->Phit
.EfiMemoryTop
) {
990 gHob
->MemoryAbove1MB
.ResourceLength
= gHob
->Phit
.EfiMemoryTop
- gHob
->MemoryAbove1MB
.PhysicalStart
;