X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=717a4345ea11df329815b0a25ce96f28163e7a92;hp=bccd0a600add0835167fa97e99b252cde748d060;hb=bb5545b663e1d8ac4fd37003d5ba26fafdad5831;hpb=3496595d7bafc329cae169f79c450253b32fadd8 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c index bccd0a600a..717a4345ea 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Service.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Service.c @@ -24,11 +24,11 @@ Module Name: Service.c PCD_DATABASE * mPcdDatabase; -LIST_ENTRY mCallbackFnTable[PCD_TOTAL_TOKEN_NUMBER]; +LIST_ENTRY *mCallbackFnTable; VOID * GetWorker ( - PCD_TOKEN_NUMBER TokenNumber, + UINTN TokenNumber, UINTN GetSize ) { @@ -50,14 +50,20 @@ 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); - IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; + IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; @@ -83,7 +89,7 @@ GetWorker ( switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) { case PCD_TYPE_VPD: VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset); - return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); + return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset); case PCD_TYPE_HII: GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable : @@ -95,10 +101,15 @@ GetWorker ( Name = &(StringTable[VariableHead->StringIndex]); Status = GetHiiVariable (Guid, Name, &Data, &DataSize); - ASSERT_EFI_ERROR (Status); - ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size)); - - return (UINT8 *) Data + VariableHead->Offset; + if (Status == EFI_SUCCESS) { + ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size)); + return (UINT8 *) Data + VariableHead->Offset; + } else { + // + // Return the default value specified by Platform Integrator + // + return (VOID *) ((UINT8 *) PcdDb + VariableHead->DefaultValueOffset); + } case PCD_TYPE_STRING: StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset); @@ -124,7 +135,7 @@ GetWorker ( EFI_STATUS DxeRegisterCallBackWorker ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN CONST GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction ) @@ -134,9 +145,16 @@ DxeRegisterCallBackWorker ( LIST_ENTRY *ListNode; if (Guid != NULL) { - TokenNumber = GetExPcdTokenNumber (Guid, TokenNumber); + 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); @@ -167,7 +185,7 @@ DxeRegisterCallBackWorker ( EFI_STATUS DxeUnRegisterCallBackWorker ( - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN CONST GUID *Guid, OPTIONAL IN PCD_PROTOCOL_CALLBACK CallBackFunction ) @@ -177,9 +195,16 @@ DxeUnRegisterCallBackWorker ( LIST_ENTRY *ListNode; if (Guid != NULL) { - TokenNumber = GetExPcdTokenNumber (Guid, TokenNumber); + 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); @@ -205,10 +230,10 @@ DxeUnRegisterCallBackWorker ( -PCD_TOKEN_NUMBER +UINTN ExGetNextTokeNumber ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER TokenNumber, + IN UINTN TokenNumber, IN EFI_GUID *GuidTable, IN UINTN SizeOfGuidTable, IN DYNAMICEX_MAPPING *ExMapTable, @@ -238,7 +263,7 @@ ExGetNextTokeNumber ( if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) { return ExMapTable[Idx].ExTokenNumber; } - + for ( ; Idx < SizeOfExMapTable; Idx++) { if (ExMapTable[Idx].ExTokenNumber == TokenNumber) { Idx++; @@ -272,7 +297,7 @@ ExGetNextTokeNumber ( VOID BuildPcdDxeDataBase ( VOID -) + ) { PEI_PCD_DATABASE *PeiDatabase; EFI_HOB_GUID_TYPE *GuidHob; @@ -310,6 +335,11 @@ BuildPcdDxeDataBase ( // // Initialized the Callback Function Table // + + if (PCD_TOTAL_TOKEN_NUMBER != 0) { + mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY)); + } + for (Idx = 0; Idx < PCD_TOTAL_TOKEN_NUMBER; Idx++) { InitializeListHead (&mCallbackFnTable[Idx]); } @@ -331,26 +361,36 @@ GetHiiVariable ( EFI_STATUS Status; VOID *Buffer; + Size = 0; + Buffer = NULL; + Status = EfiGetVariable ( (UINT16 *)VariableName, VariableGuid, NULL, &Size, - NULL + Buffer ); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); + + if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocatePool (Size); + Buffer = AllocatePool (Size); - ASSERT (Buffer != NULL); + ASSERT (Buffer != NULL); - Status = EfiGetVariable ( - VariableName, - VariableGuid, - NULL, - &Size, - Buffer - ); + Status = EfiGetVariable ( + VariableName, + VariableGuid, + NULL, + &Size, + Buffer + ); + + ASSERT (Status == EFI_SUCCESS); + } + + *VariableData = Buffer; + *VariableSize = Size; return Status; @@ -393,15 +433,15 @@ GetSkuEnabledTokenNumber ( switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) { case PCD_TYPE_VPD: Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]); - return ((Value - PcdDb) | PCD_TYPE_VPD); + return (UINT32) ((Value - PcdDb) | PCD_TYPE_VPD); case PCD_TYPE_HII: Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]); - return ((Value - PcdDb) | PCD_TYPE_HII); + return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII); case PCD_TYPE_DATA: Value += Size * i; - return (Value - PcdDb); + return (UINT32) (Value - PcdDb); default: ASSERT (FALSE); @@ -430,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); @@ -452,7 +499,7 @@ InvokeCallbackOnSet ( EFI_STATUS SetWorker ( - PCD_TOKEN_NUMBER TokenNumber, + UINTN TokenNumber, VOID *Data, UINTN Size, BOOLEAN PtrType @@ -465,28 +512,35 @@ SetWorker ( UINT16 *StringTable; EFI_GUID *Guid; UINT16 *Name; + UINTN VariableOffset; VOID *InternalData; VARIABLE_HEAD *VariableHead; 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; + IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE; LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable; 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 @@ -514,7 +568,7 @@ SetWorker ( case PCD_TYPE_STRING: CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, Size); - break; + return EFI_SUCCESS; case PCD_TYPE_HII: // @@ -527,8 +581,9 @@ SetWorker ( Guid = &(GuidTable[VariableHead->GuidTableIndex]); Name = &(StringTable[VariableHead->StringIndex]); + VariableOffset = VariableHead->Offset; - return EFI_SUCCESS; + return SetHiiVariable (Guid, Name, Data, Size, VariableOffset); case PCD_TYPE_DATA: if (PtrType) { @@ -578,7 +633,7 @@ ExGetWorker ( IN UINTN GetSize ) { - return GetWorker(GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize); + return GetWorker(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber), GetSize); } @@ -587,18 +642,18 @@ ExGetWorker ( EFI_STATUS ExSetWorker ( - IN PCD_TOKEN_NUMBER ExTokenNumber, + IN UINTN ExTokenNumber, IN CONST EFI_GUID *Guid, VOID *Data, UINTN SetSize, BOOLEAN PtrType ) { - PCD_TOKEN_NUMBER TokenNumber; + UINTN TokenNumber; - TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber); + TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber); - InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, SetSize); + InvokeCallbackOnSet ((UINT32) ExTokenNumber, Guid, TokenNumber, Data, SetSize); SetWorker (TokenNumber, Data, SetSize, PtrType); @@ -633,30 +688,41 @@ SetHiiVariable ( NULL ); - ASSERT (Status == EFI_BUFFER_TOO_SMALL); + if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocatePool (Size); + Buffer = AllocatePool (Size); - ASSERT (Buffer != NULL); + ASSERT (Buffer != NULL); - Status = EfiGetVariable ( - VariableName, - VariableGuid, - &Attribute, - &Size, - Buffer - ); + Status = EfiGetVariable ( + VariableName, + VariableGuid, + &Attribute, + &Size, + Buffer + ); + + ASSERT_EFI_ERROR (Status); + CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize); - CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize); + } else { + + Attribute = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; + Size = DataSize + Offset; + Buffer = AllocateZeroPool (Size); + ASSERT (Buffer != NULL); + CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize); + + } return EfiSetVariable ( - VariableName, - VariableGuid, - Attribute, - Size, - Buffer - ); + VariableName, + VariableGuid, + Attribute, + Size, + Buffer + ); } @@ -664,10 +730,10 @@ SetHiiVariable ( -PCD_TOKEN_NUMBER +UINTN GetExPcdTokenNumber ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINT32 ExTokenNumber ) { UINT32 i; @@ -676,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; + } + } } } @@ -696,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; @@ -703,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; } }