X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=97518510d6c63db29b53c4b5f753a2219c140c66;hp=84bfae7bf0841cc8044c4052f3c8dca5a13473b1;hb=4276d5dacfd4812abc1d7a1bd1da995d7002ee9e;hpb=2a505eac6181d99d6a33770b7c6517f0b1e14b19 diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c index 84bfae7bf0..97518510d6 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); @@ -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); @@ -137,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); @@ -180,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); @@ -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++; @@ -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; @@ -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); @@ -470,18 +512,25 @@ 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; @@ -491,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 @@ -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) { @@ -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); + } else { - CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize); + 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 + ); }