X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FPCD%2FDxe%2FService.c;h=efe72483c5e65be554f7cfb99fb7ee10b1d57ec0;hb=da0df6ca8f8f118866e53c7fb770598c199993a6;hp=7b0932a6e4337107abde8b681aba0cc6f0fdb3e3;hpb=23f3e119c7b154f6c9386588b5b74c6037a1251c;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/PCD/Dxe/Service.c b/MdeModulePkg/Universal/PCD/Dxe/Service.c index 7b0932a6e4..efe72483c5 100644 --- a/MdeModulePkg/Universal/PCD/Dxe/Service.c +++ b/MdeModulePkg/Universal/PCD/Dxe/Service.c @@ -2,7 +2,8 @@ Help functions used by PCD DXE driver. Copyright (c) 2014, Hewlett-Packard Development Company, L.P.
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -142,11 +143,25 @@ GetPcdName ( { PCD_DATABASE_INIT *Database; UINT8 *StringTable; + UINTN NameSize; PCD_NAME_INDEX *PcdNameIndex; CHAR8 *TokenSpaceName; CHAR8 *PcdName; CHAR8 *Name; + // + // Return NULL when PCD name table is absent. + // + if (IsPeiDb) { + if (mPcdDatabase.PeiDb->PcdNameTableOffset == 0) { + return NULL; + } + } else { + if (mPcdDatabase.DxeDb->PcdNameTableOffset == 0) { + return NULL; + } + } + // // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER. // We have to decrement TokenNumber by 1 to make it usable @@ -175,14 +190,15 @@ GetPcdName ( // // Need to get the full PCD name. // - Name = AllocateZeroPool (AsciiStrSize (TokenSpaceName) + AsciiStrSize (PcdName)); + NameSize = AsciiStrSize (TokenSpaceName) + AsciiStrSize (PcdName); + Name = AllocateZeroPool (NameSize); ASSERT (Name != NULL); // // Catenate TokenSpaceCName and PcdCName with a '.' to form the full PCD name. // - AsciiStrCat (Name, TokenSpaceName); + AsciiStrCatS (Name, NameSize, TokenSpaceName); Name[AsciiStrSize (TokenSpaceName) - sizeof (CHAR8)] = '.'; - AsciiStrCat (Name, PcdName); + AsciiStrCatS (Name, NameSize, PcdName); } return Name; @@ -436,7 +452,7 @@ GetWorker ( switch (LocalTokenNumber & PCD_TYPE_ALL_SET) { case PCD_TYPE_VPD: VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset); - RetPtr = (VOID *) (UINTN) (PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset); + RetPtr = (VOID *) ((UINTN) PcdGet32 (PcdVpdBaseAddress) + VpdHead->Offset); break; @@ -700,7 +716,7 @@ ExGetNextTokeNumber ( } for ( ; Index < ExMapTableCount; Index++) { - if (ExMapTable[Index].ExTokenNumber == *TokenNumber) { + if ((ExMapTable[Index].ExTokenNumber == *TokenNumber) && (ExMapTable[Index].ExGuidIndex == GuidTableIdx)) { break; } } @@ -943,7 +959,7 @@ GetSkuEnabledTokenNumber ( { SKU_HEAD *SkuHead; SKU_ID *SkuIdTable; - INTN Index; + UINTN Index; UINT8 *Value; UINT8 *PcdDb; BOOLEAN FoundSku; @@ -1354,6 +1370,84 @@ ExSetWorker ( } +/** + Get variable size and data from HII-type PCDs. + + @param[in] VariableGuid Guid of variable which stored value of a HII-type PCD. + @param[in] VariableName Unicode name of variable which stored value of a HII-type PCD. + @param[out] VariableSize Pointer to variable size got from HII-type PCDs. + @param[out] VariableData Pointer to variable data got from HII-type PCDs. + +**/ +VOID +GetVariableSizeAndDataFromHiiPcd ( + IN EFI_GUID *VariableGuid, + IN UINT16 *VariableName, + OUT UINTN *VariableSize, + OUT VOID *VariableData OPTIONAL + ) +{ + BOOLEAN IsPeiDb; + PCD_DATABASE_INIT *Database; + UINTN TokenNumber; + UINT32 LocalTokenNumber; + UINTN Offset; + EFI_GUID *GuidTable; + UINT8 *StringTable; + VARIABLE_HEAD *VariableHead; + EFI_GUID *Guid; + UINT16 *Name; + UINTN PcdDataSize; + UINTN Size; + UINT8 *VaraiableDefaultBuffer; + STRING_HEAD StringTableIdx; + + *VariableSize = 0; + + // + // Go through PCD database to find out DynamicHii PCDs. + // + for (TokenNumber = 1; TokenNumber <= mPcdTotalTokenCount; TokenNumber++) { + IsPeiDb = (BOOLEAN) ((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE); + Database = IsPeiDb ? mPcdDatabase.PeiDb: mPcdDatabase.DxeDb; + LocalTokenNumber = GetLocalTokenNumber (IsPeiDb, TokenNumber); + if ((LocalTokenNumber & PCD_TYPE_HII) != 0) { + // + // Get the Variable Guid and Name pointer. + // + Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK; + VariableHead = (VARIABLE_HEAD *) ((UINT8 *) Database + Offset); + StringTable = (UINT8 *) ((UINT8 *) Database + Database->StringTableOffset); + GuidTable = (EFI_GUID *) ((UINT8 *) Database + Database->GuidTableOffset); + Guid = GuidTable + VariableHead->GuidTableIndex; + Name = (UINT16*) (StringTable + VariableHead->StringIndex); + if (CompareGuid (VariableGuid, Guid) && (StrCmp (VariableName, Name) == 0)) { + // + // It is the matched DynamicHii PCD. + // + PcdDataSize = DxePcdGetSize (TokenNumber); + Size = VariableHead->Offset + PcdDataSize; + if (Size > *VariableSize) { + *VariableSize = Size; + } + if (VariableData != NULL) { + if ((LocalTokenNumber & PCD_TYPE_ALL_SET) == (PCD_TYPE_HII|PCD_TYPE_STRING)) { + // + // If a HII type PCD's datum type is VOID*, the DefaultValueOffset is the index of + // string array in string table. + // + StringTableIdx = *(STRING_HEAD *) ((UINT8 *) Database + VariableHead->DefaultValueOffset); + VaraiableDefaultBuffer = (UINT8 *) (StringTable + StringTableIdx); + } else { + VaraiableDefaultBuffer = (UINT8 *) Database + VariableHead->DefaultValueOffset; + } + CopyMem ((UINT8 *) VariableData + VariableHead->Offset, VaraiableDefaultBuffer, PcdDataSize); + } + } + } + } +} + /** Set value for HII-type PCD. @@ -1442,12 +1536,18 @@ SetHiiVariable ( // // If variable does not exist, a new variable need to be created. // - - Size = Offset + DataSize; - + + // + // Get size, allocate buffer and get data. + // + GetVariableSizeAndDataFromHiiPcd (VariableGuid, VariableName, &Size, NULL); Buffer = AllocateZeroPool (Size); ASSERT (Buffer != NULL); - + GetVariableSizeAndDataFromHiiPcd (VariableGuid, VariableName, &Size, Buffer); + + // + // Update buffer. + // CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize); if (SetAttributes == 0) { @@ -1851,7 +1951,7 @@ VariableLockDynamicHiiPcd ( // // Go through PCD database to find out DynamicHii PCDs. // - for (TokenNumber = 0; TokenNumber < LocalTokenCount; TokenNumber++) { + for (TokenNumber = 1; TokenNumber <= LocalTokenCount; TokenNumber++) { if (IsPeiDb) { LocalTokenNumber = GetLocalTokenNumber (TRUE, TokenNumber); } else {