3 Copyright (c) 2006 - 2014, 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
28 #define EBDA_VALUE_ADDRESS 0x40E
30 HOB_TEMPLATE gHobTemplate
= {
33 EFI_HOB_TYPE_HANDOFF
, // HobType
34 sizeof (EFI_HOB_HANDOFF_INFO_TABLE
), // HobLength
37 EFI_HOB_HANDOFF_TABLE_VERSION
, // Version
38 BOOT_WITH_FULL_CONFIGURATION
, // BootMode
41 0, // EfiFreeMemoryTop
42 0, // EfiFreeMemoryBottom
47 EFI_HOB_TYPE_FV
, // HobType
48 sizeof (EFI_HOB_FIRMWARE_VOLUME
), // HobLength
56 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
57 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
63 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
64 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
65 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
66 EFI_RESOURCE_ATTRIBUTE_TESTED
|
67 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
73 EFI_HOB_TYPE_CPU
, // HobType
74 sizeof (EFI_HOB_CPU
), // HobLength
77 52, // SizeOfMemorySpace - Architecture Max
80 0, 0, 0, 0, 0, 0 // Reserved[6]
85 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // Hob type
86 sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK
), // Hob size
90 EFI_HOB_MEMORY_ALLOC_STACK_GUID
,
91 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
92 0x0, // UINT64 MemoryLength;
93 EfiBootServicesData
, // EFI_MEMORY_TYPE MemoryType;
94 {0, 0, 0, 0} // Reserved Reserved[4];
97 { // MemoryAllocation for HOB's & Images
99 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // HobType
100 sizeof (EFI_HOB_MEMORY_ALLOCATION
), // HobLength
105 0, //EFI_HOB_MEMORY_ALLOC_MODULE_GUID // Name
107 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
108 0x0, // UINT64 MemoryLength;
109 EfiBootServicesData
, // EFI_MEMORY_TYPE MemoryType;
111 0, 0, 0, 0 // Reserved Reserved[4];
115 { // MemoryFreeUnder1MB for unused memory that DXE core will claim
117 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
118 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
124 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
125 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
126 EFI_RESOURCE_ATTRIBUTE_TESTED
|
127 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
128 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
129 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
130 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
131 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
132 0x0, // PhysicalStart
135 { // MemoryFreeAbove1MB for unused memory that DXE core will claim
137 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
138 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
144 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
145 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
146 EFI_RESOURCE_ATTRIBUTE_TESTED
|
147 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
148 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
149 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
150 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
151 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
152 0x0, // PhysicalStart
155 { // MemoryFreeAbove4GB for unused memory that DXE core will claim
157 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
158 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
164 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
165 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
166 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
167 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
168 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
169 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
170 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
171 0x0, // PhysicalStart
174 { // Memory Allocation Module for DxeCore
176 EFI_HOB_TYPE_MEMORY_ALLOCATION
, // Hob type
177 sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE
), // Hob size
181 EFI_HOB_MEMORY_ALLOC_MODULE_GUID
,
182 0x0, // EFI_PHYSICAL_ADDRESS MemoryBaseAddress;
183 0x0, // UINT64 MemoryLength;
184 EfiBootServicesCode
, // EFI_MEMORY_TYPE MemoryType;
186 0, 0, 0, 0 // UINT8 Reserved[4];
189 DXE_CORE_FILE_NAME_GUID
,
190 0x0 // EFI_PHYSICAL_ADDRESS of EntryPoint;
194 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
195 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
201 EFI_RESOURCE_SYSTEM_MEMORY
, // ResourceType
202 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
203 // EFI_RESOURCE_ATTRIBUTE_TESTED | // Do not mark as TESTED, or DxeCore will find it and use it before check Allocation
204 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
205 EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE
|
206 EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE
|
207 EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE
|
208 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
),
209 0x0, // PhysicalStart
212 { // Memory Map Hints to reduce fragmentation in the memory map
215 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
216 sizeof (MEMORY_TYPE_INFORMATION_HOB
), // Hob size
219 EFI_MEMORY_TYPE_INFORMATION_GUID
223 EfiACPIReclaimMemory
,
225 }, // 0x80 pages = 512k for ASL
229 }, // 0x100 pages = 1024k for S3, SMM, etc
231 EfiReservedMemoryType
,
233 }, // 16k for BIOS Reserved
235 EfiRuntimeServicesData
,
239 EfiRuntimeServicesCode
,
264 { // Pointer to ACPI Table
267 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
268 sizeof (TABLE_HOB
), // Hob size
275 { // Pointer to ACPI20 Table
278 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
279 sizeof (TABLE_HOB
), // Hob size
282 EFI_ACPI_20_TABLE_GUID
286 { // Pointer to SMBIOS Table
289 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
290 sizeof (TABLE_HOB
), // Hob size
297 { // Pointer to MPS Table
300 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
301 sizeof (TABLE_HOB
), // Hob size
309 { // Pointer to FlushInstructionCache
310 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
311 sizeof (PROTOCOL_HOB), // Hob size
313 EFI_PEI_FLUSH_INSTRUCTION_CACHE_GUID,
316 { // Pointer to TransferControl
317 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
318 sizeof (PROTOCOL_HOB), // Hob size
320 EFI_PEI_TRANSFER_CONTROL_GUID,
323 { // Pointer to PeCoffLoader
324 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
325 sizeof (PROTOCOL_HOB), // Hob size
327 EFI_PEI_PE_COFF_LOADER_GUID,
330 { // Pointer to EfiDecompress
331 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
332 sizeof (PROTOCOL_HOB), // Hob size
334 EFI_DECOMPRESS_PROTOCOL_GUID,
337 { // Pointer to TianoDecompress
338 EFI_HOB_TYPE_GUID_EXTENSION, // Hob type
339 sizeof (PROTOCOL_HOB), // Hob size
341 EFI_TIANO_DECOMPRESS_PROTOCOL_GUID,
345 { // Pointer to ReportStatusCode
348 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
349 sizeof (PROTOCOL_HOB
), // Hob size
352 EFI_STATUS_CODE_RUNTIME_PROTOCOL_GUID
356 { // EFILDR Memory Descriptor
359 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
360 sizeof (MEMORY_DESC_HOB
), // Hob size
363 LDR_MEMORY_DESCRIPTOR_GUID
368 { // Pci Express Base Address Hob
371 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
372 sizeof (PCI_EXPRESS_BASE_HOB
), // Hob size
375 EFI_PCI_EXPRESS_BASE_ADDRESS_GUID
383 { // Acpi Description Hob
386 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
387 sizeof (ACPI_DESCRIPTION_HOB
), // Hob size
390 EFI_ACPI_DESCRIPTION_GUID
398 { // NV Storage FV Resource
400 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
401 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
407 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
408 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
409 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
410 EFI_RESOURCE_ATTRIBUTE_TESTED
|
411 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
412 0, // PhysicalStart (Fixed later)
413 NV_STORAGE_FVB_SIZE
// ResourceLength
415 { // FVB holding NV Storage
418 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
422 EFI_FLASH_MAP_HOB_GUID
425 {0, 0, 0}, // Reserved[3]
426 EFI_FLASH_AREA_GUID_DEFINED
, // AreaType
427 EFI_SYSTEM_NV_DATA_FV_GUID
, // AreaTypeGuid
431 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
432 0, // SubAreaData.Reserved
433 0, // SubAreaData.Base (Fixed later)
434 NV_STORAGE_FVB_SIZE
, // SubAreaData.Length
435 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
438 0, // VolumeSignature (Fixed later)
439 NV_STORAGE_FILE_PATH
, // Mapped file without padding
440 // TotalFVBSize = FileSize + PaddingSize = multiple of BLOCK_SIZE
441 NV_STORAGE_SIZE
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
443 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
449 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
450 sizeof (FVB_HOB
), // Hob size
453 EFI_FLASH_MAP_HOB_GUID
456 {0, 0, 0}, // Reserved[3]
457 EFI_FLASH_AREA_EFI_VARIABLES
, // AreaType
458 { 0 }, // AreaTypeGuid
462 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
463 0, // SubAreaData.Reserved
464 0, // SubAreaData.Base (Fixed later)
465 NV_STORAGE_SIZE
, // SubAreaData.Length
466 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
470 NV_STORAGE_FILE_PATH
,
475 { // NV Ftw FV Resource
477 EFI_HOB_TYPE_RESOURCE_DESCRIPTOR
, // HobType
478 sizeof (EFI_HOB_RESOURCE_DESCRIPTOR
), // HobLength
484 EFI_RESOURCE_FIRMWARE_DEVICE
, // ResourceType
485 (EFI_RESOURCE_ATTRIBUTE_PRESENT
|
486 EFI_RESOURCE_ATTRIBUTE_INITIALIZED
|
487 EFI_RESOURCE_ATTRIBUTE_TESTED
|
488 EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE
), // ResourceAttribute
489 0, // PhysicalStart (Fixed later)
490 NV_FTW_FVB_SIZE
// ResourceLength
492 { // FVB holding FTW spaces including Working & Spare space
495 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
499 EFI_FLASH_MAP_HOB_GUID
502 {0, 0, 0}, // Reserved[3]
503 EFI_FLASH_AREA_GUID_DEFINED
, // AreaType
504 EFI_SYSTEM_NV_DATA_FV_GUID
, // AreaTypeGuid
508 EFI_FLASH_AREA_FV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
509 0, // SubAreaData.Reserved
510 0, // SubAreaData.Base (Fixed later)
511 NV_FTW_FVB_SIZE
, // SubAreaData.Length
512 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
516 L
"", // Empty String indicates using memory
521 { // NV Ftw working Hob
524 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
525 sizeof (FVB_HOB
), // Hob size
528 EFI_FLASH_MAP_HOB_GUID
531 {0, 0, 0}, // Reserved[3]
532 EFI_FLASH_AREA_FTW_STATE
, // AreaType
533 { 0 }, // AreaTypeGuid
537 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
538 0, // SubAreaData.Reserved
539 0, // SubAreaData.Base (Fixed later)
540 NV_FTW_WORKING_SIZE
, // SubAreaData.Length
541 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
544 0, // VolumeSignature
550 { // NV Ftw spare Hob
553 EFI_HOB_TYPE_GUID_EXTENSION
, // Hob type
554 sizeof (FVB_HOB
), // Hob size
557 EFI_FLASH_MAP_HOB_GUID
560 {0, 0, 0}, // Reserved[3]
561 EFI_FLASH_AREA_FTW_BACKUP
, // AreaType
562 { 0 }, // AreaTypeGuid
566 EFI_FLASH_AREA_SUBFV
| EFI_FLASH_AREA_MEMMAPPED_FV
, // SubAreaData.Attributes
567 0, // SubAreaData.Reserved
568 0, // SubAreaData.Base (Fixed later)
569 NV_FTW_SPARE_SIZE
, // SubAreaData.Length
570 EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL_GUID
// SubAreaData.FileSystem
580 EFI_HOB_TYPE_END_OF_HOB_LIST
, // HobType
581 sizeof (EFI_HOB_GENERIC_HEADER
), // HobLength
586 HOB_TEMPLATE
*gHob
= &gHobTemplate
;
590 IN UINTN NumberOfMemoryMapEntries
,
591 IN EFI_MEMORY_DESCRIPTOR
*EfiMemoryDescriptor
595 Update the Hob filling MemoryFreeUnder1MB, MemoryAbove1MB, MemoryAbove4GB
598 NumberOfMemoryMapEntries - Count of Memory Descriptors
599 EfiMemoryDescriptor - Point to the buffer containing NumberOfMemoryMapEntries Memory Descriptors
602 VOID * : The end address of MemoryAbove1MB (or the top free memory under 4GB)
609 // Prepare Low Memory
610 // 0x18 pages is 72 KB.
612 EbdaAddress
= ((UINT64
)(*(UINT16
*)(UINTN
)(EBDA_VALUE_ADDRESS
))) << 4;
613 if (EbdaAddress
< 0x9A000 || EbdaAddress
> EFI_MEMORY_BELOW_1MB_END
) {
615 // EBDA should not go below 0x9A000 in any implementation,
616 // so add check here to make sure EBDA_VALUE_ADDRESS has a valid value.
618 EbdaAddress
= EFI_MEMORY_BELOW_1MB_END
;
620 gHob
->MemoryFreeUnder1MB
.ResourceLength
= EbdaAddress
- EFI_MEMORY_BELOW_1MB_START
;
621 gHob
->MemoryFreeUnder1MB
.PhysicalStart
= EFI_MEMORY_BELOW_1MB_START
;
624 // Prepare High Memory
625 // Assume Memory Map is ordered from low to high
627 gHob
->MemoryAbove1MB
.PhysicalStart
= 0;
628 gHob
->MemoryAbove1MB
.ResourceLength
= 0;
629 gHob
->MemoryAbove4GB
.PhysicalStart
= 0;
630 gHob
->MemoryAbove4GB
.ResourceLength
= 0;
632 for (Index
= 0; Index
< NumberOfMemoryMapEntries
; Index
++) {
634 // Skip regions below 1MB
636 if (EfiMemoryDescriptor
[Index
].PhysicalStart
< 0x100000) {
640 // Process regions above 1MB
642 if (EfiMemoryDescriptor
[Index
].PhysicalStart
>= 0x100000) {
643 if (EfiMemoryDescriptor
[Index
].Type
== EfiConventionalMemory
) {
644 if (gHob
->MemoryAbove1MB
.PhysicalStart
== 0) {
645 gHob
->MemoryAbove1MB
.PhysicalStart
= EfiMemoryDescriptor
[Index
].PhysicalStart
;
646 gHob
->MemoryAbove1MB
.ResourceLength
= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
647 } else if (gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
== EfiMemoryDescriptor
[Index
].PhysicalStart
) {
648 gHob
->MemoryAbove1MB
.ResourceLength
+= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
651 if ((EfiMemoryDescriptor
[Index
].Type
== EfiReservedMemoryType
) ||
652 (EfiMemoryDescriptor
[Index
].Type
>= EfiACPIReclaimMemory
) ) {
655 if ((EfiMemoryDescriptor
[Index
].Type
== EfiRuntimeServicesCode
) ||
656 (EfiMemoryDescriptor
[Index
].Type
== EfiRuntimeServicesData
)) {
661 // Process region above 4GB
663 if (EfiMemoryDescriptor
[Index
].PhysicalStart
>= 0x100000000LL
) {
664 if (EfiMemoryDescriptor
[Index
].Type
== EfiConventionalMemory
) {
665 if (gHob
->MemoryAbove4GB
.PhysicalStart
== 0) {
666 gHob
->MemoryAbove4GB
.PhysicalStart
= EfiMemoryDescriptor
[Index
].PhysicalStart
;
667 gHob
->MemoryAbove4GB
.ResourceLength
= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
669 if (gHob
->MemoryAbove4GB
.PhysicalStart
+ gHob
->MemoryAbove4GB
.ResourceLength
==
670 EfiMemoryDescriptor
[Index
].PhysicalStart
) {
671 gHob
->MemoryAbove4GB
.ResourceLength
+= LShiftU64 (EfiMemoryDescriptor
[Index
].NumberOfPages
, EFI_PAGE_SHIFT
);
677 if (gHob
->MemoryAbove4GB
.ResourceLength
== 0) {
679 // If there is no memory above 4GB then change the resource descriptor HOB
680 // into another type. I'm doing this as it's unclear if a resource
681 // descriptor HOB of length zero is valid. Spec does not say it's illegal,
682 // but code in EDK does not seem to handle this case.
684 gHob
->MemoryAbove4GB
.Header
.HobType
= EFI_HOB_TYPE_UNUSED
;
687 return (VOID
*)(UINTN
)(gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
);
695 gHob
->Stack
.AllocDescriptor
.MemoryLength
= EFI_MEMORY_STACK_PAGE_NUM
* EFI_PAGE_SIZE
;
696 gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)StackTop
- gHob
->Stack
.AllocDescriptor
.MemoryLength
;
698 return (VOID
*)(UINTN
)gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
;
702 PrepareHobMemoryDescriptor (
703 VOID
*MemoryDescriptorTop
,
705 EFI_MEMORY_DESCRIPTOR
*MemDesc
708 gHob
->MemoryDescriptor
.MemDescCount
= MemDescCount
;
709 gHob
->MemoryDescriptor
.MemDesc
= (EFI_MEMORY_DESCRIPTOR
*)((UINTN
)MemoryDescriptorTop
- MemDescCount
* sizeof(EFI_MEMORY_DESCRIPTOR
));
711 // Make MemoryDescriptor.MemDesc page aligned
713 gHob
->MemoryDescriptor
.MemDesc
= (EFI_MEMORY_DESCRIPTOR
*)((UINTN
) gHob
->MemoryDescriptor
.MemDesc
& ~EFI_PAGE_MASK
);
715 CopyMem (gHob
->MemoryDescriptor
.MemDesc
, MemDesc
, MemDescCount
* sizeof(EFI_MEMORY_DESCRIPTOR
));
717 return gHob
->MemoryDescriptor
.MemDesc
;
726 //UINTN BfvLengthPageSize;
729 // Calculate BFV location at top of the memory region.
730 // This is like a RAM Disk. Align to page boundary.
732 //BfvLengthPageSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (BfvLength));
734 gHob
->Bfv
.BaseAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)Bfv
;
735 gHob
->Bfv
.Length
= BfvLength
;
738 // Resource descriptor for the FV
740 gHob
->BfvResource
.PhysicalStart
= gHob
->Bfv
.BaseAddress
;
741 gHob
->BfvResource
.ResourceLength
= gHob
->Bfv
.Length
;
746 VOID
*DxeCoreEntryPoint
,
747 EFI_PHYSICAL_ADDRESS DxeCoreImageBase
,
751 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryBaseAddress
= DxeCoreImageBase
;
752 gHob
->DxeCore
.MemoryAllocationHeader
.MemoryLength
= DxeCoreLength
;
753 gHob
->DxeCore
.EntryPoint
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)DxeCoreEntryPoint
;
756 gHob
->MemoryDxeCore
.PhysicalStart
= DxeCoreImageBase
;
757 gHob
->MemoryDxeCore
.ResourceLength
= DxeCoreLength
;
761 PrepareHobNvStorage (
765 Initialize Block-Aligned Firmware Block.
768 +-------------------+
770 +-------------------+
772 |VAR_STORAGE(0x4000)|
774 +-------------------+
776 +-------------------+
778 +-------------------+
782 +-------------------+
786 +-------------------+
789 STATIC VARIABLE_STORE_HEADER VarStoreHeader
= {
790 VARIABLE_STORE_SIGNATURE
,
791 0xffffffff, // will be fixed in Variable driver
792 VARIABLE_STORE_FORMATTED
,
793 VARIABLE_STORE_HEALTHY
,
798 STATIC EFI_FIRMWARE_VOLUME_HEADER NvStorageFvbHeader
= {
802 EFI_SYSTEM_NV_DATA_FV_GUID
,
805 EFI_FVB_READ_ENABLED_CAP
|
806 EFI_FVB_READ_STATUS
|
807 EFI_FVB_WRITE_ENABLED_CAP
|
808 EFI_FVB_WRITE_STATUS
|
809 EFI_FVB_ERASE_POLARITY
,
810 EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
812 0, // ExtHeaderOffset
819 NV_STORAGE_FVB_BLOCK_NUM
,
825 STATIC EFI_FV_BLOCK_MAP_ENTRY BlockMapEntryEnd
= {0, 0};
827 EFI_PHYSICAL_ADDRESS StorageFvbBase
;
828 EFI_PHYSICAL_ADDRESS FtwFvbBase
;
835 // Use first 16-byte Reset Vector of FVB to store extra information
836 // UINT32 Offset 0 stores the volume signature
837 // UINT8 Offset 4 : should init the Variable Store Header if non-zero
839 gHob
->NvStorageFvb
.FvbInfo
.VolumeId
= *(UINT32
*) (UINTN
) (NV_STORAGE_STATE
);
840 gHob
->NvStorage
. FvbInfo
.VolumeId
= *(UINT32
*) (UINTN
) (NV_STORAGE_STATE
);
843 // *(NV_STORAGE_STATE + 4):
845 // 1 - File not exist
846 // 0 - File exist with correct size
848 if (*(UINT8
*) (UINTN
) (NV_STORAGE_STATE
+ 4) == 2) {
850 PrintString ("Error: Size of Efivar.bin should be 16k!\n");
854 if (*(UINT8
*) (UINTN
) (NV_STORAGE_STATE
+ 4) != 0) {
856 // Efivar.bin doesn't exist
857 // 1. Init variable storage header to valid header
860 (VOID
*) (UINTN
) NV_STORAGE_START
,
862 sizeof (VARIABLE_STORE_HEADER
)
865 // 2. set all bits in variable storage body to 1
868 (VOID
*) (UINTN
) (NV_STORAGE_START
+ sizeof (VARIABLE_STORE_HEADER
)),
869 NV_STORAGE_SIZE
- sizeof (VARIABLE_STORE_HEADER
),
875 // Relocate variable storage
877 // 1. Init FVB Header to valid header: First 0x48 bytes
878 // In real platform, these fields are fixed by tools
883 Ptr
= (UINT16
*) &NvStorageFvbHeader
;
884 Ptr
< (UINT16
*) ((UINTN
) (UINT8
*) &NvStorageFvbHeader
+ sizeof (EFI_FIRMWARE_VOLUME_HEADER
));
887 Checksum
= (UINT16
) (Checksum
+ (*Ptr
));
889 NvStorageFvbHeader
.Checksum
= (UINT16
) (0x10000 - Checksum
);
890 StorageFvbBase
= (EFI_PHYSICAL_ADDRESS
)(((UINTN
)NvStorageTop
- NV_STORAGE_FVB_SIZE
- NV_FTW_FVB_SIZE
) & ~EFI_PAGE_MASK
);
891 CopyMem ((VOID
*) (UINTN
) StorageFvbBase
, &NvStorageFvbHeader
, sizeof (EFI_FIRMWARE_VOLUME_HEADER
));
893 (VOID
*) (UINTN
) (StorageFvbBase
+ sizeof (EFI_FIRMWARE_VOLUME_HEADER
)),
895 sizeof (EFI_FV_BLOCK_MAP_ENTRY
)
899 // 2. Relocate variable data
902 (VOID
*) (UINTN
) (StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
),
903 (VOID
*) (UINTN
) NV_STORAGE_START
,
908 // 3. Set the remaining memory to 0xff
911 (VOID
*) (UINTN
) (StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
+ NV_STORAGE_SIZE
),
912 NV_STORAGE_FVB_SIZE
- NV_STORAGE_SIZE
- EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
,
917 // Create the FVB holding NV Storage in memory
919 gHob
->NvStorageFvResource
.PhysicalStart
=
920 gHob
->NvStorageFvb
.FvbInfo
.Entries
[0].Base
= StorageFvbBase
;
922 // Create the NV Storage Hob
924 gHob
->NvStorage
.FvbInfo
.Entries
[0].Base
= StorageFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
;
927 // Create the FVB holding FTW spaces
929 FtwFvbBase
= (EFI_PHYSICAL_ADDRESS
)((UINTN
) StorageFvbBase
+ NV_STORAGE_FVB_SIZE
);
930 gHob
->NvFtwFvResource
.PhysicalStart
=
931 gHob
->NvFtwFvb
.FvbInfo
.Entries
[0].Base
= FtwFvbBase
;
933 // Put FTW Working in front
935 gHob
->NvFtwWorking
.FvbInfo
.Entries
[0].Base
= FtwFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
;
938 // Put FTW Spare area after FTW Working area
940 gHob
->NvFtwSpare
.FvbInfo
.Entries
[0].Base
=
941 (EFI_PHYSICAL_ADDRESS
)((UINTN
) FtwFvbBase
+ EFI_RUNTIME_UPDATABLE_FV_HEADER_LENGTH
+ NV_FTW_WORKING_SIZE
);
943 return (VOID
*)(UINTN
)StorageFvbBase
;
952 gHob
->Phit
.EfiMemoryTop
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)MemoryTop
;
953 gHob
->Phit
.EfiMemoryBottom
= gHob
->Phit
.EfiMemoryTop
- CONSUMED_MEMORY
;
954 gHob
->Phit
.EfiFreeMemoryTop
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)FreeMemoryTop
;
955 gHob
->Phit
.EfiFreeMemoryBottom
= gHob
->Phit
.EfiMemoryBottom
+ sizeof(HOB_TEMPLATE
);
957 CopyMem ((VOID
*)(UINTN
)gHob
->Phit
.EfiMemoryBottom
, gHob
, sizeof(HOB_TEMPLATE
));
958 gHob
= (HOB_TEMPLATE
*)(UINTN
)gHob
->Phit
.EfiMemoryBottom
;
960 gHob
->Phit
.EfiEndOfHobList
= (EFI_PHYSICAL_ADDRESS
)(UINTN
)&gHob
->EndOfHobList
;
971 // Create a CPU hand-off information
973 gHob
->Cpu
.SizeOfMemorySpace
= 36;
975 AsmCpuid (EFI_CPUID_EXTENDED_FUNCTION
, &CpuidEax
, NULL
, NULL
, NULL
);
976 if (CpuidEax
>= CPUID_EXTENDED_ADD_SIZE
) {
977 AsmCpuid (CPUID_EXTENDED_ADD_SIZE
, &CpuidEax
, NULL
, NULL
, NULL
);
978 gHob
->Cpu
.SizeOfMemorySpace
= (UINT8
)(CpuidEax
& 0xFF);
983 CompleteHobGeneration (
987 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryBaseAddress
= gHob
->Phit
.EfiFreeMemoryTop
;
989 // Reserve all the memory under Stack above FreeMemoryTop as allocated
991 gHob
->MemoryAllocation
.AllocDescriptor
.MemoryLength
= gHob
->Stack
.AllocDescriptor
.MemoryBaseAddress
- gHob
->Phit
.EfiFreeMemoryTop
;
994 // adjust Above1MB ResourceLength
996 if (gHob
->MemoryAbove1MB
.PhysicalStart
+ gHob
->MemoryAbove1MB
.ResourceLength
> gHob
->Phit
.EfiMemoryTop
) {
997 gHob
->MemoryAbove1MB
.ResourceLength
= gHob
->Phit
.EfiMemoryTop
- gHob
->MemoryAbove1MB
.PhysicalStart
;