]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/PCD/Pei/Pcd.c
1) If DebugAssertEnabled is TRUE, we still need to provide the GET size
[mirror_edk2.git] / EdkModulePkg / Universal / PCD / Pei / Pcd.c
index 34af220f6686ded58515fd20fb4aa9c2b33ea5af..33bc4e1069edb063fc5745010d4c0fb5078c3654 100644 (file)
@@ -52,7 +52,8 @@ PCD_PPI mPcdPpiInstance = {
 \r
   PeiRegisterCallBackOnSet,\r
   PcdUnRegisterCallBackOnSet,\r
 \r
   PeiRegisterCallBackOnSet,\r
   PcdUnRegisterCallBackOnSet,\r
-  PeiPcdGetNextToken\r
+  PeiPcdGetNextToken,\r
+  PeiPcdGetNextTokenSpace\r
 };\r
 \r
 \r
 };\r
 \r
 \r
@@ -100,7 +101,7 @@ PeiPcdSetSku (
 UINT8\r
 EFIAPI\r
 PeiPcdGet8 (\r
 UINT8\r
 EFIAPI\r
 PeiPcdGet8 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
   )\r
 {\r
   return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
@@ -111,7 +112,7 @@ PeiPcdGet8 (
 UINT16\r
 EFIAPI\r
 PeiPcdGet16 (\r
 UINT16\r
 EFIAPI\r
 PeiPcdGet16 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
   )\r
 {\r
   return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
@@ -122,7 +123,7 @@ PeiPcdGet16 (
 UINT32\r
 EFIAPI\r
 PeiPcdGet32 (\r
 UINT32\r
 EFIAPI\r
 PeiPcdGet32 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
   )\r
 {\r
   return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
@@ -133,7 +134,7 @@ PeiPcdGet32 (
 UINT64\r
 EFIAPI\r
 PeiPcdGet64 (\r
 UINT64\r
 EFIAPI\r
 PeiPcdGet64 (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
   )\r
 {\r
   return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
@@ -144,7 +145,7 @@ PeiPcdGet64 (
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtr (\r
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtr (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return GetWorker (TokenNumber, 0);\r
   )\r
 {\r
   return GetWorker (TokenNumber, 0);\r
@@ -155,7 +156,7 @@ PeiPcdGetPtr (
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBool (\r
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBool (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
   )\r
 {\r
   return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
@@ -166,9 +167,23 @@ PeiPcdGetBool (
 UINTN\r
 EFIAPI\r
 PeiPcdGetSize (\r
 UINTN\r
 EFIAPI\r
 PeiPcdGetSize (\r
-  IN UINTN             TokenNumber\r
+  IN UINTN                    TokenNumber\r
   )\r
 {\r
   )\r
 {\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
+  UINTN               Size;\r
+  UINTN               MaxSize;\r
+\r
+  //\r
+  // If DebugAssertEnabled is TRUE, we still need to provide the GET size\r
+  // function as GetWorker and SetWoker need this function to do ASSERT.\r
+  //\r
+  if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) &&\r
+      (!DebugAssertEnabled ())) {\r
+    return 0;\r
+  }\r
+\r
+  PeiPcdDb = GetPcdDatabase ();\r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
@@ -176,9 +191,22 @@ PeiPcdGetSize (
   //\r
   TokenNumber--;\r
 \r
   //\r
   TokenNumber--;\r
 \r
-  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\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
+  // comparison.\r
+  ASSERT (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
+\r
+  Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
+\r
+  if (Size == 0) {\r
+    //\r
+    // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
+    //\r
+    return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
+  } else {\r
+    return Size;\r
+  }\r
 \r
 \r
-  return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -186,8 +214,8 @@ PeiPcdGetSize (
 UINT8\r
 EFIAPI\r
 PeiPcdGet8Ex (\r
 UINT8\r
 EFIAPI\r
 PeiPcdGet8Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
   )\r
 {\r
   return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
@@ -198,8 +226,8 @@ PeiPcdGet8Ex (
 UINT16\r
 EFIAPI\r
 PeiPcdGet16Ex (\r
 UINT16\r
 EFIAPI\r
 PeiPcdGet16Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
   )\r
 {\r
   return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
@@ -210,8 +238,8 @@ PeiPcdGet16Ex (
 UINT32\r
 EFIAPI\r
 PeiPcdGet32Ex (\r
 UINT32\r
 EFIAPI\r
 PeiPcdGet32Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
   )\r
 {\r
   return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
@@ -222,8 +250,8 @@ PeiPcdGet32Ex (
 UINT64\r
 EFIAPI\r
 PeiPcdGet64Ex (\r
 UINT64\r
 EFIAPI\r
 PeiPcdGet64Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
   )\r
 {\r
   return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
@@ -234,8 +262,8 @@ PeiPcdGet64Ex (
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtrEx (\r
 VOID *\r
 EFIAPI\r
 PeiPcdGetPtrEx (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN             ExTokenNumber\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber\r
   )\r
 {\r
   return ExGetWorker (Guid, ExTokenNumber, 0);\r
   )\r
 {\r
   return ExGetWorker (Guid, ExTokenNumber, 0);\r
@@ -246,8 +274,8 @@ PeiPcdGetPtrEx (
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBoolEx (\r
 BOOLEAN\r
 EFIAPI\r
 PeiPcdGetBoolEx (\r
-  IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                             ExTokenNumber\r
+  IN CONST  EFI_GUID              *Guid,\r
+  IN UINTN                        ExTokenNumber\r
   )\r
 {\r
   return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
   )\r
 {\r
   return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
@@ -258,10 +286,14 @@ PeiPcdGetBoolEx (
 UINTN\r
 EFIAPI\r
 PeiPcdGetSizeEx (\r
 UINTN\r
 EFIAPI\r
 PeiPcdGetSizeEx (\r
-  IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                             ExTokenNumber\r
+  IN CONST  EFI_GUID              *Guid,\r
+  IN UINTN                        ExTokenNumber\r
   )\r
 {\r
   )\r
 {\r
+  if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) ||  !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
+    return 0;\r
+  }\r
+\r
   return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
 }\r
 \r
   return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
 }\r
 \r
@@ -271,10 +303,10 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet8 (\r
   IN UINTN                        TokenNumber,\r
 EFIAPI\r
 PeiPcdSet8 (\r
   IN UINTN                        TokenNumber,\r
-  IN UINT8             Value\r
+  IN UINT8                        Value\r
   )\r
 {\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -283,10 +315,10 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet16 (\r
   IN UINTN                         TokenNumber,\r
 EFIAPI\r
 PeiPcdSet16 (\r
   IN UINTN                         TokenNumber,\r
-  IN UINT16             Value\r
+  IN UINT16                        Value\r
   )\r
 {\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -295,10 +327,10 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet32 (\r
   IN UINTN                         TokenNumber,\r
 EFIAPI\r
 PeiPcdSet32 (\r
   IN UINTN                         TokenNumber,\r
-  IN UINT32             Value\r
+  IN UINT32                        Value\r
   )\r
 {\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -307,19 +339,19 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet64 (\r
   IN UINTN                         TokenNumber,\r
 EFIAPI\r
 PeiPcdSet64 (\r
   IN UINTN                         TokenNumber,\r
-  IN UINT64             Value\r
+  IN UINT64                        Value\r
   )\r
 {\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\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 UINTN                         SizeOfBuffer,\r
-  IN VOID                          *Buffer\r
+  IN      UINTN                    TokenNumber,\r
+  IN OUT  UINTN                    *SizeOfBuffer,\r
+  IN      VOID                     *Buffer\r
   )\r
 {\r
   return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
   )\r
 {\r
   return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
@@ -331,10 +363,10 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetBool (\r
   IN UINTN                         TokenNumber,\r
 EFIAPI\r
 PeiPcdSetBool (\r
   IN UINTN                         TokenNumber,\r
-  IN BOOLEAN            Value\r
+  IN BOOLEAN                       Value\r
   )\r
 {\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -342,18 +374,12 @@ PeiPcdSetBool (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet8Ex (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet8Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT8                  Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT8                        Value\r
   )\r
 {\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -361,18 +387,12 @@ PeiPcdSet8Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16Ex (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT16                 Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT16                       Value\r
   )\r
 {\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -380,18 +400,12 @@ PeiPcdSet16Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32Ex (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT32                 Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT32                       Value\r
   )\r
 {\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -399,18 +413,12 @@ PeiPcdSet32Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64Ex (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64Ex (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINT64                 Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINT64                       Value\r
   )\r
 {\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -418,19 +426,13 @@ PeiPcdSet64Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtrEx (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtrEx (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINTN                  SizeOfBuffer,\r
-  IN VOID                   *Value\r
+  IN CONST EFI_GUID               *Guid,\r
+  IN UINTN                        ExTokenNumber,\r
+  IN UINTN                        *SizeOfBuffer,\r
+  IN VOID                         *Value\r
   )\r
 {\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              Value, \r
-                              SizeOfBuffer, \r
-                              TRUE\r
-                              );\r
+  return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -438,18 +440,12 @@ PeiPcdSetPtrEx (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBoolEx (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBoolEx (\r
-  IN CONST EFI_GUID       *Guid,\r
-  IN UINTN                ExTokenNumber,\r
-  IN BOOLEAN              Value\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINTN                      ExTokenNumber,\r
+  IN BOOLEAN                    Value\r
   )\r
 {\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -458,11 +454,15 @@ PeiPcdSetBoolEx (
 EFI_STATUS\r
 EFIAPI\r
 PeiRegisterCallBackOnSet (\r
 EFI_STATUS\r
 EFIAPI\r
 PeiRegisterCallBackOnSet (\r
-  IN  UINTN                       ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
+  IN  UINTN                       ExTokenNumber,\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
+  if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (CallBackFunction != NULL);\r
   \r
   return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
   ASSERT (CallBackFunction != NULL);\r
   \r
   return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
@@ -473,11 +473,15 @@ PeiRegisterCallBackOnSet (
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
-  IN  UINTN                       ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
+  IN  UINTN                       ExTokenNumber,\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
+  if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (CallBackFunction != NULL);\r
   \r
   return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
   ASSERT (CallBackFunction != NULL);\r
   \r
   return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
@@ -499,18 +503,23 @@ PeiPcdGetNextToken (
   UINTN               i;\r
   BOOLEAN             Found;\r
     \r
   UINTN               i;\r
   BOOLEAN             Found;\r
     \r
+  if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+    \r
   if (Guid == NULL) {\r
   if (Guid == NULL) {\r
+    if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
     (*TokenNumber)++;\r
     (*TokenNumber)++;\r
-\r
-    if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
+    if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
       *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
     }\r
       *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
     }\r
-    \r
+    return EFI_SUCCESS;\r
   } else {\r
   } else {\r
-\r
     if (PEI_EXMAP_TABLE_EMPTY) {\r
       *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
     if (PEI_EXMAP_TABLE_EMPTY) {\r
       *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
-      return EFI_NOT_FOUND;\r
+      return EFI_SUCCESS;\r
     }\r
     \r
     //\r
     }\r
     \r
     //\r
@@ -523,7 +532,7 @@ PeiPcdGetNextToken (
     MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
 \r
     if (MatchGuid == NULL) {\r
     MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
 \r
     if (MatchGuid == NULL) {\r
-      *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+      *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
       return EFI_NOT_FOUND;\r
     }\r
 \r
       return EFI_NOT_FOUND;\r
     }\r
 \r
@@ -532,6 +541,9 @@ PeiPcdGetNextToken (
     ExMapTable = PeiPcdDb->Init.ExMapTable;\r
 \r
     Found = FALSE;\r
     ExMapTable = PeiPcdDb->Init.ExMapTable;\r
 \r
     Found = FALSE;\r
+    //\r
+    // Locate the GUID in ExMapTable first.\r
+    //\r
     for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
       if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
         Found = TRUE;\r
     for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
       if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
         Found = TRUE;\r
@@ -544,32 +556,39 @@ PeiPcdGetNextToken (
         *TokenNumber = ExMapTable[i].ExTokenNumber;\r
          return EFI_SUCCESS;\r
       }\r
         *TokenNumber = ExMapTable[i].ExTokenNumber;\r
          return EFI_SUCCESS;\r
       }\r
-      \r
-      for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
+\r
+      for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
         if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
           i++;\r
         if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
           i++;\r
+          if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
+            //\r
+            // Exceed the length of ExMap Table\r
+            //\r
+            *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+            return EFI_SUCCESS;\r
+          }\r
           if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
             *TokenNumber = ExMapTable[i].ExTokenNumber;\r
             return EFI_SUCCESS;\r
           } else {\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
+            *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
             return EFI_SUCCESS;\r
           }\r
         }\r
       }\r
             return EFI_SUCCESS;\r
           }\r
         }\r
       }\r
-\r
       return EFI_NOT_FOUND;\r
     }\r
       return EFI_NOT_FOUND;\r
     }\r
-    \r
   }\r
 \r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 }\r
 \r
+\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 EFI_STATUS\r
 EFIAPI\r
-PeiPcdGetNextTokenSpaceGuid (\r
-  IN OUT CONST EFI_GUID               **Guid\r
+PeiPcdGetNextTokenSpace (\r
+  IN OUT CONST EFI_GUID          **Guid\r
   )\r
 {\r
   UINTN               GuidTableIdx;\r
   )\r
 {\r
   UINTN               GuidTableIdx;\r
@@ -579,17 +598,19 @@ PeiPcdGetNextTokenSpaceGuid (
   UINTN               i;\r
   BOOLEAN             Found;\r
 \r
   UINTN               i;\r
   BOOLEAN             Found;\r
 \r
-   if (*Guid == NULL) {\r
-    if (PEI_EXMAP_TABLE_EMPTY) {\r
-      return EFI_SUCCESS;\r
+  if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  ASSERT (Guid != NULL);\r
+\r
+  if (PEI_EXMAP_TABLE_EMPTY) {\r
+    if (*Guid != NULL) {\r
+      return EFI_NOT_FOUND;\r
     } else {\r
     } else {\r
-      //\r
-      // return the first Token Space Guid.\r
-      //\r
-      *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
       return EFI_SUCCESS;\r
     }\r
       return EFI_SUCCESS;\r
     }\r
-   }\r
+  }\r
 \r
   //\r
   // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
 \r
   //\r
   // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
@@ -598,6 +619,16 @@ PeiPcdGetNextTokenSpaceGuid (
   //\r
   PeiPcdDb = GetPcdDatabase ();\r
 \r
   //\r
   PeiPcdDb = GetPcdDatabase ();\r
 \r
+  ExMapTable = PeiPcdDb->Init.ExMapTable;\r
+\r
+  if (*Guid == NULL) {\r
+    //\r
+    // return the first Token Space Guid.\r
+    //\r
+    *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
   MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
 \r
   if (MatchGuid == NULL) {\r
   MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
 \r
   if (MatchGuid == NULL) {\r
@@ -606,8 +637,6 @@ PeiPcdGetNextTokenSpaceGuid (
   \r
   GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\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 = FALSE;\r
   for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
     if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
@@ -617,12 +646,15 @@ PeiPcdGetNextTokenSpaceGuid (
   }\r
 \r
   if (Found) {\r
   }\r
 \r
   if (Found) {\r
+    i++;\r
     for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
       if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
         *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
         return EFI_SUCCESS;\r
       }\r
     }\r
     for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
       if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
         *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
         return EFI_SUCCESS;\r
       }\r
     }\r
+    *Guid = NULL;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   return EFI_NOT_FOUND;\r
   }\r
 \r
   return EFI_NOT_FOUND;\r