+ \r
+ } else {\r
+\r
+ if (PEI_EXMAP_TABLE_EMPTY) {\r
+ *TokenNumber = (UINTN) 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
+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