]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/PCD/Pei/Pcd.c
Refine some internal functions of PCD Driver.
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
index 3fb49dd54f925617256f56c9168d91b4b15dd128..70b229e3a931c19a7fb168f981434f8f39a1f739 100644 (file)
@@ -1,5 +1,4 @@
-/** @file\r
-PCD PEIM\r
+/** @file PCD PEIM\r
 \r
 Copyright (c) 2006, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
 \r
 Copyright (c) 2006, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
@@ -15,7 +14,6 @@ Module Name: Pcd.c
 \r
 **/\r
 \r
 \r
 **/\r
 \r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \r
 #include "Service.h"\r
 \r
 \r
@@ -52,7 +50,7 @@ PCD_PPI mPcdPpiInstance = {
   PeiPcdSetPtrEx,         \r
   PeiPcdSetBoolEx,\r
 \r
   PeiPcdSetPtrEx,         \r
   PeiPcdSetBoolEx,\r
 \r
-  PcdRegisterCallBackOnSet,\r
+  PeiRegisterCallBackOnSet,\r
   PcdUnRegisterCallBackOnSet,\r
   PeiPcdGetNextToken\r
 };\r
   PcdUnRegisterCallBackOnSet,\r
   PeiPcdGetNextToken\r
 };\r
@@ -75,12 +73,9 @@ PcdPeimInit (
   )\r
 {\r
   EFI_STATUS Status;\r
   )\r
 {\r
   EFI_STATUS Status;\r
-  UINT8      *PcdImage;\r
-\r
-  PcdImage = (UINT8 *) LocatePcdImage ();\r
-\r
-  BuildPcdDatabase (PcdImage);\r
 \r
 \r
+  BuildPcdDatabase ();\r
+  \r
   Status = PeiCoreInstallPpi (&mPpiPCD);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
   Status = PeiCoreInstallPpi (&mPpiPCD);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
@@ -88,25 +83,16 @@ PcdPeimInit (
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
-\r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
 PeiPcdSetSku (\r
 EFIAPI\r
 PeiPcdSetSku (\r
-  IN  UINTN                  SkuId\r
+  IN  SKU_ID                  SkuId\r
   )\r
 {\r
   )\r
 {\r
-  PCD_DATABASE      *Database;\r
-  EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
-  \r
-  Database = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
 \r
 \r
-  Database->Info.SkuId = SkuId;\r
+  GetPcdDatabase()->Init.SystemSkuId = SkuId;\r
 \r
 \r
-  return SkuId;\r
+  return;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -114,10 +100,10 @@ PeiPcdSetSku (
 UINT8\r
 EFIAPI\r
 PeiPcdGet8 (\r
 UINT8\r
 EFIAPI\r
 PeiPcdGet8 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGet8Ex (NULL, TokenNumber);\r
+  return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -125,10 +111,10 @@ PeiPcdGet8 (
 UINT16\r
 EFIAPI\r
 PeiPcdGet16 (\r
 UINT16\r
 EFIAPI\r
 PeiPcdGet16 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGet16Ex (NULL, TokenNumber);\r
+  return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -136,10 +122,10 @@ PeiPcdGet16 (
 UINT32\r
 EFIAPI\r
 PeiPcdGet32 (\r
 UINT32\r
 EFIAPI\r
 PeiPcdGet32 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGet32Ex (NULL, TokenNumber);\r
+  return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -147,10 +133,10 @@ PeiPcdGet32 (
 UINT64\r
 EFIAPI\r
 PeiPcdGet64 (\r
 UINT64\r
 EFIAPI\r
 PeiPcdGet64 (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGet64Ex (NULL, TokenNumber);\r
+  return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -158,10 +144,10 @@ PeiPcdGet64 (
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtr (\r
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtr (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGetPtrEx (NULL, TokenNumber);\r
+  return GetWorker (TokenNumber, 0);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -169,10 +155,10 @@ PeiPcdGetPtr (
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBool (\r
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBool (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGetBoolEx (NULL, TokenNumber);\r
+  return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -180,10 +166,12 @@ PeiPcdGetBool (
 UINTN\r
 EFIAPI\r
 PeiPcdGetSize (\r
 UINTN\r
 EFIAPI\r
 PeiPcdGetSize (\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdGetSizeEx (NULL, TokenNumber);\r
+  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+  return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -192,14 +180,10 @@ UINT8
 EFIAPI\r
 PeiPcdGet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  UINT8 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data);\r
-  \r
-  return Data;\r
+  return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -208,14 +192,10 @@ UINT16
 EFIAPI\r
 PeiPcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  UINT16 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data);\r
-  \r
-  return Data;\r
+  return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -224,14 +204,10 @@ UINT32
 EFIAPI\r
 PeiPcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  UINT32 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data);\r
-  \r
-  return Data;\r
+  return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -240,14 +216,10 @@ UINT64
 EFIAPI\r
 PeiPcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  UINT64 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data);\r
-  \r
-  return Data;\r
+  return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -256,14 +228,10 @@ VOID *
 EFIAPI\r
 PeiPcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN PCD_TOKEN_NUMBER  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  VOID *Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data);\r
-  \r
-  return Data;\r
+  return ExGetWorker (Guid, ExTokenNumber, 0);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -272,14 +240,10 @@ BOOLEAN
 EFIAPI\r
 PeiPcdGetBoolEx (\r
   IN CONST  EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGetBoolEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  TokenNumber\r
+  IN PCD_TOKEN_NUMBER                  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  BOOLEAN Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data);\r
-  \r
-  return Data;\r
+  return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -288,10 +252,10 @@ UINTN
 EFIAPI\r
 PeiPcdGetSizeEx (\r
   IN CONST  EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGetSizeEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  TokenNumber\r
+  IN PCD_TOKEN_NUMBER                  ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiGetPcdEntrySizeWorker (TokenNumber, Guid);\r
+  return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -299,11 +263,11 @@ PeiPcdGetSizeEx (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet8 (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet8 (\r
-  IN UINTN             TokenNumber,\r
+  IN PCD_TOKEN_NUMBER             TokenNumber,\r
   IN UINT8             Value\r
   )\r
 {\r
   IN UINT8             Value\r
   )\r
 {\r
-  return PeiPcdSet8Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -311,11 +275,11 @@ PeiPcdSet8 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16 (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16 (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN UINT16             Value\r
   )\r
 {\r
   IN UINT16             Value\r
   )\r
 {\r
-  return PeiPcdSet16Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -323,11 +287,11 @@ PeiPcdSet16 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32 (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32 (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN UINT32             Value\r
   )\r
 {\r
   IN UINT32             Value\r
   )\r
 {\r
-  return PeiPcdSet32Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -335,22 +299,23 @@ PeiPcdSet32 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64 (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64 (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN UINT64             Value\r
   )\r
 {\r
   IN UINT64             Value\r
   )\r
 {\r
-  return PeiPcdSet64Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtr (\r
 }\r
 \r
 \r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtr (\r
-  IN UINTN              TokenNumber,\r
-  IN CONST VOID         *Value\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
+  IN UINTN                         SizeOfBuffer,\r
+  IN VOID                          *Buffer\r
   )\r
 {\r
   )\r
 {\r
-  return PeiPcdSetPtrEx (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -358,11 +323,11 @@ PeiPcdSetPtr (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBool (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBool (\r
-  IN UINTN              TokenNumber,\r
+  IN PCD_TOKEN_NUMBER              TokenNumber,\r
   IN BOOLEAN            Value\r
   )\r
 {\r
   IN BOOLEAN            Value\r
   )\r
 {\r
-  return PeiPcdSetBoolEx (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -371,11 +336,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet8Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet8Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT8                  Value\r
   )\r
 {\r
   IN UINT8                  Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -384,11 +355,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet16Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet16Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT16                 Value\r
   )\r
 {\r
   IN UINT16                 Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -397,11 +374,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet32Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet32Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT32                 Value\r
   )\r
 {\r
   IN UINT32                 Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -410,11 +393,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet64Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet64Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
   IN UINT64                 Value\r
   )\r
 {\r
   IN UINT64                 Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -423,11 +412,18 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetPtrEx (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSetPtrEx (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
-  IN CONST VOID             *Value\r
+  IN PCD_TOKEN_NUMBER       ExTokenNumber,\r
+  IN UINTN                  SizeOfBuffer,\r
+  IN VOID                   *Value\r
   )\r
 {\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, (VOID *)Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              Value, \r
+                              SizeOfBuffer, \r
+                              TRUE\r
+                              );\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -436,12 +432,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetBoolEx (\r
   IN CONST EFI_GUID       *Guid,\r
 EFIAPI\r
 PeiPcdSetBoolEx (\r
   IN CONST EFI_GUID       *Guid,\r
-  IN UINTN                TokenNumber,\r
+  IN PCD_TOKEN_NUMBER     ExTokenNumber,\r
   IN BOOLEAN              Value\r
   )\r
 {\r
   IN BOOLEAN              Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value);\r
-\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -449,13 +450,15 @@ PeiPcdSetBoolEx (
 \r
 EFI_STATUS\r
 EFIAPI\r
 \r
 EFI_STATUS\r
 EFIAPI\r
-PcdRegisterCallBackOnSet (\r
-  IN  UINTN                       TokenNumber,\r
+PeiRegisterCallBackOnSet (\r
+  IN  PCD_TOKEN_NUMBER            ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
-  return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE);\r
+  ASSERT (CallBackFunction != NULL);\r
+  \r
+  return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -463,12 +466,14 @@ PcdRegisterCallBackOnSet (
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
-  IN  UINTN                       TokenNumber,\r
+  IN  PCD_TOKEN_NUMBER            ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
-  return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE);\r
+  ASSERT (CallBackFunction != NULL);\r
+  \r
+  return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -477,10 +482,138 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdGetNextToken (\r
   IN CONST EFI_GUID               *Guid, OPTIONAL\r
 EFIAPI\r
 PeiPcdGetNextToken (\r
   IN CONST EFI_GUID               *Guid, OPTIONAL\r
-  IN OUT  UINTN                   *TokenNumber\r
+  IN OUT  PCD_TOKEN_NUMBER        *TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return PeiGetNextTokenWorker (TokenNumber, Guid);\r
+  UINTN               GuidTableIdx;\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
+  EFI_GUID            *MatchGuid;\r
+  DYNAMICEX_MAPPING   *ExMapTable;\r
+  UINTN               i;\r
+  BOOLEAN             Found;\r
+    \r
+  if (Guid == NULL) {\r
+    (*TokenNumber)++;\r
+\r
+    if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
+      *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+    }\r
+    \r
+  } else {\r
+\r
+    if (PEI_EXMAP_TABLE_EMPTY) {\r
+      *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    \r
+    //\r
+    // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
+    // 1) ExGuid\r
+    // 2) ExTokenNumber\r
+    //\r
+    PeiPcdDb = GetPcdDatabase ();\r
+    \r
+    MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
+\r
+    if (MatchGuid == NULL) {\r
+      *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+      return EFI_NOT_FOUND;\r
+    }\r
+\r
+    GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
+\r
+    ExMapTable = PeiPcdDb->Init.ExMapTable;\r
+\r
+    Found = FALSE;\r
+    for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+      if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
+        Found = TRUE;\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (Found) {\r
+      if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
+        *TokenNumber = ExMapTable[i].ExTokenNumber;\r
+         return EFI_SUCCESS;\r
+      }\r
+      \r
+      for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
+        if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
+          i++;\r
+          if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
+            *TokenNumber = ExMapTable[i].ExTokenNumber;\r
+            return EFI_SUCCESS;\r
+          } else {\r
+            *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+            return EFI_SUCCESS;\r
+          }\r
+        }\r
+      }\r
+\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    \r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 }\r
 \r
+EFI_GUID *\r
+EFIAPI\r
+PeiPcdGetNextTokenSpaceGuid (\r
+  IN CONST EFI_GUID               *Guid\r
+  )\r
+{\r
+  UINTN               GuidTableIdx;\r
+  EFI_GUID            *MatchGuid;\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
+  DYNAMICEX_MAPPING   *ExMapTable;\r
+  UINTN               i;\r
+  BOOLEAN             Found;\r
+\r
+  if (PEI_EXMAP_TABLE_EMPTY) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
+  // 1) ExGuid\r
+  // 2) ExTokenNumber\r
+  //\r
+  PeiPcdDb = GetPcdDatabase ();\r
+\r
+  MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
+\r
+  if (MatchGuid == NULL) {\r
+    return NULL;\r
+  }\r
+  \r
+  GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
+\r
+  ExMapTable = PeiPcdDb->Init.ExMapTable;\r
+\r
+  Found = FALSE;\r
+  for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+    if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
+      Found = TRUE;\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (Found) {\r
+    for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
+      if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
+        if (i < PEI_EXMAPPING_TABLE_SIZE) {\r
+          return &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
+        } else {\r
+          return NULL;\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+\r
+}\r
 \r
 \r