X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=97518510d6c63db29b53c4b5f753a2219c140c66;hp=00437f116c327b316dd75f07412a333cf2d9b858;hb=4276d5dacfd4812abc1d7a1bd1da995d7002ee9e;hpb=abc25afaa56783ec7f5d9c0fc90cadc5403928ab diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c index 00437f116c..97518510d6 100644 --- a/EdkModulePkg/Universal/PCD/Dxe/Service.c +++ b/EdkModulePkg/Universal/PCD/Dxe/Service.c @@ -28,7 +28,7 @@ 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; @@ -312,7 +337,7 @@ BuildPcdDxeDataBase ( // if (PCD_TOTAL_TOKEN_NUMBER != 0) { - mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER); + mCallbackFnTable = AllocateZeroPool (PCD_TOTAL_TOKEN_NUMBER * sizeof (LIST_ENTRY)); } for (Idx = 0; Idx < PCD_TOTAL_TOKEN_NUMBER; Idx++) { @@ -336,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; @@ -398,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); @@ -435,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); @@ -457,7 +499,7 @@ InvokeCallbackOnSet ( EFI_STATUS SetWorker ( - PCD_TOKEN_NUMBER TokenNumber, + UINTN TokenNumber, VOID *Data, UINTN Size, BOOLEAN PtrType @@ -470,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 @@ -519,7 +568,7 @@ SetWorker ( case PCD_TYPE_STRING: CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, Size); - break; + return EFI_SUCCESS; case PCD_TYPE_HII: // @@ -532,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) { @@ -583,7 +633,7 @@ ExGetWorker ( IN UINTN GetSize ) { - return GetWorker(GetExPcdTokenNumber (Guid, ExTokenNumber), GetSize); + return GetWorker(GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber), GetSize); } @@ -592,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); @@ -638,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 + ); } @@ -669,10 +730,10 @@ SetHiiVariable ( -PCD_TOKEN_NUMBER +UINTN GetExPcdTokenNumber ( IN CONST EFI_GUID *Guid, - IN PCD_TOKEN_NUMBER ExTokenNumber + IN UINT32 ExTokenNumber ) { UINT32 i;