+\r
+EFI_GUID **\r
+GetDistinctTokenSpace (\r
+ IN OUT UINTN *ExMapTableSize,\r
+ IN DYNAMICEX_MAPPING *ExMapTable,\r
+ IN EFI_GUID *GuidTable\r
+ )\r
+{\r
+ EFI_GUID **DistinctTokenSpace;\r
+ UINTN OldGuidIndex;\r
+ UINTN TsIdx;\r
+ UINTN Idx;\r
+\r
+\r
+ DistinctTokenSpace = AllocateZeroPool (*ExMapTableSize * sizeof (EFI_GUID *));\r
+ ASSERT (DistinctTokenSpace != NULL);\r
+\r
+ TsIdx = 0;\r
+ OldGuidIndex = ExMapTable[0].ExGuidIndex;\r
+ DistinctTokenSpace[TsIdx] = &GuidTable[OldGuidIndex];\r
+ for (Idx = 1; Idx < PEI_EXMAPPING_TABLE_SIZE; Idx++) {\r
+ if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) {\r
+ OldGuidIndex = ExMapTable[Idx].ExGuidIndex;\r
+ DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex];\r
+ }\r
+ }\r
+\r
+ *ExMapTableSize = TsIdx;\r
+ return DistinctTokenSpace;\r
+ \r
+}\r
+ \r
+\r
+STATIC EFI_GUID *TmpTokenSpaceBuffer[PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE] = { 0 };\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DxePcdGetNextTokenSpace (\r
+ IN OUT CONST EFI_GUID **Guid\r
+ )\r
+{\r
+ UINTN Idx;\r
+ UINTN Idx2;\r
+ UINTN Idx3;\r
+ UINTN PeiTokenSpaceTableSize;\r
+ UINTN DxeTokenSpaceTableSize;\r
+ EFI_GUID **PeiTokenSpaceTable;\r
+ EFI_GUID **DxeTokenSpaceTable;\r
+ BOOLEAN Match;\r
+\r
+ ASSERT (Guid != NULL);\r
+ \r
+ if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {\r
+ if (*Guid != NULL) {\r
+ return EFI_NOT_FOUND;\r
+ } else {\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ \r
+ \r
+ if (TmpTokenSpaceBuffer[0] != NULL) {\r
+ PeiTokenSpaceTableSize = 0;\r
+\r
+ if (!PEI_EXMAP_TABLE_EMPTY) {\r
+ PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE;\r
+ PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize,\r
+ mPcdDatabase->PeiDb.Init.ExMapTable,\r
+ mPcdDatabase->PeiDb.Init.GuidTable\r
+ );\r
+ CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize);\r
+ }\r
+\r
+ if (!DXE_EXMAP_TABLE_EMPTY) {\r
+ DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE;\r
+ DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize,\r
+ mPcdDatabase->DxeDb.Init.ExMapTable,\r
+ mPcdDatabase->DxeDb.Init.GuidTable\r
+ );\r
+\r
+ //\r
+ // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable\r
+ //\r
+ for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) {\r
+ Match = FALSE;\r
+ for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) {\r
+ if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) {\r
+ Match = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ if (!Match) {\r
+ TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2];\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (*Guid == NULL) {\r
+ *Guid = TmpTokenSpaceBuffer[0];\r
+ return EFI_SUCCESS;\r
+ }\r
+ \r
+ for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) {\r
+ if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) {\r
+ Idx++;\r
+ *Guid = TmpTokenSpaceBuffer[Idx];\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+\r
+}\r
+\r
+\r