X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=717a4345ea11df329815b0a25ce96f28163e7a92;hp=36e859c779d15e114ca1303ae507971615230b47;hb=bb5545b663e1d8ac4fd37003d5ba26fafdad5831;hpb=c0e96fed1402f44ff4542346865db2a27b979c24 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c index 36e859c779..717a4345ea 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Service.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Service.c @@ -50,10 +50,16 @@ GetWorker ( UINT16 StringTableIdx; UINT32 LocalTokenNumber; - + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); - Size = DxePcdGetSize (TokenNumber); + Size = DxePcdGetSize (TokenNumber + 1); ASSERT (GetSize == Size || GetSize == 0); @@ -100,11 +106,10 @@ GetWorker ( return (UINT8 *) Data + VariableHead->Offset; } else { // - // BugBug: Need to support default value. The current implementation - // will return a memory buffer with ALL ZERO. - // - return AllocateZeroPool (Size); - } + // Return the default value specified by Platform Integrator + // + return (VOID *) ((UINT8 *) PcdDb + VariableHead->DefaultValueOffset); + } case PCD_TYPE_STRING: StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset); @@ -143,6 +148,13 @@ DxeRegisterCallBackWorker ( TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber); } + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ListHead = &mCallbackFnTable[TokenNumber]; ListNode = GetFirstNode (ListHead); @@ -186,6 +198,13 @@ DxeUnRegisterCallBackWorker ( TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber); } + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ListHead = &mCallbackFnTable[TokenNumber]; ListNode = GetFirstNode (ListHead); @@ -244,7 +263,7 @@ ExGetNextTokeNumber ( if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) { return ExMapTable[Idx].ExTokenNumber; } - + for ( ; Idx < SizeOfExMapTable; Idx++) { if (ExMapTable[Idx].ExTokenNumber == TokenNumber) { Idx++; @@ -342,13 +361,17 @@ GetHiiVariable ( EFI_STATUS Status; VOID *Buffer; + Size = 0; + Buffer = NULL; + Status = EfiGetVariable ( (UINT16 *)VariableName, VariableGuid, NULL, &Size, - NULL + Buffer ); + if (Status == EFI_BUFFER_TOO_SMALL) { Buffer = AllocatePool (Size); @@ -366,6 +389,9 @@ GetHiiVariable ( ASSERT (Status == EFI_SUCCESS); } + *VariableData = Buffer; + *VariableSize = Size; + return Status; } @@ -444,6 +470,13 @@ InvokeCallbackOnSet ( LIST_ENTRY *ListHead; LIST_ENTRY *ListNode; + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ListHead = &mCallbackFnTable[TokenNumber]; ListNode = GetFirstNode (ListHead); @@ -485,13 +518,19 @@ SetWorker ( UINTN Offset; UINT8 *PcdDb; - + // + // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. + // We have to decrement TokenNumber by 1 to make it usable + // as the array index. + // + TokenNumber--; + ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER); if (PtrType) { - ASSERT (Size <= DxePcdGetSize (TokenNumber)); + ASSERT (Size <= DxePcdGetSize (TokenNumber + 1)); } else { - ASSERT (Size == DxePcdGetSize (TokenNumber)); + ASSERT (Size == DxePcdGetSize (TokenNumber + 1)); } IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; @@ -501,7 +540,7 @@ SetWorker ( if ((TokenNumber < PEI_NEX_TOKEN_NUMBER) || (TokenNumber >= PEI_LOCAL_TOKEN_NUMBER || TokenNumber < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER))) { - InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size); + InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size); } TokenNumber = IsPeiDb ? TokenNumber @@ -703,19 +742,23 @@ GetExPcdTokenNumber ( EFI_GUID *MatchGuid; UINTN MatchGuidIdx; - ExMap = mPcdDatabase->PeiDb.Init.ExMapTable; - GuidTable = mPcdDatabase->PeiDb.Init.GuidTable; - - MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), Guid); - ASSERT (MatchGuid != NULL); + if (!PEI_DATABASE_EMPTY) { + ExMap = mPcdDatabase->PeiDb.Init.ExMapTable; + GuidTable = mPcdDatabase->PeiDb.Init.GuidTable; + + MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->PeiDb.Init.GuidTable), Guid); + + if (MatchGuid != NULL) { - MatchGuidIdx = MatchGuid - GuidTable; - - for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { - if ((ExTokenNumber == ExMap[i].ExTokenNumber) && - (MatchGuidIdx == ExMap[i].ExGuidIndex)) { - return ExMap[i].LocalTokenNumber; + MatchGuidIdx = MatchGuid - GuidTable; + + for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) { + if ((ExTokenNumber == ExMap[i].ExTokenNumber) && + (MatchGuidIdx == ExMap[i].ExGuidIndex)) { + return ExMap[i].LocalTokenNumber; + } + } } } @@ -723,6 +766,10 @@ GetExPcdTokenNumber ( GuidTable = mPcdDatabase->DxeDb.Init.GuidTable; MatchGuid = ScanGuid (GuidTable, sizeof(mPcdDatabase->DxeDb.Init.GuidTable), Guid); + // + // We need to ASSERT here. If GUID can't be found in GuidTable, this is a + // error in the BUILD system. + // ASSERT (MatchGuid != NULL); MatchGuidIdx = MatchGuid - GuidTable; @@ -730,7 +777,7 @@ GetExPcdTokenNumber ( for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) { if ((ExTokenNumber == ExMap[i].ExTokenNumber) && (MatchGuidIdx == ExMap[i].ExGuidIndex)) { - return ExMap[i].LocalTokenNumber + PEI_LOCAL_TOKEN_NUMBER; + return ExMap[i].LocalTokenNumber; } }