\r
#include "UefiPayloadEntry.h"\r
\r
-#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \\r
+#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \\r
EFI_RESOURCE_ATTRIBUTE_TESTED | \\r
EFI_RESOURCE_ATTRIBUTE_READ_PROTECTED | \\r
EFI_RESOURCE_ATTRIBUTE_64_BIT_IO | \\r
EFI_RESOURCE_ATTRIBUTE_PERSISTENT )\r
\r
-#define TESTED_MEMORY_ATTRIBUTES (EFI_RESOURCE_ATTRIBUTE_PRESENT | \\r
+#define TESTED_MEMORY_ATTRIBUTES (EFI_RESOURCE_ATTRIBUTE_PRESENT | \\r
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \\r
EFI_RESOURCE_ATTRIBUTE_TESTED )\r
\r
extern VOID *mHobList;\r
\r
+/**\r
+ Print all HOBs info from the HOB list.\r
+\r
+ @return The pointer to the HOB list.\r
+**/\r
+VOID\r
+PrintHob (\r
+ IN CONST VOID *HobStart\r
+ );\r
+\r
/**\r
Some bootloader may pass a pcd database, and UPL also contain a PCD database.\r
Dxe PCD driver has the assumption that the two PCD database can be catenated and\r
- the local token number should be successive。\r
+ the local token number should be successive.\r
This function will fix up the UPL PCD database to meet that assumption.\r
\r
@param[in] DxeFv The FV where to find the Universal PCD database.\r
**/\r
EFI_STATUS\r
FixUpPcdDatabase (\r
- IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FFS_FILE_HEADER *FileHeader;\r
- VOID *PcdRawData;\r
- PEI_PCD_DATABASE *PeiDatabase;\r
- PEI_PCD_DATABASE *UplDatabase;\r
- EFI_HOB_GUID_TYPE *GuidHob;\r
- DYNAMICEX_MAPPING *ExMapTable;\r
- UINTN Index;\r
+ EFI_STATUS Status;\r
+ EFI_FFS_FILE_HEADER *FileHeader;\r
+ VOID *PcdRawData;\r
+ PEI_PCD_DATABASE *PeiDatabase;\r
+ PEI_PCD_DATABASE *UplDatabase;\r
+ EFI_HOB_GUID_TYPE *GuidHob;\r
+ DYNAMICEX_MAPPING *ExMapTable;\r
+ UINTN Index;\r
\r
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
if (GuidHob == NULL) {\r
//\r
return EFI_SUCCESS;\r
}\r
- PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+\r
+ PeiDatabase = (PEI_PCD_DATABASE *)GET_GUID_HOB_DATA (GuidHob);\r
DEBUG ((DEBUG_INFO, "Find the Pei PCD data base, the total local token number is %d\n", PeiDatabase->LocalTokenCount));\r
\r
Status = FvFindFileByTypeGuid (DxeFv, EFI_FV_FILETYPE_DRIVER, PcdGetPtr (PcdPcdDriverFile), &FileHeader);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
Status = FileFindSection (FileHeader, EFI_SECTION_RAW, &PcdRawData);\r
ASSERT_EFI_ERROR (Status);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- UplDatabase = (PEI_PCD_DATABASE *) PcdRawData;\r
- ExMapTable = (DYNAMICEX_MAPPING *) (UINTN) ((UINTN) PcdRawData + UplDatabase->ExMapTableOffset);\r
+ UplDatabase = (PEI_PCD_DATABASE *)PcdRawData;\r
+ ExMapTable = (DYNAMICEX_MAPPING *)(UINTN)((UINTN)PcdRawData + UplDatabase->ExMapTableOffset);\r
\r
for (Index = 0; Index < UplDatabase->ExTokenCount; Index++) {\r
ExMapTable[Index].TokenNumber += PeiDatabase->LocalTokenCount;\r
}\r
+\r
DEBUG ((DEBUG_INFO, "Fix up UPL PCD database successfully\n"));\r
return EFI_SUCCESS;\r
}\r
**/\r
VOID\r
AddNewHob (\r
- IN EFI_PEI_HOB_POINTERS *Hob\r
+ IN EFI_PEI_HOB_POINTERS *Hob\r
)\r
{\r
- EFI_PEI_HOB_POINTERS NewHob;\r
+ EFI_PEI_HOB_POINTERS NewHob;\r
\r
if (Hob->Raw == NULL) {\r
return;\r
}\r
+\r
NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);\r
\r
if (NewHob.Header != NULL) {\r
}\r
\r
/**\r
- Found the Resource Descriptor HOB that contains a range\r
+ Found the Resource Descriptor HOB that contains a range (Base, Top)\r
\r
+ @param[in] HobList Hob start address\r
@param[in] Base Memory start address\r
- @param[in] Top Memory Top.\r
+ @param[in] Top Memory end address.\r
\r
- @return The pointer to the Resource Descriptor HOB.\r
+ @retval The pointer to the Resource Descriptor HOB.\r
**/\r
EFI_HOB_RESOURCE_DESCRIPTOR *\r
FindResourceDescriptorByRange (\r
- VOID *HobList,\r
- EFI_PHYSICAL_ADDRESS Base,\r
- EFI_PHYSICAL_ADDRESS Top\r
+ IN VOID *HobList,\r
+ IN EFI_PHYSICAL_ADDRESS Base,\r
+ IN EFI_PHYSICAL_ADDRESS Top\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
\r
- for (Hob.Raw = (UINT8 *) HobList; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {\r
+ for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r
//\r
// Skip all HOBs except Resource Descriptor HOBs\r
//\r
if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {\r
continue;\r
}\r
+\r
if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {\r
continue;\r
}\r
if (Base < ResourceHob->PhysicalStart) {\r
continue;\r
}\r
+\r
if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {\r
continue;\r
}\r
+\r
return ResourceHob;\r
}\r
+\r
return NULL;\r
}\r
\r
@param[in] MinimalNeededSize Minimal needed size.\r
@param[in] ExceptResourceHob Ignore this Resource Descriptor.\r
\r
- @return The pointer to the Resource Descriptor HOB.\r
+ @retval The pointer to the Resource Descriptor HOB.\r
**/\r
EFI_HOB_RESOURCE_DESCRIPTOR *\r
FindAnotherHighestBelow4GResourceDescriptor (\r
- IN VOID *HobList,\r
- IN UINTN MinimalNeededSize,\r
- IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob\r
+ IN VOID *HobList,\r
+ IN UINTN MinimalNeededSize,\r
+ IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
- EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;\r
+\r
ReturnResourceHob = NULL;\r
\r
- for (Hob.Raw = (UINT8 *) HobList; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {\r
+ for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {\r
//\r
// Skip all HOBs except Resource Descriptor HOBs\r
//\r
if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {\r
continue;\r
}\r
+\r
if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {\r
continue;\r
}\r
if (ResourceHob == ExceptResourceHob) {\r
continue;\r
}\r
+\r
//\r
// Skip Resource Descriptor HOBs that are beyond 4G\r
//\r
if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {\r
continue;\r
}\r
+\r
//\r
// Skip Resource Descriptor HOBs that are too small\r
//\r
}\r
}\r
}\r
+\r
return ReturnResourceHob;\r
}\r
\r
+/**\r
+ Check the HOB and decide if it is need inside Payload\r
+\r
+ Payload maintainer may make decision which HOB is need or needn't\r
+ Then add the check logic in the function.\r
+\r
+ @param[in] Hob The HOB to check\r
+\r
+ @retval TRUE If HOB is need inside Payload\r
+ @retval FALSE If HOB is needn't inside Payload\r
+**/\r
+BOOLEAN\r
+IsHobNeed (\r
+ EFI_PEI_HOB_POINTERS Hob\r
+ )\r
+{\r
+ if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {\r
+ return FALSE;\r
+ }\r
+\r
+ if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {\r
+ if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ // Arrive here mean the HOB is need\r
+ return TRUE;\r
+}\r
+\r
/**\r
It will build HOBs based on information from bootloaders.\r
\r
+ @param[in] BootloaderParameter The starting memory address of bootloader parameter block.\r
+ @param[out] DxeFv The pointer to the DXE FV in memory.\r
+\r
@retval EFI_SUCCESS If it completed successfully.\r
@retval Others If it failed to build required HOBs.\r
**/\r
OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv\r
)\r
{\r
- EFI_PEI_HOB_POINTERS Hob;\r
- UINTN MinimalNeededSize;\r
- EFI_PHYSICAL_ADDRESS FreeMemoryBottom;\r
- EFI_PHYSICAL_ADDRESS FreeMemoryTop;\r
- EFI_PHYSICAL_ADDRESS MemoryBottom;\r
- EFI_PHYSICAL_ADDRESS MemoryTop;\r
- EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;\r
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
- UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData;\r
- UINT8 *GuidHob;\r
- EFI_HOB_FIRMWARE_VOLUME *FvHob;\r
-\r
- Hob.Raw = (UINT8 *) BootloaderParameter;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ UINTN MinimalNeededSize;\r
+ EFI_PHYSICAL_ADDRESS FreeMemoryBottom;\r
+ EFI_PHYSICAL_ADDRESS FreeMemoryTop;\r
+ EFI_PHYSICAL_ADDRESS MemoryBottom;\r
+ EFI_PHYSICAL_ADDRESS MemoryTop;\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;\r
+ UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData;\r
+ UINT8 *GuidHob;\r
+ EFI_HOB_FIRMWARE_VOLUME *FvHob;\r
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;\r
+ ACPI_BOARD_INFO *AcpiBoardInfo;\r
+\r
+ Hob.Raw = (UINT8 *)BootloaderParameter;\r
MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
\r
ASSERT (Hob.Raw != NULL);\r
- ASSERT ((UINTN) Hob.HandoffInformationTable->EfiFreeMemoryTop == Hob.HandoffInformationTable->EfiFreeMemoryTop);\r
- ASSERT ((UINTN) Hob.HandoffInformationTable->EfiMemoryTop == Hob.HandoffInformationTable->EfiMemoryTop);\r
- ASSERT ((UINTN) Hob.HandoffInformationTable->EfiFreeMemoryBottom == Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
- ASSERT ((UINTN) Hob.HandoffInformationTable->EfiMemoryBottom == Hob.HandoffInformationTable->EfiMemoryBottom);\r
-\r
+ ASSERT ((UINTN)Hob.HandoffInformationTable->EfiFreeMemoryTop == Hob.HandoffInformationTable->EfiFreeMemoryTop);\r
+ ASSERT ((UINTN)Hob.HandoffInformationTable->EfiMemoryTop == Hob.HandoffInformationTable->EfiMemoryTop);\r
+ ASSERT ((UINTN)Hob.HandoffInformationTable->EfiFreeMemoryBottom == Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
+ ASSERT ((UINTN)Hob.HandoffInformationTable->EfiMemoryBottom == Hob.HandoffInformationTable->EfiMemoryBottom);\r
\r
//\r
// Try to find Resource Descriptor HOB that contains Hob range EfiMemoryBottom..EfiMemoryTop\r
//\r
- PhitResourceHob = FindResourceDescriptorByRange(Hob.Raw, Hob.HandoffInformationTable->EfiMemoryBottom, Hob.HandoffInformationTable->EfiMemoryTop);\r
+ PhitResourceHob = FindResourceDescriptorByRange (Hob.Raw, Hob.HandoffInformationTable->EfiMemoryBottom, Hob.HandoffInformationTable->EfiMemoryTop);\r
if (PhitResourceHob == NULL) {\r
//\r
// Boot loader's Phit Hob is not in an available Resource Descriptor, find another Resource Descriptor for new Phit Hob\r
//\r
- ResourceHob = FindAnotherHighestBelow4GResourceDescriptor(Hob.Raw, MinimalNeededSize, NULL);\r
+ ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);\r
if (ResourceHob == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
// In the Resource Descriptor HOB contains boot loader Hob, there is no enough free memory size for payload hob\r
// Find another Resource Descriptor Hob\r
//\r
- ResourceHob = FindAnotherHighestBelow4GResourceDescriptor(Hob.Raw, MinimalNeededSize, PhitResourceHob);\r
+ ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);\r
if (ResourceHob == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
FreeMemoryTop = ResourceHob->PhysicalStart + ResourceHob->ResourceLength;\r
MemoryTop = FreeMemoryTop;\r
}\r
- HobConstructor ((VOID *) (UINTN) MemoryBottom, (VOID *) (UINTN) MemoryTop, (VOID *) (UINTN) FreeMemoryBottom, (VOID *) (UINTN) FreeMemoryTop);\r
+\r
+ HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);\r
//\r
// From now on, mHobList will point to the new Hob range.\r
//\r
//\r
// Create an empty FvHob for the DXE FV that contains DXE core.\r
//\r
- BuildFvHob ((EFI_PHYSICAL_ADDRESS) 0, 0);\r
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);\r
//\r
// Since payload created new Hob, move all hobs except PHIT from boot loader hob list.\r
//\r
while (!END_OF_HOB_LIST (Hob)) {\r
- if (Hob.Header->HobType != EFI_HOB_TYPE_HANDOFF) {\r
+ if (IsHobNeed (Hob)) {\r
// Add this hob to payload HOB\r
AddNewHob (&Hob);\r
}\r
+\r
Hob.Raw = GET_NEXT_HOB (Hob);\r
}\r
\r
//\r
// Get DXE FV location\r
//\r
- GuidHob = GetFirstGuidHob(&gUniversalPayloadExtraDataGuid);\r
+ GuidHob = GetFirstGuidHob (&gUniversalPayloadExtraDataGuid);\r
ASSERT (GuidHob != NULL);\r
- ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *) GET_GUID_HOB_DATA (GuidHob);\r
+ ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *)GET_GUID_HOB_DATA (GuidHob);\r
ASSERT (ExtraData->Count == 1);\r
ASSERT (AsciiStrCmp (ExtraData->Entry[0].Identifier, "uefi_fv") == 0);\r
\r
- *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) ExtraData->Entry[0].Base;\r
+ *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)ExtraData->Entry[0].Base;\r
ASSERT ((*DxeFv)->FvLength == ExtraData->Entry[0].Size);\r
\r
+ //\r
+ // Create guid hob for acpi board information\r
+ //\r
+ GuidHob = GetFirstGuidHob (&gUniversalPayloadAcpiTableGuid);\r
+ if (GuidHob != NULL) {\r
+ AcpiTable = (UNIVERSAL_PAYLOAD_ACPI_TABLE *)GET_GUID_HOB_DATA (GuidHob);\r
+ AcpiBoardInfo = BuildHobFromAcpi ((UINT64)AcpiTable->Rsdp);\r
+ ASSERT (AcpiBoardInfo != NULL);\r
+ }\r
+\r
//\r
// Update DXE FV information to first fv hob in the hob list, which\r
// is the empty FvHob created before.\r
//\r
- FvHob = GetFirstHob (EFI_HOB_TYPE_FV);\r
- FvHob->BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) *DxeFv;\r
- FvHob->Length = (*DxeFv)->FvLength;\r
+ FvHob = GetFirstHob (EFI_HOB_TYPE_FV);\r
+ FvHob->BaseAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)*DxeFv;\r
+ FvHob->Length = (*DxeFv)->FvLength;\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
Entry point to the C language phase of UEFI payload.\r
\r
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.\r
+\r
@retval It will not return if SUCCESS, and return error when passing bootloader parameter.\r
**/\r
EFI_STATUS\r
EFIAPI\r
_ModuleEntryPoint (\r
- IN UINTN BootloaderParameter\r
+ IN UINTN BootloaderParameter\r
)\r
{\r
- EFI_STATUS Status;\r
- PHYSICAL_ADDRESS DxeCoreEntryPoint;\r
- EFI_HOB_HANDOFF_INFO_TABLE *HandoffHobTable;\r
- EFI_PEI_HOB_POINTERS Hob;\r
- EFI_FIRMWARE_VOLUME_HEADER *DxeFv;\r
+ EFI_STATUS Status;\r
+ PHYSICAL_ADDRESS DxeCoreEntryPoint;\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ EFI_FIRMWARE_VOLUME_HEADER *DxeFv;\r
\r
- mHobList = (VOID *) BootloaderParameter;\r
+ mHobList = (VOID *)BootloaderParameter;\r
DxeFv = NULL;\r
// Call constructor for all libraries\r
ProcessLibraryConstructorList ();\r
\r
DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));\r
- DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof(UINTN)));\r
+ DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));\r
+\r
+ DEBUG_CODE (\r
+ //\r
+ // Dump the Hobs from boot loader\r
+ //\r
+ PrintHob (mHobList);\r
+ );\r
\r
// Initialize floating point operating environment to be compliant with UEFI spec.\r
InitializeFloatingPointUnits ();\r
// Mask off all legacy 8259 interrupt sources\r
//\r
IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);\r
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);\r
\r
- HandoffHobTable = (EFI_HOB_HANDOFF_INFO_TABLE *) GetFirstHob(EFI_HOB_TYPE_HANDOFF);\r
- Hob.HandoffInformationTable = HandoffHobTable;\r
+ Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);\r
HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r
\r
// Should not get here\r