}\r
\r
/**\r
- This function searchs a given file type within a valid FV.\r
+ This function searchs a given file type with a given Guid within a valid FV.\r
+ If input Guid is NULL, will locate the first section having the given file type\r
\r
@param FvHeader A pointer to firmware volume header that contains the set of files\r
to be searched.\r
@param FileType File type to be searched.\r
+ @param Guid Will ignore if it is NULL.\r
@param FileHeader A pointer to the discovered file, if successful.\r
\r
@retval EFI_SUCCESS Successfully found FileType\r
@retval EFI_NOT_FOUND File type can't be found.\r
**/\r
EFI_STATUS\r
-FvFindFile (\r
+FvFindFileByTypeGuid (\r
IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader,\r
IN EFI_FV_FILETYPE FileType,\r
+ IN EFI_GUID *Guid OPTIONAL,\r
OUT EFI_FFS_FILE_HEADER **FileHeader\r
)\r
{\r
// Look for file type\r
//\r
if (File->Type == FileType) {\r
- *FileHeader = File;\r
- return EFI_SUCCESS;\r
+ if (Guid == NULL || CompareGuid(&File->Name, Guid)) {\r
+ *FileHeader = File;\r
+ return EFI_SUCCESS;\r
+ }\r
}\r
}\r
\r
//\r
// DXE FV is inside Payload FV. Here find DXE FV from Payload FV\r
//\r
- Status = FvFindFile (PayloadFv, EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, &FileHeader);\r
+ Status = FvFindFileByTypeGuid (PayloadFv, EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, NULL, &FileHeader);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// Find DXE core file from DXE FV\r
//\r
- Status = FvFindFile (DxeCoreFv, EFI_FV_FILETYPE_DXE_CORE, &FileHeader);\r
+ Status = FvFindFileByTypeGuid (DxeCoreFv, EFI_FV_FILETYPE_DXE_CORE, NULL, &FileHeader);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
//\r
// Find DXE core file from DXE FV\r
//\r
- Status = FvFindFile (DxeFv, EFI_FV_FILETYPE_DXE_CORE, &FileHeader);\r
+ Status = FvFindFileByTypeGuid (DxeFv, EFI_FV_FILETYPE_DXE_CORE, NULL, &FileHeader);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
#include <UniversalPayload/AcpiTable.h>\r
#include <UniversalPayload/UniversalPayload.h>\r
#include <UniversalPayload/ExtraData.h>\r
+#include <Guid/PcdDataBaseSignatureGuid.h>\r
\r
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21\r
#define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1\r
IN EFI_PEI_HOB_POINTERS HobList\r
);\r
\r
+EFI_STATUS\r
+FixUpPcdDatabase (\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv\r
+ );\r
+\r
+/**\r
+ This function searchs a given section type within a valid FFS file.\r
+\r
+ @param FileHeader A pointer to the file header that contains the set of sections to\r
+ be searched.\r
+ @param SearchType The value of the section type to search.\r
+ @param SectionData A pointer to the discovered section, if successful.\r
+\r
+ @retval EFI_SUCCESS The section was found.\r
+ @retval EFI_NOT_FOUND The section was not found.\r
+\r
+**/\r
+EFI_STATUS\r
+FileFindSection (\r
+ IN EFI_FFS_FILE_HEADER *FileHeader,\r
+ IN EFI_SECTION_TYPE SectionType,\r
+ OUT VOID **SectionData\r
+ );\r
+\r
+/**\r
+ This function searchs a given file type with a given Guid within a valid FV.\r
+ If input Guid is NULL, will locate the first section having the given file type\r
+\r
+ @param FvHeader A pointer to firmware volume header that contains the set of files\r
+ to be searched.\r
+ @param FileType File type to be searched.\r
+ @param Guid Will ignore if it is NULL.\r
+ @param FileHeader A pointer to the discovered file, if successful.\r
+\r
+ @retval EFI_SUCCESS Successfully found FileType\r
+ @retval EFI_NOT_FOUND File type can't be found.\r
+**/\r
+EFI_STATUS\r
+FvFindFileByTypeGuid (\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader,\r
+ IN EFI_FV_FILETYPE FileType,\r
+ IN EFI_GUID *Guid OPTIONAL,\r
+ OUT EFI_FFS_FILE_HEADER **FileHeader\r
+ );\r
#endif\r
\r
extern VOID *mHobList;\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
+ 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
+ @retval EFI_SUCCESS If it completed successfully.\r
+ @retval other Failed to fix up.\r
+**/\r
+EFI_STATUS\r
+FixUpPcdDatabase (\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
+\r
+ GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+ if (GuidHob == NULL) {\r
+ //\r
+ // No fix-up is needed.\r
+ //\r
+ return EFI_SUCCESS;\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
+ ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\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
+\r
+ for (Index = 0; Index < UplDatabase->ExTokenCount; Index++) {\r
+ ExMapTable[Index].TokenNumber += PeiDatabase->LocalTokenCount;\r
+ }\r
+ DEBUG ((DEBUG_INFO, "Fix up UPL PCD database successfully\n"));\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Add HOB into HOB list\r
\r
Status = BuildHobs (BootloaderParameter, &DxeFv);\r
ASSERT_EFI_ERROR (Status);\r
\r
+ FixUpPcdDatabase (DxeFv);\r
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);\r
ASSERT_EFI_ERROR (Status);\r
\r
gEfiAcpiTableGuid\r
gUefiSerialPortInfoGuid\r
gUniversalPayloadExtraDataGuid\r
+ gPcdDataBaseHobGuid\r
\r
[FeaturePcd.IA32]\r
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES\r
\r
\r
[Pcd.IA32,Pcd.X64]\r
+ gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile\r
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES\r
gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask ## CONSUMES\r
gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask ## CONSUMES\r
\r
# Size of the region used by UEFI in permanent memory\r
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x02000000|UINT32|0x00000017\r
+\r
+gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80, 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }|VOID*|0x00000018\r
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE\r
gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }\r
\r
+ gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80, 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }\r
\r
!if $(SOURCE_DEBUG_ENABLE)\r
gEfiSourceLevelDebugPkgTokenSpaceGuid.PcdDebugLoadImageMethod|0x2\r