Add in support for MaxSize and CurrentSize for PCD entry.
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 6 Jul 2006 06:10:20 +0000 (06:10 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 6 Jul 2006 06:10:20 +0000 (06:10 +0000)
Change the behavior for PcdSET for Variable_Enabled Pcd entry. If a Variable does not exist, we will only save the value to a volatile space. We save it to variable ONLY when the variable exist.

Fix a few bugs in Pcd Build tool when generated Pcd database for Pcd entry with Unicode String type.

Support PcdSet to return MaxSize if the input SizeOfBuffer is greater than the Max Size declared in FPD file.

Add SetValueWorker and GetValueWoker for each PcdSET and PcdGET function to reduce code size.

Sync function prototype definition for PCD_PPI_SET_POINTER, PCD_PPI_SET_EX_POINTER, PCD_PROTOCOL_SET_POINTER and PCD_PROTOCOL_SET_EX_POINTER with PCD arch spec 0.52.

Add ASSERTION in LibPcdSetPtr.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@789 6f19259b-4bc3-4df7-8a09-765794883524

14 files changed:
EdkModulePkg/Universal/PCD/Dxe/Pcd.c
EdkModulePkg/Universal/PCD/Dxe/Service.c
EdkModulePkg/Universal/PCD/Dxe/Service.h
EdkModulePkg/Universal/PCD/Pei/Pcd.c
EdkModulePkg/Universal/PCD/Pei/Service.c
EdkModulePkg/Universal/PCD/Pei/Service.h
MdePkg/Include/Ppi/Pcd.h
MdePkg/Include/Protocol/Pcd.h
MdePkg/Library/BasePcdLibNull/PcdLib.c
MdePkg/Library/DxePcdLib/DxePcdLib.c
MdePkg/Library/PeiPcdLib/PeiPcdLib.c
Tools/Conf/Pcd/PcdDatabaseCommonDefinitions.sample
Tools/Source/GenBuild/org/tianocore/build/pcd/action/CollectPCDAction.java
Tools/Source/GenBuild/org/tianocore/build/pcd/entity/Token.java

index 26bb7d807e02cae2b53a92006bb7f45338441a09..3e35363a3b345f679bc867de09664cd1eaebcc99 100644 (file)
@@ -182,21 +182,44 @@ DxePcdGetSize (
   IN UINTN                     TokenNumber\r
   )\r
 {\r
-  UINT16 * SizeTable;\r
+  UINTN   Size;\r
+  UINT32  *LocalTokenNumberTable;\r
+  BOOLEAN IsPeiDb;\r
+  UINTN   MaxSize;\r
+  UINTN   TmpTokenNumber;\r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
   // as the array index.\r
   //\r
   TokenNumber--;\r
+\r
+  //\r
+  // Backup the TokenNumber passed in as GetPtrTypeSize need the original TokenNumber\r
+  // \r
+  TmpTokenNumber = TokenNumber;\r
+\r
+  ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
+\r
+  IsPeiDb = (BOOLEAN) (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
   \r
-  SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? mPcdDatabase->PeiDb.Init.SizeTable :\r
-                                                    mPcdDatabase->DxeDb.Init.SizeTable;\r
+  TokenNumber = IsPeiDb ? TokenNumber : \r
+                          (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
 \r
+  LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable \r
+                                  : mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
 \r
-  TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
+  Size = (LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
+\r
+  if (Size == 0) {\r
+    //\r
+    // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
+    //\r
+    return GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
+  } else {\r
+    return Size;\r
+  }\r
 \r
-  return SizeTable[TokenNumber];\r
 }\r
 \r
 \r
@@ -256,7 +279,7 @@ DxePcdGetPtrEx (
   IN UINTN                 ExTokenNumber\r
   )\r
 {\r
-  return ExGetWorker (Guid, ExTokenNumber, 0);\r
+  return  ExGetWorker (Guid, ExTokenNumber, 0);\r
 }\r
 \r
 \r
@@ -292,7 +315,7 @@ DxePcdSet8 (
   IN UINT8              Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -304,7 +327,7 @@ DxePcdSet16 (
   IN UINT16             Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -316,7 +339,7 @@ DxePcdSet32 (
   IN UINT32             Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -328,7 +351,7 @@ DxePcdSet64 (
   IN UINT64             Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -336,9 +359,9 @@ DxePcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetPtr (\r
-  IN UINTN              TokenNumber,\r
-  IN UINTN              SizeOfBuffer,\r
-  IN VOID               *Buffer\r
+  IN          UINTN              TokenNumber,\r
+  IN OUT      UINTN              *SizeOfBuffer,\r
+  IN          VOID               *Buffer\r
   )\r
 {\r
   return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
@@ -353,7 +376,7 @@ DxePcdSetBool (
   IN BOOLEAN            Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -366,13 +389,7 @@ DxePcdSet8Ex (
   IN UINT8                  Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return  ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -385,13 +402,7 @@ DxePcdSet16Ex (
   IN UINT16            Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return  ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -404,13 +415,7 @@ DxePcdSet32Ex (
   IN UINT32             Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return  ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -423,13 +428,7 @@ DxePcdSet64Ex (
   IN UINT64            Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return  ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -437,19 +436,13 @@ DxePcdSet64Ex (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetPtrEx (\r
-  IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  ExTokenNumber,\r
-  IN UINTN                  SizeOfBuffer,\r
-  IN VOID                   *Buffer\r
+  IN            CONST EFI_GUID         *Guid,\r
+  IN            UINTN                  ExTokenNumber,\r
+  IN OUT        UINTN                  *SizeOfBuffer,\r
+  IN            VOID                   *Buffer\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              Buffer, \r
-                              SizeOfBuffer, \r
-                              TRUE\r
-                              );\r
+  return  ExSetWorker(ExTokenNumber, Guid, Buffer, SizeOfBuffer, TRUE);\r
 }\r
 \r
 \r
@@ -462,13 +455,7 @@ DxePcdSetBoolEx (
   IN BOOLEAN           Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              TRUE\r
-                              );\r
+  return  ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
index 771c4db54d77cca45038ba4ffd12e6b43abbd56c..f175b14db238635ddad4aca521671305c90a4cd4 100644 (file)
@@ -35,20 +35,22 @@ GetWorker (
   UINT32              *LocalTokenNumberTable;\r
   UINT16              *SizeTable;\r
   BOOLEAN             IsPeiDb;\r
-  UINTN               Size;\r
   UINT32              Offset;\r
   EFI_GUID            *GuidTable;\r
   UINT16              *StringTable;\r
   EFI_GUID            *Guid;\r
   UINT16              *Name;\r
   VARIABLE_HEAD       *VariableHead;\r
+  UINT8               *VaraiableDefaultBuffer;\r
   EFI_STATUS          Status;\r
   UINTN               DataSize;\r
-  VOID                *Data;\r
+  UINT8               *Data;\r
   VPD_HEAD            *VpdHead;\r
   UINT8               *PcdDb;\r
   UINT16              StringTableIdx;      \r
   UINT32              LocalTokenNumber;\r
+  UINTN               MaxSize;\r
+  UINTN               TmpTokenNumber;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -56,11 +58,12 @@ GetWorker (
   // as the array index.\r
   //\r
   TokenNumber--;\r
+\r
+  TmpTokenNumber = TokenNumber;\r
   \r
   ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
 \r
-  Size = DxePcdGetSize (TokenNumber + 1);\r
-  ASSERT (GetSize == Size || GetSize == 0);\r
+  ASSERT ((GetSize == DxePcdGetSize (TokenNumber + 1)) || (GetSize == 0));\r
 \r
   \r
   IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
@@ -77,7 +80,12 @@ GetWorker (
   LocalTokenNumber = LocalTokenNumberTable[TokenNumber];\r
   \r
   if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
+    if (GetSize == 0) {\r
+      GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
+    } else {\r
+      MaxSize = GetSize;\r
+    }\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize, IsPeiDb);\r
   }\r
 \r
   PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);\r
@@ -86,7 +94,7 @@ GetWorker (
   \r
   Offset     = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
   \r
-  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
       VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
       return (VOID *) (UINTN) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
@@ -99,16 +107,31 @@ GetWorker (
       \r
       Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
       Name = &(StringTable[VariableHead->StringIndex]);\r
+      VaraiableDefaultBuffer = (UINT8 *) PcdDb + VariableHead->DefaultValueOffset;\r
 \r
       Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
       if (Status == EFI_SUCCESS) {\r
-        return (UINT8 *) Data + VariableHead->Offset;\r
-      } else {\r
-        //\r
-        // Return the default value specified by Platform Integrator \r
-        //\r
-        return (VOID *) ((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);\r
-     }\r
+        if (GetSize == 0) {\r
+          //\r
+          // It is a pointer type. So get the MaxSize reserved for\r
+          // this PCD entry.\r
+          //\r
+          GetPtrTypeSize (TokenNumber, &GetSize);\r
+        }\r
+        CopyMem (VaraiableDefaultBuffer, Data + VariableHead->Offset, GetSize);\r
+        FreePool (Data);\r
+      }\r
+      //\r
+      // If the operation is successful, we copy the data\r
+      // to the default value buffer in the PCD Database.\r
+      // So that we can free the Data allocated in GetHiiVariable.\r
+      //\r
+      //\r
+      // If the operation is not successful, \r
+      // Return 1) either the default value specified by Platform Integrator \r
+      //        2) Or the value Set by a PCD set operation.\r
+      //\r
+      return (VOID *) VaraiableDefaultBuffer;\r
 \r
     case PCD_TYPE_STRING:\r
       StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
@@ -352,7 +375,7 @@ EFI_STATUS
 GetHiiVariable (\r
   IN  EFI_GUID      *VariableGuid,\r
   IN  UINT16        *VariableName,\r
-  OUT VOID          ** VariableData,\r
+  OUT VOID          **VariableData,\r
   OUT UINTN         *VariableSize\r
   )\r
 {\r
@@ -372,7 +395,6 @@ GetHiiVariable (
     );\r
   \r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
-\r
     Buffer = AllocatePool (Size);\r
 \r
     ASSERT (Buffer != NULL);\r
@@ -386,13 +408,11 @@ GetHiiVariable (
       );\r
 \r
     ASSERT (Status == EFI_SUCCESS);\r
+    *VariableData = Buffer;\r
+    *VariableSize = Size;\r
   }\r
 \r
-  *VariableData = Buffer;\r
-  *VariableSize = Size;\r
-\r
   return Status;\r
-\r
 }\r
 \r
 \r
@@ -429,7 +449,7 @@ GetSkuEnabledTokenNumber (
   }\r
   ASSERT (i < SkuIdTable[0]);\r
 \r
-  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
       Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]);\r
       return (UINT32) ((Value - PcdDb) | PCD_TYPE_VPD);\r
@@ -437,11 +457,15 @@ GetSkuEnabledTokenNumber (
     case PCD_TYPE_HII:\r
       Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]);\r
       return (UINT32) ((Value - PcdDb) | PCD_TYPE_HII);\r
+\r
+    case PCD_TYPE_STRING:\r
+      Value = (UINT8 *) &(((STRING_HEAD *) Value)[i]);\r
+      return (UINT32) ((Value - PcdDb) | PCD_TYPE_STRING);\r
       \r
     case PCD_TYPE_DATA:\r
       Value += Size * i;\r
       return (UINT32) (Value - PcdDb);\r
-      \r
+\r
     default:\r
       ASSERT (FALSE);\r
   }\r
@@ -494,14 +518,23 @@ InvokeCallbackOnSet (
 }\r
 \r
 \r
+EFI_STATUS\r
+SetValueWorker (\r
+  IN UINTN                   TokenNumber,\r
+  IN VOID                    *Data,\r
+  IN UINTN                   Size\r
+  )\r
+{\r
+  return SetWorker (TokenNumber, Data, &Size, FALSE);\r
+}\r
 \r
 \r
 EFI_STATUS\r
 SetWorker (\r
-  UINTN                   TokenNumber,\r
-  VOID                    *Data,\r
-  UINTN                   Size,\r
-  BOOLEAN                 PtrType\r
+  IN          UINTN                   TokenNumber,\r
+  IN          VOID                    *Data,\r
+  IN OUT      UINTN                   *Size,\r
+  IN          BOOLEAN                 PtrType\r
   )\r
 {\r
   UINT32              *LocalTokenNumberTable;\r
@@ -516,6 +549,9 @@ SetWorker (
   VARIABLE_HEAD       *VariableHead;\r
   UINTN               Offset;\r
   UINT8               *PcdDb;\r
+  EFI_STATUS          Status;\r
+  UINTN               MaxSize;\r
+  UINTN               TmpTokenNumber;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -523,13 +559,13 @@ SetWorker (
   // as the array index.\r
   //\r
   TokenNumber--;\r
+\r
+  TmpTokenNumber = TokenNumber;\r
   \r
   ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
 \r
-  if (PtrType) {\r
-    ASSERT (Size <= DxePcdGetSize (TokenNumber + 1));\r
-  } else {\r
-    ASSERT (Size == DxePcdGetSize (TokenNumber + 1));\r
+  if (!PtrType) {\r
+    ASSERT (*Size == DxePcdGetSize (TokenNumber + 1));\r
   }\r
   \r
   IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
@@ -539,7 +575,7 @@ SetWorker (
 \r
   if ((TokenNumber < PEI_NEX_TOKEN_NUMBER) ||\r
       (TokenNumber >= PEI_LOCAL_TOKEN_NUMBER || TokenNumber < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER))) {\r
-    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size);\r
+    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);\r
   }\r
 \r
   TokenNumber = IsPeiDb ? TokenNumber\r
@@ -548,7 +584,12 @@ SetWorker (
   LocalTokenNumber = LocalTokenNumberTable[TokenNumber];\r
   \r
   if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
+    if (PtrType) {\r
+      GetPtrTypeSize (TmpTokenNumber, &MaxSize);\r
+    } else {\r
+      MaxSize = *Size;\r
+    }\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize, IsPeiDb);\r
   }\r
 \r
   Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
@@ -560,19 +601,26 @@ SetWorker (
   \r
   InternalData = PcdDb + Offset;\r
 \r
-  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
       ASSERT (FALSE);\r
       return EFI_INVALID_PARAMETER;\r
     \r
     case PCD_TYPE_STRING:\r
-      CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, Size);\r
-      return EFI_SUCCESS;\r
+      if (SetPtrTypeSize (TokenNumber, Size)) {\r
+        CopyMem (&StringTable[*((UINT16 *)InternalData)], Data, *Size);\r
+        return EFI_SUCCESS;\r
+      } else {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
 \r
     case PCD_TYPE_HII:\r
-      //\r
-      // Bug Bug: Please implement this\r
-      //\r
+      if (PtrType) {\r
+        if (!SetPtrTypeSize (TokenNumber, Size)) {\r
+          return EFI_INVALID_PARAMETER;\r
+        }\r
+      }\r
+      \r
       GuidTable   = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :\r
                               mPcdDatabase->DxeDb.Init.GuidTable;\r
                               \r
@@ -582,15 +630,30 @@ SetWorker (
       Name = &(StringTable[VariableHead->StringIndex]);\r
       VariableOffset = VariableHead->Offset;\r
 \r
-      return SetHiiVariable (Guid, Name, Data, Size, VariableOffset);\r
+      Status = SetHiiVariable (Guid, Name, Data, *Size, VariableOffset);\r
+\r
+      if (EFI_NOT_FOUND == Status) {\r
+        CopyMem (PcdDb + VariableHead->DefaultValueOffset, Data, *Size);\r
+        return EFI_SUCCESS;\r
+      } else {\r
+        return Status;\r
+      }\r
+      \r
+      //\r
+      // Bug Bug: Please implement this\r
+      //\r
 \r
     case PCD_TYPE_DATA:\r
       if (PtrType) {\r
-        CopyMem (InternalData, Data, Size);\r
-        return EFI_SUCCESS;\r
+        if (SetPtrTypeSize (TokenNumber, Size)) {\r
+          CopyMem (InternalData, Data, *Size);\r
+          return EFI_SUCCESS;\r
+        } else {\r
+          return EFI_INVALID_PARAMETER;\r
+        }\r
       }\r
 \r
-      switch (Size) {\r
+      switch (*Size) {\r
         case sizeof(UINT8):\r
           *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
           return EFI_SUCCESS;\r
@@ -638,26 +701,35 @@ ExGetWorker (
 \r
 \r
 \r
+EFI_STATUS\r
+ExSetValueWorker (\r
+  IN          UINTN                ExTokenNumber,\r
+  IN          CONST EFI_GUID       *Guid,\r
+  IN          VOID                 *Data,\r
+  IN          UINTN                SetSize\r
+  )\r
+{\r
+  return ExSetWorker (ExTokenNumber, Guid, Data, &SetSize, FALSE);\r
+}\r
+\r
 \r
 EFI_STATUS\r
 ExSetWorker (\r
-  IN UINTN                ExTokenNumber,\r
-  IN CONST EFI_GUID       *Guid,\r
-  VOID                    *Data,\r
-  UINTN                   SetSize,\r
-  BOOLEAN                 PtrType\r
+  IN          UINTN                ExTokenNumber,\r
+  IN          CONST EFI_GUID       *Guid,\r
+  IN          VOID                 *Data,\r
+  IN OUT      UINTN                *SetSize,\r
+  IN          BOOLEAN              PtrType\r
   )\r
 {\r
   UINTN                   TokenNumber;\r
   \r
   TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) ExTokenNumber);\r
 \r
-  InvokeCallbackOnSet ((UINT32) ExTokenNumber, Guid, TokenNumber, Data, SetSize);\r
+  InvokeCallbackOnSet ((UINT32) ExTokenNumber, Guid, TokenNumber, Data, *SetSize);\r
 \r
-  SetWorker (TokenNumber, Data, SetSize, PtrType);\r
+  return SetWorker (TokenNumber, Data, SetSize, PtrType);\r
 \r
-  return EFI_SUCCESS;\r
-  \r
 }\r
 \r
 \r
@@ -705,24 +777,25 @@ SetHiiVariable (
 \r
     CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
 \r
-  } else {\r
-\r
-    Attribute = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS;\r
-    Size = DataSize + Offset;\r
-    Buffer = AllocateZeroPool (Size);\r
-    ASSERT (Buffer != NULL);\r
-    CopyMem ((UINT8 *)Buffer + Offset, Data, DataSize);\r
-    \r
-  }\r
+    Status = EfiSetVariable (\r
+              VariableName,\r
+              VariableGuid,\r
+              Attribute,\r
+              Size,\r
+              Buffer\r
+              );\r
 \r
-  return EfiSetVariable (\r
-            VariableName,\r
-            VariableGuid,\r
-            Attribute,\r
-            Size,\r
-            Buffer\r
-            );\r
+    FreePool (Buffer);\r
+    return Status;\r
 \r
+  } \r
+  \r
+  //\r
+  // If we drop to here, we don't have a Variable entry in\r
+  // the variable service yet. So, we will save the data\r
+  // in the PCD Database's volatile area.\r
+  //\r
+  return Status;\r
 }\r
 \r
 \r
@@ -785,3 +858,258 @@ GetExPcdTokenNumber (
   return 0;\r
 }\r
 \r
+\r
+\r
+SKU_ID *\r
+GetSkuIdArray (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  IN    BOOLEAN           IsPeiPcd\r
+  )\r
+{\r
+  SKU_HEAD  *SkuHead;\r
+  UINTN     LocalTokenNumber;\r
+  UINT8     *Database;\r
+\r
+  if (IsPeiPcd) {\r
+    LocalTokenNumber = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+    Database         = (UINT8 *) &mPcdDatabase->PeiDb;\r
+  } else {\r
+    LocalTokenNumber = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable[LocalTokenNumberTableIdx - PEI_LOCAL_TOKEN_NUMBER];\r
+    Database         = (UINT8 *) &mPcdDatabase->DxeDb;\r
+  }\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
+\r
+  SkuHead = (SKU_HEAD *) ((UINT8 *)Database + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
+\r
+  return (SKU_ID *) (Database + SkuHead->SkuIdTableOffset);\r
+  \r
+}\r
+\r
+\r
+\r
+UINTN\r
+GetSizeTableIndexA (\r
+  IN UINTN        LocalTokenNumberTableIdx,\r
+  IN UINT32       *LocalTokenNumberTable,\r
+  IN BOOLEAN      IsPeiDb\r
+  )\r
+{\r
+  UINTN       i;\r
+  UINTN       SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  \r
+  SizeTableIdx = 0;\r
+\r
+  for (i=0; i<LocalTokenNumberTableIdx; i++) {\r
+    LocalTokenNumber = LocalTokenNumberTable[i];\r
+\r
+    if ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER) {\r
+      //\r
+      // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+      // PCD entry.\r
+      //\r
+      if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+          //\r
+          // We have only one entry for VPD enabled PCD entry:\r
+          // 1) MAX Size.\r
+          // We consider current size is equal to MAX size.\r
+          //\r
+          SizeTableIdx++;\r
+      } else {\r
+        if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+          //\r
+          // We have only two entry for Non-Sku enabled PCD entry:\r
+          // 1) MAX SIZE\r
+          // 2) Current Size\r
+          //\r
+          SizeTableIdx += 2;\r
+        } else {\r
+          //\r
+          // We have these entry for SKU enabled PCD entry\r
+          // 1) MAX SIZE\r
+          // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+          //\r
+          SkuIdTable = GetSkuIdArray (i, IsPeiDb);\r
+          SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
+        }\r
+      }\r
+    }\r
+\r
+  }\r
+\r
+  return SizeTableIdx;\r
+}\r
+\r
+\r
+\r
+\r
+UINTN\r
+GetSizeTableIndex (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  IN    BOOLEAN           IsPeiDb\r
+  )\r
+{\r
+  UINT32 *LocalTokenNumberTable;\r
+  \r
+  if (IsPeiDb) {\r
+    LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
+  } else {\r
+    LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+  }\r
+  return GetSizeTableIndexA (LocalTokenNumberTableIdx, \r
+                              LocalTokenNumberTable,\r
+                              IsPeiDb);\r
+}\r
+\r
+\r
+\r
+UINTN\r
+GetPtrTypeSize (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  OUT   UINTN             *MaxSize\r
+  )\r
+{\r
+  INTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  SIZE_INFO   *SizeTable;\r
+  UINTN       i;\r
+  BOOLEAN     IsPeiDb;\r
+  UINT32      *LocalTokenNumberTable;\r
+\r
+  IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+\r
+  if (IsPeiDb) {\r
+    LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
+    SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;\r
+  } else {\r
+    LocalTokenNumberTableIdx -= PEI_LOCAL_TOKEN_NUMBER;\r
+    LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+    SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;\r
+  }\r
+\r
+  LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+  \r
+  SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, IsPeiDb);\r
+\r
+  *MaxSize = SizeTable[SizeTableIdx];\r
+  //\r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // PCD entry.\r
+  //\r
+  if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+      //\r
+      // We have only one entry for VPD enabled PCD entry:\r
+      // 1) MAX Size.\r
+      // We consider current size is equal to MAX size.\r
+      //\r
+      return *MaxSize;\r
+  } else {\r
+    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+      //\r
+      // We have only two entry for Non-Sku enabled PCD entry:\r
+      // 1) MAX SIZE\r
+      // 2) Current Size\r
+      //\r
+      return SizeTable[SizeTableIdx + 1];\r
+    } else {\r
+      //\r
+      // We have these entry for SKU enabled PCD entry\r
+      // 1) MAX SIZE\r
+      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+      //\r
+      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
+      for (i = 0; i < SkuIdTable[0]; i++) {\r
+        if (SkuIdTable[1 + i] == mPcdDatabase->PeiDb.Init.SystemSkuId) {\r
+          return SizeTable[SizeTableIdx + 1 + i];\r
+        }\r
+      }\r
+      return SizeTable[SizeTableIdx + 1];\r
+    }\r
+  }\r
+}\r
+\r
+\r
+\r
+BOOLEAN\r
+SetPtrTypeSize (\r
+  IN          UINTN             LocalTokenNumberTableIdx,\r
+  IN    OUT   UINTN             *CurrentSize\r
+  )\r
+{\r
+  INTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  SIZE_INFO   *SizeTable;\r
+  UINTN       i;\r
+  UINTN       MaxSize;\r
+  BOOLEAN     IsPeiDb;\r
+  UINT32      *LocalTokenNumberTable;\r
+\r
+  IsPeiDb = (BOOLEAN) (LocalTokenNumberTableIdx < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+  if (IsPeiDb) {\r
+    LocalTokenNumberTable = mPcdDatabase->PeiDb.Init.LocalTokenNumberTable;\r
+    SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;\r
+  } else {\r
+    LocalTokenNumberTableIdx -= PEI_LOCAL_TOKEN_NUMBER;\r
+    LocalTokenNumberTable = mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
+    SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;\r
+  }\r
+\r
+  LocalTokenNumber = LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+  \r
+  SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, IsPeiDb);\r
+\r
+  MaxSize = SizeTable[SizeTableIdx];\r
+  //\r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // PCD entry.\r
+  //\r
+  if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+      //\r
+      // We shouldn't come here as we don't support SET for VPD\r
+      //\r
+      ASSERT (FALSE);\r
+      return FALSE;\r
+  } else {\r
+    if ((*CurrentSize > MaxSize) ||\r
+      (*CurrentSize == MAX_ADDRESS)) {\r
+       *CurrentSize = MaxSize;\r
+       return FALSE;\r
+    } \r
+    \r
+    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+      //\r
+      // We have only two entry for Non-Sku enabled PCD entry:\r
+      // 1) MAX SIZE\r
+      // 2) Current Size\r
+      //\r
+      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+      return TRUE;\r
+    } else {\r
+      //\r
+      // We have these entry for SKU enabled PCD entry\r
+      // 1) MAX SIZE\r
+      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+      //\r
+      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, IsPeiDb);\r
+      for (i = 0; i < SkuIdTable[0]; i++) {\r
+        if (SkuIdTable[1 + i] == mPcdDatabase->PeiDb.Init.SystemSkuId) {\r
+          SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize;\r
+          return TRUE;\r
+        }\r
+      }\r
+      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+      return TRUE;\r
+    }\r
+  }\r
+}\r
+\r
index c8bec08539cd37b8339c5ab7514c1f1d42666690..7628900596e3ae9db944bc50b84d32a8d2095bae 100644 (file)
@@ -44,30 +44,50 @@ typedef struct {
 // Internal Functions\r
 //\r
 \r
+EFI_STATUS\r
+SetValueWorker (\r
+  IN UINTN                   TokenNumber,\r
+  IN VOID                    *Data,\r
+  IN UINTN                   Size\r
+  )\r
+;\r
+\r
 EFI_STATUS\r
 SetWorker (\r
-  IN UINTN                     TokenNumber,\r
-  IN VOID                      *Data,\r
-  IN UINTN                     Size,\r
-  IN BOOLEAN                   PtrType\r
+  IN          UINTN                     TokenNumber,\r
+  IN          VOID                      *Data,\r
+  IN OUT      UINTN                     *Size,\r
+  IN          BOOLEAN                   PtrType\r
+  )\r
+;\r
+\r
+\r
+EFI_STATUS\r
+ExSetValueWorker (\r
+  IN          UINTN                ExTokenNumber,\r
+  IN          CONST EFI_GUID       *Guid,\r
+  IN          VOID                 *Data,\r
+  IN          UINTN                SetSize\r
   )\r
 ;\r
 \r
+\r
+\r
 EFI_STATUS\r
 ExSetWorker (\r
-  IN UINTN                ExTokenNumber,\r
-  IN CONST EFI_GUID       *Guid,\r
-  VOID                    *Data,\r
-  UINTN                   Size,\r
-  BOOLEAN                 PtrType\r
+  IN      UINTN                ExTokenNumber,\r
+  IN      CONST EFI_GUID       *Guid,\r
+  IN      VOID                 *Data,\r
+  IN OUT  UINTN                *Size,\r
+  IN      BOOLEAN              PtrType\r
   )\r
 ;\r
 \r
 \r
 VOID *\r
 GetWorker (\r
-  UINTN             TokenNumber,\r
-  UINTN             GetSize\r
+  IN UINTN             TokenNumber,\r
+  IN UINTN             GetSize\r
   )\r
 ;\r
 \r
@@ -132,6 +152,24 @@ GetExPcdTokenNumber (
   IN UINT32                     ExTokenNumber\r
   )\r
 ;\r
+\r
+\r
+UINTN\r
+GetPtrTypeSize (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  OUT   UINTN             *MaxSize\r
+  )\r
+;\r
+\r
+\r
+\r
+BOOLEAN\r
+SetPtrTypeSize (\r
+  IN          UINTN             LocalTokenNumberTableIdx,\r
+  IN    OUT   UINTN             *CurrentSize\r
+  )\r
+;\r
+\r
 //\r
 // Protocol Interface function declaration.\r
 //\r
@@ -303,9 +341,9 @@ DxePcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetPtr (\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN        UINTN             TokenNumber,\r
+  IN        UINTN             *SizeOfBuffer,\r
+  IN        VOID              *Buffer\r
   )\r
 ;\r
 \r
@@ -362,10 +400,10 @@ DxePcdSet64Ex (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetPtrEx (\r
-  IN CONST EFI_GUID    *Guid,\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN        CONST EFI_GUID    *Guid,\r
+  IN        UINTN             TokenNumber,\r
+  IN OUT    UINTN             *SizeOfBuffer,\r
+  IN        VOID              *Buffer\r
   )\r
 ;\r
 \r
index dfcb56981ede8391d36c9d84e1a8055ec0486bca..a2b5701f1334266c5da136d9b72d4aa6dfff617f 100644 (file)
@@ -170,6 +170,11 @@ PeiPcdGetSize (
   IN UINTN             TokenNumber\r
   )\r
 {\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
+  UINTN               Size;\r
+  UINTN               MaxSize;\r
+\r
+  PeiPcdDb = GetPcdDatabase ();\r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
   // We have to decrement TokenNumber by 1 to make it usable\r
@@ -179,7 +184,17 @@ PeiPcdGetSize (
 \r
   ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
-  return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
+  Size = (PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber] & PCD_DATUM_TYPE_ALL_SET) >> PCD_DATUM_TYPE_SHIFT;\r
+\r
+  if (Size == 0) {\r
+    //\r
+    // For pointer type, we need to scan the SIZE_TABLE to get the current size.\r
+    //\r
+    return GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
+  } else {\r
+    return Size;\r
+  }\r
+\r
 }\r
 \r
 \r
@@ -272,10 +287,10 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet8 (\r
   IN UINTN                        TokenNumber,\r
-  IN UINT8             Value\r
+  IN UINT8                        Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -283,11 +298,11 @@ PeiPcdSet8 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet16 (\r
-  IN UINTN                         TokenNumber,\r
-  IN UINT16             Value\r
+  IN UINTN                          TokenNumber,\r
+  IN UINT16                         Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -295,11 +310,11 @@ PeiPcdSet16 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet32 (\r
-  IN UINTN                         TokenNumber,\r
-  IN UINT32             Value\r
+  IN UINTN                          TokenNumber,\r
+  IN UINT32                         Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -307,20 +322,20 @@ PeiPcdSet32 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSet64 (\r
-  IN UINTN                         TokenNumber,\r
-  IN UINT64             Value\r
+  IN UINTN                          TokenNumber,\r
+  IN UINT64                         Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtr (\r
-  IN UINTN                         TokenNumber,\r
-  IN UINTN                         SizeOfBuffer,\r
-  IN VOID                          *Buffer\r
+  IN      UINTN                         TokenNumber,\r
+  IN OUT  UINTN                         *SizeOfBuffer,\r
+  IN      VOID                          *Buffer\r
   )\r
 {\r
   return SetWorker (TokenNumber, Buffer, SizeOfBuffer, TRUE);\r
@@ -331,11 +346,11 @@ PeiPcdSetPtr (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetBool (\r
-  IN UINTN                         TokenNumber,\r
-  IN BOOLEAN            Value\r
+  IN UINTN                          TokenNumber,\r
+  IN BOOLEAN                        Value\r
   )\r
 {\r
-  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
+  return SetValueWorker (TokenNumber, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -348,13 +363,7 @@ PeiPcdSet8Ex (
   IN UINT8                  Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -367,13 +376,7 @@ PeiPcdSet16Ex (
   IN UINT16                 Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -386,13 +389,7 @@ PeiPcdSet32Ex (
   IN UINT32                 Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -405,13 +402,7 @@ PeiPcdSet64Ex (
   IN UINT64                 Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -421,17 +412,11 @@ EFIAPI
 PeiPcdSetPtrEx (\r
   IN CONST EFI_GUID         *Guid,\r
   IN UINTN                  ExTokenNumber,\r
-  IN UINTN                  SizeOfBuffer,\r
+  IN UINTN                  *SizeOfBuffer,\r
   IN VOID                   *Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              Value, \r
-                              SizeOfBuffer, \r
-                              TRUE\r
-                              );\r
+  return ExSetWorker (ExTokenNumber, Guid, Value, SizeOfBuffer, TRUE);\r
 }\r
 \r
 \r
@@ -444,13 +429,7 @@ PeiPcdSetBoolEx (
   IN BOOLEAN              Value\r
   )\r
 {\r
-  return          ExSetWorker(\r
-                              ExTokenNumber, \r
-                              Guid,\r
-                              &Value, \r
-                              sizeof (Value), \r
-                              FALSE\r
-                              );\r
+  return ExSetValueWorker (ExTokenNumber, Guid, &Value, sizeof (Value));\r
 }\r
 \r
 \r
@@ -567,6 +546,8 @@ PeiPcdGetNextToken (
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdGetNextTokenSpace (\r
index a85d1d1786a22d3bea2c179cacce6531f27014a5..0004bc6c76a1ffca81e8c52fe45b6d7af48f369e 100644 (file)
@@ -68,6 +68,10 @@ PeiRegisterCallBackWorker (
 \r
   LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
+  //\r
+  // We don't support SET for HII and VPD type PCD entry in PEI phase.\r
+  // So we will assert if any register callback for such PCD entry.\r
+  //\r
   ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
   ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
 \r
@@ -223,19 +227,23 @@ GetSkuEnabledTokenNumber (
     }\r
   }\r
 \r
-  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
-      Value += sizeof(VPD_HEAD) * i;\r
+      Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]);\r
       return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
 \r
     case PCD_TYPE_HII:\r
-      Value += sizeof(VARIABLE_HEAD) * i;\r
+      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]);\r
       return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
       \r
+    case PCD_TYPE_STRING:\r
+      Value = (UINT8 *) &(((STRING_HEAD *) Value)[i]);\r
+      return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_STRING);\r
+\r
     case PCD_TYPE_DATA:\r
       Value += Size * i;\r
       return (Value - (UINT8 *) PeiPcdDb);\r
-      \r
+\r
     default:\r
       ASSERT (FALSE);\r
   }\r
@@ -293,13 +301,24 @@ InvokeCallbackOnSet (
 \r
 \r
 \r
+EFI_STATUS\r
+SetValueWorker (\r
+  IN          UINTN              TokenNumber,\r
+  IN          VOID               *Data,\r
+  IN          UINTN              Size\r
+  )\r
+{\r
+  return SetWorker (TokenNumber, Data, &Size, FALSE);\r
+}\r
+\r
+\r
 \r
 EFI_STATUS\r
 SetWorker (\r
-  UINTN               TokenNumber,\r
-  VOID                *Data,\r
-  UINTN               Size,\r
-  BOOLEAN             PtrType\r
+  IN          UINTN               TokenNumber,\r
+  IN OUT      VOID                *Data,\r
+  IN OUT      UINTN               *Size,\r
+  IN          BOOLEAN             PtrType\r
   )\r
 {\r
   UINT32              LocalTokenNumber;\r
@@ -307,6 +326,7 @@ SetWorker (
   UINT16              StringTableIdx;\r
   UINTN               Offset;\r
   VOID                *InternalData;\r
+  UINTN               MaxSize;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -321,10 +341,8 @@ SetWorker (
 \r
   LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
-  if (PtrType) {\r
-    ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] >= Size);\r
-  } else {\r
-    ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size);\r
+  if (!PtrType) {\r
+    ASSERT (PeiPcdGetSize(TokenNumber + 1) == *Size);\r
   }\r
 \r
   //\r
@@ -333,17 +351,22 @@ SetWorker (
   // type PCD entry in ExSetWorker.\r
   //\r
   if (TokenNumber < PEI_NEX_TOKEN_NUMBER) {\r
-    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size);\r
+    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, *Size);\r
   }\r
 \r
   if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
+    if (PtrType) {\r
+      MaxSize = GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
+    } else {\r
+      MaxSize = *Size;\r
+    }\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize);\r
   }\r
 \r
   Offset          = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
   InternalData    = (VOID *) ((UINT8 *) PeiPcdDb + Offset);\r
   \r
-  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
     case PCD_TYPE_HII:\r
     {\r
@@ -352,19 +375,26 @@ SetWorker (
     }\r
 \r
     case PCD_TYPE_STRING:\r
-      StringTableIdx = *((UINT16 *)InternalData);\r
-      CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size);\r
-      return EFI_SUCCESS;\r
+      if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) {\r
+        StringTableIdx = *((UINT16 *)InternalData);\r
+        CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, *Size);\r
+        return EFI_SUCCESS;\r
+      } else {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
 \r
     case PCD_TYPE_DATA:\r
     {\r
-      \r
       if (PtrType) {\r
-        CopyMem (InternalData, Data, Size);\r
-        return EFI_SUCCESS;\r
+        if (SetPtrTypeSize (TokenNumber, Size, PeiPcdDb)) {\r
+          CopyMem (InternalData, Data, *Size);\r
+          return EFI_SUCCESS;\r
+        } else {\r
+          return EFI_INVALID_PARAMETER;\r
+        }\r
       }\r
 \r
-      switch (Size) {\r
+      switch (*Size) {\r
         case sizeof(UINT8):\r
           *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
           return EFI_SUCCESS;\r
@@ -396,26 +426,36 @@ SetWorker (
 \r
 \r
 \r
+EFI_STATUS\r
+ExSetValueWorker (\r
+  IN          UINTN                ExTokenNumber,\r
+  IN          CONST EFI_GUID       *Guid,\r
+  IN          VOID                 *Data,\r
+  IN          UINTN                Size\r
+  )\r
+{\r
+  return ExSetWorker (ExTokenNumber, Guid, Data, &Size, FALSE);\r
+}\r
+\r
+\r
 \r
 EFI_STATUS\r
 ExSetWorker (\r
-  IN UINTN                ExTokenNumber,\r
-  IN CONST EFI_GUID       *Guid,\r
-  VOID                    *Data,\r
-  UINTN                   Size,\r
-  BOOLEAN                 PtrType\r
+  IN            UINTN                ExTokenNumber,\r
+  IN            CONST EFI_GUID       *Guid,\r
+  IN            VOID                 *Data,\r
+  IN OUT        UINTN                *Size,\r
+  IN            BOOLEAN              PtrType\r
   )\r
 {\r
   UINTN                     TokenNumber;\r
 \r
   TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
 \r
-  InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, Size);\r
+  InvokeCallbackOnSet (ExTokenNumber, Guid, TokenNumber, Data, *Size);\r
 \r
-  SetWorker (TokenNumber, Data, Size, PtrType);\r
+  return SetWorker (TokenNumber, Data, Size, PtrType);\r
 \r
-  return EFI_SUCCESS;\r
-  \r
 }\r
 \r
 \r
@@ -451,7 +491,7 @@ GetWorker (
   UINT16              StringTableIdx;\r
   PEI_PCD_DATABASE    *PeiPcdDb;\r
   UINT32              LocalTokenNumber;\r
-  UINTN               Size;\r
+  UINTN               MaxSize;\r
 \r
   //\r
   // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
@@ -462,22 +502,25 @@ GetWorker (
 \r
   ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
-  Size = PeiPcdGetSize(TokenNumber + 1);\r
-  \r
-  ASSERT (GetSize == Size || GetSize == 0);\r
+  ASSERT ((GetSize == PeiPcdGetSize(TokenNumber + 1)) || (GetSize == 0));\r
 \r
   PeiPcdDb        = GetPcdDatabase ();\r
 \r
   LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
   if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
-    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
+    if (GetSize == 0) {\r
+      MaxSize = GetPtrTypeSize (TokenNumber, &MaxSize, PeiPcdDb);\r
+    } else {\r
+      MaxSize = GetSize;\r
+    }\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, MaxSize);\r
   }\r
 \r
   Offset      = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
   StringTable = PeiPcdDb->Init.StringTable;\r
   \r
-  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+  switch (LocalTokenNumber & PCD_TYPE_ALL_SET) {\r
     case PCD_TYPE_VPD:\r
     {\r
       VPD_HEAD *VpdHead;\r
@@ -578,3 +621,208 @@ GetPcdDatabase (
   return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
 }\r
 \r
+\r
+SKU_ID *\r
+GetSkuIdArray (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  IN    PEI_PCD_DATABASE  *Database\r
+  )\r
+{\r
+  SKU_HEAD *SkuHead;\r
+  UINTN     LocalTokenNumber;\r
+\r
+  LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) != 0);\r
+\r
+  SkuHead = (SKU_HEAD *) ((UINT8 *)Database + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
+\r
+  return (SKU_ID *) ((UINT8 *)Database + SkuHead->SkuIdTableOffset);\r
+  \r
+}\r
+\r
+\r
+\r
+UINTN\r
+GetSizeTableIndex (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  IN    PEI_PCD_DATABASE  *Database\r
+  )\r
+{\r
+  UINTN       i;\r
+  UINTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  \r
+  SizeTableIdx = 0;\r
+\r
+  for (i=0; i<LocalTokenNumberTableIdx; i++) {\r
+    LocalTokenNumber = Database->Init.LocalTokenNumberTable[i];\r
+\r
+    if ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER) {\r
+      //\r
+      // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+      // PCD entry.\r
+      //\r
+      if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+          //\r
+          // We have only one entry for VPD enabled PCD entry:\r
+          // 1) MAX Size.\r
+          // We consider current size is equal to MAX size.\r
+          //\r
+          SizeTableIdx++;\r
+      } else {\r
+        if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+          //\r
+          // We have only two entry for Non-Sku enabled PCD entry:\r
+          // 1) MAX SIZE\r
+          // 2) Current Size\r
+          //\r
+          SizeTableIdx += 2;\r
+        } else {\r
+          //\r
+          // We have these entry for SKU enabled PCD entry\r
+          // 1) MAX SIZE\r
+          // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+          //\r
+          SkuIdTable = GetSkuIdArray (i, Database);\r
+          SizeTableIdx += (UINTN)*SkuIdTable + 1;\r
+        }\r
+      }\r
+    }\r
+\r
+  }\r
+\r
+  return SizeTableIdx;\r
+}\r
+\r
+\r
+\r
+\r
+UINTN\r
+GetPtrTypeSize (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  OUT   UINTN             *MaxSize,\r
+  IN    PEI_PCD_DATABASE  *Database\r
+  )\r
+{\r
+  INTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  SIZE_INFO   *SizeTable;\r
+  UINTN       i;\r
+\r
+  SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
+\r
+  LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+  \r
+  SizeTable = Database->Init.SizeTable;\r
+\r
+  *MaxSize = SizeTable[SizeTableIdx];\r
+  //\r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // PCD entry.\r
+  //\r
+  if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+      //\r
+      // We have only one entry for VPD enabled PCD entry:\r
+      // 1) MAX Size.\r
+      // We consider current size is equal to MAX size.\r
+      //\r
+      return *MaxSize;\r
+  } else {\r
+    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+      //\r
+      // We have only two entry for Non-Sku enabled PCD entry:\r
+      // 1) MAX SIZE\r
+      // 2) Current Size\r
+      //\r
+      return SizeTable[SizeTableIdx + 1];\r
+    } else {\r
+      //\r
+      // We have these entry for SKU enabled PCD entry\r
+      // 1) MAX SIZE\r
+      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+      //\r
+      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
+      for (i = 0; i < SkuIdTable[0]; i++) {\r
+        if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
+          return SizeTable[SizeTableIdx + 1 + i];\r
+        }\r
+      }\r
+      return SizeTable[SizeTableIdx + 1];\r
+    }\r
+  }\r
+}\r
+\r
+\r
+\r
+BOOLEAN\r
+SetPtrTypeSize (\r
+  IN          UINTN             LocalTokenNumberTableIdx,\r
+  IN    OUT   UINTN             *CurrentSize,\r
+  IN          PEI_PCD_DATABASE  *Database\r
+  )\r
+{\r
+  INTN        SizeTableIdx;\r
+  UINTN       LocalTokenNumber;\r
+  SKU_ID      *SkuIdTable;\r
+  SIZE_INFO   *SizeTable;\r
+  UINTN       i;\r
+  UINTN       MaxSize;\r
+  \r
+  SizeTableIdx = GetSizeTableIndex (LocalTokenNumberTableIdx, Database);\r
+\r
+  LocalTokenNumber = Database->Init.LocalTokenNumberTable[LocalTokenNumberTableIdx];\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_DATUM_TYPE_ALL_SET) == PCD_DATUM_TYPE_POINTER);\r
+  \r
+  SizeTable = Database->Init.SizeTable;\r
+\r
+  MaxSize = SizeTable[SizeTableIdx];\r
+  //\r
+  // SizeTable only contain record for PCD_DATUM_TYPE_POINTER type \r
+  // PCD entry.\r
+  //\r
+  if (LocalTokenNumber & PCD_TYPE_VPD) {\r
+      //\r
+      // We shouldn't come here as we don't support SET for VPD\r
+      //\r
+      ASSERT (FALSE);\r
+      return FALSE;\r
+  } else {\r
+    if ((*CurrentSize > MaxSize) ||\r
+      (*CurrentSize == MAX_ADDRESS)) {\r
+       *CurrentSize = MaxSize;\r
+       return FALSE;\r
+    } \r
+    \r
+    if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0) {\r
+      //\r
+      // We have only two entry for Non-Sku enabled PCD entry:\r
+      // 1) MAX SIZE\r
+      // 2) Current Size\r
+      //\r
+      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+      return TRUE;\r
+    } else {\r
+      //\r
+      // We have these entry for SKU enabled PCD entry\r
+      // 1) MAX SIZE\r
+      // 2) Current Size for each SKU_ID (It is equal to MaxSku).\r
+      //\r
+      SkuIdTable = GetSkuIdArray (LocalTokenNumberTableIdx, Database);\r
+      for (i = 0; i < SkuIdTable[0]; i++) {\r
+        if (SkuIdTable[1 + i] == Database->Init.SystemSkuId) {\r
+          SizeTable[SizeTableIdx + 1 + i] = (SIZE_INFO) *CurrentSize;\r
+          return TRUE;\r
+        }\r
+      }\r
+      SizeTable[SizeTableIdx + 1] = (SIZE_INFO) *CurrentSize;\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+}\r
index d3e7139ff4fe2d066df52378da92d5c705a28997..4dbf7610ba74404f86ae1a4b49fdae557ad53e00 100644 (file)
@@ -40,25 +40,49 @@ GetPcdDatabase (
   )\r
 ;\r
 \r
+\r
+EFI_STATUS\r
+SetValueWorker (\r
+  IN          UINTN              TokenNumber,\r
+  IN          VOID               *Data,\r
+  IN          UINTN              Size\r
+  )\r
+;\r
+\r
+\r
 EFI_STATUS\r
 SetWorker (\r
-  IN UINTN              TokenNumber,\r
-  IN VOID               *Data,\r
-  IN UINTN              Size,\r
-  IN BOOLEAN            PtrType\r
+  IN          UINTN              TokenNumber,\r
+  IN          VOID               *Data,\r
+  IN OUT      UINTN              *Size,\r
+  IN          BOOLEAN            PtrType\r
   )\r
 ;\r
 \r
+\r
+EFI_STATUS\r
+ExSetValueWorker (\r
+  IN          UINTN                ExTokenNumber,\r
+  IN          CONST EFI_GUID       *Guid,\r
+  IN          VOID                 *Data,\r
+  IN          UINTN                Size\r
+  )\r
+;\r
+\r
+\r
+\r
 EFI_STATUS\r
 ExSetWorker (\r
-  IN UINTN                ExTokenNumber,\r
-  IN CONST EFI_GUID       *Guid,\r
-  IN VOID                 *Data,\r
-  IN UINTN                Size,\r
-  IN BOOLEAN              PtrType\r
+  IN      UINTN                ExTokenNumber,\r
+  IN      CONST EFI_GUID       *Guid,\r
+  IN      VOID                 *Data,\r
+  IN OUT  UINTN                *Size,\r
+  IN      BOOLEAN              PtrType\r
   )\r
 ;\r
 \r
+\r
+\r
 VOID *\r
 GetWorker (\r
   IN UINTN                TokenNumber,\r
@@ -66,6 +90,8 @@ GetWorker (
   )\r
 ;\r
 \r
+\r
+\r
 VOID *\r
 ExGetWorker (\r
   IN CONST EFI_GUID   *Guid,\r
@@ -109,6 +135,27 @@ BuildPcdDatabase (
 ;\r
 \r
 \r
+\r
+\r
+UINTN\r
+GetPtrTypeSize (\r
+  IN    UINTN             LocalTokenNumberTableIdx,\r
+  OUT   UINTN             *MaxSize,\r
+  IN    PEI_PCD_DATABASE  *Database\r
+  )\r
+;\r
+\r
+\r
+\r
+BOOLEAN\r
+SetPtrTypeSize (\r
+  IN          UINTN             LocalTokenNumberTableIdx,\r
+  IN    OUT   UINTN             *CurrentSize,\r
+  IN          PEI_PCD_DATABASE  *Database\r
+  )\r
+;\r
+\r
+\r
 //\r
 // PPI Interface Implementation Declaration.\r
 //\r
@@ -276,9 +323,9 @@ PeiPcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtr (\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN        UINTN             TokenNumber,\r
+  IN OUT    UINTN             *SizeOfBuffer,\r
+  IN        VOID              *Buffer\r
   )\r
 ;\r
 \r
@@ -334,10 +381,10 @@ PeiPcdSet64Ex (
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetPtrEx (\r
-  IN CONST EFI_GUID    *Guid,\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN        CONST EFI_GUID    *Guid,\r
+  IN        UINTN             TokenNumber,\r
+  IN OUT    UINTN             *SizeOfBuffer,\r
+  IN        VOID              *Buffer\r
   )\r
 ;\r
 \r
index a67e79c01c745af6c9c33bf8b717b5d4da1517ef..2050d659de6258e4517988b48aaae697e81a26d2 100644 (file)
@@ -152,9 +152,9 @@ EFI_STATUS
 typedef\r
 EFI_STATUS\r
 (EFIAPI *PCD_PPI_SET_POINTER) (\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN        UINTN             TokenNumber,\r
+  IN OUT    UINTN             *SizeOfBuffer,\r
+  IN        VOID              *Buffer\r
   );\r
 \r
 typedef\r
@@ -199,10 +199,10 @@ EFI_STATUS
 typedef\r
 EFI_STATUS\r
 (EFIAPI *PCD_PPI_SET_EX_POINTER) (\r
-  IN CONST EFI_GUID    *Guid,\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN        CONST EFI_GUID    *Guid,\r
+  IN        UINTN             TokenNumber,\r
+  IN OUT    UINTN             *SizeOfBuffer,\r
+  IN        VOID              *Buffer\r
   );\r
 \r
 typedef\r
index 8869ad2be13497106ff517274131a4dd85eb006f..4127f734889617d35c7034ef587f78026c89e7d7 100644 (file)
@@ -152,9 +152,9 @@ EFI_STATUS
 typedef\r
 EFI_STATUS\r
 (EFIAPI *PCD_PROTOCOL_SET_POINTER) (\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN      UINTN             TokenNumber,\r
+  IN OUT  UINTN             *SizeOfBuffer,\r
+  IN      VOID              *Buffer\r
   );\r
 \r
 typedef\r
@@ -199,10 +199,10 @@ EFI_STATUS
 typedef\r
 EFI_STATUS\r
 (EFIAPI *PCD_PROTOCOL_SET_EX_POINTER) (\r
-  IN CONST EFI_GUID    *Guid,\r
-  IN UINTN             TokenNumber,\r
-  IN UINTN             SizeOfBuffer,\r
-  IN VOID              *Buffer\r
+  IN      CONST EFI_GUID    *Guid,\r
+  IN      UINTN             TokenNumber,\r
+  IN OUT  UINTN             *SizeOfBuffer,\r
+  IN      VOID              *Buffer\r
   );\r
 \r
 typedef\r
@@ -228,7 +228,7 @@ typedef
 VOID\r
 (EFIAPI *PCD_PROTOCOL_CALLBACK) (\r
   IN      CONST EFI_GUID   *CallBackGuid, OPTIONAL\r
-  IN      UINTN                       CallBackToken,\r
+  IN      UINTN            CallBackToken,\r
   IN  OUT VOID             *TokenData,\r
   IN      UINTN            TokenDataSize\r
   );\r
index e58965cc686f3f643d10cb5c0c92b5a2f9306ee7..ab6f711a00e44f891fad3e4f8ba221803f263bd1 100644 (file)
@@ -463,6 +463,8 @@ LibPcdSetPtr (
   IN      VOID              *Buffer\r
   )\r
 {\r
+  ASSERT (SizeOfBuffer != NULL);\r
+\r
   if (*SizeOfBuffer > 0) {\r
     ASSERT (Buffer != NULL);\r
   }\r
index f0b0cbd8f662cac8c30ed4bb3c12a0383b35a74f..2747df35c0e17db2ee2a487e86b002a300c3901b 100644 (file)
@@ -514,23 +514,19 @@ LibPcdSetPtr (
   )\r
 {\r
   EFI_STATUS Status;\r
-  UINTN      Size;\r
+\r
+  ASSERT (SizeOfBuffer != NULL);\r
 \r
   if (*SizeOfBuffer > 0) {\r
     ASSERT (Buffer != NULL);\r
   }\r
 \r
-  Size = LibPcdGetSize (TokenNumber);\r
-  \r
-  if (*SizeOfBuffer > Size) {\r
-    *SizeOfBuffer = Size;\r
+  Status = mPcd->SetPtr (TokenNumber, SizeOfBuffer, Buffer);\r
+\r
+  if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
 \r
-  Status = mPcd->SetPtr (TokenNumber, *SizeOfBuffer, Buffer);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   return Buffer;\r
 }\r
 \r
@@ -728,7 +724,6 @@ LibPcdSetExPtr (
   )\r
 {\r
   EFI_STATUS  Status;\r
-  UINTN       Size;\r
 \r
   ASSERT (Guid != NULL);\r
 \r
@@ -738,17 +733,12 @@ LibPcdSetExPtr (
     ASSERT (Buffer != NULL);\r
   }\r
 \r
+  Status = mPcd->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 = mPcd->SetPtrEx (Guid, TokenNumber, *SizeOfBuffer, Buffer);\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   return Buffer;\r
 }\r
 \r
index bee53860977c9f522e691064c135a54b9c919592..b8a53185bd8d59b4c94571321e814a5941359bca 100644 (file)
@@ -586,7 +586,6 @@ LibPcdSetPtr (
 {\r
   EFI_STATUS Status;\r
   PCD_PPI    *PcdPpi;\r
-  UINTN      Size;\r
 \r
   ASSERT (SizeOfBuffer != NULL);\r
 \r
@@ -596,17 +595,12 @@ LibPcdSetPtr (
 \r
   PcdPpi = GetPcdPpiPtr ();\r
   \r
-  Size = LibPcdGetSize (TokenNumber);\r
-  \r
-  if (*SizeOfBuffer > Size) {\r
-    *SizeOfBuffer = Size;\r
+  Status = PcdPpi->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
@@ -817,7 +811,6 @@ LibPcdSetExPtr (
 {\r
   EFI_STATUS      Status;\r
   PCD_PPI         *PcdPpi;\r
-  UINTN           Size;\r
 \r
   if (*SizeOfBuffer > 0) {\r
     ASSERT (Buffer != NULL);\r
@@ -825,16 +818,12 @@ LibPcdSetExPtr (
 \r
   PcdPpi = GetPcdPpiPtr ();\r
 \r
-  Size = LibPcdGetExSize (Guid, TokenNumber);\r
-  if (*SizeOfBuffer > Size) {\r
-    *SizeOfBuffer = Size;\r
+  Status = PcdPpi->SetPtrEx (Guid, TokenNumber, SizeOfBuffer, Buffer);\r
+\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
index 7bdb28293c91bf7a82120d1c1e8bfb4b2ed4b5aa..7df1a5a6f4028f6e76e24a1383dab1fd64bea80b 100644 (file)
@@ -7,17 +7,32 @@
 //\r
 typedef UINT8 SKU_ID;\r
 \r
-#define PCD_TYPE_SHIFT        24\r
+#define PCD_TYPE_SHIFT        28\r
 \r
+#define PCD_TYPE_DATA         (0x0 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_HII               (0x8 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_VPD               (0x4 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_SKU_ENABLED   (0x2 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_STRING       (0x1 << PCD_TYPE_SHIFT)\r
 \r
-#define PCD_TYPE_DATA         (0x00 << PCD_TYPE_SHIFT)\r
-#define PCD_TYPE_HII               (0x80 << PCD_TYPE_SHIFT)\r
-#define PCD_TYPE_VPD               (0x40 << PCD_TYPE_SHIFT)\r
-#define PCD_TYPE_SKU_ENABLED   (0x20 << PCD_TYPE_SHIFT)\r
-#define PCD_TYPE_STRING       (0x10 << PCD_TYPE_SHIFT)\r
+#define PCD_TYPE_ALL_SET      (PCD_TYPE_DATA | PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED | PCD_TYPE_STRING)\r
 \r
+#define PCD_DATUM_TYPE_SHIFT  24\r
 \r
-#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED | PCD_TYPE_STRING))\r
+#define PCD_DATUM_TYPE_POINTER        (0x0 << PCD_DATUM_TYPE_SHIFT)\r
+#define PCD_DATUM_TYPE_UINT8          (0x1 << PCD_DATUM_TYPE_SHIFT)\r
+#define PCD_DATUM_TYPE_UINT16              (0x2 << PCD_DATUM_TYPE_SHIFT)\r
+#define PCD_DATUM_TYPE_UINT32              (0x4 << PCD_DATUM_TYPE_SHIFT)\r
+#define PCD_DATUM_TYPE_UINT64          (0x8 << PCD_DATUM_TYPE_SHIFT)\r
+\r
+#define PCD_DATUM_TYPE_ALL_SET    (PCD_DATUM_TYPE_POINTER | \\r
+                                    PCD_DATUM_TYPE_UINT8  | \\r
+                                    PCD_DATUM_TYPE_UINT16 | \\r
+                                    PCD_DATUM_TYPE_UINT32 | \\r
+                                    PCD_DATUM_TYPE_UINT64)\r
+\r
+\r
+#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_ALL_SET | PCD_DATUM_TYPE_ALL_SET))\r
 \r
 typedef struct  {\r
   UINT32                ExTokenNumber;\r
@@ -46,11 +61,7 @@ typedef  struct {
 \r
 typedef UINT16 STRING_HEAD;\r
 \r
-typedef struct {\r
-  UINT32 LocalTokenNumber;\r
-  UINT16 TokenNumber;\r
-  UINT16 Size;\r
-} SIZEINFO;\r
+typedef UINT16 SIZE_INFO;\r
 \r
 #define offsetof(s,m)                 (UINT32) (UINTN) &(((s *)0)->m)\r
 \r
index 3a781c8001160160548ed411c8fcef3a9eb5730d..396a1af442de49f109104d008a469670b84b0a79 100644 (file)
@@ -229,16 +229,24 @@ class StringTable {
 \r
 **/\r
 class SizeTable {\r
-    private ArrayList<Integer>  al;\r
+    private ArrayList<ArrayList<Integer>>  al;\r
     private ArrayList<String>   alComments;\r
-    private String              phase;\r
     private int                 len;\r
+    private String              phase;\r
     \r
     public SizeTable (String phase) {\r
-        this.phase = phase;\r
-        al = new ArrayList<Integer>();\r
+        al = new ArrayList<ArrayList<Integer>>();\r
         alComments = new ArrayList<String>();\r
         len = 0;\r
+        this.phase = phase;\r
+    }\r
+\r
+    public String getSizeMacro () {\r
+        return String.format(PcdDatabase.SizeTableSizeMacro, phase, getSize());\r
+    }\r
+    \r
+    private int getSize() {\r
+        return len == 0 ? 1 : len;\r
     }\r
 \r
     public void genCode (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
@@ -262,6 +270,7 @@ class SizeTable {
     }\r
 \r
     private ArrayList<String> getInstantiation () {\r
+        final String comma   = ",";\r
         ArrayList<String> Output = new ArrayList<String>();\r
 \r
         Output.add("/* SizeTable */");\r
@@ -270,14 +279,23 @@ class SizeTable {
             Output.add("\t0");\r
         } else {\r
             for (int index = 0; index < al.size(); index++) {\r
-                Integer n = al.get(index);\r
-                String str = "\t" + n.toString();\r
+                ArrayList<Integer> ial = al.get(index);\r
+                \r
+                String str = "\t";\r
+                \r
+                for (int index2 = 0; index2 < ial.size(); index2++) {\r
+                    str += " " + ial.get(index2).toString();\r
+                    if (index2 != ial.size() - 1) {\r
+                        str += comma;\r
+                    }\r
+                }\r
 \r
+                str += " /* " + alComments.get(index) + " */"; \r
+                \r
                 if (index != (al.size() - 1)) {\r
-                    str += ",";\r
+                    str += comma;\r
                 }\r
 \r
-                str += " /* " + alComments.get(index) + " */"; \r
                 Output.add(str);\r
     \r
             }\r
@@ -287,20 +305,25 @@ class SizeTable {
         return Output;\r
     }\r
 \r
-    public int add (Token token) {\r
-        int index = len;\r
+    public void add (Token token) {\r
 \r
-        len++; \r
-        al.add(token.datumSize);\r
+        //\r
+        // We only have size information for POINTER type PCD entry.\r
+        //\r
+        if (token.datumType != Token.DATUM_TYPE.POINTER) {\r
+            return;\r
+        }\r
+        \r
+        ArrayList<Integer> ial = token.getPointerTypeSize();\r
+        \r
+        len+= ial.size(); \r
+\r
+        al.add(ial);\r
         alComments.add(token.getPrimaryKeyString());\r
 \r
-        return index;\r
+        return;\r
     }\r
     \r
-    public int getTableLen () {\r
-        return al.size() == 0 ? 1 : al.size();\r
-    }\r
-\r
 }\r
 \r
 /**\r
@@ -344,7 +367,7 @@ class GuidTable {
         cCode += String.format(PcdDatabase.GuidTableDeclaration, phase); \r
         decl = new CStructTypeDeclaration (\r
                                             name,\r
-                                            8,\r
+                                            4,\r
                                             cCode,\r
                                             true\r
                                            );  \r
@@ -674,6 +697,25 @@ class LocalTokenNumberTable {
             str += " | PCD_TYPE_VPD";\r
         }\r
         \r
+        switch (token.datumType) {\r
+        case UINT8:\r
+        case BOOLEAN:\r
+            str += " | PCD_DATUM_TYPE_UINT8";\r
+            break;\r
+        case UINT16:\r
+            str += " | PCD_DATUM_TYPE_UINT16";\r
+            break;\r
+        case UINT32:\r
+            str += " | PCD_DATUM_TYPE_UINT32";\r
+            break;\r
+        case UINT64:\r
+            str += " | PCD_DATUM_TYPE_UINT64";\r
+            break;\r
+        case POINTER:\r
+            str += " | PCD_DATUM_TYPE_POINTER";\r
+            break;\r
+        }\r
+        \r
         al.add(str);\r
         alComment.add(token.getPrimaryKeyString());\r
 \r
@@ -851,7 +893,7 @@ class PcdDatabase {
     public final static String GuidTableDeclaration             = "EFI_GUID            GuidTable[%s_GUID_TABLE_SIZE];\r\n";\r
     public final static String LocalTokenNumberTableDeclaration = "UINT32              LocalTokenNumberTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
     public final static String StringTableDeclaration           = "UINT16              StringTable[%s_STRING_TABLE_SIZE];\r\n";\r
-    public final static String SizeTableDeclaration             = "UINT16              SizeTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
+    public final static String SizeTableDeclaration             = "SIZE_INFO           SizeTable[%s_SIZE_TABLE_SIZE];\r\n";\r
     public final static String SkuIdTableDeclaration            = "UINT8               SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
 \r
 \r
@@ -860,6 +902,7 @@ class PcdDatabase {
     public final static String GuidTableSizeMacro               = "#define %s_GUID_TABLE_SIZE         %d\r\n"; \r
     public final static String LocalTokenNumberTableSizeMacro   = "#define %s_LOCAL_TOKEN_NUMBER_TABLE_SIZE            %d\r\n";\r
     public final static String LocalTokenNumberSizeMacro               = "#define %s_LOCAL_TOKEN_NUMBER            %d\r\n";\r
+    public final static String SizeTableSizeMacro               = "#define %s_SIZE_TABLE_SIZE            %d\r\n";\r
     public final static String StringTableSizeMacro             = "#define %s_STRING_TABLE_SIZE       %d\r\n";\r
     public final static String SkuIdTableSizeMacro              = "#define %s_SKUID_TABLE_SIZE        %d\r\n";\r
 \r
@@ -1144,6 +1187,7 @@ class PcdDatabase {
         macroStr += skuIdTable.getSizeMacro();\r
         macroStr += localTokenNumberTable.getSizeMacro();\r
         macroStr += exMapTable.getSizeMacro();\r
+        macroStr += sizeTable.getSizeMacro();\r
 \r
         //\r
         // Generate existance info Macro for all Tables\r
@@ -1311,6 +1355,9 @@ class PcdDatabase {
         }\r
     }\r
     \r
+    //\r
+    // privateGlobalName and privateGlobalCCode is used to pass output to caller of getCDeclarationString\r
+    //\r
     private void getCDeclarationString(Token t) \r
         throws EntityException {\r
         \r
@@ -1321,7 +1368,7 @@ class PcdDatabase {
         }\r
 \r
         String type = getCType(t);\r
-        if ((t.datumType == Token.DATUM_TYPE.POINTER) && (!t.isHiiEnable())) {\r
+        if ((t.datumType == Token.DATUM_TYPE.POINTER) && (!t.isHiiEnable()) && (!t.isUnicodeStringType())) {\r
             int bufferSize;\r
             if (t.isASCIIStringType()) {\r
                 //\r
@@ -3007,14 +3054,16 @@ public class CollectPCDAction {
     **/\r
     public static void main(String argv[]) throws EntityException {\r
         CollectPCDAction ca = new CollectPCDAction();\r
-        ca.setWorkspacePath("m:/tianocore/edk2");\r
-        ca.setFPDFilePath("m:/tianocore/edk2/EdkNt32Pkg/Nt32.fpd");\r
+        String projectDir = "x:/edk2";\r
+        ca.setWorkspacePath(projectDir);\r
+        ca.setFPDFilePath(projectDir + "/EdkNt32Pkg/Nt32.fpd");\r
         ca.setActionMessageLevel(ActionMessage.MAX_MESSAGE_LEVEL);\r
         GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
-                            "m:/tianocore/edk2",\r
+                            projectDir,\r
                             "tools_def.txt");\r
+        System.out.println("After initInfo!");\r
         FpdParserTask fpt = new FpdParserTask();\r
-        fpt.parseFpdFile(new File("m:/tianocore/edk2/EdkNt32Pkg/Nt32.fpd"));\r
+        fpt.parseFpdFile(new File(projectDir + "/EdkNt32Pkg/Nt32.fpd"));\r
         ca.execute();\r
     }\r
 }\r
index 1ffad91183e3b86a91fd6d13eeb16eadf9f277db..94266cda36ce1151d40480928186413cc5e50e6f 100644 (file)
@@ -574,7 +574,78 @@ public class Token {
     public int getSkuIdCount () {\r
         return this.skuData.size();\r
     }\r
-    \r
+\r
+    private void getCurrentSizeFromDefaultValue (String str, ArrayList<Integer> al) {\r
+        if (isValidNullValue(str)) {\r
+            al.add(new Integer(0));\r
+        } else {\r
+            //\r
+            // isValidNullValue has already make sure that str here\r
+            // always contain a valid default value of the following 3\r
+            // cases:\r
+            // 1) "Hello world" //Assci string\r
+            // 2) L"Hello" //Unicode string\r
+            // 3) {0x01, 0x02, 0x03} //Byte stream\r
+            //\r
+            if (str.startsWith("\"")) {\r
+                al.add(new Integer(str.length() - 2));\r
+            } else if (str.startsWith("L\"")){\r
+                //\r
+                // Unicode is 2 bytes each.\r
+                //\r
+                al.add(new Integer((str.length() - 3) * 2));\r
+            } else if (str.startsWith("{")) {\r
+                //\r
+                // We count the number of "," in the string.\r
+                // The number of byte is one plus the number of \r
+                // comma.\r
+                //\r
+                String str2 = str;\r
+                \r
+                int cnt = 0;\r
+                int pos = 0;\r
+                pos = str2.indexOf(",", 0);\r
+                while (pos != -1) {\r
+                    cnt++;\r
+                    pos++;\r
+                    pos = str2.indexOf(",", pos);\r
+                }\r
+                cnt++;\r
+                al.add(new Integer(cnt));\r
+            }\r
+        }\r
+    }\r
+    //\r
+    // This method can be used to get the MAX and current size\r
+    // for pointer type dynamic(ex) PCD entry\r
+    //\r
+    public ArrayList<Integer> getPointerTypeSize () {\r
+        ArrayList<Integer> al = new ArrayList<Integer>();\r
+        \r
+        //\r
+        // For VPD_enabled and HII_enabled, we can only return the MAX size.\r
+        // For the default DATA type dynamic PCD entry, we will return\r
+        // the MAX size and current size for each SKU_ID.\r
+        //\r
+        al.add(new Integer(this.datumSize));\r
+        \r
+        if (!this.isVpdEnable()) {\r
+            int idx;\r
+            if (this.isHiiEnable()){\r
+                for (idx = 0; idx < this.skuData.size(); idx++) {\r
+                    String str = this.skuData.get(idx).value.hiiDefaultValue;\r
+                    getCurrentSizeFromDefaultValue(str, al);\r
+                }\r
+            } else {\r
+                for (idx = 0; idx < this.skuData.size(); idx++) {\r
+                    String str = this.skuData.get(idx).value.value;\r
+                    getCurrentSizeFromDefaultValue(str, al);\r
+                }\r
+            }\r
+        }\r
+        \r
+        return al;\r
+    }\r
 \r
     /**\r
        Get default value for a token, For HII type, HiiDefaultValue of default\r