]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/PCD/Dxe/Service.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / PCD / Dxe / Service.c
index 7b0932a6e4337107abde8b681aba0cc6f0fdb3e3..ea7edc3cbb1c620860b333577129dde4e980f470 100644 (file)
@@ -2,14 +2,9 @@
     Help functions used by PCD DXE driver.\r
 \r
 Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>\r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -18,23 +13,28 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 PCD_DATABASE   mPcdDatabase;\r
 \r
-UINT32         mPcdTotalTokenCount; \r
-UINT32         mPeiLocalTokenCount; \r
-UINT32         mDxeLocalTokenCount; \r
-UINT32         mPeiNexTokenCount;   \r
-UINT32         mDxeNexTokenCount;  \r
+UINT32         mPcdTotalTokenCount;\r
+UINT32         mPeiLocalTokenCount;\r
+UINT32         mDxeLocalTokenCount;\r
+UINT32         mPeiNexTokenCount;\r
+UINT32         mDxeNexTokenCount;\r
 UINT32         mPeiExMapppingTableSize;\r
 UINT32         mDxeExMapppingTableSize;\r
 UINT32         mPeiGuidTableSize;\r
 UINT32         mDxeGuidTableSize;\r
 \r
-BOOLEAN        mPeiExMapTableEmpty; \r
-BOOLEAN        mDxeExMapTableEmpty; \r
+BOOLEAN        mPeiExMapTableEmpty;\r
+BOOLEAN        mDxeExMapTableEmpty;\r
 BOOLEAN        mPeiDatabaseEmpty;\r
 \r
 LIST_ENTRY    *mCallbackFnTable;\r
 EFI_GUID     **TmpTokenSpaceBuffer;\r
-UINTN          TmpTokenSpaceBufferCount; \r
+UINTN          TmpTokenSpaceBufferCount;\r
+\r
+UINTN                 mPeiPcdDbSize    = 0;\r
+PEI_PCD_DATABASE      *mPeiPcdDbBinary = NULL;\r
+UINTN                 mDxePcdDbSize    = 0;\r
+DXE_PCD_DATABASE      *mDxePcdDbBinary = NULL;\r
 \r
 /**\r
   Get Local Token Number by Token Number.\r
@@ -51,11 +51,7 @@ GetLocalTokenNumber (
   IN UINTN              TokenNumber\r
   )\r
 {\r
-  UINTN                 TmpTokenNumber;\r
   UINT32                *LocalTokenNumberTable;\r
-  UINT32                LocalTokenNumber;\r
-  UINTN                 Size;\r
-  UINTN                 MaxSize;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -64,29 +60,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
+  LocalTokenNumberTable  = IsPeiDb ? (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) :\r
                                      (UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset);\r
   TokenNumber            = IsPeiDb ? TokenNumber : TokenNumber - mPeiLocalTokenCount;\r
 \r
-  LocalTokenNumber = LocalTokenNumberTable[TokenNumber];\r
-\r
-  Size = (LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
-\r
-  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    if (Size == 0) {\r
-      GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
-    } else {\r
-      MaxSize = Size;\r
-    }\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize, IsPeiDb);\r
-  }\r
-\r
-  return LocalTokenNumber;\r
+  return LocalTokenNumberTable[TokenNumber];\r
 }\r
 \r
 /**\r
@@ -142,11 +120,25 @@ GetPcdName (
 {\r
   PCD_DATABASE_INIT *Database;\r
   UINT8             *StringTable;\r
+  UINTN             NameSize;\r
   PCD_NAME_INDEX    *PcdNameIndex;\r
   CHAR8             *TokenSpaceName;\r
   CHAR8             *PcdName;\r
   CHAR8             *Name;\r
 \r
+  //\r
+  // Return NULL when PCD name table is absent.\r
+  //\r
+  if (IsPeiDb) {\r
+    if (mPcdDatabase.PeiDb->PcdNameTableOffset == 0) {\r
+      return NULL;\r
+    }\r
+  } else {\r
+    if (mPcdDatabase.DxeDb->PcdNameTableOffset == 0) {\r
+      return NULL;\r
+    }\r
+  }\r
+\r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
@@ -175,14 +167,15 @@ GetPcdName (
     //\r
     // Need to get the full PCD name.\r
     //\r
-    Name = AllocateZeroPool (AsciiStrSize (TokenSpaceName) + AsciiStrSize (PcdName));\r
+    NameSize = AsciiStrSize (TokenSpaceName) + AsciiStrSize (PcdName);\r
+    Name = AllocateZeroPool (NameSize);\r
     ASSERT (Name != NULL);\r
     //\r
     // Catenate TokenSpaceCName and PcdCName with a '.' to form the full PCD name.\r
     //\r
-    AsciiStrCat (Name, TokenSpaceName);\r
+    AsciiStrCatS (Name, NameSize, TokenSpaceName);\r
     Name[AsciiStrSize (TokenSpaceName) - sizeof (CHAR8)] = '.';\r
-    AsciiStrCat (Name, PcdName);  \r
+    AsciiStrCatS (Name, NameSize, PcdName);\r
   }\r
 \r
   return Name;\r
@@ -199,7 +192,7 @@ GetPcdName (
   @param[in]    Guid        The 128-bit unique value that designates the namespace from which to extract the value.\r
   @param[in]    TokenNumber The PCD token number.\r
   @param[out]   PcdInfo     The returned information associated with the requested TokenNumber.\r
-                            The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName. \r
+                            The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName.\r
 \r
   @retval  EFI_SUCCESS      The PCD information was returned successfully\r
   @retval  EFI_NOT_FOUND    The PCD service could not find the requested token number.\r
@@ -248,7 +241,7 @@ ExGetPcdInfo (
         PcdInfo->PcdSize = 0;\r
         //\r
         // Here use one representative in the token space to get the TokenSpaceCName.\r
-        // \r
+        //\r
         PcdInfo->PcdName = GetPcdName (TRUE, IsPeiDb, ExMapTable[Index].TokenNumber);\r
         return EFI_SUCCESS;\r
       } else if (ExMapTable[Index].ExTokenNumber == TokenNumber) {\r
@@ -353,10 +346,10 @@ DxeGetPcdInfo (
 \r
 /**\r
   Get the PCD entry pointer in PCD database.\r
-  \r
+\r
   This routine will visit PCD database to find the PCD entry according to given\r
-  token number. The given token number is autogened by build tools and it will be \r
-  translated to local token number. Local token number contains PCD's type and \r
+  token number. The given token number is autogened by build tools and it will be\r
+  translated to local token number. Local token number contains PCD's type and\r
   offset of PCD entry in PCD database.\r
 \r
   @param TokenNumber     Token's number, it is autogened by build tools\r
@@ -386,7 +379,7 @@ GetWorker (
   EFI_STATUS          Status;\r
   UINT32              LocalTokenNumber;\r
   UINT32              Offset;\r
-  STRING_HEAD         StringTableIdx;      \r
+  STRING_HEAD         StringTableIdx;\r
   BOOLEAN             IsPeiDb;\r
 \r
   //\r
@@ -408,7 +401,7 @@ GetWorker (
 \r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   //\r
   ASSERT (TokenNumber + 1 < mPcdTotalTokenCount + 1);\r
@@ -416,14 +409,14 @@ GetWorker (
   ASSERT ((GetSize == DxePcdGetSize (TokenNumber + 1)) || (GetSize == 0));\r
 \r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);\r
 \r
   LocalTokenNumber = GetLocalTokenNumber (IsPeiDb, TokenNumber + 1);\r
 \r
   PcdDb = IsPeiDb ? ((UINT8 *) mPcdDatabase.PeiDb) : ((UINT8 *) mPcdDatabase.DxeDb);\r
-                                    \r
+\r
   if (IsPeiDb) {\r
     StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->StringTableOffset);\r
   } else {\r
@@ -436,7 +429,8 @@ GetWorker (
   switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
       VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
-      RetPtr = (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset);\r
+      ASSERT (mVpdBaseAddress != 0);\r
+      RetPtr = (VOID *) (mVpdBaseAddress + VpdHead->Offset);\r
 \r
       break;\r
 \r
@@ -454,11 +448,11 @@ GetWorker (
 \r
       if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
         //\r
-        // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of \r
+        // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of\r
         // string array in string table.\r
         //\r
-        StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);   \r
-        VaraiableDefaultBuffer = (UINT8 *) (StringTable + StringTableIdx);     \r
+        StringTableIdx = *(STRING_HEAD*)((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);\r
+        VaraiableDefaultBuffer = (UINT8 *) (StringTable + StringTableIdx);\r
       } else {\r
         VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
       }\r
@@ -502,7 +496,7 @@ GetWorker (
     default:\r
       ASSERT (FALSE);\r
       break;\r
-      \r
+\r
   }\r
 \r
   EfiReleaseLock (&mPcdDatabaseLock);\r
@@ -516,9 +510,9 @@ GetWorker (
 \r
   This routine will register a callback function to a PCD entry by given token number\r
   and token space guid.\r
-  \r
+\r
   @param TokenNumber        PCD token's number, it is autogened by build tools.\r
-  @param Guid               PCD token space's guid, \r
+  @param Guid               PCD token space's guid,\r
                             if not NULL, this PCD is dynamicEx type PCD.\r
   @param CallBackFunction   Callback function pointer\r
 \r
@@ -566,7 +560,7 @@ DxeRegisterCallBackWorker (
 \r
   FnTableEntry->CallbackFn = CallBackFunction;\r
   InsertTailList (ListHead, &FnTableEntry->Node);\r
-  \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -618,7 +612,7 @@ DxeUnRegisterCallBackWorker (
       //\r
       RemoveEntryList (ListNode);\r
       FreePool (FnTableEntry);\r
-      \r
+\r
       return EFI_SUCCESS;\r
     }\r
     ListNode = GetNextNode (ListHead, ListNode);\r
@@ -629,16 +623,16 @@ DxeUnRegisterCallBackWorker (
 \r
 /**\r
   Get next token number in given token space.\r
-  \r
+\r
   This routine is used for dynamicEx type PCD. It will firstly scan token space\r
-  table to get token space according to given token space guid. Then scan given \r
-  token number in found token space, if found, then return next token number in \r
+  table to get token space according to given token space guid. Then scan given\r
+  token number in found token space, if found, then return next token number in\r
   this token space.\r
 \r
-  @param Guid            Token space guid. Next token number will be scaned in \r
+  @param Guid            Token space guid. Next token number will be scaned in\r
                          this token space.\r
-  @param TokenNumber     Token number. \r
-                         If PCD_INVALID_TOKEN_NUMBER, return first token number in \r
+  @param TokenNumber     Token number.\r
+                         If PCD_INVALID_TOKEN_NUMBER, return first token number in\r
                          token space table.\r
                          If not PCD_INVALID_TOKEN_NUMBER, return next token number\r
                          in token space table.\r
@@ -669,8 +663,8 @@ ExGetNextTokeNumber (
   UINTN            ExMapTableCount;\r
 \r
   //\r
-  // Scan token space guid \r
-  // \r
+  // Scan token space guid\r
+  //\r
   MatchGuid = ScanGuid (GuidTable, SizeOfGuidTable, Guid);\r
   if (MatchGuid == NULL) {\r
     return EFI_NOT_FOUND;\r
@@ -700,7 +694,7 @@ ExGetNextTokeNumber (
     }\r
 \r
     for ( ; Index < ExMapTableCount; Index++) {\r
-      if (ExMapTable[Index].ExTokenNumber == *TokenNumber) {\r
+      if ((ExMapTable[Index].ExTokenNumber == *TokenNumber) && (ExMapTable[Index].ExGuidIndex == GuidTableIdx)) {\r
         break;\r
       }\r
     }\r
@@ -735,39 +729,111 @@ ExGetNextTokeNumber (
 DXE_PCD_DATABASE *\r
 LocateExPcdBinary (\r
   VOID\r
-) \r
+)\r
 {\r
-  DXE_PCD_DATABASE      *DxePcdDbBinary;\r
-  UINTN                 DxePcdDbSize;\r
   EFI_STATUS            Status;\r
\r
-  DxePcdDbBinary = NULL;\r
+\r
   //\r
-  // Search the External Pcd database from one section of current FFS, \r
+  // Search the External Pcd database from one section of current FFS,\r
   // and read it to memory\r
   //\r
   Status = GetSectionFromFfs (\r
              EFI_SECTION_RAW,\r
              0,\r
-             (VOID **) &DxePcdDbBinary,\r
-             &DxePcdDbSize\r
+             (VOID **) &mDxePcdDbBinary,\r
+             &mDxePcdDbSize\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Check the first bytes (Header Signature Guid) and build version.\r
   //\r
-  if (!CompareGuid ((VOID *)DxePcdDbBinary, &gPcdDataBaseSignatureGuid) ||\r
-      (DxePcdDbBinary->BuildVersion != PCD_SERVICE_DXE_VERSION)) {\r
+  if (!CompareGuid ((VOID *)mDxePcdDbBinary, &gPcdDataBaseSignatureGuid) ||\r
+      (mDxePcdDbBinary->BuildVersion != PCD_SERVICE_DXE_VERSION)) {\r
     ASSERT (FALSE);\r
   }\r
 \r
-  return DxePcdDbBinary;\r
+  return mDxePcdDbBinary;\r
+}\r
+\r
+/**\r
+  Update PCD database base on current SkuId\r
+\r
+  @param   SkuId     Current SkuId\r
+  @param   IsPeiDb   Whether to update PEI PCD database.\r
+\r
+  @retval EFI_SUCCESS    Update PCD database successfully.\r
+  @retval EFI_NOT_FOUND  Not found PCD database for current SkuId.\r
+**/\r
+EFI_STATUS\r
+UpdatePcdDatabase (\r
+  IN SKU_ID        SkuId,\r
+  IN BOOLEAN       IsPeiDb\r
+  )\r
+{\r
+  UINTN                       Index;\r
+  PCD_DATABASE_SKU_DELTA      *SkuDelta;\r
+  PCD_DATA_DELTA              *SkuDeltaData;\r
+\r
+  if (IsPeiDb && mPeiPcdDbBinary != NULL) {\r
+    //\r
+    // Find the delta data for PEI DB\r
+    //\r
+    Index    = (mPcdDatabase.PeiDb->Length + 7) & (~7);\r
+    SkuDelta = NULL;\r
+    while (Index < mPeiPcdDbSize) {\r
+      SkuDelta = (PCD_DATABASE_SKU_DELTA *) ((UINT8 *) mPeiPcdDbBinary + Index);\r
+      if (SkuDelta->SkuId == SkuId && SkuDelta->SkuIdCompared == 0) {\r
+        break;\r
+      }\r
+      Index = (Index + SkuDelta->Length + 7) & (~7);\r
+    }\r
+\r
+    //\r
+    // Patch the delta data into current PCD database\r
+    //\r
+    if (Index < mPeiPcdDbSize && SkuDelta != NULL) {\r
+      SkuDeltaData = (PCD_DATA_DELTA *) (SkuDelta + 1);\r
+      while ((UINT8 *) SkuDeltaData < (UINT8 *) SkuDelta + SkuDelta->Length) {\r
+        *((UINT8 *) mPcdDatabase.PeiDb + SkuDeltaData->Offset) = (UINT8) SkuDeltaData->Value;\r
+        SkuDeltaData ++;\r
+      }\r
+    } else {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Find the delta data for DXE DB\r
+  //\r
+  Index    = (mPcdDatabase.DxeDb->Length + 7) & (~7);\r
+  SkuDelta = NULL;\r
+  while (Index < mDxePcdDbSize) {\r
+    SkuDelta = (PCD_DATABASE_SKU_DELTA *) ((UINT8 *) mDxePcdDbBinary + Index);\r
+    if (SkuDelta->SkuId == SkuId && SkuDelta->SkuIdCompared == 0) {\r
+      break;\r
+    }\r
+    Index = (Index + SkuDelta->Length + 7) & (~7);\r
+  }\r
+\r
+  //\r
+  // Patch the delta data into current PCD database\r
+  //\r
+  if (Index < mDxePcdDbSize && SkuDelta != NULL) {\r
+    SkuDeltaData = (PCD_DATA_DELTA *) (SkuDelta + 1);\r
+    while ((UINT8 *) SkuDeltaData < (UINT8 *) SkuDelta + SkuDelta->Length) {\r
+      *((UINT8 *) mPcdDatabase.DxeDb + SkuDeltaData->Offset) = (UINT8) SkuDeltaData->Value;\r
+      SkuDeltaData ++;\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 /**\r
   Initialize the PCD database in DXE phase.\r
-  \r
+\r
   PCD database in DXE phase also contains PCD database in PEI phase which is copied\r
   from GUID Hob.\r
 \r
@@ -782,6 +848,7 @@ BuildPcdDxeDataBase (
   UINTN               Index;\r
   UINT32              PcdDxeDbLen;\r
   VOID                *PcdDxeDb;\r
+  EFI_STATUS          Status;\r
 \r
   //\r
   // Assign PCD Entries with default value to PCD DATABASE\r
@@ -792,20 +859,28 @@ BuildPcdDxeDataBase (
   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
-    // \r
+    //\r
     // If no PEIMs use dynamic Pcd Entry, the Pcd Service PEIM\r
     // should not be included at all. So the GuidHob could\r
     // be NULL. If it is NULL, we just copy over the DXE Default\r
     // Value to PCD Database.\r
     //\r
-    \r
     PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+\r
+    //\r
+    // Get next one that stores full PEI data\r
+    //\r
+    GuidHob = GetNextGuidHob (&gPcdDataBaseHobGuid, GET_NEXT_HOB (GuidHob));\r
+    if (GuidHob != NULL) {\r
+      mPeiPcdDbBinary = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+      mPeiPcdDbSize   = (UINTN) GET_GUID_HOB_DATA_SIZE (GuidHob);\r
+    }\r
+\r
     //\r
     // Assign PCD Entries refereneced in PEI phase to PCD DATABASE\r
     //\r
@@ -813,6 +888,10 @@ BuildPcdDxeDataBase (
     //\r
     // Inherit the SystemSkuId from PEI phase.\r
     //\r
+    if (mPcdDatabase.PeiDb->SystemSkuId != 0) {\r
+      Status = UpdatePcdDatabase (mPcdDatabase.PeiDb->SystemSkuId, FALSE);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
     mPcdDatabase.DxeDb->SystemSkuId = mPcdDatabase.PeiDb->SystemSkuId;\r
   } else {\r
     mPcdDatabase.PeiDb = AllocateZeroPool (sizeof (PEI_PCD_DATABASE));\r
@@ -832,7 +911,7 @@ BuildPcdDxeDataBase (
 \r
   mPcdTotalTokenCount     = mPeiLocalTokenCount + mDxeLocalTokenCount;\r
   mPeiNexTokenCount       = mPeiLocalTokenCount - mPcdDatabase.PeiDb->ExTokenCount;\r
-  mDxeNexTokenCount       = mDxeLocalTokenCount - mPcdDatabase.DxeDb->ExTokenCount;  \r
+  mDxeNexTokenCount       = mDxeLocalTokenCount - mPcdDatabase.DxeDb->ExTokenCount;\r
 \r
   mPeiExMapTableEmpty     = (mPcdDatabase.PeiDb->ExTokenCount == 0) ? TRUE : FALSE;\r
   mDxeExMapTableEmpty     = (mPcdDatabase.DxeDb->ExTokenCount == 0) ? TRUE : FALSE;\r
@@ -849,7 +928,7 @@ BuildPcdDxeDataBase (
 \r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   //\r
   for (Index = 0; Index + 1 < mPcdTotalTokenCount + 1; Index++) {\r
@@ -862,7 +941,7 @@ BuildPcdDxeDataBase (
 \r
   @param VariableGuid    Variable's guid\r
   @param VariableName    Variable's unicode name string\r
-  @param VariableData    Variable's data pointer, \r
+  @param VariableData    Variable's data pointer,\r
   @param VariableSize    Variable's size.\r
 \r
   @return the status of gRT->GetVariable\r
@@ -881,7 +960,7 @@ GetHiiVariable (
 \r
   Size = 0;\r
   Buffer = NULL;\r
-  \r
+\r
   //\r
   // Firstly get the real size of HII variable\r
   //\r
@@ -892,7 +971,7 @@ GetHiiVariable (
     &Size,\r
     Buffer\r
     );\r
-  \r
+\r
   //\r
   // Allocate buffer to hold whole variable data according to variable size.\r
   //\r
@@ -914,7 +993,7 @@ GetHiiVariable (
     *VariableSize = Size;\r
   } else {\r
     //\r
-    // Use Default Data only when variable is not found. \r
+    // Use Default Data only when variable is not found.\r
     // For other error status, correct data can't be got, and trig ASSERT().\r
     //\r
     ASSERT (Status == EFI_NOT_FOUND);\r
@@ -924,95 +1003,7 @@ GetHiiVariable (
 }\r
 \r
 /**\r
-  Find the local token number according to system SKU ID.\r
-\r
-  @param LocalTokenNumber PCD token number\r
-  @param Size             The size of PCD entry.\r
-  @param IsPeiDb          If TRUE, the PCD entry is initialized in PEI phase.\r
-                          If False, the PCD entry is initialized in DXE phase.\r
-\r
-  @return Token number according to system SKU ID.\r
-\r
-**/\r
-UINT32\r
-GetSkuEnabledTokenNumber (\r
-  UINT32    LocalTokenNumber,\r
-  UINTN     Size,\r
-  BOOLEAN   IsPeiDb\r
-  ) \r
-{\r
-  SKU_HEAD              *SkuHead;\r
-  SKU_ID                *SkuIdTable;\r
-  INTN                  Index;\r
-  UINT8                 *Value;\r
-  UINT8                 *PcdDb;\r
-  BOOLEAN               FoundSku;\r
-\r
-  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
-\r
-  PcdDb = IsPeiDb ? (UINT8 *) mPcdDatabase.PeiDb : (UINT8 *) mPcdDatabase.DxeDb;\r
-\r
-  SkuHead     = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-  Value       = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
-\r
-  SkuIdTable =  (SKU_ID *)(PcdDb + SkuHead->SkuIdTableOffset);\r
-  //\r
-  // Find the current system's SKU ID entry in SKU ID table.\r
-  //\r
-  FoundSku = FALSE;\r
-  for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-    if (mPcdDatabase.DxeDb->SystemSkuId == SkuIdTable[Index + 1]) {\r
-      FoundSku = TRUE;\r
-      break;\r
-    }\r
-  }\r
-  \r
-  //\r
-  // Find the default SKU ID entry in SKU ID table.\r
-  //\r
-  \r
-  if(!FoundSku) {\r
-    for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-      if (0 == SkuIdTable[Index + 1]) {\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  ASSERT (Index < SkuIdTable[0]);\r
-\r
-  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
-    case PCD_TYPE_VPD:\r
-      Value = (UINT8 *) &(((VPD_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_VPD);\r
-\r
-    case PCD_TYPE_HII:\r
-      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII);\r
-\r
-    case PCD_TYPE_HII|PCD_TYPE_STRING:\r
-      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII | PCD_TYPE_STRING);\r
-\r
-    case PCD_TYPE_STRING:\r
-      Value = (UINT8 *) &(((STRING_HEAD *) Value)[Index]);\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING);\r
-      \r
-    case PCD_TYPE_DATA:\r
-      Value += Size * Index;\r
-      return (UINT32) ((Value - PcdDb) | PCD_TYPE_DATA);\r
-\r
-    default:\r
-      ASSERT (FALSE);\r
-  }\r
-\r
-  ASSERT (FALSE);\r
-\r
-  return 0;\r
-  \r
-}\r
-\r
-/**\r
-  Invoke the callback function when dynamic PCD entry was set, if this PCD entry \r
+  Invoke the callback function when dynamic PCD entry was set, if this PCD entry\r
   has registered callback function.\r
 \r
   @param ExTokenNumber   DynamicEx PCD's token number, if this PCD entry is dyanmicEx\r
@@ -1048,14 +1039,14 @@ InvokeCallbackOnSet (
   while (ListNode != ListHead) {\r
     FnTableEntry = CR_FNENTRY_FROM_LISTNODE (ListNode, CALLBACK_FN_ENTRY, Node);\r
 \r
-    FnTableEntry->CallbackFn(Guid, \r
+    FnTableEntry->CallbackFn(Guid,\r
                     (Guid == NULL) ? TokenNumber : ExTokenNumber,\r
                     Data,\r
                     Size);\r
-    \r
+\r
     ListNode = GetNextNode (ListHead, ListNode);\r
   }\r
-  \r
+\r
   return;\r
 }\r
 \r
@@ -1092,10 +1083,10 @@ SetValueWorker (
 \r
   @retval EFI_INVALID_PARAMETER  If this PCD type is VPD, VPD PCD can not be set.\r
   @retval EFI_INVALID_PARAMETER  If Size can not be set to size table.\r
-  @retval EFI_INVALID_PARAMETER  If Size of non-Ptr type PCD does not match the size information in PCD database.  \r
+  @retval EFI_INVALID_PARAMETER  If Size of non-Ptr type PCD does not match the size information in PCD database.\r
   @retval EFI_NOT_FOUND          If value type of PCD entry is intergrate, but not in\r
                                  range of UINT8, UINT16, UINT32, UINT64\r
-  @retval EFI_NOT_FOUND          Can not find the PCD type according to token number.                                \r
+  @retval EFI_NOT_FOUND          Can not find the PCD type according to token number.\r
 **/\r
 EFI_STATUS\r
 SetWorker (\r
@@ -1129,10 +1120,10 @@ SetWorker (
   TokenNumber--;\r
 \r
   TmpTokenNumber = TokenNumber;\r
-  \r
+\r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   //\r
   ASSERT (TokenNumber + 1 < mPcdTotalTokenCount + 1);\r
@@ -1154,7 +1145,7 @@ SetWorker (
 \r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   //\r
   if ((TokenNumber + 1 < mPeiNexTokenCount + 1) ||\r
@@ -1169,7 +1160,7 @@ SetWorker (
 \r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   //\r
   IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);\r
@@ -1186,7 +1177,7 @@ SetWorker (
     StringTable = (UINT8 *) ((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->StringTableOffset);\r
   }\r
 \r
-  \r
+\r
   InternalData = PcdDb + Offset;\r
 \r
   switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
@@ -1194,7 +1185,7 @@ SetWorker (
       ASSERT (FALSE);\r
       Status = EFI_INVALID_PARAMETER;\r
       break;\r
-    \r
+\r
     case PCD_TYPE_STRING:\r
       if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
         CopyMem (StringTable + *((STRING_HEAD *)InternalData), Data, *Size);\r
@@ -1227,7 +1218,7 @@ SetWorker (
       Attributes = VariableHead->Attributes;\r
       Status = SetHiiVariable (Guid, Name, Attributes, Data, *Size, VariableOffset);\r
       break;\r
-      \r
+\r
     case PCD_TYPE_DATA:\r
       if (PtrType) {\r
         if (SetPtrTypeSize (TmpTokenNumber, Size)) {\r
@@ -1271,7 +1262,7 @@ SetWorker (
     }\r
 \r
   EfiReleaseLock (&mPcdDatabaseLock);\r
-  \r
+\r
   return Status;\r
 }\r
 \r
@@ -1290,7 +1281,7 @@ ExGetWorker (
   IN CONST EFI_GUID         *Guid,\r
   IN UINTN                  ExTokenNumber,\r
   IN UINTN                  GetSize\r
-  ) \r
+  )\r
 {\r
   return GetWorker(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber), GetSize);\r
 }\r
@@ -1319,12 +1310,12 @@ ExSetValueWorker (
 \r
 /**\r
   Set value for a dynamic-ex PCD entry.\r
-  \r
-  This routine find the local token number according to dynamic-ex PCD's token \r
+\r
+  This routine find the local token number according to dynamic-ex PCD's token\r
   space guid and token number firstly, and invoke callback function if this PCD\r
   entry registered callback function. Finally, invoken general SetWorker to set\r
   PCD value.\r
-  \r
+\r
   @param ExTokenNumber   Dynamic-ex PCD token number.\r
   @param Guid            Token space guid for dynamic-ex PCD.\r
   @param Data            PCD value want to be set\r
@@ -1345,7 +1336,7 @@ ExSetWorker (
   )\r
 {\r
   UINTN                   TokenNumber;\r
-  \r
+\r
   TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber);\r
 \r
   InvokeCallbackOnSet ((UINT32) ExTokenNumber, Guid, TokenNumber, Data, *SetSize);\r
@@ -1354,12 +1345,90 @@ ExSetWorker (
 \r
 }\r
 \r
+/**\r
+  Get variable size and data from HII-type PCDs.\r
+\r
+  @param[in]  VariableGuid   Guid of variable which stored value of a HII-type PCD.\r
+  @param[in]  VariableName   Unicode name of variable which stored value of a HII-type PCD.\r
+  @param[out] VariableSize   Pointer to variable size got from HII-type PCDs.\r
+  @param[out] VariableData   Pointer to variable data got from HII-type PCDs.\r
+\r
+**/\r
+VOID\r
+GetVariableSizeAndDataFromHiiPcd (\r
+  IN EFI_GUID               *VariableGuid,\r
+  IN UINT16                 *VariableName,\r
+  OUT UINTN                 *VariableSize,\r
+  OUT VOID                  *VariableData OPTIONAL\r
+  )\r
+{\r
+  BOOLEAN                   IsPeiDb;\r
+  PCD_DATABASE_INIT         *Database;\r
+  UINTN                     TokenNumber;\r
+  UINT32                    LocalTokenNumber;\r
+  UINTN                     Offset;\r
+  EFI_GUID                  *GuidTable;\r
+  UINT8                     *StringTable;\r
+  VARIABLE_HEAD             *VariableHead;\r
+  EFI_GUID                  *Guid;\r
+  UINT16                    *Name;\r
+  UINTN                     PcdDataSize;\r
+  UINTN                     Size;\r
+  UINT8                     *VaraiableDefaultBuffer;\r
+  STRING_HEAD               StringTableIdx;\r
+\r
+  *VariableSize = 0;\r
+\r
+  //\r
+  // Go through PCD database to find out DynamicHii PCDs.\r
+  //\r
+  for (TokenNumber = 1; TokenNumber <= mPcdTotalTokenCount; TokenNumber++) {\r
+    IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);\r
+    Database = IsPeiDb ? mPcdDatabase.PeiDb: mPcdDatabase.DxeDb;\r
+    LocalTokenNumber = GetLocalTokenNumber (IsPeiDb, TokenNumber);\r
+    if ((LocalTokenNumber & PCD_TYPE_HII) != 0) {\r
+      //\r
+      // Get the Variable Guid and Name pointer.\r
+      //\r
+      Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+      VariableHead = (VARIABLE_HEAD *) ((UINT8 *) Database + Offset);\r
+      StringTable = (UINT8 *) ((UINT8 *) Database + Database->StringTableOffset);\r
+      GuidTable = (EFI_GUID *) ((UINT8 *) Database + Database->GuidTableOffset);\r
+      Guid = GuidTable + VariableHead->GuidTableIndex;\r
+      Name = (UINT16*) (StringTable + VariableHead->StringIndex);\r
+      if (CompareGuid (VariableGuid, Guid) && (StrCmp (VariableName, Name) == 0)) {\r
+        //\r
+        // It is the matched DynamicHii PCD.\r
+        //\r
+        PcdDataSize = DxePcdGetSize (TokenNumber);\r
+        Size = VariableHead->Offset + PcdDataSize;\r
+        if (Size > *VariableSize) {\r
+          *VariableSize = Size;\r
+        }\r
+        if (VariableData != NULL) {\r
+          if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) {\r
+            //\r
+            // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of\r
+            // string array in string table.\r
+            //\r
+            StringTableIdx = *(STRING_HEAD *) ((UINT8 *) Database + VariableHead->DefaultValueOffset);\r
+            VaraiableDefaultBuffer = (UINT8 *) (StringTable + StringTableIdx);\r
+          } else {\r
+            VaraiableDefaultBuffer = (UINT8 *) Database + VariableHead->DefaultValueOffset;\r
+          }\r
+          CopyMem ((UINT8 *) VariableData + VariableHead->Offset, VaraiableDefaultBuffer, PcdDataSize);\r
+        }\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   Set value for HII-type PCD.\r
 \r
-  A HII-type PCD's value is stored in a variable. Setting/Getting the value of \r
+  A HII-type PCD's value is stored in a variable. Setting/Getting the value of\r
   HII-type PCD is to visit this variable.\r
-  \r
+\r
   @param VariableGuid    Guid of variable which stored value of a HII-type PCD.\r
   @param VariableName    Unicode name of variable which stored value of a HII-type PCD.\r
   @param SetAttributes   Attributes bitmask to set for the variable.\r
@@ -1399,7 +1468,7 @@ SetHiiVariable (
     &Size,\r
     NULL\r
     );\r
-  \r
+\r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
     //\r
     // Patch new PCD's value to offset in given HII variable.\r
@@ -1419,7 +1488,7 @@ SetHiiVariable (
       &Size,\r
       Buffer\r
       );\r
-    \r
+\r
     ASSERT_EFI_ERROR (Status);\r
 \r
     CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
@@ -1442,12 +1511,18 @@ SetHiiVariable (
     //\r
     // If variable does not exist, a new variable need to be created.\r
     //\r
-    \r
-    Size = Offset + DataSize;\r
-    \r
+\r
+    //\r
+    // Get size, allocate buffer and get data.\r
+    //\r
+    GetVariableSizeAndDataFromHiiPcd (VariableGuid, VariableName, &Size, NULL);\r
     Buffer = AllocateZeroPool (Size);\r
     ASSERT (Buffer != NULL);\r
-    \r
+    GetVariableSizeAndDataFromHiiPcd (VariableGuid, VariableName, &Size, Buffer);\r
+\r
+    //\r
+    // Update buffer.\r
+    //\r
     CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
 \r
     if (SetAttributes == 0) {\r
@@ -1463,9 +1538,9 @@ SetHiiVariable (
               );\r
 \r
     FreePool (Buffer);\r
-    return Status;    \r
+    return Status;\r
   }\r
-  \r
+\r
   //\r
   // If we drop to here, the value is failed to be written in to variable area.\r
   //\r
@@ -1478,14 +1553,14 @@ SetHiiVariable (
   A dynamic-ex type PCD, developer must provide pair of token space guid: token number\r
   in DEC file. PCD database maintain a mapping table that translate pair of {token\r
   space guid: token number} to Token Number.\r
-  \r
+\r
   @param Guid            Token space guid for dynamic-ex PCD entry.\r
   @param ExTokenNumber   Dynamic-ex PCD token number.\r
 \r
   @return Token Number for dynamic-ex PCD.\r
 \r
 **/\r
-UINTN           \r
+UINTN\r
 GetExPcdTokenNumber (\r
   IN CONST EFI_GUID             *Guid,\r
   IN UINT32                     ExTokenNumber\r
@@ -1540,44 +1615,9 @@ GetExPcdTokenNumber (
   return 0;\r
 }\r
 \r
-/**\r
-  Get SKU ID table from PCD database.\r
-\r
-  @param LocalTokenNumberTableIdx Index of local token number in token number table.\r
-  @param IsPeiDb                  If TRUE, the pcd entry is initialized in PEI phase,\r
-                                  If FALSE, the pcd entry is initialized in DXE phase.\r
-  @return Pointer to SKU ID array table\r
-\r
-**/\r
-SKU_ID *\r
-GetSkuIdArray (\r
-  IN    UINTN             LocalTokenNumberTableIdx,\r
-  IN    BOOLEAN           IsPeiDb\r
-  )\r
-{\r
-  SKU_HEAD  *SkuHead;\r
-  UINTN     LocalTokenNumber;\r
-  UINT8     *Database;\r
-\r
-  if (IsPeiDb) {\r
-    LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
-    Database         = (UINT8 *) mPcdDatabase.PeiDb;\r
-  } else {\r
-    LocalTokenNumber = *((UINT32 *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->LocalTokenNumberTableOffset) + LocalTokenNumberTableIdx);\r
-    Database         = (UINT8 *) mPcdDatabase.DxeDb;\r
-  }\r
-\r
-  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
-\r
-  SkuHead = (SKU_HEAD *) ((UINT8 *)Database + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
-\r
-  return (SKU_ID *) (Database + SkuHead->SkuIdTableOffset);\r
-  \r
-}\r
-\r
 /**\r
   Wrapper function of getting index of PCD entry in size table.\r
-  \r
+\r
   @param LocalTokenNumberTableIdx Index of this PCD in local token number table.\r
   @param IsPeiDb                  If TRUE, the pcd entry is initialized in PEI phase,\r
                                   If FALSE, the pcd entry is initialized in DXE phase.\r
@@ -1594,8 +1634,7 @@ GetSizeTableIndex (
   UINTN  LocalTokenNumber;\r
   UINTN  Index;\r
   UINTN  SizeTableIdx;\r
-  SKU_ID *SkuIdTable;\r
-  \r
+\r
   if (IsPeiDb) {\r
     LocalTokenNumberTable = (UINT32 *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->LocalTokenNumberTableOffset);\r
   } else {\r
@@ -1609,7 +1648,7 @@ GetSizeTableIndex (
 \r
     if ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER) {\r
       //\r
-      // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+      // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type\r
       // PCD entry.\r
       //\r
       if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r
@@ -1621,28 +1660,18 @@ GetSizeTableIndex (
           //\r
           SizeTableIdx += 2;\r
       } else {\r
-        if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
           //\r
           // We have only two entry for Non-Sku enabled PCD entry:\r
           // 1) MAX SIZE\r
           // 2) Current Size\r
           //\r
           SizeTableIdx += 2;\r
-        } else {\r
-          //\r
-          // We have these entry for SKU enabled PCD entry\r
-          // 1) MAX SIZE\r
-          // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-          //\r
-          SkuIdTable = GetSkuIdArray (Index, IsPeiDb);\r
-          SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
-        }\r
       }\r
     }\r
 \r
   }\r
 \r
-  return SizeTableIdx;  \r
+  return SizeTableIdx;\r
 }\r
 \r
 /**\r
@@ -1662,14 +1691,12 @@ GetPtrTypeSize (
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
   SIZE_INFO   *SizeTable;\r
-  UINTN       Index;\r
   BOOLEAN     IsPeiDb;\r
   UINT32      *LocalTokenNumberTable;\r
 \r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < mPeiLocalTokenCount + 1);\r
 \r
@@ -1686,12 +1713,12 @@ GetPtrTypeSize (
   LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
 \r
   ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
-  \r
+\r
   SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, IsPeiDb);\r
 \r
   *MaxSize = SizeTable[SizeTableIdx];\r
   //\r
-  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type\r
   // PCD entry.\r
   //\r
   if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r
@@ -1703,27 +1730,12 @@ GetPtrTypeSize (
       //\r
       return *MaxSize;\r
   } else {\r
-    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
       //\r
       // We have only two entry for Non-Sku enabled PCD entry:\r
       // 1) MAX SIZE\r
       // 2) Current Size\r
       //\r
       return SizeTable[SizeTableIdx + 1];\r
-    } else {\r
-      //\r
-      // We have these entry for SKU enabled PCD entry\r
-      // 1) MAX SIZE\r
-      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-      //\r
-      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
-      for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == mPcdDatabase.DxeDb->SystemSkuId) {\r
-          return SizeTable[SizeTableIdx + 1 + Index];\r
-        }\r
-      }\r
-      return SizeTable[SizeTableIdx + 1];\r
-    }\r
   }\r
 }\r
 \r
@@ -1745,16 +1757,14 @@ SetPtrTypeSize (
 {\r
   INTN        SizeTableIdx;\r
   UINTN       LocalTokenNumber;\r
-  SKU_ID      *SkuIdTable;\r
   SIZE_INFO   *SizeTable;\r
-  UINTN       Index;\r
   UINTN       MaxSize;\r
   BOOLEAN     IsPeiDb;\r
   UINT32      *LocalTokenNumberTable;\r
 \r
   //\r
   // EBC compiler is very choosy. It may report warning about comparison\r
-  // between UINTN and 0 . So we add 1 in each size of the \r
+  // between UINTN and 0 . So we add 1 in each size of the\r
   // comparison.\r
   //\r
   IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx + 1 < mPeiLocalTokenCount + 1);\r
@@ -1771,12 +1781,12 @@ SetPtrTypeSize (
   LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
 \r
   ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
-  \r
+\r
   SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, IsPeiDb);\r
 \r
   MaxSize = SizeTable[SizeTableIdx];\r
   //\r
-  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type\r
   // PCD entry.\r
   //\r
   if ((LocalTokenNumber & PCD_TYPE_VPD) != 0) {\r
@@ -1790,32 +1800,15 @@ SetPtrTypeSize (
       (*CurrentSize == MAX_ADDRESS)) {\r
        *CurrentSize = MaxSize;\r
        return FALSE;\r
-    } \r
-    \r
-    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
-      //\r
-      // We have only two entry for Non-Sku enabled PCD entry:\r
-      // 1) MAX SIZE\r
-      // 2) Current Size\r
-      //\r
-      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
-      return TRUE;\r
-    } else {\r
-      //\r
-      // We have these entry for SKU enabled PCD entry\r
-      // 1) MAX SIZE\r
-      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
-      //\r
-      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
-      for (Index = 0; Index < SkuIdTable[0]; Index++) {\r
-        if (SkuIdTable[1 + Index] == mPcdDatabase.DxeDb->SystemSkuId) {\r
-          SizeTable[SizeTableIdx + 1 + Index] = (SIZE_INFO) *CurrentSize;\r
-          return TRUE;\r
-        }\r
-      }\r
-      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
-      return TRUE;\r
     }\r
+\r
+    //\r
+    // We have only two entry for Non-Sku enabled PCD entry:\r
+    // 1) MAX SIZE\r
+    // 2) Current Size\r
+    //\r
+    SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+    return TRUE;\r
   }\r
 }\r
 \r
@@ -1835,7 +1828,7 @@ VariableLockDynamicHiiPcd (
 {\r
   EFI_STATUS                Status;\r
   PCD_DATABASE_INIT         *Database;\r
-  UINT32                    LocalTokenCount; \r
+  UINT32                    LocalTokenCount;\r
   UINTN                     TokenNumber;\r
   UINT32                    LocalTokenNumber;\r
   UINTN                     Offset;\r
@@ -1851,7 +1844,7 @@ VariableLockDynamicHiiPcd (
   //\r
   // Go through PCD database to find out DynamicHii PCDs.\r
   //\r
-  for (TokenNumber = 0; TokenNumber < LocalTokenCount; TokenNumber++) {\r
+  for (TokenNumber = 1; TokenNumber <= LocalTokenCount; TokenNumber++) {\r
     if (IsPeiDb) {\r
       LocalTokenNumber = GetLocalTokenNumber (TRUE, TokenNumber);\r
     } else {\r