/** Retrieves the next valid PCD token namespace for a given namespace. Gets the next valid token namespace for a given namespace. This is useful to traverse the valid token namespaces on a platform. @param[in, out] Guid An indirect pointer to EFI_GUID. On input it designates a known token namespace from which the search will start. On output, it designates the next valid token namespace on the platform. If *Guid is NULL, then the GUID of the first token space of the current platform is returned. If the search cannot locate the next valid token namespace, an error is returned and the value of *Guid is undefined. @retval EFI_SUCCESS The PCD service retrieved the value requested. @retval EFI_NOT_FOUND The PCD service could not find the next valid token namespace. **/ EFI_STATUS EFIAPI DxePcdGetNextTokenSpace ( IN OUT CONST EFI_GUID **Guid ) { UINTN Idx; UINTN Idx2; UINTN Idx3; UINTN PeiTokenSpaceTableSize; UINTN DxeTokenSpaceTableSize; EFI_GUID **PeiTokenSpaceTable; EFI_GUID **DxeTokenSpaceTable; BOOLEAN Match; BOOLEAN PeiExMapTableEmpty; BOOLEAN DxeExMapTableEmpty; ASSERT (Guid != NULL); PeiExMapTableEmpty = mPeiExMapTableEmpty; DxeExMapTableEmpty = mDxeExMapTableEmpty; if (PeiExMapTableEmpty && DxeExMapTableEmpty) { return EFI_NOT_FOUND; } if (TmpTokenSpaceBuffer[0] == NULL) { PeiTokenSpaceTableSize = 0; if (!PeiExMapTableEmpty) { PeiTokenSpaceTableSize = mPeiExMapppingTableSize / sizeof(DYNAMICEX_MAPPING); PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize, (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->ExMapTableOffset), (EFI_GUID *)((UINT8 *)mPcdDatabase.PeiDb + mPcdDatabase.PeiDb->GuidTableOffset) ); CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize); TmpTokenSpaceBufferCount = PeiTokenSpaceTableSize; FreePool (PeiTokenSpaceTable); } if (!DxeExMapTableEmpty) { DxeTokenSpaceTableSize = mDxeExMapppingTableSize / sizeof(DYNAMICEX_MAPPING); DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize, (DYNAMICEX_MAPPING *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->ExMapTableOffset), (EFI_GUID *)((UINT8 *)mPcdDatabase.DxeDb + mPcdDatabase.DxeDb->GuidTableOffset) ); // // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable // for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) { Match = FALSE; for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) { if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) { Match = TRUE; break; } } if (!Match) { TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2]; } } TmpTokenSpaceBufferCount = Idx3; FreePool (DxeTokenSpaceTable); } } if (*Guid == NULL) { *Guid = TmpTokenSpaceBuffer[0]; return EFI_SUCCESS; } for (Idx = 0; Idx < TmpTokenSpaceBufferCount; Idx++) { if (CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) { if (Idx == TmpTokenSpaceBufferCount - 1) { // // It has been the last token namespace. // *Guid = NULL; return EFI_NOT_FOUND; } else { Idx++; *Guid = TmpTokenSpaceBuffer[Idx]; return EFI_SUCCESS; } } } return EFI_NOT_FOUND; }
/** Get next token space in PCD database according to given token space guid. @param Guid Given token space guid. If NULL, then Guid will be set to the first PCD token space in PCD database, If not NULL, then Guid will be set to next PCD token space. @retval EFI_UNSUPPORTED @retval EFI_NOT_FOUND If PCD database has no token space table or can not find given token space in PCD database. @retval EFI_SUCCESS Success to get next token space guid. **/ EFI_STATUS EFIAPI DxePcdGetNextTokenSpace ( IN OUT CONST EFI_GUID **Guid ) { UINTN Idx; UINTN Idx2; UINTN Idx3; UINTN PeiTokenSpaceTableSize; UINTN DxeTokenSpaceTableSize; EFI_GUID **PeiTokenSpaceTable; EFI_GUID **DxeTokenSpaceTable; BOOLEAN Match; BOOLEAN PeiExMapTableEmpty; BOOLEAN DxeExMapTableEmpty; ASSERT (Guid != NULL); PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY; DxeExMapTableEmpty = DXE_EXMAP_TABLE_EMPTY; if (PeiExMapTableEmpty && DxeExMapTableEmpty) { if (*Guid != NULL) { return EFI_NOT_FOUND; } else { return EFI_SUCCESS; } } if (TmpTokenSpaceBuffer[0] == NULL) { PeiTokenSpaceTableSize = 0; if (!PeiExMapTableEmpty) { PeiTokenSpaceTableSize = PEI_EXMAPPING_TABLE_SIZE; PeiTokenSpaceTable = GetDistinctTokenSpace (&PeiTokenSpaceTableSize, mPcdDatabase->PeiDb.Init.ExMapTable, mPcdDatabase->PeiDb.Init.GuidTable ); CopyMem (TmpTokenSpaceBuffer, PeiTokenSpaceTable, sizeof (EFI_GUID*) * PeiTokenSpaceTableSize); } if (!DxeExMapTableEmpty) { DxeTokenSpaceTableSize = DXE_EXMAPPING_TABLE_SIZE; DxeTokenSpaceTable = GetDistinctTokenSpace (&DxeTokenSpaceTableSize, mPcdDatabase->DxeDb.Init.ExMapTable, mPcdDatabase->DxeDb.Init.GuidTable ); // // Make sure EFI_GUID in DxeTokenSpaceTable does not exist in PeiTokenSpaceTable // for (Idx2 = 0, Idx3 = PeiTokenSpaceTableSize; Idx2 < DxeTokenSpaceTableSize; Idx2++) { Match = FALSE; for (Idx = 0; Idx < PeiTokenSpaceTableSize; Idx++) { if (CompareGuid (TmpTokenSpaceBuffer[Idx], DxeTokenSpaceTable[Idx2])) { Match = TRUE; break; } } if (!Match) { TmpTokenSpaceBuffer[Idx3++] = DxeTokenSpaceTable[Idx2]; } } } } if (*Guid == NULL) { *Guid = TmpTokenSpaceBuffer[0]; return EFI_SUCCESS; } for (Idx = 0; Idx < (PEI_EXMAPPING_TABLE_SIZE + DXE_EXMAPPING_TABLE_SIZE); Idx++) { if(CompareGuid (*Guid, TmpTokenSpaceBuffer[Idx])) { Idx++; *Guid = TmpTokenSpaceBuffer[Idx]; return EFI_SUCCESS; } } return EFI_NOT_FOUND; }