UINT8\r
EFIAPI\r
PeiPcdGet8 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
UINT16\r
EFIAPI\r
PeiPcdGet16 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
UINT32\r
EFIAPI\r
PeiPcdGet32 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
UINT64\r
EFIAPI\r
PeiPcdGet64 (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
VOID *\r
EFIAPI\r
PeiPcdGetPtr (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
return GetWorker (TokenNumber, 0);\r
BOOLEAN\r
EFIAPI\r
PeiPcdGetBool (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
UINTN\r
EFIAPI\r
PeiPcdGetSize (\r
- IN UINTN TokenNumber\r
+ IN UINTN TokenNumber\r
)\r
{\r
+ PEI_PCD_DATABASE *PeiPcdDb;\r
+ UINTN Size;\r
+ UINTN MaxSize;\r
+\r
+ //\r
+ // If DebugAssertEnabled is TRUE, we still need to provide the GET size\r
+ // function as GetWorker and SetWoker need this function to do ASSERT.\r
+ //\r
+ if ((!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled)) &&\r
+ (!DebugAssertEnabled ())) {\r
+ return 0;\r
+ }\r
+\r
+ PeiPcdDb = GetPcdDatabase ();\r
//\r
// TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
// We have to decrement TokenNumber by 1 to make it usable\r
//\r
TokenNumber--;\r
\r
- ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\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 < PEI_LOCAL_TOKEN_NUMBER + 1);\r
+\r
+ Size = (PeiPcdDb->Init.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 (TokenNumber, &MaxSize, PeiPcdDb);\r
+ } else {\r
+ return Size;\r
+ }\r
\r
- return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
}\r
\r
\r
UINT8\r
EFIAPI\r
PeiPcdGet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
UINT16\r
EFIAPI\r
PeiPcdGet16Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
UINT32\r
EFIAPI\r
PeiPcdGet32Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
UINT64\r
EFIAPI\r
PeiPcdGet64Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
VOID *\r
EFIAPI\r
PeiPcdGetPtrEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return ExGetWorker (Guid, ExTokenNumber, 0);\r
BOOLEAN\r
EFIAPI\r
PeiPcdGetBoolEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
UINTN\r
EFIAPI\r
PeiPcdGetSizeEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber\r
)\r
{\r
+ if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled)) {\r
+ return 0;\r
+ }\r
+\r
return PeiPcdGetSize (GetExPcdTokenNumber (Guid, ExTokenNumber));\r
}\r
\r
EFIAPI\r
PeiPcdSet8 (\r
IN UINTN TokenNumber,\r
- IN UINT8 Value\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
EFIAPI\r
PeiPcdSet16 (\r
IN UINTN TokenNumber,\r
- IN UINT16 Value\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
EFIAPI\r
PeiPcdSet32 (\r
IN UINTN TokenNumber,\r
- IN UINT32 Value\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
EFIAPI\r
PeiPcdSet64 (\r
IN UINTN TokenNumber,\r
- IN UINT64 Value\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
PeiPcdSetPtr (\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
EFIAPI\r
PeiPcdSetBool (\r
IN UINTN TokenNumber,\r
- IN BOOLEAN Value\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
PeiPcdSet8Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT8 Value\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
PeiPcdSet16Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT16 Value\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
PeiPcdSet32Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT32 Value\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
PeiPcdSet64Ex (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINT64 Value\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
PeiPcdSetPtrEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN UINTN SizeOfBuffer,\r
- IN VOID *Value\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN ExTokenNumber,\r
+ IN UINTN *SizeOfBuffer,\r
+ IN VOID *Value\r
)\r
{\r
- return ExSetWorker(\r
- ExTokenNumber, \r
- Guid,\r
- Value, \r
- SizeOfBuffer, \r
- TRUE\r
- );\r
+ return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
PeiPcdSetBoolEx (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN ExTokenNumber,\r
- IN BOOLEAN Value\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
- FALSE\r
- );\r
+ return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
}\r
\r
\r
EFI_STATUS\r
EFIAPI\r
PeiRegisterCallBackOnSet (\r
- IN UINTN ExTokenNumber,\r
IN CONST EFI_GUID *Guid, OPTIONAL\r
+ IN UINTN ExTokenNumber,\r
IN PCD_PPI_CALLBACK CallBackFunction\r
)\r
{\r
+ if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
ASSERT (CallBackFunction != NULL);\r
\r
return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
EFI_STATUS\r
EFIAPI\r
PcdUnRegisterCallBackOnSet (\r
- IN UINTN ExTokenNumber,\r
IN CONST EFI_GUID *Guid, OPTIONAL\r
+ IN UINTN ExTokenNumber,\r
IN PCD_PPI_CALLBACK CallBackFunction\r
)\r
{\r
+ if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
ASSERT (CallBackFunction != NULL);\r
\r
return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
DYNAMICEX_MAPPING *ExMapTable;\r
UINTN i;\r
BOOLEAN Found;\r
- \r
+ BOOLEAN PeiExMapTableEmpty;\r
+\r
+ if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
+\r
if (Guid == NULL) {\r
+ if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
(*TokenNumber)++;\r
-\r
- if (*TokenNumber >= PEI_NEX_TOKEN_NUMBER) {\r
+ if (*TokenNumber > PEI_NEX_TOKEN_NUMBER) {\r
*TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
}\r
- \r
+ return EFI_SUCCESS;\r
} else {\r
-\r
- if (PEI_EXMAP_TABLE_EMPTY) {\r
+ if (PeiExMapTableEmpty) {\r
*TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
- return EFI_NOT_FOUND;\r
+ return EFI_SUCCESS;\r
}\r
\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
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
return EFI_NOT_FOUND;\r
}\r
\r
ExMapTable = PeiPcdDb->Init.ExMapTable;\r
\r
Found = FALSE;\r
+ //\r
+ // Locate the GUID in ExMapTable first.\r
+ //\r
for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
if (ExMapTable[i].ExGuidIndex == GuidTableIdx) {\r
Found = TRUE;\r
*TokenNumber = ExMapTable[i].ExTokenNumber;\r
return EFI_SUCCESS;\r
}\r
- \r
- for ( ; ExMapTable[i].ExGuidIndex == GuidTableIdx; i++) {\r
+\r
+ for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
if (ExMapTable[i].ExTokenNumber == *TokenNumber) {\r
i++;\r
+ if (i == PEI_EXMAPPING_TABLE_SIZE) {\r
+ //\r
+ // Exceed the length of ExMap Table\r
+ //\r
+ *TokenNumber = PCD_INVALID_TOKEN_NUMBER;\r
+ return EFI_SUCCESS;\r
+ }\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
+ *TokenNumber = 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
+ return EFI_NOT_FOUND;\r
}\r
\r
+\r
+\r
EFI_STATUS\r
EFIAPI\r
PeiPcdGetNextTokenSpace (\r
- IN OUT CONST EFI_GUID **Guid\r
+ IN OUT CONST EFI_GUID **Guid\r
)\r
{\r
UINTN GuidTableIdx;\r
DYNAMICEX_MAPPING *ExMapTable;\r
UINTN i;\r
BOOLEAN Found;\r
+ BOOLEAN PeiExMapTableEmpty;\r
+\r
+ if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
\r
ASSERT (Guid != NULL);\r
\r
- if (PEI_EXMAP_TABLE_EMPTY) {\r
+ PeiExMapTableEmpty = PEI_EXMAP_TABLE_EMPTY;\r
+\r
+ if (PeiExMapTableEmpty) {\r
if (*Guid != NULL) {\r
return EFI_NOT_FOUND;\r
} else {\r
\r
}\r
\r
+UINTN\r
+GetPtrTypeSize (\r
+ IN UINTN LocalTokenNumberTableIdx,\r
+ OUT UINTN *MaxSize,\r
+ IN PEI_PCD_DATABASE *Database\r
+ )\r
+{\r
+ INTN SizeTableIdx;\r
+ UINTN LocalTokenNumber;\r
+ SKU_ID *SkuIdTable;\r
+ SIZE_INFO *SizeTable;\r
+ UINTN i;\r
+\r
+ SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
+\r
+ LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+ ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+ \r
+ SizeTable = Database->Init.SizeTable;\r
+\r
+ *MaxSize = SizeTable[SizeTableIdx];\r
+ //\r
+ // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+ // PCD entry.\r
+ //\r
+ if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+ //\r
+ // We have only one entry for VPD enabled PCD entry:\r
+ // 1) MAX Size.\r
+ // We consider current size is equal to MAX size.\r
+ //\r
+ return *MaxSize;\r
+ } else {\r
+ if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+ //\r
+ // We have only two entry for Non-Sku enabled PCD entry:\r
+ // 1) MAX SIZE\r
+ // 2) Current Size\r
+ //\r
+ return SizeTable[SizeTableIdx + 1];\r
+ } else {\r
+ //\r
+ // We have these entry for SKU enabled PCD entry\r
+ // 1) MAX SIZE\r
+ // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+ //\r
+ SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
+ for (i = 0; i < SkuIdTable[0]; i++) {\r
+ if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
+ return SizeTable[SizeTableIdx + 1 + i];\r
+ }\r
+ }\r
+ return SizeTable[SizeTableIdx + 1];\r
+ }\r
+ }\r
+}\r
+\r
+\r
+\r
+BOOLEAN\r
+SetPtrTypeSize (\r
+ IN UINTN LocalTokenNumberTableIdx,\r
+ IN OUT UINTN *CurrentSize,\r
+ IN PEI_PCD_DATABASE *Database\r
+ )\r
+{\r
+ INTN SizeTableIdx;\r
+ UINTN LocalTokenNumber;\r
+ SKU_ID *SkuIdTable;\r
+ SIZE_INFO *SizeTable;\r
+ UINTN i;\r
+ UINTN MaxSize;\r
+ \r
+ SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
+\r
+ LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+ ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+ \r
+ SizeTable = Database->Init.SizeTable;\r
+\r
+ MaxSize = SizeTable[SizeTableIdx];\r
+ //\r
+ // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+ // PCD entry.\r
+ //\r
+ if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+ //\r
+ // We shouldn't come here as we don't support SET for VPD\r
+ //\r
+ ASSERT (FALSE);\r
+ return FALSE;\r
+ } else {\r
+ if ((*CurrentSize > MaxSize) ||\r
+ (*CurrentSize == MAX_ADDRESS)) {\r
+ *CurrentSize = MaxSize;\r
+ return FALSE;\r
+ } \r
+ \r
+ if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+ //\r
+ // We have only two entry for Non-Sku enabled PCD entry:\r
+ // 1) MAX SIZE\r
+ // 2) Current Size\r
+ //\r
+ SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+ return TRUE;\r
+ } else {\r
+ //\r
+ // We have these entry for SKU enabled PCD entry\r
+ // 1) MAX SIZE\r
+ // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+ //\r
+ SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
+ for (i = 0; i < SkuIdTable[0]; i++) {\r
+ if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
+ SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize;\r
+ return TRUE;\r
+ }\r
+ }\r
+ SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+}\r