]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/PCD/Dxe/Service.c
MdeModulePkg Pcd DXE: Handle the case gPcdDataBaseHobGuid HOB is not present.
[mirror_edk2.git] / MdeModulePkg / Universal / PCD / Dxe / Service.c
index 54c814b56252c134ec4a0ed4bc277a97e127ec40..a9e1ca49a30f4a15355fc5f51dca3012289e2b26 100644 (file)
@@ -50,6 +50,7 @@ GetLocalTokenNumber (
   IN UINTN              TokenNumber\r
   )\r
 {\r
+  UINTN                 TmpTokenNumber;\r
   UINT32                *LocalTokenNumberTable;\r
   UINT32                LocalTokenNumber;\r
   UINTN                 Size;\r
@@ -62,6 +63,11 @@ GetLocalTokenNumber (
   //\r
   TokenNumber--;\r
 \r
+  //\r
+  // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber\r
+  // \r
+  TmpTokenNumber = TokenNumber;\r
+\r
   LocalTokenNumberTable  = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) : \r
                                      (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
   TokenNumber            = IsPeiDb ? TokenNumber : TokenNumber - mPeiLocalTokenCount;\r
@@ -72,7 +78,7 @@ GetLocalTokenNumber (
 \r
   if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
     if (Size == 0) {\r
-      GetPtrTypeSize (TokenNumber, &MaxSize);\r
+      GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
     } else {\r
       MaxSize = Size;\r
     }\r
@@ -98,7 +104,7 @@ GetPcdType (
     case PCD_DATUM_TYPE_POINTER:\r
       return EFI_PCD_TYPE_PTR;\r
     case PCD_DATUM_TYPE_UINT8:\r
-      if (LocalTokenNumber & PCD_DATUM_TYPE_UINT8_BOOLEAN) {\r
+      if ((LocalTokenNumber & PCD_DATUM_TYPE_UINT8_BOOLEAN) == PCD_DATUM_TYPE_UINT8_BOOLEAN) {\r
         return EFI_PCD_TYPE_BOOL;\r
       } else {\r
         return EFI_PCD_TYPE_8;\r
@@ -169,6 +175,7 @@ GetPcdName (
     // Need to get the full PCD name.\r
     //\r
     Name = AllocateZeroPool (AsciiStrSize (TokenSpaceName) + AsciiStrSize (PcdName));\r
+    ASSERT (Name != NULL);\r
     //\r
     // Catenate TokenSpaceCName and PcdCName with a '.' to form the full PCD name.\r
     //\r
@@ -767,6 +774,18 @@ BuildPcdDxeDataBase (
   UINT32              PcdDxeDbLen;\r
   VOID                *PcdDxeDb;\r
 \r
+  //\r
+  // Assign PCD Entries with default value to PCD DATABASE\r
+  //\r
+  mPcdDatabase.DxeDb = LocateExPcdBinary ();\r
+  ASSERT(mPcdDatabase.DxeDb != NULL);\r
+  PcdDxeDbLen = mPcdDatabase.DxeDb->Length + mPcdDatabase.DxeDb->UninitDataBaseSize;\r
+  PcdDxeDb = AllocateZeroPool (PcdDxeDbLen);\r
+  ASSERT (PcdDxeDb != NULL);\r
+  CopyMem (PcdDxeDb, mPcdDatabase.DxeDb, mPcdDatabase.DxeDb->Length);\r
+  FreePool (mPcdDatabase.DxeDb);\r
+  mPcdDatabase.DxeDb = PcdDxeDb;\r
+\r
   GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
   if (GuidHob != NULL) {\r
 \r
@@ -782,20 +801,15 @@ BuildPcdDxeDataBase (
     // Assign PCD Entries refereneced in PEI phase to PCD DATABASE\r
     //\r
     mPcdDatabase.PeiDb = PeiDatabase;\r
+    //\r
+    // Inherit the SystemSkuId from PEI phase.\r
+    //\r
+    mPcdDatabase.DxeDb->SystemSkuId = mPcdDatabase.PeiDb->SystemSkuId;\r
+  } else {\r
+    mPcdDatabase.PeiDb = AllocateZeroPool (sizeof (PEI_PCD_DATABASE));\r
+    ASSERT(mPcdDatabase.PeiDb != NULL);\r
   }\r
 \r
-  //\r
-  // Assign PCD Entries with default value to PCD DATABASE\r
-  //\r
-  mPcdDatabase.DxeDb = LocateExPcdBinary ();\r
-  ASSERT(mPcdDatabase.DxeDb != NULL);\r
-  PcdDxeDbLen = mPcdDatabase.DxeDb->Length + mPcdDatabase.DxeDb->UninitDataBaseSize;\r
-  PcdDxeDb = AllocateZeroPool (PcdDxeDbLen);\r
-  ASSERT (PcdDxeDb != NULL);\r
-  CopyMem (PcdDxeDb, mPcdDatabase.DxeDb, mPcdDatabase.DxeDb->Length);\r
-  FreePool (mPcdDatabase.DxeDb);\r
-  mPcdDatabase.DxeDb = PcdDxeDb;\r
-\r
   //\r
   // Initialized the external PCD database local variables\r
   //\r
@@ -938,7 +952,7 @@ GetSkuEnabledTokenNumber (
   //\r
   FoundSku = FALSE;\r
   for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-    if (mPcdDatabase.PeiDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
+    if (mPcdDatabase.DxeDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
       FoundSku = TRUE;\r
       break;\r
     }\r
@@ -1697,7 +1711,7 @@ GetPtrTypeSize (
       //\r
       SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
       for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == mPcdDatabase.PeiDb->SystemSkuId) {\r
+        if (SkuIdTable[1 + Index] == mPcdDatabase.DxeDb->SystemSkuId) {\r
           return SizeTable[SizeTableIdx + 1 + Index];\r
         }\r
       }\r
@@ -1787,7 +1801,7 @@ SetPtrTypeSize (
       //\r
       SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
       for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == mPcdDatabase.PeiDb->SystemSkuId) {\r
+        if (SkuIdTable[1 + Index] == mPcdDatabase.DxeDb->SystemSkuId) {\r
           SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;\r
           return TRUE;\r
         }\r