]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiPayloadPkg: Fix up UPL Pcd database
authorZhiguang Liu <zhiguang.liu@intel.com>
Thu, 10 Jun 2021 07:08:13 +0000 (15:08 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 24 Jun 2021 09:16:22 +0000 (09:16 +0000)
Edk2 bootloader will pass the pei pcd database, and UPL also contain a
PCD database.
Dxe PCD driver has the assumption that the two PCD database can be
catenated and the local token number should be successive。
This patch will manually fix up the UPL PCD database to meet that
assumption.

Cc: Maurice Ma <maurice.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Reviewed-by: Guo Dong <guo.dong@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
UefiPayloadPkg/UefiPayloadPkg.dec
UefiPayloadPkg/UefiPayloadPkg.dsc

index f5d70c59f8e3359022e6667dfb0e9b42082f5872..0b6cb47cd0ed965a5654325e64c957ee37be807b 100644 (file)
@@ -114,20 +114,23 @@ LoadPeCoffImage (
 }\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
@@ -171,8 +174,10 @@ FvFindFile (
     // 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
@@ -266,7 +271,7 @@ LoadDxeCore (
   //\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
@@ -283,7 +288,7 @@ LoadDxeCore (
   //\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
@@ -330,7 +335,7 @@ UniversalLoadDxeCore (
   //\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
index dff7b6b87f2cce927b209e12dff5a5009bee59d4..331724c6874058d254930f46b93da7c34e83760e 100644 (file)
@@ -35,6 +35,7 @@
 #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
@@ -159,4 +160,48 @@ HandOffToDxeCore (
   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
index 13f4587cd9899171e4e7f98e992be171a0bfa03b..a67653eb115140f39cf55cf6d6904de1fb3ce591 100644 (file)
 \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
@@ -327,6 +383,7 @@ _ModuleEntryPoint (
   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
index 77cd25aafd5b584184368d2be9d4ef1025b92690..76d7e4791c6498585b0e2a3b7809b060862c53f7 100644 (file)
@@ -63,6 +63,7 @@
   gEfiAcpiTableGuid\r
   gUefiSerialPortInfoGuid\r
   gUniversalPayloadExtraDataGuid\r
+  gPcdDataBaseHobGuid\r
 \r
 [FeaturePcd.IA32]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES\r
@@ -72,6 +73,7 @@
 \r
 \r
 [Pcd.IA32,Pcd.X64]\r
+  gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask    ## CONSUMES\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask    ## CONSUMES\r
index 105e1f5a1c0f34553fb383e5b12ff3cef4a06114..d84f5609959bf0ca3eeb937a64354e6b89d89374 100644 (file)
@@ -72,3 +72,5 @@ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode|0x80|UINT32|0x
 \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
index d8277efccd5a7c8626e0302540759ae42f51e4d3..e3d669a6d60e5838c241716fc4085122ae5978e7 100644 (file)
   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