\r
**/\r
\r
-//\r
-// The package level header files this module uses\r
-//\r
+\r
#include <PiDxe.h>\r
-//\r
-// The protocols, PPI and GUID defintions for this module\r
-//\r
+\r
#include <Protocol/Pcd.h>\r
-//\r
-// The Library classes this module consumes\r
-//\r
+\r
#include <Library/PcdLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
\r
#include "DxePcdLibInternal.h"\r
\r
-static PCD_PROTOCOL *mPcd;\r
+STATIC PCD_PROTOCOL *mPcd = NULL;\r
\r
/**\r
- The constructor function caches the PCD_PROTOCOL pointer.\r
+ Retrieves PCD protocol interface.\r
\r
- @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
- @param[in] SystemTable A pointer to the EFI System Table.\r
- \r
- @retval EFI_SUCCESS The constructor always return EFI_SUCCESS.\r
+ This function retrieves PCD protocol interface. On the first invocation, it\r
+ retrieves protocol interface via UEFI boot services and cache it to accelarte\r
+ further access. A module invokes this function only when it needs to access a\r
+ dynamic PCD entry.\r
+ If UefiBootServicesTableLib has not been initialized, then ASSERT ().\r
+ If PCD protocol has not been installed, then ASSERT ().\r
+\r
+ @return mPcd The PCD protocol protocol interface.\r
\r
**/\r
-EFI_STATUS\r
-EFIAPI\r
-PcdLibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
+PCD_PROTOCOL*\r
+GetPcdProtocol (\r
+ VOID\r
)\r
{\r
EFI_STATUS Status;\r
\r
- Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **)&mPcd);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (mPcd == NULL) {\r
+ ASSERT (gBS != NULL);\r
+ //\r
+ // PCD protocol has not been installed, but a module needs to access a\r
+ // dynamic PCD entry.\r
+ // \r
+ Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **)&mPcd);\r
+ ASSERT_EFI_ERROR (Status);\r
+ ASSERT (mPcd!= NULL);\r
+ }\r
\r
- return EFI_SUCCESS;\r
+ return mPcd;\r
}\r
\r
\r
{\r
ASSERT (SkuId < 0x100);\r
\r
- mPcd->SetSku (SkuId);\r
+ (GetPcdProtocol ())->SetSku (SkuId);\r
\r
return SkuId;\r
}\r
/**\r
Returns the 8-bit value for the token specified by TokenNumber. \r
\r
- @param[in] The PCD token number to retrieve a current value for.\r
+ @param[in] TokenNumber The PCD token number to retrieve a current value for.\r
\r
@retval UINT8 Returns the 8-bit value for the token specified by TokenNumber. \r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->Get8 (TokenNumber);\r
+ return (GetPcdProtocol ())->Get8 (TokenNumber);\r
}\r
\r
\r
/**\r
Returns the 16-bit value for the token specified by TokenNumber. \r
\r
- @param[in] The PCD token number to retrieve a current value for.\r
+ @param[in] TokenNumber The PCD token number to retrieve a current value for.\r
\r
@retval UINT16 Returns the 16-bit value for the token specified by TokenNumber. \r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->Get16 (TokenNumber);\r
+ return (GetPcdProtocol ())->Get16 (TokenNumber);\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->Get32 (TokenNumber);\r
+ return (GetPcdProtocol ())->Get32 (TokenNumber);\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->Get64 (TokenNumber);\r
+ return (GetPcdProtocol ())->Get64 (TokenNumber);\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->GetPtr (TokenNumber);\r
+ return (GetPcdProtocol ())->GetPtr (TokenNumber);\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->GetBool (TokenNumber);\r
+ return (GetPcdProtocol ())->GetBool (TokenNumber);\r
}\r
\r
\r
IN UINTN TokenNumber\r
)\r
{\r
- return mPcd->GetSize (TokenNumber);\r
+ return (GetPcdProtocol ())->GetSize (TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->Get8Ex (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->Get8Ex (Guid, TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->Get16Ex (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->Get16Ex (Guid, TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->Get32Ex (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->Get32Ex (Guid, TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->Get64Ex (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->Get64Ex (Guid, TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->GetPtrEx (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->GetPtrEx (Guid, TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->GetBoolEx (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->GetBoolEx (Guid, TokenNumber);\r
}\r
\r
\r
{\r
ASSERT (Guid != NULL);\r
\r
- return mPcd->GetSizeEx (Guid, TokenNumber);\r
+ return (GetPcdProtocol ())->GetSizeEx (Guid, TokenNumber);\r
}\r
\r
\r
{\r
EFI_STATUS Status;\r
\r
- Status = mPcd->Set8 (TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set8 (TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
{\r
EFI_STATUS Status;\r
\r
- Status = mPcd->Set16 (TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set16 (TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
)\r
{\r
EFI_STATUS Status;\r
- Status = mPcd->Set32 (TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set32 (TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
{\r
EFI_STATUS Status;\r
\r
- Status = mPcd->Set64 (TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set64 (TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
If SizeOfValue > 0 and Buffer is NULL, then ASSERT().\r
\r
- @param[in] TokenNumber The PCD token number to set a current value for.\r
- @param[in,out] SizeOfBuffer The size, in bytes, of Buffer.\r
- @param[in] Value A pointer to the buffer to set.\r
+ @param[in] TokenNumber The PCD token number to set a current value for.\r
+ @param[in, out] SizeOfBuffer The size, in bytes, of Buffer.\r
+ @param[in] Buffer A pointer to the buffer to set.\r
\r
@retval VOID* Return the pointer for the buffer been set.\r
\r
ASSERT (Buffer != NULL);\r
}\r
\r
- Status = mPcd->SetPtr (TokenNumber, SizeOfBuffer, Buffer);\r
+ Status = (GetPcdProtocol ())->SetPtr (TokenNumber, SizeOfBuffer, Buffer);\r
\r
if (EFI_ERROR (Status)) {\r
return NULL;\r
to the value specified by Value. Value is returned.\r
\r
@param[in] TokenNumber The PCD token number to set a current value for.\r
- @param[in] Value The boolean value to set.\r
+ @param[in] Value The boolean value to set.\r
\r
@retval BOOLEAN Return the value been set.\r
\r
{\r
EFI_STATUS Status;\r
\r
- Status = mPcd->SetBool (TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->SetBool (TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
ASSERT (Guid != NULL);\r
\r
- Status = mPcd->Set8Ex (Guid, TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set8Ex (Guid, TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
ASSERT (Guid != NULL);\r
\r
- Status = mPcd->Set16Ex (Guid, TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set16Ex (Guid, TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
ASSERT (Guid != NULL);\r
\r
- Status = mPcd->Set32Ex (Guid, TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set32Ex (Guid, TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
ASSERT (Guid != NULL);\r
\r
- Status = mPcd->Set64Ex (Guid, TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->Set64Ex (Guid, TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
ASSERT (Buffer != NULL);\r
}\r
\r
- Status = mPcd->SetPtrEx (Guid, TokenNumber, SizeOfBuffer, Buffer);\r
+ Status = (GetPcdProtocol ())->SetPtrEx (Guid, TokenNumber, SizeOfBuffer, Buffer);\r
\r
if (EFI_ERROR (Status)) {\r
return NULL;\r
\r
ASSERT (Guid != NULL);\r
\r
- Status = mPcd->SetBoolEx (Guid, TokenNumber, Value);\r
+ Status = (GetPcdProtocol ())->SetBoolEx (Guid, TokenNumber, Value);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
ASSERT (NotificationFunction != NULL);\r
\r
- Status = mPcd->CallbackOnSet (Guid, TokenNumber, NotificationFunction);\r
+ Status = (GetPcdProtocol ())->CallbackOnSet (Guid, TokenNumber, NotificationFunction);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
ASSERT (NotificationFunction != NULL);\r
\r
- Status = mPcd->CancelCallback (Guid, TokenNumber, NotificationFunction);\r
+ Status = (GetPcdProtocol ())->CancelCallback (Guid, TokenNumber, NotificationFunction);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
token number in the token space, then 0 is returned. If TokenNumber is not 0 and \r
is not in the token space specified by Guid, then ASSERT().\r
\r
- @param[in] Pointer to a 128-bit unique value that designates which namespace \r
- to set a value from. If NULL, then the default token space is used.\r
- @param[in] The previous PCD token number. If 0, then retrieves the first PCD \r
- token number.\r
+ @param[in] Guid Pointer to a 128-bit unique value that designates which namespace \r
+ to set a value from. If NULL, then the default token space is used.\r
+ @param[in] TokenNumber The previous PCD token number. If 0, then retrieves the first PCD \r
+ token number.\r
\r
@retval UINTN The next valid token number.\r
\r
{\r
EFI_STATUS Status;\r
\r
- Status = mPcd->GetNextToken (Guid, &TokenNumber);\r
+ Status = (GetPcdProtocol ())->GetNextToken (Guid, &TokenNumber);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r
\r
\r
\r
- @param[in] Pointer to a 128-bit unique value that designates from which namespace \r
- to start the search.\r
+ @param[in] Guid Pointer to a 128-bit unique value that designates from which namespace \r
+ to start the search.\r
\r
@retval CONST GUID * The next valid token namespace.\r
\r
{\r
EFI_STATUS Status;\r
\r
- Status = mPcd->GetNextTokenSpace (&Guid);\r
+ Status = (GetPcdProtocol ())->GetNextTokenSpace (&Guid);\r
\r
ASSERT_EFI_ERROR (Status);\r
\r