]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/PeiPcdLib/PeiPcdLib.c
refine code.
[mirror_edk2.git] / MdePkg / Library / PeiPcdLib / PeiPcdLib.c
index 4018e44f702b45514164bbbeb195bcf6dc5711f8..03ef1d7f261c4cb1f4ee5981df955df820853ee0 100644 (file)
@@ -11,52 +11,50 @@ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
 \r
 \r
-Module Name: PeiPcdLib.c\r
-\r
 **/\r
 \r
 \r
 \r
+\r
+#include <PiPei.h>\r
+\r
+#include <Ppi/Pcd.h>\r
+\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PeiServicesTablePointerLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
 /**\r
-  The constructor function retrieve the PCD_PPI pointer.\r
+  Retrieve the PCD_PPI pointer.\r
 \r
-  @param[in] VOID\r
+  This function is to locate PCD_PPI PPI via PeiService. \r
+  If fail to locate PCD_PPI, then ASSERT_EFI_ERROR().\r
   \r
   @retval PCD_PPI * The pointer to the PCD_PPI.\r
 \r
 **/\r
 PCD_PPI  *\r
-GetPcdPpiPtr (\r
+GetPcdPpiPointer (\r
   VOID\r
   ) \r
 {\r
   EFI_STATUS        Status;\r
   PCD_PPI           *PcdPpi;\r
-  EFI_PEI_SERVICES  **PeiServices;\r
-\r
-\r
-  PeiServices = GetPeiServicesTablePointer ();\r
-\r
-  Status = (**PeiServices).LocatePpi (\r
-                             PeiServices,\r
-                             &gPcdPpiGuid,\r
-                             0,\r
-                             NULL,\r
-                             (VOID **)&PcdPpi\r
-                             );\r
-\r
+  \r
+  Status = PeiServicesLocatePpi (&gPcdPpiGuid, 0, NULL, (VOID **)&PcdPpi);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   return PcdPpi;\r
 }\r
 \r
-\r
-\r
 /**\r
   Sets the current SKU in the PCD database to the value specified by SkuId.  SkuId is returned.\r
-\r
-  @param[in]  SkuId The SKU value that will be used when the PCD service will retrieve and \r
-              set values associated with a PCD token.\r
+  If SkuId not less than PCD_MAX_SKU_ID, then ASSERT().\r
+  \r
+  @param[in]  System sku id. The SKU value that will be used when the PCD service will retrieve and \r
+              set values.\r
 \r
   @retval SKU_ID Return the SKU ID that just be set.\r
 \r
@@ -68,7 +66,9 @@ LibPcdSetSku (
   )\r
 {\r
 \r
-  GetPcdPpiPtr()->SetSku (SkuId);;\r
+  ASSERT (SkuId < PCD_MAX_SKU_ID);\r
+\r
+  GetPcdPpiPointer()->SetSku (SkuId);\r
 \r
   return SkuId;\r
 }\r
@@ -78,7 +78,7 @@ LibPcdSetSku (
 /**\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
@@ -89,11 +89,7 @@ LibPcdGet8 (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->Get8 (TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get8 (TokenNumber);\r
 }\r
 \r
 \r
@@ -101,7 +97,7 @@ LibPcdGet8 (
 /**\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
@@ -112,11 +108,7 @@ LibPcdGet16 (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI  *PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->Get16 (TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get16 (TokenNumber);\r
 }\r
 \r
 \r
@@ -135,11 +127,7 @@ LibPcdGet32 (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->Get32 (TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get32 (TokenNumber);\r
 }\r
 \r
 \r
@@ -158,11 +146,7 @@ LibPcdGet64 (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->Get64 (TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get64 (TokenNumber);\r
 }\r
 \r
 \r
@@ -181,11 +165,7 @@ LibPcdGetPtr (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->GetPtr (TokenNumber);\r
+  return (GetPcdPpiPointer ())->GetPtr (TokenNumber);\r
 }\r
 \r
 \r
@@ -204,11 +184,7 @@ LibPcdGetBool (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->GetBool (TokenNumber);\r
+  return (GetPcdPpiPointer ())->GetBool (TokenNumber);\r
 }\r
 \r
 \r
@@ -227,11 +203,7 @@ LibPcdGetSize (
   IN UINTN                        TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->GetSize (TokenNumber);\r
+  return (GetPcdPpiPointer ())->GetSize (TokenNumber);\r
 }\r
 \r
 \r
@@ -254,11 +226,9 @@ LibPcdGetEx8 (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
+  ASSERT (Guid != NULL);\r
 \r
-  return PcdPpi->Get8Ex (Guid, TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get8Ex (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -281,11 +251,10 @@ LibPcdGetEx16 (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
+  ASSERT (Guid != NULL);\r
 \r
-  return PcdPpi->Get16Ex (Guid, TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get16Ex (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -308,11 +277,9 @@ LibPcdGetEx32 (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
+  ASSERT (Guid != NULL);\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->Get32Ex (Guid, TokenNumber);\r
+  return (GetPcdPpiPointer ())->Get32Ex (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -336,11 +303,8 @@ LibPcdGetEx64 (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->Get64Ex (Guid, TokenNumber);\r
+  ASSERT (Guid != NULL);\r
+  return (GetPcdPpiPointer ())->Get64Ex (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -363,11 +327,9 @@ LibPcdGetExPtr (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
+  ASSERT (Guid != NULL);\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->GetPtrEx (Guid, TokenNumber);\r
+  return (GetPcdPpiPointer ())->GetPtrEx (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -390,11 +352,8 @@ LibPcdGetExBool (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->GetBoolEx (Guid, TokenNumber);\r
+  ASSERT (Guid != NULL);\r
+  return (GetPcdPpiPointer ())->GetBoolEx (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -417,11 +376,8 @@ LibPcdGetExSize (
   IN UINTN             TokenNumber\r
   )\r
 {\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-  return PcdPpi->GetSizeEx (Guid, TokenNumber);\r
+  ASSERT (Guid != NULL);\r
+  return (GetPcdPpiPointer ())->GetSizeEx (Guid, TokenNumber);\r
 }\r
 \r
 \r
@@ -429,6 +385,7 @@ LibPcdGetExSize (
 /**\r
   Sets the 8-bit value for the token specified by TokenNumber \r
   to the value specified by Value.  Value is returned.\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  TokenNumber The PCD token number to set a current value for.\r
   @param[in]  Value The 8-bit value to set.\r
@@ -444,12 +401,8 @@ LibPcdSet8 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
 \r
-\r
-  Status = PcdPpi->Set8 (TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set8 (TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
   \r
@@ -461,6 +414,7 @@ LibPcdSet8 (
 /**\r
   Sets the 16-bit value for the token specified by TokenNumber \r
   to the value specified by Value.  Value is returned.\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  TokenNumber The PCD token number to set a current value for.\r
   @param[in]  Value The 16-bit value to set.\r
@@ -476,12 +430,8 @@ LibPcdSet16 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
 \r
-\r
-  Status = PcdPpi->Set16 (TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set16 (TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
   \r
@@ -493,6 +443,7 @@ LibPcdSet16 (
 /**\r
   Sets the 32-bit value for the token specified by TokenNumber \r
   to the value specified by Value.  Value is returned.\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  TokenNumber The PCD token number to set a current value for.\r
   @param[in]  Value The 32-bit value to set.\r
@@ -508,11 +459,8 @@ LibPcdSet32 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
 \r
-  Status = PcdPpi->Set32 (TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set32 (TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -524,6 +472,7 @@ LibPcdSet32 (
 /**\r
   Sets the 64-bit value for the token specified by TokenNumber \r
   to the value specified by Value.  Value is returned.\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  TokenNumber The PCD token number to set a current value for.\r
   @param[in]  Value The 64-bit value to set.\r
@@ -539,12 +488,8 @@ LibPcdSet64 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-\r
-  Status = PcdPpi->Set64 (TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set64 (TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -555,21 +500,22 @@ LibPcdSet64 (
 \r
 /**\r
   Sets a buffer for the token specified by TokenNumber to \r
-  the value specified by Buffer and SizeOfValue.  Buffer to\r
+  the value specified by Buffer and SizeOfBuffer.  Buffer to\r
   be set is returned. The content of the buffer could be \r
   overwritten if a Callback on SET is registered with this\r
   TokenNumber.\r
   \r
-  If SizeOfValue is greater than the maximum \r
-  size support by TokenNumber, then set SizeOfValue to the \r
+  If SizeOfBuffer is greater than the maximum \r
+  size support by TokenNumber, then set SizeOfBuffer to the \r
   maximum size supported by TokenNumber and return NULL to \r
   indicate that the set operation was not actually performed. \r
   \r
-  If SizeOfValue > 0 and Buffer is NULL, then ASSERT().\r
+  If SizeOfBuffer > 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
+                                    In out, returns actual size of buffer is set.\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
@@ -583,26 +529,19 @@ LibPcdSetPtr (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI    *PcdPpi;\r
-  UINTN      Size;\r
+\r
+  ASSERT (SizeOfBuffer != NULL);\r
 \r
   if (*SizeOfBuffer > 0) {\r
     ASSERT (Buffer != NULL);\r
   }\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-  \r
-  Size = LibPcdGetSize (TokenNumber);\r
   \r
-  if (*SizeOfBuffer > Size) {\r
-    *SizeOfBuffer = Size;\r
+  Status = (GetPcdPpiPointer ())->SetPtr (TokenNumber, SizeOfBuffer, Buffer);\r
+\r
+  if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
 \r
-  Status = PcdPpi->SetPtr (TokenNumber, *SizeOfBuffer, Buffer);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   return Buffer;\r
 }\r
 \r
@@ -611,6 +550,7 @@ LibPcdSetPtr (
 /**\r
   Sets the Boolean value for the token specified by TokenNumber \r
   to the value specified by Value.  Value is returned.\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\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
@@ -626,12 +566,8 @@ LibPcdSetBool (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
 \r
-\r
-  Status = PcdPpi->SetBool (TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->SetBool (TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -644,6 +580,7 @@ LibPcdSetBool (
   Sets the 8-bit value for the token specified by TokenNumber and \r
   Guid to the value specified by Value. Value is returned.\r
   If Guid is NULL, then ASSERT().\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  Guid Pointer to a 128-bit unique value that \r
               designates which namespace to set a value from.\r
@@ -662,12 +599,10 @@ LibPcdSetEx8 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
 \r
+  ASSERT (Guid != NULL);\r
 \r
-  Status = PcdPpi->Set8Ex (Guid, TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set8Ex (Guid, TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -680,13 +615,14 @@ LibPcdSetEx8 (
   Sets the 16-bit value for the token specified by TokenNumber and \r
   Guid to the value specified by Value. Value is returned.\r
   If Guid is NULL, then ASSERT().\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  Guid Pointer to a 128-bit unique value that \r
               designates which namespace to set a value from.\r
   @param[in]  TokenNumber The PCD token number to set a current value for.\r
   @param[in]  Value The 16-bit value to set.\r
 \r
-  @retval UINT8 Return the value been set.\r
+  @retval UINT16 Return the value been set.\r
 \r
 **/\r
 UINT16\r
@@ -698,12 +634,8 @@ LibPcdSetEx16 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-\r
-  Status = PcdPpi->Set16Ex (Guid, TokenNumber, Value);\r
+  ASSERT (Guid != NULL);\r
+  Status = (GetPcdPpiPointer ())->Set16Ex (Guid, TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -716,6 +648,7 @@ LibPcdSetEx16 (
   Sets the 32-bit value for the token specified by TokenNumber and \r
   Guid to the value specified by Value. Value is returned.\r
   If Guid is NULL, then ASSERT().\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  Guid Pointer to a 128-bit unique value that \r
               designates which namespace to set a value from.\r
@@ -734,12 +667,10 @@ LibPcdSetEx32 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
+  ASSERT (Guid != NULL);\r
 \r
-\r
-  Status = PcdPpi->Set32Ex (Guid, TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set32Ex (Guid, TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -752,6 +683,7 @@ LibPcdSetEx32 (
   Sets the 64-bit value for the token specified by TokenNumber and \r
   Guid to the value specified by Value. Value is returned.\r
   If Guid is NULL, then ASSERT().\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  Guid Pointer to a 128-bit unique value that \r
               designates which namespace to set a value from.\r
@@ -770,12 +702,9 @@ LibPcdSetEx64 (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
+  ASSERT (Guid != NULL);\r
 \r
-\r
-  Status = PcdPpi->Set64Ex (Guid, TokenNumber, Value);\r
+  Status = (GetPcdPpiPointer ())->Set64Ex (Guid, TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -786,17 +715,18 @@ LibPcdSetEx64 (
 \r
 /**\r
   Sets a buffer for the token specified by TokenNumber to the value specified by \r
-  Buffer and SizeOfValue.  Buffer is returned.  If SizeOfValue is greater than \r
-  the maximum size support by TokenNumber, then set SizeOfValue to the maximum size \r
+  Buffer and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than \r
+  the maximum size support by TokenNumber, then set SizeOfBuffer to the maximum size \r
   supported by TokenNumber and return NULL to indicate that the set operation \r
   was not actually performed. \r
   \r
-  If SizeOfValue > 0 and Buffer is NULL, then ASSERT().\r
+  If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().\r
   \r
   @param[in]  Guid Pointer to a 128-bit unique value that \r
               designates which namespace to set a value from.\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
+                  In out, returns actual size of buffer is set.\r
   @param[in]  Buffer A pointer to the buffer to set.\r
 \r
   @retval VOID * Return the pinter to the buffer been set.\r
@@ -812,25 +742,18 @@ LibPcdSetExPtr (
   )\r
 {\r
   EFI_STATUS      Status;\r
-  PCD_PPI         *PcdPpi;\r
-  UINTN           Size;\r
-\r
+  ASSERT (SizeOfBuffer != NULL);\r
   if (*SizeOfBuffer > 0) {\r
     ASSERT (Buffer != NULL);\r
   }\r
+  ASSERT (Guid != NULL);\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
+  Status = (GetPcdPpiPointer ())->SetPtrEx (Guid, TokenNumber, SizeOfBuffer, Buffer);\r
 \r
-  Size = LibPcdGetExSize (Guid, TokenNumber);\r
-  if (*SizeOfBuffer > Size) {\r
-    *SizeOfBuffer = Size;\r
+  if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
 \r
-  Status = PcdPpi->SetPtrEx (Guid, TokenNumber, *SizeOfBuffer, Buffer);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   return Buffer;\r
 }\r
 \r
@@ -840,6 +763,7 @@ LibPcdSetExPtr (
   Sets the Boolean value for the token specified by TokenNumber and \r
   Guid to the value specified by Value. Value is returned.\r
   If Guid is NULL, then ASSERT().\r
+  If fail to set pcd value, then ASSERT_EFI_ERROR().\r
   \r
   @param[in]  Guid Pointer to a 128-bit unique value that \r
               designates which namespace to set a value from.\r
@@ -858,12 +782,9 @@ LibPcdSetExBool (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
 \r
-  Status = PcdPpi->SetBoolEx (Guid, TokenNumber, Value);\r
+  ASSERT (Guid != NULL);\r
+  Status = (GetPcdPpiPointer ())->SetBoolEx (Guid, TokenNumber, Value);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -877,7 +798,7 @@ LibPcdSetExBool (
   then notification function specified by NotificationFunction is called.  \r
   If Guid is NULL, then the default token space is used. \r
   If NotificationFunction is NULL, then ASSERT().\r
-\r
+  If fail to set callback, then ASSERT_EFI_ERROR().\r
   @param[in]  Guid Pointer to a 128-bit unique value that designates which \r
               namespace to set a value from.  If NULL, then the default \r
               token space is used.\r
@@ -897,12 +818,8 @@ LibPcdCallbackOnSet (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
 \r
-  Status = PcdPpi->CallbackOnSet (TokenNumber, Guid, NotificationFunction);\r
+  Status = (GetPcdPpiPointer ())->CallbackOnSet (Guid, TokenNumber, NotificationFunction);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -914,7 +831,8 @@ LibPcdCallbackOnSet (
 /**\r
   Disable a notification function that was established with LibPcdCallbackonSet().\r
   If NotificationFunction is NULL, then ASSERT().\r
-\r
+  If fail to cancel callback, then ASSERT_EFI_ERROR().\r
+  \r
   @param[in]  Guid Specify the GUID token space.\r
   @param[in]  TokenNumber Specify the token number.\r
   @param[in]  NotificationFunction The callback function to be unregistered.\r
@@ -931,12 +849,8 @@ LibPcdCancelCallback (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
-\r
-  PcdPpi = GetPcdPpiPtr ();\r
 \r
-\r
-  Status = PcdPpi->CancelCallback (TokenNumber, Guid, NotificationFunction);\r
+  Status = (GetPcdPpiPointer ())->CancelCallback (Guid, TokenNumber, NotificationFunction);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -952,11 +866,12 @@ LibPcdCancelCallback (
   follows TokenNumber in the token space is returned.  If TokenNumber is the last \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
+  If fail to get token in given token space, then ASSERT_EFI_ERROR().\r
+  \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
@@ -969,12 +884,8 @@ LibPcdGetNextToken (
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
-\r
-\r
-  Status = PcdPpi->GetNextToken (Guid, &TokenNumber);\r
+  Status = (GetPcdPpiPointer ())->GetNextToken (Guid, &TokenNumber);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -988,33 +899,80 @@ LibPcdGetNextToken (
   platform. If Guid is NULL, then the GUID of the first non-local token space of the \r
   current platform is returned. If Guid is the last non-local token space, \r
   then NULL is returned. \r
-\r
+  If fail to get next token space, then ASSERT_EFI_ERROR().\r
+  \r
   If Guid is not NULL and is not a valid token space in the current platform, then ASSERT().\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
-CONST GUID*           \r
+GUID *           \r
 EFIAPI\r
 LibPcdGetNextTokenSpace (\r
   IN CONST GUID  *Guid\r
   )\r
 {\r
   EFI_STATUS Status;\r
-  PCD_PPI * PcdPpi;\r
 \r
-  PcdPpi = GetPcdPpiPtr ();\r
+  Status = (GetPcdPpiPointer ())->GetNextTokenSpace (&Guid);\r
 \r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = PcdPpi->GetNextTokenSpace (&Guid);\r
+  return (GUID *)Guid;\r
+}\r
 \r
-  ASSERT_EFI_ERROR (Status);\r
 \r
-  return Guid;\r
+\r
+/**\r
+  Sets the PCD entry specified by PatchVariable to the value specified by Buffer \r
+  and SizeOfBuffer.  Buffer is returned.  If SizeOfBuffer is greater than \r
+  MaximumDatumSize, then set SizeOfBuffer to MaximumDatumSize and return \r
+  NULL to indicate that the set operation was not actually performed.  \r
+  If SizeOfBuffer is set to MAX_ADDRESS, then SizeOfBuffer must be set to \r
+  MaximumDatumSize and NULL must be returned.\r
+  \r
+  If PatchVariable is NULL, then ASSERT().\r
+  If SizeOfBuffer is NULL, then ASSERT().\r
+  If SizeOfBuffer > 0 and Buffer is NULL, then ASSERT().\r
+\r
+  @param[in] PatchVariable      A pointer to the global variable in a module that is \r
+                                the target of the set operation.\r
+  @param[in] MaximumDatumSize   The maximum size allowed for the PCD entry specified by PatchVariable.\r
+  @param[in, out] SizeOfBuffer  A pointer to the size, in bytes, of Buffer.\r
+                                In out, returns actual size of buffer is set.\r
+  @param[in] Buffer             A pointer to the buffer to used to set the target variable.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+LibPatchPcdSetPtr (\r
+  IN        VOID        *PatchVariable,\r
+  IN        UINTN       MaximumDatumSize,\r
+  IN OUT    UINTN       *SizeOfBuffer,\r
+  IN CONST  VOID        *Buffer\r
+  )\r
+{\r
+  ASSERT (PatchVariable != NULL);\r
+  ASSERT (SizeOfBuffer  != NULL);\r
+  \r
+  if (*SizeOfBuffer > 0) {\r
+    ASSERT (Buffer != NULL);\r
+  }\r
+\r
+  if ((*SizeOfBuffer > MaximumDatumSize) ||\r
+      (*SizeOfBuffer == MAX_ADDRESS)) {\r
+    *SizeOfBuffer = MaximumDatumSize;\r
+    return NULL;\r
+  }\r
+    \r
+  CopyMem (PatchVariable, Buffer, *SizeOfBuffer);\r
+  \r
+  return (VOID *) Buffer;\r
 }\r
 \r
+\r