DxePcdSetPtrEx,\r
DxePcdSetBoolEx,\r
\r
- PcdRegisterCallBackOnSet,\r
- PcdUnRegisterCallBackOnSet,\r
- DxePcdGetNextToken\r
+ DxeRegisterCallBackOnSet,\r
+ DxeUnRegisterCallBackOnSet,\r
+ DxePcdGetNextToken,\r
+ DxePcdGetNextTokenSpace\r
};\r
\r
\r
//\r
// Static global to reduce the code size\r
//\r
-static EFI_HANDLE NewHandle = NULL;\r
+static EFI_HANDLE mNewHandle = NULL;\r
\r
EFI_STATUS\r
EFIAPI\r
//\r
// Make sure the Pcd Protocol is not already installed in the system\r
//\r
- \r
+\r
ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid);\r
- \r
+\r
BuildPcdDxeDataBase ();\r
\r
- //\r
- // BugBug Check if PcdDatabase is already installed.\r
- //\r
- \r
Status = gBS->InstallProtocolInterface (\r
- &NewHandle,\r
+ &mNewHandle,\r
&gPcdProtocolGuid,\r
EFI_NATIVE_INTERFACE,\r
&mPcdInstance\r
VOID\r
EFIAPI\r
DxePcdSetSku (\r
- IN SKU_ID SkuId\r
+ IN UINTN SkuId\r
)\r
{\r
- gPcdDatabase->PeiDb.Init.SystemSkuId = SkuId;\r
+ mPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId;\r
\r
return;\r
}\r
UINT8\r
EFIAPI\r
DxePcdGet8 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber));\r
- \r
- return *((UINT8 *) GetWorker (TokenNumber));\r
+ return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
}\r
\r
\r
UINT16\r
EFIAPI\r
DxePcdGet16 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber));\r
- \r
- return ReadUnaligned16 (GetWorker (TokenNumber));\r
+ return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
}\r
\r
\r
UINT32\r
EFIAPI\r
DxePcdGet32 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber));\r
- \r
- return ReadUnaligned32 (GetWorker (TokenNumber));\r
+ return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
}\r
\r
\r
UINT64\r
EFIAPI\r
DxePcdGet64 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber));\r
- \r
- return ReadUnaligned64(GetWorker (TokenNumber));\r
+ return ReadUnaligned64(GetWorker (TokenNumber, sizeof (UINT64)));\r
}\r
\r
\r
VOID *\r
EFIAPI\r
DxePcdGetPtr (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- return GetWorker (TokenNumber);\r
+ return GetWorker (TokenNumber, 0);\r
}\r
\r
\r
BOOLEAN\r
EFIAPI\r
DxePcdGetBool (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber));\r
- \r
- return *((BOOLEAN *) GetWorker (TokenNumber));\r
+ return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
}\r
\r
\r
UINTN\r
EFIAPI\r
DxePcdGetSize (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
- UINT16 * SizeTable;\r
+ UINTN Size;\r
+ UINT32 *LocalTokenNumberTable;\r
+ BOOLEAN IsPeiDb;\r
+ UINTN MaxSize;\r
+ UINTN TmpTokenNumber;\r
+ //\r
+ // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+ // We have to decrement TokenNumber by 1 to make it usable\r
+ // as the array index.\r
+ //\r
+ TokenNumber--;\r
\r
- SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? gPcdDatabase->PeiDb.Init.SizeTable :\r
- gPcdDatabase->DxeDb.Init.SizeTable;\r
+ //\r
+ // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber\r
+ // \r
+ TmpTokenNumber = TokenNumber;\r
+\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 < PCD_TOTAL_TOKEN_NUMBER + 1);\r
+\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
+ IsPeiDb = (BOOLEAN) (TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
+ \r
+ TokenNumber = IsPeiDb ? TokenNumber : \r
+ (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
\r
+ LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable \r
+ : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
\r
- TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
+ Size = (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 (TmpTokenNumber, &MaxSize);\r
+ } else {\r
+ return Size;\r
+ }\r
\r
- return SizeTable[TokenNumber];\r
}\r
\r
\r
EFIAPI\r
DxePcdGet8Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));\r
EFIAPI\r
DxePcdGet16Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));\r
+ return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGet32Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));\r
+ return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGet64Ex (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- //\r
- // BugBug: Must be changed to ReadUnaligned64\r
- //\r
- return *((UINT64 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64)));\r
+ return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64)));\r
}\r
\r
\r
EFIAPI\r
DxePcdGetPtrEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- return ExGetWorker (Guid, ExTokenNumber, 0);\r
+ return ExGetWorker (Guid, ExTokenNumber, 0);\r
}\r
\r
\r
EFIAPI\r
DxePcdGetBoolEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));\r
EFIAPI\r
DxePcdGetSizeEx (\r
IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
- EX_PCD_ENTRY_ATTRIBUTE Attr;\r
- \r
- GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
-\r
- return Attr.Size;\r
+ return DxePcdGetSize(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber));\r
}\r
\r
\r
IN UINT8 Value\r
)\r
{\r
- return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+ return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
}\r
\r
\r
IN UINT16 Value\r
)\r
{\r
- return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+ return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
}\r
\r
\r
IN UINT32 Value\r
)\r
{\r
- return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+ return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
}\r
\r
\r
IN UINT64 Value\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
DxePcdSetPtr (\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
IN BOOLEAN Value\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
DxePcdSet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
+ IN CONST EFI_GUID *Guid,\r
IN UINTN ExTokenNumber,\r
IN UINT8 Value\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
EFI_STATUS\r
EFIAPI\r
DxePcdSet16Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
IN UINT16 Value\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
EFI_STATUS\r
EFIAPI\r
DxePcdSet32Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
IN UINT32 Value\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
EFI_STATUS\r
EFIAPI\r
DxePcdSet64Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
IN UINT64 Value\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
EFI_STATUS\r
EFIAPI\r
DxePcdSetPtrEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINTN SizeOfBuffer,\r
- IN VOID *Buffer\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
+ IN OUT UINTN *SizeOfBuffer,\r
+ IN VOID *Buffer\r
)\r
{\r
- return ExSetWorker(\r
- ExTokenNumber, \r
- Guid,\r
- Buffer, \r
- SizeOfBuffer, \r
- TRUE\r
- );\r
+ return ExSetWorker(ExTokenNumber, Guid, Buffer, SizeOfBuffer, TRUE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdSetBoolEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
IN BOOLEAN Value\r
)\r
{\r
- return ExSetWorker(\r
- ExTokenNumber, \r
- Guid,\r
- &Value, \r
- sizeof (Value), \r
- TRUE\r
- );\r
+ return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
}\r
\r
\r
\r
EFI_STATUS\r
EFIAPI\r
-PcdRegisterCallBackOnSet (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
+DxeRegisterCallBackOnSet (\r
+ IN CONST EFI_GUID *Guid, OPTIONAL\r
+ IN UINTN TokenNumber,\r
IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
)\r
{\r
- return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE);\r
+ ASSERT (CallBackFunction != NULL);\r
+ \r
+ return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
}\r
\r
\r
\r
EFI_STATUS\r
EFIAPI\r
-PcdUnRegisterCallBackOnSet (\r
- IN UINTN TokenNumber,\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
+DxeUnRegisterCallBackOnSet (\r
+ IN CONST EFI_GUID *Guid, OPTIONAL\r
+ IN UINTN TokenNumber,\r
IN PCD_PROTOCOL_CALLBACK CallBackFunction\r
)\r
{\r
- return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE);\r
+ ASSERT (CallBackFunction != NULL);\r
+ \r
+ return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
DxePcdGetNextToken (\r
- IN CONST EFI_GUID *Guid, OPTIONAL\r
- IN OUT UINTN *TokenNumber\r
+ IN CONST EFI_GUID *Guid, OPTIONAL\r
+ IN OUT UINTN *TokenNumber\r
)\r
{\r
- return DxeGetNextTokenWorker (TokenNumber, Guid);\r
+ EFI_STATUS Status;\r
+\r
+ if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Status = EFI_NOT_FOUND;\r
+ //\r
+ // Scan the local token space\r
+ //\r
+ if (Guid == NULL) {\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
+ if (((*TokenNumber + 1 > PEI_NEX_TOKEN_NUMBER + 1) && (*TokenNumber + 1 < PEI_LOCAL_TOKEN_NUMBER + 1)) ||\r
+ ((*TokenNumber + 1 > (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER + 1)))) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ \r
+ (*TokenNumber)++;\r
+ if ((*TokenNumber + 1 > PEI_NEX_TOKEN_NUMBER + 1) &&\r
+ (*TokenNumber <= PEI_LOCAL_TOKEN_NUMBER)) {\r
+ //\r
+ // The first Non-Ex type Token Number for DXE PCD \r
+ // database is PEI_LOCAL_TOKEN_NUMBER\r
+ //\r
+ *TokenNumber = PEI_LOCAL_TOKEN_NUMBER;\r
+ } else if (*TokenNumber + 1 > DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER + 1) {\r
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+ }\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {\r
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ if (!PEI_EXMAP_TABLE_EMPTY) {\r
+ Status = ExGetNextTokeNumber (\r
+ Guid,\r
+ TokenNumber,\r
+ mPcdDatabase->PeiDb.Init.GuidTable,\r
+ sizeof(mPcdDatabase->PeiDb.Init.GuidTable),\r
+ mPcdDatabase->PeiDb.Init.ExMapTable,\r
+ sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)\r
+ );\r
+ }\r
+\r
+ if (Status == EFI_SUCCESS) {\r
+ return Status;\r
+ }\r
+\r
+ if (!DXE_EXMAP_TABLE_EMPTY) {\r
+ Status = ExGetNextTokeNumber (\r
+ Guid,\r
+ TokenNumber,\r
+ mPcdDatabase->DxeDb.Init.GuidTable,\r
+ sizeof(mPcdDatabase->DxeDb.Init.GuidTable),\r
+ mPcdDatabase->DxeDb.Init.ExMapTable,\r
+ sizeof(mPcdDatabase->DxeDb.Init.ExMapTable)\r
+ );\r
+ }\r
+\r
+ return Status;\r
}\r
\r
+\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 < *ExMapTableSize; Idx++) {\r
+ if (ExMapTable[Idx].ExGuidIndex != OldGuidIndex) {\r
+ OldGuidIndex = ExMapTable[Idx].ExGuidIndex;\r
+ DistinctTokenSpace[++TsIdx] = &GuidTable[OldGuidIndex];\r
+ }\r
+ }\r
+\r
+ //\r
+ // The total number of Distinct Token Space\r
+ // is TsIdx + 1 because we use TsIdx as a index\r
+ // to the DistinctTokenSpace[]\r
+ //\r
+ *ExMapTableSize = TsIdx + 1;\r
+ return DistinctTokenSpace;\r
+ \r
+}\r
+ \r
+//\r
+// Just pre-allocate a memory buffer that is big enough to\r
+// host all distinct TokenSpace guid in both\r
+// PEI ExMap and DXE ExMap.\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
+ if (!FeaturePcdGet (PcdDxePcdDatabaseTraverseEnabled)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\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