\r
DxeRegisterCallBackOnSet,\r
DxeUnRegisterCallBackOnSet,\r
- DxePcdGetNextToken\r
+ DxePcdGetNextToken,\r
+ DxePcdGetNextTokenSpace\r
};\r
\r
\r
IN OUT UINTN *TokenNumber\r
)\r
{\r
- UINTN ExTokenNumber;\r
- \r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_NOT_FOUND;\r
//\r
// Scan the local token space\r
//\r
if (Guid == NULL) {\r
+ if (((*TokenNumber > PEI_NEX_TOKEN_NUMBER) && (*TokenNumber < PEI_LOCAL_TOKEN_NUMBER)) ||\r
+ ((*TokenNumber > (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER)))) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ \r
(*TokenNumber)++;\r
- if (*TokenNumber == PCD_INVALID_TOKEN_NUMBER) {\r
- return EFI_SUCCESS;\r
- } else {\r
- if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER &&\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
- return EFI_SUCCESS;\r
- } else if (*TokenNumber >= DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER) {\r
- *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_SUCCESS;\r
- }\r
+ if (*TokenNumber > PEI_NEX_TOKEN_NUMBER &&\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 > DXE_NEX_TOKEN_NUMBER + PEI_LOCAL_TOKEN_NUMBER) {\r
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
}\r
+ return EFI_SUCCESS;\r
}\r
\r
- if (PEI_EXMAP_TABLE_EMPTY && PEI_EXMAP_TABLE_EMPTY) {\r
- *TokenNumber = (UINTN) PCD_INVALID_TOKEN_NUMBER;\r
+ if (PEI_EXMAP_TABLE_EMPTY && DXE_EXMAP_TABLE_EMPTY) {\r
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
return EFI_NOT_FOUND;\r
}\r
\r
- ExTokenNumber = *TokenNumber;\r
if (!PEI_EXMAP_TABLE_EMPTY) {\r
- ExTokenNumber = ExGetNextTokeNumber (\r
+ Status = ExGetNextTokeNumber (\r
Guid,\r
- ExTokenNumber,\r
+ TokenNumber,\r
mPcdDatabase->PeiDb.Init.GuidTable,\r
sizeof(mPcdDatabase->PeiDb.Init.GuidTable),\r
mPcdDatabase->PeiDb.Init.ExMapTable,\r
);\r
}\r
\r
- if ((ExTokenNumber == PCD_INVALID_TOKEN_NUMBER) &&\r
- !DXE_EXMAP_TABLE_EMPTY\r
- ) {\r
- ExTokenNumber = ExGetNextTokeNumber (\r
+ if (Status == EFI_SUCCESS) {\r
+ return Status;\r
+ }\r
+\r
+ if (!DXE_EXMAP_TABLE_EMPTY) {\r
+ Status = ExGetNextTokeNumber (\r
Guid,\r
- ExTokenNumber,\r
- mPcdDatabase->PeiDb.Init.GuidTable,\r
- sizeof(mPcdDatabase->PeiDb.Init.GuidTable),\r
- mPcdDatabase->PeiDb.Init.ExMapTable,\r
- sizeof(mPcdDatabase->PeiDb.Init.ExMapTable)\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
- *TokenNumber = ExTokenNumber;\r
-\r
- return EFI_SUCCESS;\r
+ return Status;\r
}\r
\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
+ 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
- *ExMapTableSize = TsIdx;\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
+//\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
}\r
\r
\r
- if (TmpTokenSpaceBuffer[0] != NULL) {\r
+ if (TmpTokenSpaceBuffer[0] == NULL) {\r
PeiTokenSpaceTableSize = 0;\r
\r
if (!PEI_EXMAP_TABLE_EMPTY) {\r