X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;ds=sidebyside;f=MdePkg%2FLibrary%2FDxePcdLib%2FDxePcdLib.c;h=6e3e4e70697f48779c40b4d980fa2b52e14c8b32;hb=9344f0921518309295da89c221d10cbead8531aa;hp=b746614d5be64fd4d8c6b51ca25dadb1b27408aa;hpb=bb5545b663e1d8ac4fd37003d5ba26fafdad5831;p=mirror_edk2.git diff --git a/MdePkg/Library/DxePcdLib/DxePcdLib.c b/MdePkg/Library/DxePcdLib/DxePcdLib.c index b746614d5b..6e3e4e7069 100644 --- a/MdePkg/Library/DxePcdLib/DxePcdLib.c +++ b/MdePkg/Library/DxePcdLib/DxePcdLib.c @@ -1,65 +1,138 @@ /** @file Implementation of PcdLib class library for DXE phase. -Copyright (c) 2006, Intel Corporation
-All rights reserved. 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 -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent -Module Name: DxePcdLib.c - **/ -static PCD_PROTOCOL *mPcd; + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +PCD_PROTOCOL *mPcd = NULL; +EFI_PCD_PROTOCOL *mPiPcd = NULL; +GET_PCD_INFO_PROTOCOL *mPcdInfo = NULL; +EFI_GET_PCD_INFO_PROTOCOL *mPiPcdInfo = NULL; /** - The constructor function caches the PCD_PROTOCOL pointer. + Retrieves the PI PCD protocol from the handle database. - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The constructor always return EFI_SUCCESS. + @retval EFI_PCD_PROTOCOL * The pointer to the EFI_PCD_PROTOCOL. +**/ +EFI_PCD_PROTOCOL * +EFIAPI +GetPiPcdProtocol ( + VOID + ) +{ + EFI_STATUS Status; + + if (mPiPcd == NULL) { + // + // PI Pcd protocol defined in PI 1.2 vol3 should be installed before the module + // access DynamicEx type PCD. + // + Status = gBS->LocateProtocol (&gEfiPcdProtocolGuid, NULL, (VOID **) &mPiPcd); + ASSERT_EFI_ERROR (Status); + ASSERT (mPiPcd != NULL); + } + return mPiPcd; +} + +/** + Retrieves the PCD protocol from the handle database. + @retval PCD_PROTOCOL * The pointer to the PCD_PROTOCOL. **/ -EFI_STATUS +PCD_PROTOCOL * EFIAPI -PcdLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +GetPcdProtocol ( + VOID ) { EFI_STATUS Status; - Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **)&mPcd); - ASSERT_EFI_ERROR (Status); + if (mPcd == NULL) { + // + // PCD protocol need to be installed before the module access Dynamic type PCD. + // But dynamic type PCD is not required in PI 1.2 specification. + // + Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **)&mPcd); + ASSERT_EFI_ERROR (Status); + ASSERT (mPcd != NULL); + } + return mPcd; +} + +/** + Retrieves the PI PCD info protocol from the handle database. + + @retval EFI_GET_PCD_INFO_PROTOCOL * The pointer to the EFI_GET_PCD_INFO_PROTOCOL defined in PI 1.2.1 Vol 3. +**/ +EFI_GET_PCD_INFO_PROTOCOL * +GetPiPcdInfoProtocolPointer ( + VOID + ) +{ + EFI_STATUS Status; - return EFI_SUCCESS; + if (mPiPcdInfo == NULL) { + Status = gBS->LocateProtocol (&gEfiGetPcdInfoProtocolGuid, NULL, (VOID **)&mPiPcdInfo); + ASSERT_EFI_ERROR (Status); + ASSERT (mPiPcdInfo != NULL); + } + return mPiPcdInfo; } +/** + Retrieves the PCD info protocol from the handle database. + + @retval GET_PCD_INFO_PROTOCOL * The pointer to the GET_PCD_INFO_PROTOCOL. +**/ +GET_PCD_INFO_PROTOCOL * +GetPcdInfoProtocolPointer ( + VOID + ) +{ + EFI_STATUS Status; + + if (mPcdInfo == NULL) { + Status = gBS->LocateProtocol (&gGetPcdInfoProtocolGuid, NULL, (VOID **)&mPcdInfo); + ASSERT_EFI_ERROR (Status); + ASSERT (mPcdInfo != NULL); + } + return mPcdInfo; +} /** + This function provides a means by which SKU support can be established in the PCD infrastructure. + Sets the current SKU in the PCD database to the value specified by SkuId. SkuId is returned. - @param[in] SkuId The SKU value that will be used when the PCD service will retrieve and - set values associated with a PCD token. + @param SkuId The SKU value that will be used when the PCD service retrieves and sets values + associated with a PCD token. - @retval SKU_ID Return the SKU ID that just be set. + @return Return the SKU ID that just be set. **/ UINTN EFIAPI LibPcdSetSku ( - IN UINTN SkuId + IN UINTN SkuId ) { - ASSERT (SkuId < 0x100); - - mPcd->SetSku (SkuId); + GetPcdProtocol()->SetSku (SkuId); return SkuId; } @@ -67,11 +140,13 @@ LibPcdSetSku ( /** - Returns the 8-bit value for the token specified by TokenNumber. + This function provides a means by which to retrieve a value for a given PCD token. + + Returns the 8-bit value for the token specified by TokenNumber. - @param[in] The PCD token number to retrieve a current value for. + @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINT8 Returns the 8-bit value for the token specified by TokenNumber. + @return Returns the 8-bit value for the token specified by TokenNumber. **/ UINT8 @@ -80,17 +155,19 @@ LibPcdGet8 ( IN UINTN TokenNumber ) { - return mPcd->Get8 (TokenNumber); + return GetPcdProtocol()->Get8 (TokenNumber); } /** - Returns the 16-bit value for the token specified by TokenNumber. + This function provides a means by which to retrieve a value for a given PCD token. - @param[in] The PCD token number to retrieve a current value for. + Returns the 16-bit value for the token specified by TokenNumber. - @retval UINT16 Returns the 16-bit value for the token specified by TokenNumber. + @param[in] TokenNumber The PCD token number to retrieve a current value for. + + @return Returns the 16-bit value for the token specified by TokenNumber. **/ UINT16 @@ -99,17 +176,19 @@ LibPcdGet16 ( IN UINTN TokenNumber ) { - return mPcd->Get16 (TokenNumber); + return GetPcdProtocol()->Get16 (TokenNumber); } /** - Returns the 32-bit value for the token specified by TokenNumber. + This function provides a means by which to retrieve a value for a given PCD token. + + Returns the 32-bit value for the token specified by TokenNumber. @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINT32 Returns the 32-bit value for the token specified by TokenNumber. + @return Returns the 32-bit value for the token specified by TokenNumber. **/ UINT32 @@ -118,17 +197,19 @@ LibPcdGet32 ( IN UINTN TokenNumber ) { - return mPcd->Get32 (TokenNumber); + return GetPcdProtocol()->Get32 (TokenNumber); } /** + This function provides a means by which to retrieve a value for a given PCD token. + Returns the 64-bit value for the token specified by TokenNumber. @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINT64 Returns the 64-bit value for the token specified by TokenNumber. + @return Returns the 64-bit value for the token specified by TokenNumber. **/ UINT64 @@ -137,17 +218,19 @@ LibPcdGet64 ( IN UINTN TokenNumber ) { - return mPcd->Get64 (TokenNumber); + return GetPcdProtocol()->Get64 (TokenNumber); } /** + This function provides a means by which to retrieve a value for a given PCD token. + Returns the pointer to the buffer of the token specified by TokenNumber. @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval VOID* Returns the pointer to the token specified by TokenNumber. + @return Returns the pointer to the token specified by TokenNumber. **/ VOID * @@ -156,36 +239,38 @@ LibPcdGetPtr ( IN UINTN TokenNumber ) { - return mPcd->GetPtr (TokenNumber); + return GetPcdProtocol()->GetPtr (TokenNumber); } /** - Returns the Boolean value of the token specified by TokenNumber. + This function provides a means by which to retrieve a value for a given PCD token. + + Returns the Boolean value of the token specified by TokenNumber. @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval BOOLEAN Returns the Boolean value of the token specified by TokenNumber. + @return Returns the Boolean value of the token specified by TokenNumber. **/ -BOOLEAN +BOOLEAN EFIAPI LibPcdGetBool ( IN UINTN TokenNumber ) { - return mPcd->GetBool (TokenNumber); + return GetPcdProtocol()->GetBool (TokenNumber); } /** - Returns the size of the token specified by TokenNumber. + This function provides a means by which to retrieve the size of a given PCD token. @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINTN Returns the size of the token specified by TokenNumber. + @return Returns the size of the token specified by TokenNumber. **/ UINTN @@ -194,20 +279,23 @@ LibPcdGetSize ( IN UINTN TokenNumber ) { - return mPcd->GetSize (TokenNumber); + return GetPcdProtocol()->GetSize (TokenNumber); } /** + This function provides a means by which to retrieve a value for a given PCD token. + Returns the 8-bit value for the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINT8 Return the UINT8. + @return Return the UINT8. **/ UINT8 @@ -218,20 +306,23 @@ LibPcdGetEx8 ( ) { ASSERT (Guid != NULL); - - return mPcd->Get8Ex (Guid, TokenNumber); + + return GetPiPcdProtocol()->Get8 (Guid, TokenNumber); } /** + This function provides a means by which to retrieve a value for a given PCD token. + Returns the 16-bit value for the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + If Guid is NULL, then ASSERT(). - @retval UINT16 Return the UINT16. + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. + + @return Return the UINT16. **/ UINT16 @@ -243,19 +334,19 @@ LibPcdGetEx16 ( { ASSERT (Guid != NULL); - return mPcd->Get16Ex (Guid, TokenNumber); + return GetPiPcdProtocol()->Get16 (Guid, TokenNumber); } /** Returns the 32-bit value for the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). + If Guid is NULL, then ASSERT(). - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINT32 Return the UINT32. + @return Return the UINT32. **/ UINT32 @@ -267,20 +358,23 @@ LibPcdGetEx32 ( { ASSERT (Guid != NULL); - return mPcd->Get32Ex (Guid, TokenNumber); + return GetPiPcdProtocol()->Get32 (Guid, TokenNumber); } /** + This function provides a means by which to retrieve a value for a given PCD token. + Returns the 64-bit value for the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. - @retval UINT64 Return the UINT64. + @return Return the UINT64. **/ UINT64 @@ -291,21 +385,24 @@ LibPcdGetEx64 ( ) { ASSERT (Guid != NULL); - - return mPcd->Get64Ex (Guid, TokenNumber); + + return GetPiPcdProtocol()->Get64 (Guid, TokenNumber); } /** - Returns the pointer to the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). + This function provides a means by which to retrieve a value for a given PCD token. - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + Returns the pointer to the buffer of token specified by TokenNumber and Guid. + + If Guid is NULL, then ASSERT(). - @retval VOID* Return the VOID* pointer. + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. + + @return Return the VOID* pointer. **/ VOID * @@ -317,20 +414,23 @@ LibPcdGetExPtr ( { ASSERT (Guid != NULL); - return mPcd->GetPtrEx (Guid, TokenNumber); + return GetPiPcdProtocol()->GetPtr (Guid, TokenNumber); } /** - Returns the Boolean value of the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). + This function provides a means by which to retrieve a value for a given PCD token. - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + Returns the Boolean value of the token specified by TokenNumber and Guid. + + If Guid is NULL, then ASSERT(). - @retval BOOLEAN Return the BOOLEAN. + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. + + @return Return the BOOLEAN. **/ BOOLEAN @@ -342,20 +442,23 @@ LibPcdGetExBool ( { ASSERT (Guid != NULL); - return mPcd->GetBoolEx (Guid, TokenNumber); + return GetPiPcdProtocol()->GetBool (Guid, TokenNumber); } /** - Returns the size of the token specified by TokenNumber and Guid. - If Guid is NULL, then ASSERT(). + This function provides a means by which to retrieve the size of a given PCD token. - @param[in] Guid Pointer to a 128-bit unique value that designates - which namespace to retrieve a value from. - @param[in] TokenNumber The PCD token number to retrieve a current value for. + Returns the size of the token specified by TokenNumber and Guid. - @retval UINTN Return the size. + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that designates + which namespace to retrieve a value from. + @param[in] TokenNumber The PCD token number to retrieve a current value for. + + @return Return the size. **/ UINTN @@ -367,19 +470,22 @@ LibPcdGetExSize ( { ASSERT (Guid != NULL); - return mPcd->GetSizeEx (Guid, TokenNumber); + return GetPiPcdProtocol()->GetSize (Guid, TokenNumber); } +#ifndef DISABLE_NEW_DEPRECATED_INTERFACES /** - Sets the 8-bit value for the token specified by TokenNumber + This function provides a means by which to set a value for a given PCD token. + + Sets the 8-bit value for the token specified by TokenNumber to the value specified by Value. Value is returned. - - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 8-bit value to set. - @retval UINT8 Return the value been set. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 8-bit value to set. + + @return Return the value that was set. **/ UINT8 @@ -389,25 +495,23 @@ LibPcdSet8 ( IN UINT8 Value ) { - EFI_STATUS Status; - - Status = mPcd->Set8 (TokenNumber, Value); + GetPcdProtocol()->Set8 (TokenNumber, Value); - ASSERT_EFI_ERROR (Status); - return Value; } /** - Sets the 16-bit value for the token specified by TokenNumber + This function provides a means by which to set a value for a given PCD token. + + Sets the 16-bit value for the token specified by TokenNumber to the value specified by Value. Value is returned. - - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 16-bit value to set. - @retval UINT16 Return the value been set. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 16-bit value to set. + + @return Return the value that was set. **/ UINT16 @@ -417,38 +521,33 @@ LibPcdSet16 ( IN UINT16 Value ) { - EFI_STATUS Status; - - Status = mPcd->Set16 (TokenNumber, Value); + GetPcdProtocol()->Set16 (TokenNumber, Value); - ASSERT_EFI_ERROR (Status); - return Value; } /** - Sets the 32-bit value for the token specified by TokenNumber + This function provides a means by which to set a value for a given PCD token. + + Sets the 32-bit value for the token specified by TokenNumber to the value specified by Value. Value is returned. - - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 32-bit value to set. - @retval UINT32 Return the value been set. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 32-bit value to set. + + @return Return the value that was set. **/ UINT32 EFIAPI LibPcdSet32 ( IN UINTN TokenNumber, - IN UINT32 Value + IN UINT32 Value ) { - EFI_STATUS Status; - Status = mPcd->Set32 (TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPcdProtocol()->Set32 (TokenNumber, Value); return Value; } @@ -456,27 +555,25 @@ LibPcdSet32 ( /** - Sets the 64-bit value for the token specified by TokenNumber + This function provides a means by which to set a value for a given PCD token. + + Sets the 64-bit value for the token specified by TokenNumber to the value specified by Value. Value is returned. - - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 64-bit value to set. - @retval UINT64 Return the value been set. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 64-bit value to set. + + @return Return the value that was set. **/ UINT64 EFIAPI LibPcdSet64 ( IN UINTN TokenNumber, - IN UINT64 Value + IN UINT64 Value ) { - EFI_STATUS Status; - - Status = mPcd->Set64 (TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPcdProtocol()->Set64 (TokenNumber, Value); return Value; } @@ -484,66 +581,65 @@ LibPcdSet64 ( /** - Sets a buffer for the token specified by TokenNumber to - the value specified by Buffer and SizeOfValue. Buffer to - be set is returned. The content of the buffer could be - overwritten if a Callback on SET is registered with this - TokenNumber. - - If SizeOfValue is greater than the maximum - size support by TokenNumber, then set SizeOfValue to the - maximum size supported by TokenNumber and return NULL to - indicate that the set operation was not actually performed. - - If SizeOfValue > 0 and Buffer is NULL, then ASSERT(). - - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in,out] SizeOfBuffer The size, in bytes, of Buffer. - @param[in] Value A pointer to the buffer to set. + This function provides a means by which to set a value for a given PCD token. - @retval VOID* Return the pointer for the buffer been set. + Sets a buffer for the token specified by TokenNumber to the value + specified by Buffer and SizeOfBuffer. Buffer is returned. + If SizeOfBuffer is greater than the maximum size support by TokenNumber, + then set SizeOfBuffer to the maximum size supported by TokenNumber and + return NULL to indicate that the set operation was not actually performed. -**/ + If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the + maximum size supported by TokenName and NULL must be returned. + + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in, out] SizeOfBuffer The size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to set. + + @return Return the pointer for the buffer been set. + +**/ VOID * EFIAPI LibPcdSetPtr ( - IN UINTN TokenNumber, - IN OUT UINTN *SizeOfBuffer, - IN VOID *Buffer + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN CONST VOID *Buffer ) { EFI_STATUS Status; - UINTN Size; + UINTN InputSizeOfBuffer; + + ASSERT (SizeOfBuffer != NULL); if (*SizeOfBuffer > 0) { ASSERT (Buffer != NULL); } - Size = LibPcdGetSize (TokenNumber); - - if (*SizeOfBuffer > Size) { - *SizeOfBuffer = Size; + InputSizeOfBuffer = *SizeOfBuffer; + Status = GetPcdProtocol()->SetPtr (TokenNumber, SizeOfBuffer, (VOID *) Buffer); + if (EFI_ERROR (Status) && (*SizeOfBuffer < InputSizeOfBuffer)) { return NULL; } - Status = mPcd->SetPtr (TokenNumber, *SizeOfBuffer, Buffer); - - ASSERT_EFI_ERROR (Status); - - return Buffer; + return (VOID *)Buffer; } /** - Sets the Boolean value for the token specified by TokenNumber + This function provides a means by which to set a value for a given PCD token. + + Sets the Boolean value for the token specified by TokenNumber to the value specified by Value. Value is returned. - - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The boolean value to set. - @retval BOOLEAN Return the value been set. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The boolean value to set. + + @return Return the value that was set. **/ BOOLEAN @@ -553,11 +649,7 @@ LibPcdSetBool ( IN BOOLEAN Value ) { - EFI_STATUS Status; - - Status = mPcd->SetBool (TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPcdProtocol()->SetBool (TokenNumber, Value); return Value; } @@ -565,16 +657,19 @@ LibPcdSetBool ( /** - Sets the 8-bit value for the token specified by TokenNumber and + This function provides a means by which to set a value for a given PCD token. + + Sets the 8-bit value for the token specified by TokenNumber and Guid to the value specified by Value. Value is returned. + If Guid is NULL, then ASSERT(). - - @param[in] Guid Pointer to a 128-bit unique value that - designates which namespace to set a value from. - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 8-bit value to set. - @retval UINT8 Return the value been set. + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 8-bit value to set. + + @return Return the value that was set. **/ UINT8 @@ -585,13 +680,9 @@ LibPcdSetEx8 ( IN UINT8 Value ) { - EFI_STATUS Status; - ASSERT (Guid != NULL); - Status = mPcd->Set8Ex (Guid, TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPiPcdProtocol()->Set8 (Guid, TokenNumber, Value); return Value; } @@ -599,16 +690,19 @@ LibPcdSetEx8 ( /** - Sets the 16-bit value for the token specified by TokenNumber and + This function provides a means by which to set a value for a given PCD token. + + Sets the 16-bit value for the token specified by TokenNumber and Guid to the value specified by Value. Value is returned. + If Guid is NULL, then ASSERT(). - - @param[in] Guid Pointer to a 128-bit unique value that - designates which namespace to set a value from. - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 16-bit value to set. - @retval UINT8 Return the value been set. + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 16-bit value to set. + + @return Return the value that was set. **/ UINT16 @@ -619,13 +713,9 @@ LibPcdSetEx16 ( IN UINT16 Value ) { - EFI_STATUS Status; - ASSERT (Guid != NULL); - Status = mPcd->Set16Ex (Guid, TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPiPcdProtocol()->Set16 (Guid, TokenNumber, Value); return Value; } @@ -633,16 +723,19 @@ LibPcdSetEx16 ( /** - Sets the 32-bit value for the token specified by TokenNumber and + This function provides a means by which to set a value for a given PCD token. + + Sets the 32-bit value for the token specified by TokenNumber and Guid to the value specified by Value. Value is returned. + If Guid is NULL, then ASSERT(). - - @param[in] Guid Pointer to a 128-bit unique value that - designates which namespace to set a value from. - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 32-bit value to set. - @retval UINT32 Return the value been set. + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 32-bit value to set. + + @return Return the value that was set. **/ UINT32 @@ -650,16 +743,12 @@ EFIAPI LibPcdSetEx32 ( IN CONST GUID *Guid, IN UINTN TokenNumber, - IN UINT32 Value + IN UINT32 Value ) { - EFI_STATUS Status; - ASSERT (Guid != NULL); - Status = mPcd->Set32Ex (Guid, TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPiPcdProtocol()->Set32 (Guid, TokenNumber, Value); return Value; } @@ -667,16 +756,19 @@ LibPcdSetEx32 ( /** - Sets the 64-bit value for the token specified by TokenNumber and + This function provides a means by which to set a value for a given PCD token. + + Sets the 64-bit value for the token specified by TokenNumber and Guid to the value specified by Value. Value is returned. + If Guid is NULL, then ASSERT(). - - @param[in] Guid Pointer to a 128-bit unique value that - designates which namespace to set a value from. - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The 64-bit value to set. - @retval UINT64 Return the value been set. + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 64-bit value to set. + + @return Return the value that was set. **/ UINT64 @@ -684,16 +776,12 @@ EFIAPI LibPcdSetEx64 ( IN CONST GUID *Guid, IN UINTN TokenNumber, - IN UINT64 Value + IN UINT64 Value ) { - EFI_STATUS Status; - ASSERT (Guid != NULL); - Status = mPcd->Set64Ex (Guid, TokenNumber, Value); - - ASSERT_EFI_ERROR (Status); + GetPiPcdProtocol()->Set64 (Guid, TokenNumber, Value); return Value; } @@ -701,21 +789,25 @@ LibPcdSetEx64 ( /** - Sets a buffer for the token specified by TokenNumber to the value specified by - Buffer and SizeOfValue. Buffer is returned. If SizeOfValue is greater than - the maximum size support by TokenNumber, then set SizeOfValue to the maximum size - supported by TokenNumber and return NULL to indicate that the set operation - was not actually performed. - - If SizeOfValue > 0 and Buffer is NULL, then ASSERT(). - - @param[in] Guid Pointer to a 128-bit unique value that - designates which namespace to set a value from. - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in, out] SizeOfBuffer The size, in bytes, of Buffer. - @param[in] Buffer A pointer to the buffer to set. + This function provides a means by which to set a value for a given PCD token. - @retval VOID * Return the pinter to the buffer been set. + Sets a buffer for the token specified by TokenNumber to the value specified by + Buffer and SizeOfBuffer. Buffer is returned. If SizeOfBuffer is greater than + the maximum size support by TokenNumber, then set SizeOfBuffer to the maximum size + supported by TokenNumber and return NULL to indicate that the set operation + was not actually performed. + + If Guid is NULL, then ASSERT(). + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in, out] SizeOfBuffer The size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to set. + + @return Return the pointer to the buffer been set. **/ VOID * @@ -728,7 +820,7 @@ LibPcdSetExPtr ( ) { EFI_STATUS Status; - UINTN Size; + UINTN InputSizeOfBuffer; ASSERT (Guid != NULL); @@ -738,33 +830,31 @@ LibPcdSetExPtr ( ASSERT (Buffer != NULL); } - - Size = LibPcdGetExSize (Guid, TokenNumber); - if (*SizeOfBuffer > Size) { - *SizeOfBuffer = Size; + InputSizeOfBuffer = *SizeOfBuffer; + Status = GetPiPcdProtocol()->SetPtr (Guid, TokenNumber, SizeOfBuffer, Buffer); + if (EFI_ERROR (Status) && (*SizeOfBuffer < InputSizeOfBuffer)) { return NULL; } - Status = mPcd->SetPtrEx (Guid, TokenNumber, *SizeOfBuffer, Buffer); - - ASSERT_EFI_ERROR (Status); - return Buffer; } /** - Sets the Boolean value for the token specified by TokenNumber and + This function provides a means by which to set a value for a given PCD token. + + Sets the Boolean value for the token specified by TokenNumber and Guid to the value specified by Value. Value is returned. + If Guid is NULL, then ASSERT(). - - @param[in] Guid Pointer to a 128-bit unique value that - designates which namespace to set a value from. - @param[in] TokenNumber The PCD token number to set a current value for. - @param[in] Value The Boolean value to set. - @retval Boolean Return the value been set. + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The Boolean value to set. + + @return Return the value that was set. **/ BOOLEAN @@ -775,33 +865,364 @@ LibPcdSetExBool ( IN BOOLEAN Value ) { - EFI_STATUS Status; + ASSERT (Guid != NULL); + + GetPiPcdProtocol()->SetBool (Guid, TokenNumber, Value); + + return Value; +} +#endif + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the 8-bit value for the token specified by TokenNumber + to the value specified by Value. + + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 8-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSet8S ( + IN UINTN TokenNumber, + IN UINT8 Value + ) +{ + return GetPcdProtocol()->Set8 (TokenNumber, Value); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the 16-bit value for the token specified by TokenNumber + to the value specified by Value. + + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 16-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSet16S ( + IN UINTN TokenNumber, + IN UINT16 Value + ) +{ + return GetPcdProtocol()->Set16 (TokenNumber, Value); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the 32-bit value for the token specified by TokenNumber + to the value specified by Value. + + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 32-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSet32S ( + IN UINTN TokenNumber, + IN UINT32 Value + ) +{ + return GetPcdProtocol()->Set32 (TokenNumber, Value); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the 64-bit value for the token specified by TokenNumber + to the value specified by Value. + + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 64-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSet64S ( + IN UINTN TokenNumber, + IN UINT64 Value + ) +{ + return GetPcdProtocol()->Set64 (TokenNumber, Value); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets a buffer for the token specified by TokenNumber to the value specified + by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than the maximum size + support by TokenNumber, then set SizeOfBuffer to the maximum size supported by + TokenNumber and return EFI_INVALID_PARAMETER to indicate that the set operation + was not actually performed. + + If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to the + maximum size supported by TokenName and EFI_INVALID_PARAMETER must be returned. + + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in, out] SizeOfBuffer The size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetPtrS ( + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN CONST VOID *Buffer + ) +{ + ASSERT (SizeOfBuffer != NULL); + + if (*SizeOfBuffer > 0) { + ASSERT (Buffer != NULL); + } + + return GetPcdProtocol()->SetPtr (TokenNumber, SizeOfBuffer, (VOID *) Buffer); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the boolean value for the token specified by TokenNumber + to the value specified by Value. + + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The boolean value to set. + + @return The status of the set operation. +**/ +RETURN_STATUS +EFIAPI +LibPcdSetBoolS ( + IN UINTN TokenNumber, + IN BOOLEAN Value + ) +{ + return GetPcdProtocol()->SetBool (TokenNumber, Value); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the 8-bit value for the token specified by TokenNumber + to the value specified by Value. + + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 8-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetEx8S ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + IN UINT8 Value + ) +{ ASSERT (Guid != NULL); - Status = mPcd->SetBoolEx (Guid, TokenNumber, Value); + return GetPiPcdProtocol()->Set8 (Guid, TokenNumber, Value); +} - ASSERT_EFI_ERROR (Status); +/** + This function provides a means by which to set a value for a given PCD token. - return Value; + Sets the 16-bit value for the token specified by TokenNumber + to the value specified by Value. + + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 16-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetEx16S ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + IN UINT16 Value + ) +{ + ASSERT (Guid != NULL); + + return GetPiPcdProtocol()->Set16 (Guid, TokenNumber, Value); } +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the 32-bit value for the token specified by TokenNumber + to the value specified by Value. + + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 32-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetEx32S ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + IN UINT32 Value + ) +{ + ASSERT (Guid != NULL); + return GetPiPcdProtocol()->Set32 (Guid, TokenNumber, Value); +} /** - When the token specified by TokenNumber and Guid is set, - then notification function specified by NotificationFunction is called. - If Guid is NULL, then the default token space is used. - If NotificationFunction is NULL, then ASSERT(). + This function provides a means by which to set a value for a given PCD token. + + Sets the 64-bit value for the token specified by TokenNumber + to the value specified by Value. + + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The 64-bit value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetEx64S ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + IN UINT64 Value + ) +{ + ASSERT (Guid != NULL); - @param[in] Guid Pointer to a 128-bit unique value that designates which - namespace to set a value from. If NULL, then the default - token space is used. - @param[in] TokenNumber The PCD token number to monitor. - @param[in] NotificationFunction The function to call when the token - specified by Guid and TokenNumber is set. + return GetPiPcdProtocol()->Set64 (Guid, TokenNumber, Value); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets a buffer for the token specified by TokenNumber to the value specified by + Buffer and SizeOfBuffer. If SizeOfBuffer is greater than the maximum size + support by TokenNumber, then set SizeOfBuffer to the maximum size supported by + TokenNumber and return EFI_INVALID_PARAMETER to indicate that the set operation + was not actually performed. - @retval VOID + If Guid is NULL, then ASSERT(). + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[in] Guid Pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in, out] SizeOfBuffer The size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetExPtrS ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + IN OUT UINTN *SizeOfBuffer, + IN VOID *Buffer + ) +{ + ASSERT (Guid != NULL); + + ASSERT (SizeOfBuffer != NULL); + + if (*SizeOfBuffer > 0) { + ASSERT (Buffer != NULL); + } + + return GetPiPcdProtocol()->SetPtr (Guid, TokenNumber, SizeOfBuffer, Buffer); +} + +/** + This function provides a means by which to set a value for a given PCD token. + + Sets the boolean value for the token specified by TokenNumber + to the value specified by Value. + + If Guid is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that + designates which namespace to set a value from. + @param[in] TokenNumber The PCD token number to set a current value for. + @param[in] Value The boolean value to set. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPcdSetExBoolS ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + IN BOOLEAN Value + ) +{ + ASSERT (Guid != NULL); + + return GetPiPcdProtocol()->SetBool (Guid, TokenNumber, Value); +} + +/** + Set up a notification function that is called when a specified token is set. + + When the token specified by TokenNumber and Guid is set, + then notification function specified by NotificationFunction is called. + If Guid is NULL, then the default token space is used. + If NotificationFunction is NULL, then ASSERT(). + + @param[in] Guid The pointer to a 128-bit unique value that designates which + namespace to set a value from. If NULL, then the default + token space is used. + @param[in] TokenNumber The PCD token number to monitor. + @param[in] NotificationFunction The function to call when the token + specified by Guid and TokenNumber is set. **/ VOID @@ -816,8 +1237,7 @@ LibPcdCallbackOnSet ( ASSERT (NotificationFunction != NULL); - Status = mPcd->CallbackOnSet (TokenNumber, Guid, NotificationFunction); - + Status = GetPiPcdProtocol()->CallbackOnSet (Guid, TokenNumber, (EFI_PCD_PROTOCOL_CALLBACK) NotificationFunction); ASSERT_EFI_ERROR (Status); return; @@ -827,14 +1247,16 @@ LibPcdCallbackOnSet ( /** Disable a notification function that was established with LibPcdCallbackonSet(). + + Disable a notification function that was previously established with LibPcdCallbackOnSet(). If NotificationFunction is NULL, then ASSERT(). + If LibPcdCallbackOnSet() was not previously called with Guid, TokenNumber, + and NotificationFunction, then ASSERT(). - @param[in] Guid Specify the GUID token space. - @param[in] TokenNumber Specify the token number. + @param[in] Guid Specify the GUID token space. + @param[in] TokenNumber Specify the token number. @param[in] NotificationFunction The callback function to be unregistered. - @retval VOID - **/ VOID EFIAPI @@ -847,9 +1269,8 @@ LibPcdCancelCallback ( EFI_STATUS Status; ASSERT (NotificationFunction != NULL); - - Status = mPcd->CancelCallback (TokenNumber, Guid, NotificationFunction); + Status = GetPiPcdProtocol()->CancelCallback (Guid, TokenNumber, (EFI_PCD_PROTOCOL_CALLBACK) NotificationFunction); ASSERT_EFI_ERROR (Status); return; @@ -858,33 +1279,35 @@ LibPcdCancelCallback ( /** - Retrieves the next PCD token number from the token space specified by Guid. - If Guid is NULL, then the default token space is used. If TokenNumber is 0, - then the first token number is returned. Otherwise, the token number that - follows TokenNumber in the token space is returned. If TokenNumber is the last - token number in the token space, then 0 is returned. If TokenNumber is not 0 and - is not in the token space specified by Guid, then ASSERT(). + Retrieves the next token in a token space. + + Retrieves the next PCD token number from the token space specified by Guid. + If Guid is NULL, then the default token space is used. If TokenNumber is 0, + then the first token number is returned. Otherwise, the token number that + follows TokenNumber in the token space is returned. If TokenNumber is the last + token number in the token space, then 0 is returned. - @param[in] Pointer to a 128-bit unique value that designates which namespace - to set a value from. If NULL, then the default token space is used. - @param[in] The previous PCD token number. If 0, then retrieves the first PCD - token number. + If TokenNumber is not 0 and is not in the token space specified by Guid, then ASSERT(). - @retval UINTN The next valid token number. + @param[in] Guid The pointer to a 128-bit unique value that designates which namespace + to set a value from. If NULL, then the default token space is used. + @param[in] TokenNumber The previous PCD token number. If 0, then retrieves the first PCD + token number. + + @return The next valid token number. **/ -UINTN +UINTN EFIAPI LibPcdGetNextToken ( - IN CONST GUID *Guid, OPTIONAL - IN UINTN TokenNumber + IN CONST GUID *Guid, OPTIONAL + IN UINTN TokenNumber ) { - EFI_STATUS Status; - - Status = mPcd->GetNextToken (Guid, &TokenNumber); + EFI_STATUS Status; - ASSERT_EFI_ERROR (Status); + Status = GetPiPcdProtocol()->GetNextToken (Guid, &TokenNumber); + ASSERT (!EFI_ERROR (Status) || TokenNumber == 0); return TokenNumber; } @@ -892,34 +1315,306 @@ LibPcdGetNextToken ( /** - Retrieves the next PCD token space from a token space specified by Guid. - Guid of NULL is reserved to mark the default local token namespace on the current - platform. If Guid is NULL, then the GUID of the first non-local token space of the - current platform is returned. If Guid is the last non-local token space, - then NULL is returned. - - If Guid is not NULL and is not a valid token space in the current platform, then ASSERT(). + Used to retrieve the list of available PCD token space GUIDs. + Returns the PCD token space GUID that follows TokenSpaceGuid in the list of token spaces + in the platform. + If TokenSpaceGuid is NULL, then a pointer to the first PCD token spaces returned. + If TokenSpaceGuid is the last PCD token space GUID in the list, then NULL is returned. - - @param[in] Pointer to a 128-bit unique value that designates from which namespace - to start the search. + @param TokenSpaceGuid The pointer to the a PCD token space GUID. - @retval CONST GUID * The next valid token namespace. + @return The next valid token namespace. **/ -GUID * +GUID * EFIAPI LibPcdGetNextTokenSpace ( - IN CONST GUID *Guid + IN CONST GUID *TokenSpaceGuid + ) +{ + GetPiPcdProtocol()->GetNextTokenSpace (&TokenSpaceGuid); + + return (GUID *)TokenSpaceGuid; +} + + +/** + Sets a value of a patchable PCD entry that is type pointer. + + Sets the PCD entry specified by PatchVariable to the value specified by Buffer + and SizeOfBuffer. Buffer is returned. If SizeOfBuffer is greater than + MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return + NULL to indicate that the set operation was not actually performed. + If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to + MaximumDatumSize and NULL must be returned. + + If PatchVariable is NULL, then ASSERT(). + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[out] PatchVariable A pointer to the global variable in a module that is + the target of the set operation. + @param[in] MaximumDatumSize The maximum size allowed for the PCD entry specified by PatchVariable. + @param[in, out] SizeOfBuffer A pointer to the size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to used to set the target variable. + + @return Return the pointer to the buffer been set. + +**/ +VOID * +EFIAPI +LibPatchPcdSetPtr ( + OUT VOID *PatchVariable, + IN UINTN MaximumDatumSize, + IN OUT UINTN *SizeOfBuffer, + IN CONST VOID *Buffer + ) +{ + ASSERT (PatchVariable != NULL); + ASSERT (SizeOfBuffer != NULL); + + if (*SizeOfBuffer > 0) { + ASSERT (Buffer != NULL); + } + + if ((*SizeOfBuffer > MaximumDatumSize) || + (*SizeOfBuffer == MAX_ADDRESS)) { + *SizeOfBuffer = MaximumDatumSize; + return NULL; + } + + CopyMem (PatchVariable, Buffer, *SizeOfBuffer); + + return (VOID *) Buffer; +} + +/** + Sets a value of a patchable PCD entry that is type pointer. + + Sets the PCD entry specified by PatchVariable to the value specified + by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than MaximumDatumSize, + then set SizeOfBuffer to MaximumDatumSize and return RETURN_INVALID_PARAMETER + to indicate that the set operation was not actually performed. + If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to + MaximumDatumSize and RETURN_INVALID_PARAMETER must be returned. + + If PatchVariable is NULL, then ASSERT(). + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[out] PatchVariable A pointer to the global variable in a module that is + the target of the set operation. + @param[in] MaximumDatumSize The maximum size allowed for the PCD entry specified by PatchVariable. + @param[in, out] SizeOfBuffer A pointer to the size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to used to set the target variable. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPatchPcdSetPtrS ( + OUT VOID *PatchVariable, + IN UINTN MaximumDatumSize, + IN OUT UINTN *SizeOfBuffer, + IN CONST VOID *Buffer + ) +{ + ASSERT (PatchVariable != NULL); + ASSERT (SizeOfBuffer != NULL); + + if (*SizeOfBuffer > 0) { + ASSERT (Buffer != NULL); + } + + if ((*SizeOfBuffer > MaximumDatumSize) || + (*SizeOfBuffer == MAX_ADDRESS)) { + *SizeOfBuffer = MaximumDatumSize; + return RETURN_INVALID_PARAMETER; + } + + CopyMem (PatchVariable, Buffer, *SizeOfBuffer); + + return RETURN_SUCCESS; +} + + +/** + Sets a value and size of a patchable PCD entry that is type pointer. + + Sets the PCD entry specified by PatchVariable to the value specified by Buffer + and SizeOfBuffer. Buffer is returned. If SizeOfBuffer is greater than + MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return + NULL to indicate that the set operation was not actually performed. + If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to + MaximumDatumSize and NULL must be returned. + + If PatchVariable is NULL, then ASSERT(). + If SizeOfPatchVariable is NULL, then ASSERT(). + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[out] PatchVariable A pointer to the global variable in a module that is + the target of the set operation. + @param[out] SizeOfPatchVariable A pointer to the size, in bytes, of PatchVariable. + @param[in] MaximumDatumSize The maximum size allowed for the PCD entry specified by PatchVariable. + @param[in, out] SizeOfBuffer A pointer to the size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to used to set the target variable. + + @return Return the pointer to the buffer been set. + +**/ +VOID * +EFIAPI +LibPatchPcdSetPtrAndSize ( + OUT VOID *PatchVariable, + OUT UINTN *SizeOfPatchVariable, + IN UINTN MaximumDatumSize, + IN OUT UINTN *SizeOfBuffer, + IN CONST VOID *Buffer + ) +{ + ASSERT (PatchVariable != NULL); + ASSERT (SizeOfPatchVariable != NULL); + ASSERT (SizeOfBuffer != NULL); + + if (*SizeOfBuffer > 0) { + ASSERT (Buffer != NULL); + } + + if ((*SizeOfBuffer > MaximumDatumSize) || + (*SizeOfBuffer == MAX_ADDRESS)) { + *SizeOfBuffer = MaximumDatumSize; + return NULL; + } + + CopyMem (PatchVariable, Buffer, *SizeOfBuffer); + *SizeOfPatchVariable = *SizeOfBuffer; + + return (VOID *) Buffer; +} + +/** + Sets a value and size of a patchable PCD entry that is type pointer. + + Sets the PCD entry specified by PatchVariable to the value specified + by Buffer and SizeOfBuffer. If SizeOfBuffer is greater than MaximumDatumSize, + then set SizeOfBuffer to MaximumDatumSize and return RETURN_INVALID_PARAMETER + to indicate that the set operation was not actually performed. + If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to + MaximumDatumSize and RETURN_INVALID_PARAMETER must be returned. + + If PatchVariable is NULL, then ASSERT(). + If SizeOfPatchVariable is NULL, then ASSERT(). + If SizeOfBuffer is NULL, then ASSERT(). + If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT(). + + @param[out] PatchVariable A pointer to the global variable in a module that is + the target of the set operation. + @param[out] SizeOfPatchVariable A pointer to the size, in bytes, of PatchVariable. + @param[in] MaximumDatumSize The maximum size allowed for the PCD entry specified by PatchVariable. + @param[in, out] SizeOfBuffer A pointer to the size, in bytes, of Buffer. + @param[in] Buffer A pointer to the buffer to used to set the target variable. + + @return The status of the set operation. + +**/ +RETURN_STATUS +EFIAPI +LibPatchPcdSetPtrAndSizeS ( + OUT VOID *PatchVariable, + OUT UINTN *SizeOfPatchVariable, + IN UINTN MaximumDatumSize, + IN OUT UINTN *SizeOfBuffer, + IN CONST VOID *Buffer + ) +{ + ASSERT (PatchVariable != NULL); + ASSERT (SizeOfPatchVariable != NULL); + ASSERT (SizeOfBuffer != NULL); + + if (*SizeOfBuffer > 0) { + ASSERT (Buffer != NULL); + } + + if ((*SizeOfBuffer > MaximumDatumSize) || + (*SizeOfBuffer == MAX_ADDRESS)) { + *SizeOfBuffer = MaximumDatumSize; + return RETURN_INVALID_PARAMETER; + } + + CopyMem (PatchVariable, Buffer, *SizeOfBuffer); + *SizeOfPatchVariable = *SizeOfBuffer; + + return RETURN_SUCCESS; +} + +/** + Retrieve additional information associated with a PCD token. + + This includes information such as the type of value the TokenNumber is associated with as well as possible + human readable name that is associated with the token. + + If TokenNumber is not in the default token space specified, then ASSERT(). + + @param[in] TokenNumber The PCD token number. + @param[out] PcdInfo The returned information associated with the requested TokenNumber. + The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName. +**/ +VOID +EFIAPI +LibPcdGetInfo ( + IN UINTN TokenNumber, + OUT PCD_INFO *PcdInfo ) { EFI_STATUS Status; - Status = mPcd->GetNextTokenSpace (&Guid); + Status = GetPcdInfoProtocolPointer()->GetInfo (TokenNumber, (EFI_PCD_INFO *) PcdInfo); + ASSERT_EFI_ERROR (Status); +} + +/** + Retrieve additional information associated with a PCD token. + + This includes information such as the type of value the TokenNumber is associated with as well as possible + human readable name that is associated with the token. + + If TokenNumber is not in the token space specified by Guid, then ASSERT(). + + @param[in] Guid The 128-bit unique value that designates the namespace from which to extract the value. + @param[in] TokenNumber The PCD token number. + @param[out] PcdInfo The returned information associated with the requested TokenNumber. + The caller is responsible for freeing the buffer that is allocated by callee for PcdInfo->PcdName. +**/ +VOID +EFIAPI +LibPcdGetInfoEx ( + IN CONST GUID *Guid, + IN UINTN TokenNumber, + OUT PCD_INFO *PcdInfo + ) +{ + EFI_STATUS Status; + Status = GetPiPcdInfoProtocolPointer()->GetInfo (Guid, TokenNumber, (EFI_PCD_INFO *) PcdInfo); ASSERT_EFI_ERROR (Status); +} - return (GUID *) Guid; +/** + Retrieve the currently set SKU Id. + + @return The currently set SKU Id. If the platform has not set at a SKU Id, then the + default SKU Id value of 0 is returned. If the platform has set a SKU Id, then the currently set SKU + Id is returned. +**/ +UINTN +EFIAPI +LibPcdGetSku ( + VOID + ) +{ + return GetPiPcdInfoProtocolPointer()->GetSku (); }