Check in the Pcd service Driver/PEIM according to the new way of generating PCD Database
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 24 May 2006 08:16:20 +0000 (08:16 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 24 May 2006 08:16:20 +0000 (08:16 +0000)
LIMITATION:

1) ONLY dynamic type PCD is supported for now. DynamicEx is not supported.
2) HII enable and VPD is not tested.

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

EdkModulePkg/EdkModulePkg.spd
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
EdkModulePkg/Universal/PCD/Test/PcdTest.c

index 1d75273..bf77ad0 100644 (file)
@@ -304,6 +304,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <MsaFile>
       <Filename>Universal/Network/Snp32_64/Dxe/SNP.msa</Filename>
     </MsaFile>
+    <MsaFile>\r
+      <Filename>Universal/PCD/Pei/Pcd.msa</Filename>\r
+    </MsaFile>\r
+    <MsaFile>\r
+      <Filename>Universal/PCD/Test/PeiPcdTest.msa</Filename>\r
+    </MsaFile>\r
+    <MsaFile>\r
+      <Filename>Universal/PCD/Dxe/Pcd.msa</Filename>\r
+    </MsaFile>\r
     <MsaFile>
       <Filename>Universal/Runtime/RuntimeDxe/Runtime.msa</Filename>
     </MsaFile>
@@ -347,6 +356,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <IncludeHeader ModuleType="UEFI_DRIVER">Include/EdkDxe.h</IncludeHeader>
   </PackageHeaders>
   <GuidDeclarations>
+    <Entry Name="PcdDataBaseHob">\r
+      <C_Name>gPcdDataBaseHobGuid</C_Name>\r
+      <Guid>0xea296d92, 0xb69,  0x423c, 0x8c, 0x28, 0x33, 0xb4, 0xe0, 0xa9, 0x12, 0x68</Guid>\r
+    </Entry>\r
+    <Entry Name="PcdPeiCallbackFnTable">\r
+      <C_Name>gPcdPeiCallbackFnTableHobGuid</C_Name>\r
+      <Guid>0xc625f4b2, 0xea09, 0x4675, 0x82, 0xd7, 0xba, 0x36, 0x82, 0x15, 0x7a, 0x14</Guid>\r
+    </Entry>\r
     <Entry Name="PeiPeCoffLoader">
       <C_Name>gEfiPeiPeCoffLoaderGuid</C_Name>
       <Guid>0xd8117cff, 0x94a6, 0x11d4, 0x9a, 0x3a, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d</Guid>
@@ -665,5 +682,38 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>UINT8</DatumType>
       <DefaultValue>0</DefaultValue>
     </PcdEntry>
+    <PcdEntry ItemType="FIXED_AT_BUILD">\r
+      <C_Name>PcdMaxPcdCallBackNumber</C_Name>\r
+      <Token>0x0001000f</Token>\r
+      <DatumType>UINT32</DatumType>\r
+      <DefaultValue>0</DefaultValue>\r
+    </PcdEntry>    \r
+    <PcdEntry ItemType="DYNAMIC">\r
+      <C_Name>PcdTestDynamicUint8</C_Name>\r
+      <Token>0x00011000</Token>\r
+      <DatumType>UINT8</DatumType>\r
+      <DefaultValue>0x01</DefaultValue>\r
+    </PcdEntry>    \r
+    <PcdEntry ItemType="DYNAMIC">\r
+      <C_Name>PcdTestDynamicUint16</C_Name>\r
+      <Token>0x00011001</Token>\r
+      <DatumType>UINT16</DatumType>\r
+      <DefaultValue>0x1234</DefaultValue>\r
+    </PcdEntry>    \r
+    <PcdEntry ItemType="DYNAMIC">\r
+      <C_Name>PcdTestDynamicUint32</C_Name>\r
+      <Token>0x00011002</Token>\r
+      <DatumType>UINT32</DatumType>\r
+    </PcdEntry>    \r
+    <PcdEntry ItemType="DYNAMIC">\r
+      <C_Name>PcdTestDynamicUint64</C_Name>\r
+      <Token>0x00011003</Token>\r
+      <DatumType>UINT64</DatumType>\r
+    </PcdEntry>    \r
+    <PcdEntry ItemType="DYNAMIC">\r
+      <C_Name>PcdTestDynamicBoolean</C_Name>\r
+      <Token>0x00011004</Token>\r
+      <DatumType>BOOLEAN</DatumType>\r
+    </PcdEntry>    \r
   </PcdDefinitions>
 </PackageSurfaceArea>
index 4ed7eb0..20fd4a1 100644 (file)
@@ -15,7 +15,6 @@ Module Name: Pcd.c
 \r
 **/\r
 \r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \r
@@ -70,9 +69,19 @@ PcdDxeInit (
   IN EFI_SYSTEM_TABLE     *SystemTable\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS          Status;\r
+\r
+  //\r
+  // Make sure the Pcd Protocol is not already installed in the system\r
+  //\r
+  \r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gPcdProtocolGuid);\r
   \r
-  InitPcdDxeDataBase ();\r
+  BuildPcdDxeDataBase ();\r
+\r
+  //\r
+  // BugBug Check if PcdDatabase is already installed.\r
+  //\r
   \r
   Status = gBS->InstallProtocolInterface (\r
                   &NewHandle,\r
@@ -91,10 +100,10 @@ PcdDxeInit (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetSku (\r
-  IN  UINTN                  SkuId\r
+  IN  UINTN        SkuId\r
   )\r
 {\r
-  return DxeSetSku(SkuId);\r
+  return gPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId;\r
 }\r
 \r
 \r
@@ -102,10 +111,12 @@ DxePcdSetSku (
 UINT8\r
 EFIAPI\r
 DxePcdGet8 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN         TokenNumber\r
   )\r
 {\r
-  return DxePcdGet8Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return *((UINT8 *) GetWorker (TokenNumber));\r
 }\r
 \r
 \r
@@ -113,10 +124,12 @@ DxePcdGet8 (
 UINT16\r
 EFIAPI\r
 DxePcdGet16 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN         TokenNumber\r
   )\r
 {\r
-  return DxePcdGet16Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return ReadUnaligned16 (GetWorker (TokenNumber));\r
 }\r
 \r
 \r
@@ -124,10 +137,12 @@ DxePcdGet16 (
 UINT32\r
 EFIAPI\r
 DxePcdGet32 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN         TokenNumber\r
   )\r
 {\r
-  return DxePcdGet32Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return ReadUnaligned32 (GetWorker (TokenNumber));\r
 }\r
 \r
 \r
@@ -135,10 +150,12 @@ DxePcdGet32 (
 UINT64\r
 EFIAPI\r
 DxePcdGet64 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
-  return DxePcdGet32Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return ReadUnaligned64(GetWorker (TokenNumber));\r
 }\r
 \r
 \r
@@ -146,10 +163,10 @@ DxePcdGet64 (
 VOID *\r
 EFIAPI\r
 DxePcdGetPtr (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
-  return DxePcdGetPtrEx (NULL, TokenNumber);\r
+  return GetWorker (TokenNumber);\r
 }\r
 \r
 \r
@@ -157,10 +174,12 @@ DxePcdGetPtr (
 BOOLEAN\r
 EFIAPI\r
 DxePcdGetBool (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
-  return DxePcdGetBoolEx (NULL, TokenNumber);\r
+  ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return *((BOOLEAN *) GetWorker (TokenNumber));\r
 }\r
 \r
 \r
@@ -168,10 +187,18 @@ DxePcdGetBool (
 UINTN\r
 EFIAPI\r
 DxePcdGetSize (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
-  return  DxePcdGetSizeEx (NULL, TokenNumber);\r
+  UINT16 * SizeTable;\r
+\r
+  SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? gPcdDatabase->PeiDb.Init.SizeTable :\r
+                                                    gPcdDatabase->DxeDb.Init.SizeTable;\r
+\r
+\r
+  TokenNumber = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TokenNumber : (TokenNumber - PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+  return SizeTable[TokenNumber];\r
 }\r
 \r
 \r
@@ -179,15 +206,11 @@ DxePcdGetSize (
 UINT8\r
 EFIAPI\r
 DxePcdGet8Ex (\r
-  IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN CONST EFI_GUID         *Guid,\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  UINT8 Data;\r
-\r
-  DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data);\r
-\r
-  return Data;\r
+  return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT8)));\r
 }\r
 \r
 \r
@@ -196,14 +219,10 @@ UINT16
 EFIAPI\r
 DxePcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                 ExTokenNumber\r
   )\r
 {\r
-  UINT16 Data;\r
-\r
-  DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data);\r
-\r
-  return Data;\r
+  return *((UINT16 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT16)));\r
 }\r
 \r
 \r
@@ -212,14 +231,10 @@ UINT32
 EFIAPI\r
 DxePcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  UINT32 Data;\r
-\r
-  DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data);\r
-\r
-  return Data;\r
+  return *((UINT32 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT32)));\r
 }\r
 \r
 \r
@@ -228,14 +243,13 @@ UINT64
 EFIAPI\r
 DxePcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  UINT64 Data;\r
-\r
-  DxeGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data);\r
-\r
-  return Data;\r
+  //\r
+  // BugBug: Must be changed to ReadUnaligned64\r
+  //\r
+  return *((UINT64 *) ExGetWorker (Guid, ExTokenNumber, sizeof(UINT64)));\r
 }\r
 \r
 \r
@@ -244,14 +258,10 @@ VOID *
 EFIAPI\r
 DxePcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  VOID *Data;\r
-\r
-  DxeGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data);\r
-\r
-  return Data;\r
+  return ExGetWorker (Guid, ExTokenNumber, 0);\r
 }\r
 \r
 \r
@@ -260,12 +270,10 @@ BOOLEAN
 EFIAPI\r
 DxePcdGetBoolEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  BOOLEAN Data;\r
-  DxeGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data);\r
-  return Data;\r
+  return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof(BOOLEAN)));\r
 }\r
 \r
 \r
@@ -274,10 +282,14 @@ UINTN
 EFIAPI\r
 DxePcdGetSizeEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  return DxeGetPcdEntrySizeWorker (TokenNumber, Guid);\r
+  EX_PCD_ENTRY_ATTRIBUTE    Attr;\r
+  \r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
+\r
+  return Attr.Size;\r
 }\r
 \r
 \r
@@ -285,11 +297,11 @@ DxePcdGetSizeEx (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet8 (\r
-  IN UINTN  TokenNumber,\r
-  IN UINT8             Value\r
+  IN UINTN              TokenNumber,\r
+  IN UINT8              Value\r
   )\r
 {\r
-  return DxePcdSet8Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -297,11 +309,11 @@ DxePcdSet8 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet16 (\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN              TokenNumber,\r
   IN UINT16             Value\r
   )\r
 {\r
-  return DxePcdSet16Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -309,11 +321,11 @@ DxePcdSet16 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet32 (\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN              TokenNumber,\r
   IN UINT32             Value\r
   )\r
 {\r
-  return DxePcdSet32Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -321,11 +333,11 @@ DxePcdSet32 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet64 (\r
-  IN UINTN  TokenNumber,\r
-  IN UINT64            Value\r
+  IN UINTN              TokenNumber,\r
+  IN UINT64             Value\r
   )\r
 {\r
-  return DxePcdSet64Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -333,11 +345,16 @@ DxePcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetPtr (\r
-  IN UINTN  TokenNumber,\r
-  IN CONST VOID        *Value\r
+  IN UINTN              TokenNumber,\r
+  IN CONST VOID         *Value\r
   )\r
 {\r
-  return DxePcdSetPtrEx (NULL, TokenNumber, Value);\r
+  //\r
+  // BugBug, please change the Size to Input size when sync with spec\r
+  //\r
+  //ASSERT (sizeof (Value) == DxePcdGetSize (TokenNumber));\r
+\r
+  return SetWorker (TokenNumber, (VOID *)Value, DxePcdGetSize (TokenNumber), TRUE);\r
 }\r
 \r
 \r
@@ -345,11 +362,11 @@ DxePcdSetPtr (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetBool (\r
-  IN UINTN  TokenNumber,\r
-  IN BOOLEAN           Value\r
+  IN UINTN              TokenNumber,\r
+  IN BOOLEAN            Value\r
   )\r
 {\r
-  return DxePcdSetBoolEx (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -358,11 +375,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
-  IN UINT8             Value\r
+  IN UINTN                  ExTokenNumber,\r
+  IN UINT8                  Value\r
   )\r
 {\r
-  return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -371,11 +394,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN UINT16            Value\r
   )\r
 {\r
-  return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -384,11 +413,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN UINT32             Value\r
   )\r
 {\r
-  return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -397,11 +432,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN UINT64            Value\r
   )\r
 {\r
-  return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -410,11 +451,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN CONST VOID        *Value\r
   )\r
 {\r
-  return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              (VOID *) Value, \r
+                              sizeof (Value), \r
+                              TRUE\r
+                              );\r
 }\r
 \r
 \r
@@ -423,12 +470,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSetBoolEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN BOOLEAN           Value\r
   )\r
 {\r
-  return DxeSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value);\r
-\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              TRUE\r
+                              );\r
 }\r
 \r
 \r
index 280a45e..52097ad 100644 (file)
@@ -14,427 +14,463 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 Module Name: Service.c\r
 \r
 **/\r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
-static PCD_DATABASE *PrivatePcdDxeDatabase;\r
-static LIST_ENTRY   mPcdDatabaseListHead = INITIALIZE_LIST_HEAD_VARIABLE(mPcdDatabaseListHead);\r
 \r
-LIST_ENTRY *\r
-GetPcdDatabaseListHead (\r
-  VOID\r
-  )\r
-{\r
-  return &mPcdDatabaseListHead;\r
-}\r
-\r
-PCD_DATABASE *\r
-GetPcdDxeDataBaseInstance (\r
-  VOID\r
-)\r
-{\r
-  return PrivatePcdDxeDatabase;\r
-}\r
+//\r
+// Build Tool will generate DXE_PCD_DB_INIT_VALUE in Autogen.h\r
+// Compression Algorithm will take care of the size optimization.\r
+//\r
 \r
-PCD_DATABASE *\r
-SetPcdDxeDataBaseInstance (\r
-  PCD_DATABASE *PcdDatabase\r
-)\r
-{\r
-  return PrivatePcdDxeDatabase = PcdDatabase;\r
-}\r
+/*\r
+DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {\r
+  DXE_PCD_DB_INIT_VALUE\r
+};\r
+*/\r
 \r
+PCD_DATABASE * gPcdDatabase;\r
 \r
-VOID\r
-DxeGetPcdEntryWorker (\r
-  IN UINTN            TokenNumber,\r
-  IN CONST GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE    Type,\r
-  OUT VOID            *Data\r
-  )\r
+VOID *\r
+GetWorkerByLocalTokenNumber (\r
+  UINT32      LocalTokenNumber,\r
+  BOOLEAN     IsPeiDb,\r
+  UINTN       Size\r
+  ) \r
 {\r
-  PCD_DATABASE *Database;\r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  UINT32              Offset;\r
+  EFI_GUID            *GuidTable;\r
+  UINT16              *StringTable;\r
+  EFI_GUID            *Guid;\r
+  UINT16              *Name;\r
+  VARIABLE_HEAD       *VariableHead;\r
+  EFI_STATUS          Status;\r
+  UINTN               DataSize;\r
+  VOID                *Data;\r
+  VPD_HEAD            *VpdHead;\r
+  UINT8               *PcdDb;\r
+  UINT16              StringTableIdx;      \r
+\r
+  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
+  }\r
+\r
+  PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
+  StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
+                          gPcdDatabase->DxeDb.Init.StringTable;\r
+  \r
+  Offset     = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+  \r
+  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+    case PCD_TYPE_VPD:\r
+      VpdHead = (VPD_HEAD *) ((UINT8 *) PcdDb + Offset);\r
+      return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+      \r
+    case PCD_TYPE_HII:\r
+      GuidTable   = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :\r
+                              gPcdDatabase->DxeDb.Init.GuidTable;\r
+                              \r
+      VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
+      \r
+      Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
+      Name = &(StringTable[VariableHead->StringIndex]);\r
 \r
-  GetPcdEntryWorker ( &Database->Info,\r
-                      TokenNumber,\r
-                      Guid,\r
-                      Type,\r
-                      Data\r
-                      );\r
+      Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+      ASSERT_EFI_ERROR (Status);\r
+      ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
 \r
+      return (UINT8 *) Data + VariableHead->Offset;\r
 \r
-  return;\r
-}\r
+    case PCD_TYPE_STRING:\r
+      StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
+      return (VOID *) &StringTable[StringTableIdx];\r
 \r
+    case PCD_TYPE_DATA:\r
+      return (VOID *) ((UINT8 *) PcdDb + Offset);\r
+      break;\r
 \r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+      \r
+  }\r
 \r
-EFI_STATUS\r
-DxeSetPcdEntryWorker (\r
-  IN UINTN              TokenNumber,\r
-  IN CONST GUID         *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE      Type,\r
-  IN CONST VOID         *Data\r
+  ASSERT (FALSE);\r
+      \r
+  return NULL;\r
+}\r
+  \r
+VOID *\r
+GetWorker (\r
+  UINTN  TokenNumber\r
   )\r
 {\r
-  PCD_DATABASE            *Database;\r
-  PCD_INDEX               *PcdIndex;\r
-  EFI_STATUS              Status;\r
-\r
-  Database = GetPcdDxeDataBaseInstance ();\r
-\r
-\r
-  ASSERT (Data != NULL);\r
-\r
-  PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
+  UINT32        *LocalTokenNumberTable;\r
+  UINT16        *SizeTable;\r
+  BOOLEAN       IsPeiDb;\r
 \r
-  ASSERT (PcdIndex != NULL);\r
+  ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
+  \r
+  IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
 \r
-  ASSERT (PcdIndex->StateByte.DataType == Type);\r
+  LocalTokenNumberTable  = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+                                     gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
 \r
-  //\r
-  // Invoke the callback function.\r
-  //\r
+  SizeTable              = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable: \r
+                                     gPcdDatabase->DxeDb.Init.SizeTable;\r
 \r
-  Status = SetPcdData (PcdIndex, &Database->Info, Data);\r
+  TokenNumber            = IsPeiDb ? TokenNumber :\r
+                                     TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
+  return GetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], IsPeiDb, SizeTable[TokenNumber]);\r
+}\r
 \r
-  return Status;\r
 \r
 \r
+EFI_STATUS\r
+DxeRegisterCallBackWorker (\r
+  IN  UINTN                   TokenNumber,\r
+  IN  CONST GUID              *Guid, OPTIONAL\r
+  IN  PCD_PROTOCOL_CALLBACK   CallBackFunction,\r
+  IN  BOOLEAN                 Register\r
+)\r
+{\r
+  \r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
-\r
-UINTN\r
-DxeGetPcdEntrySizeWorker (\r
-  IN UINTN            TokenNumber,\r
-  IN CONST GUID       *Guid  OPTIONAL\r
+EFI_STATUS\r
+DxeGetNextTokenWorker (\r
+  IN OUT UINTN            *TokenNumber,\r
+  IN CONST GUID           *Guid     OPTIONAL\r
   )\r
 {\r
-  PCD_DATABASE *Database;\r
-  Database = GetPcdDxeDataBaseInstance ();\r
-\r
-  return GetPcdEntrySizeWorker (&Database->Info,\r
-                                TokenNumber,\r
-                                Guid\r
-                                );\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
 \r
-LIST_ENTRY *\r
-InsertToGuidSpaceListI (\r
-  IN LIST_ENTRY       *GuidSpaceListHead,\r
-  IN CONST EFI_GUID   *Guid\r
-  )\r
+VOID\r
+BuildPcdDxeDataBase (\r
+  VOID\r
+)\r
 {\r
-  PCD_GUID_SPACE    *GuidSpaceEntry;\r
+  PEI_PCD_DATABASE    *PeiDatabase;\r
+  EFI_HOB_GUID_TYPE   *GuidHob;\r
 \r
-  GuidSpaceEntry = AllocatePool (sizeof (PCD_GUID_SPACE));\r
-  ASSERT (GuidSpaceEntry != NULL);\r
+  gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));\r
+  ASSERT (gPcdDatabase != NULL);\r
 \r
-  GuidSpaceEntry->GuidSpace= Guid;\r
-  InitializeListHead (&GuidSpaceEntry->TokenSpaceHead);\r
-  \r
-  InsertTailList (GuidSpaceListHead, &GuidSpaceEntry->ListNode);\r
+  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+  ASSERT (GuidHob != NULL);\r
 \r
-  return &GuidSpaceEntry->TokenSpaceHead;\r
+  PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+  //\r
+  // Copy PCD Entries refereneced in PEI phase to PCD DATABASE\r
+  //\r
+  CopyMem (&gPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));\r
+\r
+  //\r
+  // Copy PCD Entries with default value to PCD DATABASE\r
+  //\r
+  CopyMem (&gPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));\r
+    \r
+  return;\r
 }\r
 \r
 \r
 \r
-LIST_ENTRY *\r
-InsertToTokenSpaceListI (\r
-  IN LIST_ENTRY *TokenSpaceListHead,\r
-  IN UINTN      TokenNumber\r
+EFI_STATUS\r
+GetHiiVariable (\r
+  IN  EFI_GUID      *VariableGuid,\r
+  IN  UINT16        *VariableName,\r
+  OUT VOID          ** VariableData,\r
+  OUT UINTN         *VariableSize\r
   )\r
 {\r
-  PCD_TOKEN_SPACE   *TokenSpaceEntry;\r
+  UINTN      Size;\r
+  EFI_STATUS Status;\r
+  VOID       *Buffer;\r
 \r
-  TokenSpaceEntry = AllocatePool (sizeof (PCD_TOKEN_SPACE));\r
-  ASSERT (TokenSpaceEntry != NULL);\r
+  Status = EfiGetVariable (\r
+    (UINT16 *)VariableName,\r
+    VariableGuid,\r
+    NULL,\r
+    &Size,\r
+    NULL\r
+    );\r
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
 \r
-  TokenSpaceEntry->TokeNumber = TokenNumber;\r
-  InitializeListHead (&TokenSpaceEntry->CallbackListHead);\r
-  \r
-  InsertTailList (TokenSpaceListHead, &TokenSpaceEntry->ListNode);\r
+  Buffer = AllocatePool (Size);\r
 \r
-  return &TokenSpaceEntry->CallbackListHead;\r
-}\r
+  ASSERT (Buffer != NULL);\r
 \r
+  Status = EfiGetVariable (\r
+    VariableName,\r
+    VariableGuid,\r
+    NULL,\r
+    &Size,\r
+    Buffer\r
+    );\r
 \r
+  return Status;\r
 \r
-VOID\r
-InsertToCallbackListI (\r
-  IN  LIST_ENTRY *CallbackListHead,\r
-  IN  PCD_PROTOCOL_CALLBACK   CallBackFunction\r
-  )\r
-{\r
-  PCD_CALLBACK_ENTRY *CallbackEntry;\r
-  \r
-  CallbackEntry = AllocatePool (sizeof (PCD_CALLBACK_ENTRY));\r
-  ASSERT (CallbackEntry != NULL);\r
-  CallbackEntry->CallbackFunction = CallBackFunction;\r
-  InsertTailList (CallbackListHead, &CallbackEntry->ListNode);\r
-  \r
-  return;\r
 }\r
 \r
 \r
+UINT32\r
+GetSkuEnabledTokenNumber (\r
+  UINT32    LocalTokenNumber,\r
+  UINTN     Size,\r
+  BOOLEAN   IsPeiDb\r
+  ) \r
+{\r
+  SKU_HEAD              *SkuHead;\r
+  SKU_ID                *SkuIdTable;\r
+  INTN                  i;\r
+  UINT8                 *Value;\r
+  SKU_ID                *PhaseSkuIdTable;\r
+  UINT8                 *PcdDb;\r
 \r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
 \r
-VOID\r
-InsertToCallbackList (\r
-  IN  UINTN                   TokenNumber,\r
-  IN  CONST EFI_GUID          *Guid,\r
-  IN  PCD_PROTOCOL_CALLBACK   CallBackFunction\r
-  )\r
-{\r
-  LIST_ENTRY        *GuidListNode;\r
-  LIST_ENTRY        *GuidListHead;\r
-  LIST_ENTRY        *TokenListNode;\r
-  LIST_ENTRY        *TokenListHead;\r
-  LIST_ENTRY        *CallbackListHead;\r
-  PCD_GUID_SPACE    *GuidSpaceEntry;\r
-  PCD_TOKEN_SPACE   *TokenSpaceEntry;\r
+  PcdDb = IsPeiDb ? (UINT8 *) &gPcdDatabase->PeiDb : (UINT8 *) &gPcdDatabase->DxeDb;\r
 \r
-  \r
-  GuidListHead = GetPcdDatabaseListHead ();\r
-\r
-  GuidListNode = GetFirstNode (GuidListHead);\r
-  while (!IsNull (GuidListNode, GuidListHead)) {\r
-    GuidSpaceEntry = PCD_GUID_SPACE_FROM_LISTNODE(GuidListNode);\r
-\r
-    if (CompareGuid (GuidSpaceEntry->GuidSpace, Guid)) {\r
-      TokenListHead = &GuidSpaceEntry->TokenSpaceHead;\r
-      TokenListNode = GetFirstNode (TokenListHead);\r
-      while (!IsNull (TokenListNode, TokenListHead)) {\r
-        TokenSpaceEntry = PCD_TOKEN_SPACE_FROM_LISTNODE(TokenListNode);\r
-        if (TokenSpaceEntry->TokeNumber == TokenNumber) {\r
-          InsertToCallbackListI (&TokenSpaceEntry->CallbackListHead , CallBackFunction);\r
-        }\r
-      }\r
+  SkuHead     = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
+  Value       = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset); \r
 \r
-      //\r
-      // No TokenNumber match input found in this GuidSpace\r
-      //\r
-      CallbackListHead = InsertToTokenSpaceListI (TokenListHead, TokenNumber);\r
-      InsertToCallbackListI (CallbackListHead , CallBackFunction);\r
+  PhaseSkuIdTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SkuIdTable :\r
+                              gPcdDatabase->DxeDb.Init.SkuIdTable;\r
+                              \r
+  SkuIdTable  = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];\r
+        \r
+  for (i = 0; i < SkuIdTable[0]; i++) {\r
+    if (gPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {\r
+      break;\r
     }\r
-    \r
-    GuidListNode = GetNextNode (GuidListHead, GuidListNode);\r
   }\r
+  ASSERT (i < SkuIdTable[0]);\r
 \r
-  //\r
-  // No GuidSpace match the input Guid, so build the GuidSpace, TokenNumberSpace and Callback\r
-  //\r
-  TokenListHead = InsertToGuidSpaceListI (GuidListHead, Guid);\r
-  CallbackListHead = InsertToTokenSpaceListI (TokenListHead, TokenNumber);\r
-  InsertToCallbackListI (CallbackListHead , CallBackFunction);\r
+  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+    case PCD_TYPE_VPD:\r
+      Value = (UINT8 *) &(((VPD_HEAD *) Value)[i]);\r
+      return ((Value - PcdDb) | PCD_TYPE_VPD);\r
 \r
-  return;\r
+    case PCD_TYPE_HII:\r
+      Value = (UINT8 *) &(((VARIABLE_HEAD *) Value)[i]);\r
+      return ((Value - PcdDb) | PCD_TYPE_HII);\r
+      \r
+    case PCD_TYPE_DATA:\r
+      Value += Size * i;\r
+      return (Value - PcdDb);\r
+      \r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
+\r
+  ASSERT (FALSE);\r
+\r
+  return 0;\r
   \r
 }\r
 \r
-EFI_STATUS\r
-RemoveFromCallbackListI (\r
-  IN  LIST_ENTRY              *CallbackListHead,\r
-  IN  PCD_PROTOCOL_CALLBACK   CallBackFunction\r
-  )\r
-{\r
-  LIST_ENTRY          *ListNode;\r
-  PCD_CALLBACK_ENTRY  *CallbackEntry;\r
 \r
-  ListNode = GetFirstNode (CallbackListHead);\r
 \r
-  while (!IsNull(CallbackListHead, ListNode)) {\r
-    CallbackEntry = PCD_CALLBACK_ENTRY_FROM_LISTNODE(ListNode);\r
 \r
-    if (CallbackEntry->CallbackFunction == CallBackFunction) {\r
-      RemoveEntryList (ListNode);\r
-      FreePool (CallbackEntry);\r
-      return EFI_SUCCESS;\r
-    }\r
-    ListNode = GetNextNode (CallbackListHead, ListNode);\r
-  }\r
 \r
-  return EFI_NOT_FOUND;\r
+VOID\r
+InvokeCallbackOnSet (\r
+  UINT32            ExTokenNumber,\r
+  CONST EFI_GUID    *Guid, OPTIONAL\r
+  UINTN             TokenNumber,\r
+  VOID              *Data,\r
+  UINTN             Size\r
+  )\r
+{\r
+  return;\r
 }\r
 \r
 \r
 \r
+\r
 EFI_STATUS\r
-RemoveFromCallbackList (\r
-  IN  UINTN                   TokenNumber,\r
-  IN  CONST GUID              *Guid,\r
-  IN  PCD_PROTOCOL_CALLBACK   CallBackFunction\r
+SetWorker (\r
+  UINTN         TokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType\r
   )\r
 {\r
-  LIST_ENTRY        *GuidListNode;\r
-  LIST_ENTRY        *GuidListHead;\r
-  LIST_ENTRY        *TokenListNode;\r
-  LIST_ENTRY        *TokenListHead;\r
-  PCD_GUID_SPACE    *GuidSpaceEntry;\r
-  PCD_TOKEN_SPACE   *TokenSpaceEntry;\r
+  UINT32              *LocalTokenNumberTable;\r
+  BOOLEAN             IsPeiDb;\r
 \r
-  \r
-  GuidListHead = GetPcdDatabaseListHead ();\r
 \r
-  GuidListNode = GetFirstNode (GuidListHead);\r
-  while (!IsNull (GuidListNode, GuidListHead)) {\r
-    \r
-    GuidSpaceEntry = PCD_GUID_SPACE_FROM_LISTNODE(GuidListNode);\r
-    if (CompareGuid (GuidSpaceEntry->GuidSpace, Guid)) {\r
-      \r
-      TokenListHead = &GuidSpaceEntry->TokenSpaceHead;\r
-      TokenListNode = GetFirstNode (TokenListHead);\r
-      while (!IsNull (TokenListNode, TokenListHead)) {\r
-        \r
-        TokenSpaceEntry = PCD_TOKEN_SPACE_FROM_LISTNODE(TokenListNode);\r
-        if (TokenSpaceEntry->TokeNumber == TokenNumber) {\r
-          return RemoveFromCallbackListI (&TokenSpaceEntry->CallbackListHead , CallBackFunction);\r
-        }\r
-      }\r
+  ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
 \r
-      //\r
-      // No TokenNumber match input found in this GuidSpace\r
-      //\r
-      return EFI_NOT_FOUND;\r
-    }\r
-    \r
-    GuidListNode = GetNextNode (GuidListHead, GuidListNode);\r
+  if (PtrType) {\r
+    ASSERT (Size <= DxePcdGetSize (TokenNumber));\r
+  } else {\r
+    ASSERT (Size == DxePcdGetSize (TokenNumber));\r
   }\r
-\r
-\r
-  return EFI_NOT_FOUND;\r
   \r
-}\r
-\r
+  IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
 \r
+  LocalTokenNumberTable  = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+                                     gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
 \r
-EFI_STATUS\r
-DxeRegisterCallBackWorker (\r
-  IN  UINTN                   TokenNumber,\r
-  IN  CONST GUID              *Guid, OPTIONAL\r
-  IN  PCD_PROTOCOL_CALLBACK   CallBackFunction,\r
-  IN  BOOLEAN                 Register\r
-)\r
-{\r
-  PCD_DATABASE *Database;\r
-  PCD_INDEX    *PcdIndex;\r
+  TokenNumber = IsPeiDb ? TokenNumber\r
+                        : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
   \r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
 \r
-  PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
+  return SetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], Data, Size, PtrType, IsPeiDb);\r
 \r
-  if (PcdIndex == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
+}\r
 \r
-  if (Register) {\r
-    InsertToCallbackList (TokenNumber, Guid, CallBackFunction);\r
-    return EFI_SUCCESS;\r
-  } else {\r
-    return RemoveFromCallbackList (TokenNumber, Guid, CallBackFunction); \r
-  }\r
 \r
- }\r
 \r
 \r
 \r
-EFI_STATUS\r
-DxeSetSku (\r
-  UINTN Id\r
-)\r
+VOID *\r
+ExGetWorker (\r
+  IN CONST EFI_GUID         *Guid,\r
+  IN UINTN                  ExTokenNumber,\r
+  IN UINTN                  GetSize\r
+  ) \r
 {\r
-  PCD_DATABASE * Database;\r
+  EX_PCD_ENTRY_ATTRIBUTE Attr;\r
 \r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
 \r
-  return Database->Info.SkuId = Id;\r
+  ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
 \r
+  return GetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias,\r
+                                                Attr.IsPeiDb,\r
+                                                Attr.Size\r
+                                                );\r
 }\r
 \r
 \r
 \r
+\r
+\r
 EFI_STATUS\r
-DxeGetNextTokenWorker (\r
-  IN OUT UINTN            *TokenNumber,\r
-  IN CONST GUID           *Guid     OPTIONAL\r
+ExSetWorker (\r
+  IN UINT32               ExTokenNumber,\r
+  IN CONST EFI_GUID       *Guid,\r
+  VOID                    *Data,\r
+  UINTN                   SetSize,\r
+  BOOLEAN                 PtrType\r
   )\r
 {\r
-  PCD_DATABASE * Database;\r
+  EX_PCD_ENTRY_ATTRIBUTE Attr;\r
 \r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
 \r
-  return GetNextTokenWorker (&Database->Info,\r
-                             TokenNumber,\r
-                             Guid\r
-                             );\r
-}\r
+  ASSERT (!PtrType && (SetSize == Attr.Size));\r
 \r
+  ASSERT (PtrType && (SetSize <= Attr.Size));\r
 \r
+  InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Attr.Size);\r
 \r
-VOID\r
-InitPcdDxeDataBase (\r
-  VOID\r
-)\r
-{\r
-  PCD_DATABASE        *PeiDatabase;\r
-  PCD_DATABASE        *DxeDatabase;\r
-  EFI_HOB_GUID_TYPE   *GuidHob;\r
+  SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Attr.Size, PtrType, Attr.IsPeiDb);\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
+  return EFI_SUCCESS;\r
+  \r
+}\r
 \r
-  PeiDatabase = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
 \r
-  DxeDatabase = AllocateCopyPool (PeiDatabase->Info.DatabaseLen, PeiDatabase);\r
 \r
-  ASSERT (DxeDatabase != NULL);\r
 \r
-  SetPcdDxeDataBaseInstance (DxeDatabase);\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+  UINT32        LocalTokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType,\r
+  BOOLEAN       IsPeiDb\r
+  )\r
+{\r
+  EFI_GUID            *GuidTable;\r
+  UINT16              *StringTable;\r
+  EFI_GUID            *Guid;\r
+  UINT16              *Name;\r
+  VOID                *InternalData;\r
+  VARIABLE_HEAD       *VariableHead;\r
+  UINTN               Offset;\r
+  UINT8               *PcdDb;\r
+\r
+\r
+  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);\r
+  }\r
 \r
-  return;\r
-}\r
+  Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
 \r
+  PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
 \r
+  StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
+                          gPcdDatabase->DxeDb.Init.StringTable;\r
+  \r
+  InternalData = PcdDb + Offset;\r
 \r
-EFI_STATUS\r
-GetHiiVariable (\r
-  IN  EFI_GUID      *VariableGuid,\r
-  IN  UINT16        *VariableName,\r
-  OUT VOID          ** VariableData,\r
-  OUT UINTN         *VariableSize\r
-  )\r
-{\r
-  UINTN      Size;\r
-  EFI_STATUS Status;\r
-  VOID       *Buffer;\r
+  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\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
+      break;\r
 \r
-  Status = EfiGetVariable (\r
-    (UINT16 *)VariableName,\r
-    VariableGuid,\r
-    NULL,\r
-    &Size,\r
-    NULL\r
-    );\r
-  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+    case PCD_TYPE_HII:\r
+      //\r
+      // Bug Bug: Please implement this\r
+      //\r
+      GuidTable   = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :\r
+                              gPcdDatabase->DxeDb.Init.GuidTable;\r
+                              \r
+      VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);\r
+      \r
+      Guid = &(GuidTable[VariableHead->GuidTableIndex]);\r
+      Name = &(StringTable[VariableHead->StringIndex]);\r
 \r
-  Buffer = AllocatePool (Size);\r
+      return EFI_SUCCESS;\r
 \r
-  ASSERT (Buffer != NULL);\r
+    case PCD_TYPE_DATA:\r
+      if (PtrType) {\r
+        CopyMem (InternalData, Data, Size);\r
+        return EFI_SUCCESS;\r
+      }\r
 \r
-  Status = EfiGetVariable (\r
-    VariableName,\r
-    VariableGuid,\r
-    NULL,\r
-    &Size,\r
-    Buffer\r
-    );\r
+      switch (Size) {\r
+        case sizeof(UINT8):\r
+          *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
+          return EFI_SUCCESS;\r
 \r
-  return Status;\r
+        case sizeof(UINT16):\r
+          *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
+          return EFI_SUCCESS;\r
+\r
+        case sizeof(UINT32):\r
+          *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
+          return EFI_SUCCESS;\r
+\r
+        case sizeof(UINT64):\r
+          *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
+          return EFI_SUCCESS;\r
 \r
+        default:\r
+          ASSERT (FALSE);\r
+          return EFI_NOT_FOUND;\r
+      }\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+    }\r
+      \r
+  ASSERT (FALSE);\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 \r
@@ -448,16 +484,17 @@ SetHiiVariable (
   IN  UINTN        Offset\r
   )\r
 {\r
-  UINTN Size;\r
-  VOID  *Buffer;\r
-  EFI_STATUS Status;\r
+  UINTN       Size;\r
+  VOID        *Buffer;\r
+  EFI_STATUS  Status;\r
+  UINT32      Attribute;\r
 \r
   Size = 0;\r
 \r
   Status = EfiGetVariable (\r
     (UINT16 *)VariableName,\r
     VariableGuid,\r
-    NULL,\r
+    &Attribute,\r
     &Size,\r
     NULL\r
     );\r
@@ -471,7 +508,7 @@ SetHiiVariable (
   Status = EfiGetVariable (\r
     VariableName,\r
     VariableGuid,\r
-    NULL,\r
+    &Attribute,\r
     &Size,\r
     Buffer\r
     );\r
@@ -482,10 +519,67 @@ SetHiiVariable (
   return EfiSetVariable (\r
     VariableName,\r
     VariableGuid,\r
-    0,\r
+    Attribute,\r
     Size,\r
     Buffer\r
     );\r
 \r
 }\r
 \r
+\r
+\r
+\r
+\r
+VOID\r
+GetExPcdTokenAttributes (\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINT32                     ExTokenNumber,\r
+  OUT EX_PCD_ENTRY_ATTRIBUTE    *ExAttr\r
+  )\r
+{\r
+  UINT32              i;\r
+  DYNAMICEX_MAPPING   *ExMap;\r
+  EFI_GUID            *GuidTable;\r
+  UINT16              *SizeTable;\r
+\r
+  ExMap       = gPcdDatabase->PeiDb.Init.ExMapTable;\r
+  GuidTable   = gPcdDatabase->PeiDb.Init.GuidTable;\r
+  SizeTable   = gPcdDatabase->PeiDb.Init.SizeTable;\r
+  \r
+  for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+    if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&\r
+        CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])\r
+      ) {\r
+\r
+        ExAttr->IsPeiDb               = TRUE;\r
+        ExAttr->Size                  = SizeTable[i + PEI_NEX_TOKEN_NUMBER];\r
+        ExAttr->TokenNumber           = i + PEI_NEX_TOKEN_NUMBER;\r
+        ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
+        return;\r
+\r
+    }\r
+  }\r
+  \r
+  ExMap       = gPcdDatabase->DxeDb.Init.ExMapTable;\r
+  GuidTable   = gPcdDatabase->DxeDb.Init.GuidTable;\r
+  SizeTable   = gPcdDatabase->DxeDb.Init.SizeTable;\r
+  \r
+  for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) {\r
+    if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&\r
+         CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])\r
+      ) {\r
+\r
+        ExAttr->IsPeiDb               = FALSE;\r
+        ExAttr->Size                  = SizeTable[i + DXE_NEX_TOKEN_NUMBER];\r
+        ExAttr->TokenNumber           = i + DXE_NEX_TOKEN_NUMBER;\r
+        ExAttr->LocalTokenNumberAlias = ExMap[i].LocalTokenNumber;\r
+        return;\r
+\r
+    }\r
+  }\r
+\r
+  ASSERT (FALSE);\r
+\r
+  return;\r
+}\r
+\r
index 86e3dfd..fd20871 100644 (file)
@@ -18,27 +18,251 @@ Module Name: Service.h
 #ifndef _SERVICE_H\r
 #define _SERVICE_H\r
 \r
-VOID \r
-DxeGetPcdEntryWorker (\r
-  IN UINTN Token,\r
-  IN CONST EFI_GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE    Type,\r
-  OUT VOID            *Data\r
-  );\r
+#define USE_AUTOGEN\r
 \r
-EFI_STATUS \r
-DxeSetPcdEntryWorker (\r
-  IN UINTN Token,\r
-  IN CONST EFI_GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE    Type,\r
-  IN CONST VOID       *Data\r
-  );\r
+#ifndef USE_AUTOGEN\r
+//\r
+// The following definition will be generated by build tool \r
+//\r
+\r
+//\r
+// Common definitions\r
+//\r
+#define PCD_TYPE_SHIFT        24\r
+\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
+\r
+\r
+#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED))\r
+\r
+typedef struct  {\r
+  UINT32                ExTokenNumber;\r
+  UINT32                LocalTokenNumber;   // PCD Number of this particular platform build\r
+  UINT16                ExGuidIndex;        // Index of GuidTable\r
+} DYNAMICEX_MAPPING;\r
+\r
+\r
+typedef struct {\r
+  UINT32  SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler\r
+  UINT32  SkuIdTableOffset;   //Offset from the PCD_DB\r
+} SKU_HEAD;\r
+\r
+\r
+typedef struct {\r
+  UINT16  GuidTableIndex;   // Offset in Guid Table in units of GUID.\r
+  UINT16  StringIndex;           // Offset in String Table in units of UINT16.\r
+  UINT16  Offset;           // Offset in Variable\r
+} VARIABLE_HEAD  ;\r
+\r
+\r
+typedef  struct {\r
+  UINT32  Offset;\r
+} VPD_HEAD;\r
+\r
+typedef struct {\r
+  UINT32 LocalTokenNumber;\r
+  UINT16 TokenNumber;\r
+  UINT16 Size;\r
+} SIZEINFO;\r
+\r
+#define offsetof(s,m)                 (UINT32)&(((s *)0)->m)\r
+\r
+\r
+\r
+//\r
+// C Structure generate for PEI PCD Database\r
+//\r
+#define PEI_EXMAPPING_TABLE_SIZE  1\r
+#define PEI_GUID_TABLE_SIZE         1\r
+#define PEI_LOCAL_TOKEN_NUMBER            1\r
+#define PEI_EXTOKEN_NUMBER          1\r
+#define PEI_STRING_TABLE_SIZE        2\r
+#define PEI_SKUID_TABLE_SIZE         3\r
+#define PEI_SIZE_TABLE_SIZE          1\r
+\r
+#define PEI_DATABASE_EMPTRY          FALSE\r
+#define PEI_DYNAMICEX_MAPPING_EMPTY  FALSE\r
+#define PEI_GUID_TABLE_EMPTY         FALSE\r
+#define PEI_STRINGTABLE_EMPTY        FALSE\r
+#define PEI_SIZETABLE_EMPTY          FALSE\r
+#define PEI_SKUID_TABLE_EMPTY        FALSE\r
+\r
+\r
+typedef struct {\r
+\r
+  DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];\r
+  EFI_GUID          GuidTable[PEI_GUID_TABLE_SIZE];\r
+\r
+  UINT32            LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER];\r
+\r
+\r
+  UINT16            StringTable[PEI_STRING_TABLE_SIZE];\r
+  UINT16            SizeTable[PEI_LOCAL_TOKEN_NUMBER];\r
+  \r
+  SKU_ID            SkuIdTable[PEI_SKUID_TABLE_SIZE];\r
+  \r
+  SKU_ID            SystemSkuId;\r
+\r
+} PEI_PCD_DATABASE_INIT;\r
+\r
+typedef struct {\r
+  UINT8 Dummy;\r
+} PEI_PCD_DATABASE_UNINIT;\r
+\r
+//\r
+// Following code should be generated for PCD DXE driver\r
+//\r
+\r
+#define DXE_EXMAPPING_TABLE_SIZE  1\r
+#define DXE_GUID_TABLE_SIZE         1\r
+#define DXE_TOKEN_NUMBER            1\r
+#define DXE_EXTOKEN_NUMBER          1\r
+#define DXE_STRING_TABLE_SIZE        2\r
+#define DXE_SKUID_TABLE_SIZE         3\r
+#define DXE_SIZE_TABLE_SIZE          1\r
+\r
+#define DXE_DATABASE_EMPTRY          FALSE\r
+#define DXE_DYNAMICEX_MAPPING_EMPTY  FALSE\r
+#define DXE_GUID_TABLE_EMPTY         FALSE\r
+#define DXE_STRINGTABLE_EMPTY        FALSE\r
+#define DXE_SIZETABLE_EMPTY          FALSE\r
+#define DXE_SKUID_TABLE_EMPTY        FALSE\r
+\r
+typedef struct {\r
+  DYNAMICEX_MAPPING ExMapTable[DXE_EXMAPPING_TABLE_SIZE];\r
+  EFI_GUID          GuidTable[DXE_GUID_TABLE_SIZE];\r
+\r
+  UINT32            LocalTokenNumberTable[DXE_TOKEN_NUMBER];\r
+\r
+\r
+  UINT16            StringTable[DXE_STRING_TABLE_SIZE];\r
+  UINT16            SizeTable[DXE_TOKEN_NUMBER];\r
+  \r
+  SKU_ID            SkuIdTable[DXE_SKUID_TABLE_SIZE];\r
+  \r
+} DXE_PCD_DATABASE_INIT;\r
+\r
+typedef struct {\r
+  UINT8 Dummy;\r
+} DXE_PCD_DATABASE_UNINIT;\r
+\r
+\r
+#define DXE_PCD_DB_INIT_VALUE \\r
+    /* ExMapTable */ \\r
+  { \\r
+    { /* ExTokenNumber */ 0x00000001, /* LocalTokenNumberIndex */ 0, /* ExGuidIndex */ 0} \\r
+  }, \\r
+  \\r
+  /* GuidTable */ \\r
+  { \\r
+    { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD }} \\r
+  }, \\r
+  \\r
+  /* LocalTokenNumberTable */ \\r
+  { \\r
+    0 \\r
+  }, \\r
+  \\r
+  /* StringTable */ \\r
+  { \\r
+    L"\0" \\r
+  }, \\r
+  \\r
+  /* SizeTable */ \\r
+  { \\r
+    4 \\r
+  }, \\r
+  \\r
+  /* SkuIdTable */ \\r
+  { \\r
+    /*MaxSku*/ 2, /*SkuId*/ 100, /*SkuId*/200   \\r
+  },\\r
+  \\r
+\r
+//\r
+// End of Autogen Code\r
+//\r
+#endif\r
+\r
+/*\r
+typedef struct {\r
+  PEI_PCD_DATABASE_INIT Init;\r
+  PEI_PCD_DATABASE_UNINIT Uninit;\r
+} PEI_PCD_DATABASE;\r
 \r
-UINTN\r
-DxeGetPcdEntrySizeWorker (\r
-  IN UINTN Token,\r
-  IN CONST EFI_GUID       *Guid  OPTIONAL\r
-  );\r
+\r
+\r
+typedef struct {\r
+  DXE_PCD_DATABASE_INIT Init;\r
+  DXE_PCD_DATABASE_UNINIT Uninit;\r
+} DXE_PCD_DATABASE;\r
+\r
+\r
+typedef struct {\r
+  PEI_PCD_DATABASE PeiDb;\r
+  DXE_PCD_DATABASE DxeDb;\r
+} PCD_DATABASE;\r
+*/\r
+\r
+\r
+//\r
+// Internal Functions\r
+//\r
+\r
+EFI_STATUS\r
+SetWorker (\r
+  UINTN         TokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+ExSetWorker (\r
+  IN UINT32               ExTokenNumber,\r
+  IN CONST EFI_GUID       *Guid,\r
+  VOID                    *Data,\r
+  UINTN                   Size,\r
+  BOOLEAN                 PtrType\r
+  )\r
+;\r
+\r
+\r
+VOID *\r
+GetWorker (\r
+  UINTN  TokenNumber\r
+  )\r
+;\r
+\r
+VOID *\r
+ExGetWorker (\r
+  IN CONST EFI_GUID         *Guid,\r
+  IN UINTN                  ExTokenNumber,\r
+  IN UINTN                  GetSize\r
+  ) \r
+;\r
+\r
+UINT32\r
+GetSkuEnabledTokenNumber (\r
+  UINT32 LocalTokenNumber,\r
+  UINTN  Size,\r
+  BOOLEAN IsPeiDb\r
+  ) \r
+;\r
+\r
+EFI_STATUS\r
+GetHiiVariable (\r
+  IN  EFI_GUID      *VariableGuid,\r
+  IN  UINT16        *VariableName,\r
+  OUT VOID          ** VariableData,\r
+  OUT UINTN         *VariableSize\r
+  )\r
+;\r
 \r
 EFI_STATUS\r
 DxeRegisterCallBackWorker (\r
@@ -48,11 +272,6 @@ DxeRegisterCallBackWorker (
   IN  BOOLEAN                 Reigster\r
 );\r
 \r
-EFI_STATUS\r
-DxeSetSku (\r
-  UINTN Id\r
-);\r
-\r
 EFI_STATUS\r
 DxeGetNextTokenWorker (\r
   IN OUT UINTN *Token,\r
@@ -60,10 +279,26 @@ DxeGetNextTokenWorker (
   );\r
 \r
 VOID\r
-InitPcdDxeDataBase (\r
+BuildPcdDxeDataBase (\r
   VOID\r
 );\r
 \r
+\r
+typedef struct {\r
+  UINTN   TokenNumber;\r
+  UINTN   Size;\r
+  UINT32  LocalTokenNumberAlias;\r
+  BOOLEAN IsPeiDb;\r
+} EX_PCD_ENTRY_ATTRIBUTE;\r
+\r
+VOID\r
+GetExPcdTokenAttributes (\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINT32                     ExTokenNumber,\r
+  OUT EX_PCD_ENTRY_ATTRIBUTE    *ExAttr\r
+  )\r
+;\r
+\r
 //\r
 // Protocol Interface function declaration.\r
 //\r
@@ -339,61 +574,20 @@ DxePcdGetNextToken (
   )\r
 ;\r
 \r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+  UINT32        LocalTokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType,\r
+  BOOLEAN       IsPeiDb\r
+  )\r
+;\r
 \r
-/*\r
-  This DXE_PCD_DATABASE layout. The difference of DXE_PCD_DATABASE\r
-  and PEI_PCD_DATABASE is as follows:\r
-\r
-  1) No PCD_CALL_BACK_TABLE; DXE_PCD_DATABASE maintain a LinkList for the\r
-    callback function registered.\r
-\r
-  ---------------------------\r
-  |  LIST_ENTRY GuidSpaceHead|\r
-  ---------------------------\r
-  |  PCD_DATABASE_HEADER    |\r
-  ---------------------------\r
-  |  GUID_TABLE             |  Aligned on GUID    (128 bits)\r
-  ---------------------------\r
-  |  PCD_INDEX_TABLE        |  Aligned on PCD_INDEX (see PCD_INDEX's declaration)\r
-  ---------------------------\r
-  |  IMAGE_STRING_TABLE     |  Aligned on 16 Bits\r
-  ---------------------------\r
-  |  IMAGE_PCD_INDEX        |  Unaligned\r
-  ---------------------------\r
-  |  Data Defaults          |  Unaligned\r
-  ---------------------------\r
-  |  Data Buffer            |\r
-  |  for entries without    |\r
-  |  defaults               |\r
-  ---------------------------\r
-\r
-*/\r
-\r
-\r
-typedef struct {\r
-  LIST_ENTRY       ListNode;\r
-  LIST_ENTRY       TokenSpaceHead;\r
-  CONST EFI_GUID   *GuidSpace;\r
-} PCD_GUID_SPACE;\r
-\r
-typedef struct {\r
-  LIST_ENTRY ListNode;\r
-  LIST_ENTRY CallbackListHead;\r
-  UINTN      TokeNumber;\r
-} PCD_TOKEN_SPACE;\r
-\r
-typedef struct {\r
-  LIST_ENTRY            ListNode;\r
-  PCD_PROTOCOL_CALLBACK CallbackFunction;\r
-} PCD_CALLBACK_ENTRY;\r
-\r
-#define PCD_GUID_SPACE_FROM_LISTNODE(a) \\r
-  _CR(a, PCD_GUID_SPACE, ListNode)\r
+extern EFI_GUID gPcdDataBaseHobGuid;\r
 \r
-#define PCD_TOKEN_SPACE_FROM_LISTNODE(a) \\r
-  _CR(a, PCD_TOKEN_SPACE, ListNode)\r
+extern PCD_DATABASE * gPcdDatabase;\r
 \r
-#define PCD_CALLBACK_ENTRY_FROM_LISTNODE(a) \\r
-  _CR(a, PCD_CALLBACK_ENTRY, ListNode)\r
+extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;\r
 \r
 #endif\r
index 3fb49dd..88d1fb0 100644 (file)
@@ -1,5 +1,4 @@
-/** @file\r
-PCD PEIM\r
+/** @file PCD PEIM\r
 \r
 Copyright (c) 2006, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
@@ -15,7 +14,7 @@ Module Name: Pcd.c
 \r
 **/\r
 \r
-#include "../Common/PcdCommon.h"\r
+#include "PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \r
@@ -75,12 +74,9 @@ PcdPeimInit (
   )\r
 {\r
   EFI_STATUS Status;\r
-  UINT8      *PcdImage;\r
-\r
-  PcdImage = (UINT8 *) LocatePcdImage ();\r
-\r
-  BuildPcdDatabase (PcdImage);\r
 \r
+  BuildPcdDatabase ();\r
+  \r
   Status = PeiCoreInstallPpi (&mPpiPCD);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
@@ -88,25 +84,16 @@ PcdPeimInit (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
-\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetSku (\r
   IN  UINTN                  SkuId\r
   )\r
 {\r
-  PCD_DATABASE      *Database;\r
-  EFI_HOB_GUID_TYPE *GuidHob;\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
-  \r
-  Database = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
-\r
-  Database->Info.SkuId = SkuId;\r
+  GetPcdDatabase()->Init.SystemSkuId = (SKU_ID) SkuId;\r
 \r
-  return SkuId;\r
+  return  EFI_SUCCESS;\r
 }\r
 \r
 \r
@@ -117,7 +104,7 @@ PeiPcdGet8 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet8Ex (NULL, TokenNumber);\r
+  return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
 }\r
 \r
 \r
@@ -128,7 +115,7 @@ PeiPcdGet16 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet16Ex (NULL, TokenNumber);\r
+  return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
 }\r
 \r
 \r
@@ -139,7 +126,7 @@ PeiPcdGet32 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet32Ex (NULL, TokenNumber);\r
+  return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
 }\r
 \r
 \r
@@ -150,7 +137,7 @@ PeiPcdGet64 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet64Ex (NULL, TokenNumber);\r
+  return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
 }\r
 \r
 \r
@@ -161,7 +148,7 @@ PeiPcdGetPtr (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGetPtrEx (NULL, TokenNumber);\r
+  return GetWorker (TokenNumber, 0);\r
 }\r
 \r
 \r
@@ -172,7 +159,7 @@ PeiPcdGetBool (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGetBoolEx (NULL, TokenNumber);\r
+  return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
 }\r
 \r
 \r
@@ -183,7 +170,9 @@ PeiPcdGetSize (
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGetSizeEx (NULL, TokenNumber);\r
+  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+  return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
 }\r
 \r
 \r
@@ -192,14 +181,10 @@ UINT8
 EFIAPI\r
 PeiPcdGet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\r
-  UINT8 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data);\r
-  \r
-  return Data;\r
+  return *((UINT8 *) ExGetWorker (Guid, ExTokenNumber, sizeof (UINT8)));\r
 }\r
 \r
 \r
@@ -208,14 +193,10 @@ UINT16
 EFIAPI\r
 PeiPcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\r
-  UINT16 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data);\r
-  \r
-  return Data;\r
+  return ReadUnaligned16 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT16)));\r
 }\r
 \r
 \r
@@ -224,14 +205,10 @@ UINT32
 EFIAPI\r
 PeiPcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\r
-  UINT32 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data);\r
-  \r
-  return Data;\r
+  return ReadUnaligned32 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT32)));\r
 }\r
 \r
 \r
@@ -240,14 +217,10 @@ UINT64
 EFIAPI\r
 PeiPcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\r
-  UINT64 Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data);\r
-  \r
-  return Data;\r
+  return ReadUnaligned64 (ExGetWorker (Guid, ExTokenNumber, sizeof (UINT64)));\r
 }\r
 \r
 \r
@@ -256,14 +229,10 @@ VOID *
 EFIAPI\r
 PeiPcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\r
-  VOID *Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data);\r
-  \r
-  return Data;\r
+  return ExGetWorker (Guid, ExTokenNumber, 0);\r
 }\r
 \r
 \r
@@ -272,14 +241,10 @@ BOOLEAN
 EFIAPI\r
 PeiPcdGetBoolEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  BOOLEAN Data;\r
-  \r
-  PeiGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data);\r
-  \r
-  return Data;\r
+  return *((BOOLEAN *) ExGetWorker (Guid, ExTokenNumber, sizeof (BOOLEAN)));\r
 }\r
 \r
 \r
@@ -288,10 +253,14 @@ UINTN
 EFIAPI\r
 PeiPcdGetSizeEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\r
-  return PeiGetPcdEntrySizeWorker (TokenNumber, Guid);\r
+  EX_PCD_ENTRY_ATTRIBUTE      Attr;\r
+\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
+  \r
+  return Attr.Size;\r
 }\r
 \r
 \r
@@ -303,7 +272,7 @@ PeiPcdSet8 (
   IN UINT8             Value\r
   )\r
 {\r
-  return PeiPcdSet8Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -315,7 +284,7 @@ PeiPcdSet16 (
   IN UINT16             Value\r
   )\r
 {\r
-  return PeiPcdSet16Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -327,7 +296,7 @@ PeiPcdSet32 (
   IN UINT32             Value\r
   )\r
 {\r
-  return PeiPcdSet32Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -339,7 +308,7 @@ PeiPcdSet64 (
   IN UINT64             Value\r
   )\r
 {\r
-  return PeiPcdSet64Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -350,7 +319,12 @@ PeiPcdSetPtr (
   IN CONST VOID         *Value\r
   )\r
 {\r
-  return PeiPcdSetPtrEx (NULL, TokenNumber, Value);\r
+  //\r
+  // BugBug, please change the Size to Input size when sync with spec\r
+  //\r
+  //ASSERT (sizeof (Value) == GetPcdDatabase()->Init.SizeTable[TokenNumber]);\r
+\r
+  return SetWorker (TokenNumber, (VOID *) Value, GetPcdDatabase()->Init.SizeTable[TokenNumber], TRUE);\r
 }\r
 \r
 \r
@@ -362,7 +336,7 @@ PeiPcdSetBool (
   IN BOOLEAN            Value\r
   )\r
 {\r
-  return PeiPcdSetBoolEx (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
@@ -371,11 +345,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet8Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT8                  Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -384,11 +364,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet16Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT16                 Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -397,11 +383,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet32Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT32                 Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -410,11 +402,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet64Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT64                 Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -423,11 +421,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetPtrEx (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN CONST VOID             *Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, (VOID *)Value);\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              (VOID *) Value, \r
+                              sizeof (Value), \r
+                              TRUE\r
+                              );\r
 }\r
 \r
 \r
@@ -436,12 +440,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetBoolEx (\r
   IN CONST EFI_GUID       *Guid,\r
-  IN UINTN                TokenNumber,\r
+  IN UINTN                ExTokenNumber,\r
   IN BOOLEAN              Value\r
   )\r
 {\r
-  return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value);\r
-\r
+  return          ExSetWorker(\r
+                              ExTokenNumber, \r
+                              Guid,\r
+                              &Value, \r
+                              sizeof (Value), \r
+                              FALSE\r
+                              );\r
 }\r
 \r
 \r
@@ -450,12 +459,12 @@ PeiPcdSetBoolEx (
 EFI_STATUS\r
 EFIAPI\r
 PcdRegisterCallBackOnSet (\r
-  IN  UINTN                       TokenNumber,\r
+  IN  UINTN                       ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
-  return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE);\r
+  return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, TRUE);\r
 }\r
 \r
 \r
@@ -463,12 +472,12 @@ PcdRegisterCallBackOnSet (
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
-  IN  UINTN                       TokenNumber,\r
+  IN  UINTN                       ExTokenNumber,\r
   IN  CONST EFI_GUID              *Guid, OPTIONAL\r
   IN  PCD_PPI_CALLBACK            CallBackFunction\r
   )\r
 {\r
-  return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE);\r
+  return PeiRegisterCallBackWorker (ExTokenNumber, Guid, CallBackFunction, FALSE);\r
 }\r
 \r
 \r
@@ -480,7 +489,19 @@ PeiPcdGetNextToken (
   IN OUT  UINTN                   *TokenNumber\r
   )\r
 {\r
-  return PeiGetNextTokenWorker (TokenNumber, Guid);\r
+  if (Guid == NULL) {\r
+    *TokenNumber++;\r
+\r
+    if (*TokenNumber >= PEI_LOCAL_TOKEN_NUMBER) {\r
+      *TokenNumber = 0;\r
+    }\r
+  }\r
+\r
+  //\r
+  // BugBug: Haven't implemented the portion to get Next Token for GuidSpace is not Local GuidSpace.\r
+  //\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
index 3829325..052ff9e 100644 (file)
@@ -14,799 +14,560 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 Module Name: Service.c\r
 \r
 **/\r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \r
+//\r
+// Build Tool will generate PEI_PCD_DB_INIT_VALUE in Autogen.h\r
+//\r
+/* PEI_PCD_DATABASE_INIT\r
+gPEIPcdDbInit = {\r
+  PEI_PCD_DB_INIT_VALUE\r
+};\r
+*/\r
 \r
 \r
-/**\r
-  This function expand the StateByte\r
-\r
-  @param[out]   StateByte The output StateByte information.\r
-  @param[in]    Byte The StateByte.\r
-\r
-  @retval       VOID\r
---*/\r
-VOID\r
-PcdImageExpandStateByte (\r
-  OUT PCD_STATEBYTE *StateByte,\r
-  IN  UINT8          Byte\r
-)\r
-{\r
-  switch (Byte & PCD_STATEBYTE_DATUMTYPE) {\r
-    case PCD_BYTE8:\r
-      StateByte->DataType = PcdByte8;\r
-      break;\r
-    case PCD_BYTE16:\r
-      StateByte->DataType = PcdByte16;\r
-      break;\r
-    case PCD_BYTE32:\r
-      StateByte->DataType = PcdByte32;\r
-      break;\r
-    case PCD_BYTE64:\r
-      StateByte->DataType = PcdByte64;\r
-      break;\r
-    case PCD_POINTER:\r
-      StateByte->DataType = PcdPointer;\r
-      break;\r
-    case PCD_BOOLEAN:\r
-      StateByte->DataType = PcdBoolean;\r
-      break;\r
-    default:\r
-      ASSERT (FALSE);\r
-  }\r
-\r
-  StateByte->ExtendedGuidPresent = (BOOLEAN) ((Byte & PCD_STATEBYTE_EXTENDEDGUIDPRESENT) != 0);\r
-  StateByte->HiiEnable           = (BOOLEAN) ((Byte & PCD_STATEBYTE_HIIENABLE)           != 0);\r
-  StateByte->SkuDataArrayEnable  = (BOOLEAN) ((Byte & PCD_STATEBYTE_SKUDATAARRAYENABLE)  != 0);\r
-  StateByte->SkuEnable           = (BOOLEAN) ((Byte & PCD_STATEBYTE_SKUENABLE)           != 0);\r
-  StateByte->VpdEnable           = (BOOLEAN) ((Byte & PCD_STATEBYTE_VPDENABLE)           != 0);\r
-\r
-}\r
-\r
 \r
 \r
 /**\r
-  This function locates the <PCD_IMAGE> on the flash and \r
-  return a pointer to the Section Data on flash.\r
+  The function registers the CallBackOnSet fucntion\r
+  according to TokenNumber and EFI_GUID space.\r
 \r
-  @param[in]  VOID\r
+  @param[in]  TokenNumber       The token number.\r
+  @param[in]  Guid              The GUID space.\r
+  @param[in]  CallBackFunction  The Callback function to be registered.\r
 \r
-  @retval     VOID\r
+  @retval EFI_SUCCESS If the Callback function is registered.\r
+  @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
 --*/\r
-UINT8 *\r
-LocatePcdImage (\r
-  VOID\r
+EFI_STATUS\r
+PeiRegisterCallBackWorker (\r
+  IN  UINTN                       ExTokenNumber,\r
+  IN  CONST EFI_GUID              *Guid, OPTIONAL\r
+  IN  PCD_PPI_CALLBACK            CallBackFunction,\r
+  IN  BOOLEAN                     Register\r
 )\r
 {\r
-  EFI_STATUS                 Status;\r
-  EFI_FIRMWARE_VOLUME_HEADER *FvHdr;\r
-  EFI_FFS_FILE_HEADER        *FfsHdr;\r
-  VOID                       *SectionData;\r
-\r
-  Status = PeiCoreFfsFindNextVolume (0, &FvHdr);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  do {\r
-    FfsHdr = NULL;\r
-    Status = PeiCoreFfsFindNextFile (EFI_FV_FILETYPE_FREEFORM, FvHdr, &FfsHdr);\r
-    if (Status == EFI_SUCCESS) {\r
-      if (CompareGuid (&gPcdImageFileGuid, &FfsHdr->Name)) {\r
-\r
-        Status = PeiCoreFfsFindSectionData (EFI_SECTION_RAW, FfsHdr, &SectionData);\r
-        ASSERT_EFI_ERROR (Status);\r
-\r
-        return (UINT8 *)SectionData;\r
-      }\r
-    }\r
-  } while (Status == EFI_SUCCESS);\r
-\r
-  ASSERT (FALSE);\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  The function retrieves the PCD data value according to\r
-  TokenNumber and Guid space given.\r
-\r
-  @param[in]  TokenNumber The token number.\r
-  @param[in]  Guid The Guid space.\r
-  @param[in]  Type The storage type.\r
-  @param[out] Data The output data.\r
-\r
-\r
-  @retval EFI_SUCESS    If data value is found according to SKU_ID.\r
-  @retval EFI_NOT_FOUND If not such a value is found.\r
+  EFI_HOB_GUID_TYPE       *GuidHob;\r
+  PCD_PPI_CALLBACK        *CallbackTable;\r
+  PCD_PPI_CALLBACK        Compare;\r
+  PCD_PPI_CALLBACK        Assign;\r
+  UINT32                  LocalTokenNumber;\r
+  UINTN                   TokenNumber;\r
+  UINTN                   Idx;\r
+  EX_PCD_ENTRY_ATTRIBUTE  Attr;\r
 \r
---*/\r
-VOID\r
-PeiGetPcdEntryWorker (\r
-  IN UINTN TokenNumber,\r
-  IN CONST EFI_GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE        Type,\r
-  OUT VOID                *Data\r
-  )\r
-{\r
-  PCD_DATABASE *Database;\r
-  EFI_HOB_GUID_TYPE *GuidHob;\r
+  if (Guid == NULL) {\r
+    TokenNumber = ExTokenNumber;\r
+    ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+    LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
+  } else {\r
+    GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
+    TokenNumber = Attr.TokenNumber;\r
+    LocalTokenNumber = Attr.LocalTokenNumberAlias;\r
+  }\r
 \r
-  ASSERT (Data != NULL);\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+  GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
   ASSERT (GuidHob != NULL);\r
+  \r
+  CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
 \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
+  Compare = Register? NULL: CallBackFunction;\r
+  Assign  = Register? CallBackFunction: NULL;\r
 \r
-  GetPcdEntryWorker ( &Database->Info,\r
-                      TokenNumber,\r
-                      Guid,\r
-                      Type,\r
-                      Data\r
-                      );\r
+  for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
+    if (CallbackTable[Idx] == Compare) {\r
+      CallbackTable[Idx] = Assign;\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
 \r
+  return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
 \r
-  return;\r
 }\r
 \r
 \r
-/**\r
-  The function set the PCD data value according to\r
-  TokenNumber and Guid space given.\r
 \r
-  @param[in] Database     The PCD Database Instance.\r
-  @param[in] TokenNumber  The token number.\r
-  @param[in] Guid         The Guid space.\r
-  @param[in] Type         The storage type.\r
-  @param[in] Data         The output data.\r
 \r
+/**\r
+  The function builds the PCD database based on the\r
+  PCD_IMAGE on the flash.\r
 \r
-  @retval EFI_SUCESS      If data value is found according to SKU_ID.\r
-  @retval EFI_NOT_FOUND   If not such a value is found.\r
+  @param[in] PcdImageOnFlash  The PCD image on flash.\r
 \r
+  @retval VOID\r
 --*/\r
-EFI_STATUS\r
-SetPcdEntryWorker (\r
-  IN CONST PCD_DATABASE     *Database,\r
-  IN UINTN                  TokenNumber,\r
-  IN CONST EFI_GUID         *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE          Type,\r
-  IN VOID                   *Data\r
+VOID\r
+BuildPcdDatabase (\r
+  VOID\r
   )\r
 {\r
-  PCD_INDEX               *PcdIndex;\r
-  EFI_STATUS              Status;\r
-  PCD_PPI_CALLBACK        *CallbackTable;\r
-  UINTN                   Idx;\r
-\r
-  ASSERT (Data != NULL);\r
-\r
-  //\r
-  // Find the PCD entry in list in memory first\r
-  //\r
-  PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, &Idx);\r
-\r
-  ASSERT (PcdIndex != NULL);\r
+  PEI_PCD_DATABASE  *Database;\r
+  VOID              *CallbackFnTable;\r
+  UINTN             SizeOfCallbackFnTable;\r
+  \r
+  Database = BuildGuidHob (&gPcdDataBaseHobGuid, sizeof (PEI_PCD_DATABASE));\r
 \r
-  ASSERT (PcdIndex->StateByte.DataType == Type);\r
+  ZeroMem (Database, sizeof (PEI_PCD_DATABASE));\r
 \r
   //\r
-  // Invoke the callback function.\r
+  // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE\r
   //\r
-  CallbackTable = (PCD_PPI_CALLBACK *)\r
-                              GetAbsoluteAddress (Idx * Database->Info.MaxCallbackNum * sizeof(PCD_PPI_CALLBACK),\r
-                              Database->Info.CallbackTableOffset,\r
-                              &Database->Info\r
-                              );\r
   \r
-  for (Idx = 0; Idx < Database->Info.MaxCallbackNum; Idx++) {\r
-    if (CallbackTable[Idx] != NULL) {\r
-      CallbackTable[Idx] (Guid,\r
-                          PcdIndex->TokenNumber,\r
-                          Data,\r
-                          PcdIndex->DatumSize\r
-                          );\r
-    }\r
-  }\r
+  CopyMem (&Database->Init, &gPEIPcdDbInit, sizeof (gPEIPcdDbInit));\r
 \r
-  Status = SetPcdData (PcdIndex, &Database->Info, Data);\r
+  SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
 \r
-  return Status;\r
+  CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
+  \r
+  ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
+  \r
+  return;\r
 }\r
 \r
 \r
 \r
 /**\r
-  (reviewed) The function set the PCD data value according to\r
-  TokenNumber and Guid space given.\r
-\r
-  @param[in] TokenNumber  The token number.\r
-  @param[in] Guid         The Guid space.\r
-  @param[in] Type         The storage type.\r
-  @param[in] Data         The output data.\r
-\r
+  The function is provided by PCD PEIM and PCD DXE driver to\r
+  do the work of reading a HII variable from variable service.\r
 \r
-  @retval EFI_SUCESS    If data value is found according to SKU_ID.\r
-  @retval EFI_NOT_FOUND If not such a value is found.\r
+  @param[in] VariableGuid     The Variable GUID.\r
+  @param[in] VariableName     The Variable Name.\r
+  @param[out] VariableData    The output data.\r
+  @param[out] VariableSize    The size of the variable.\r
 \r
+  @retval EFI_SUCCESS         Operation successful.\r
+  @retval EFI_SUCCESS         Variablel not found.\r
 --*/\r
 EFI_STATUS\r
-PeiSetPcdEntryWorker (\r
-  IN UINTN TokenNumber,\r
-  IN CONST EFI_GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE        Type,\r
-  IN VOID                 *Data\r
+GetHiiVariable (\r
+  IN  CONST EFI_GUID      *VariableGuid,\r
+  IN  UINT16              *VariableName,\r
+  OUT VOID                **VariableData,\r
+  OUT UINTN               *VariableSize\r
   )\r
 {\r
-  PCD_DATABASE *Database;\r
-  EFI_HOB_GUID_TYPE *GuidHob;\r
+  UINTN      Size;\r
+  EFI_STATUS Status;\r
+  VOID       *Buffer;\r
+  EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
 \r
-  ASSERT (Data != NULL);\r
+  Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
-  \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
+  Size = 0;\r
 \r
-  SetPcdEntryWorker (Database,\r
-                     TokenNumber,\r
-                     Guid,\r
-                     Type,\r
-                     Data\r
-                     );\r
+  Status = VariablePpi->PeiGetVariable (\r
+                          GetPeiServicesTablePointer (),\r
+                          VariableName,\r
+                          (EFI_GUID *) VariableGuid,\r
+                          NULL,\r
+                          &Size,\r
+                          NULL\r
+                            );\r
+  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+\r
+  Status = PeiCoreAllocatePool (Size, &Buffer);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  // declare a local for STP.\r
+  //\r
+  Status = VariablePpi->PeiGetVariable (\r
+                            GetPeiServicesTablePointer (),\r
+                            (UINT16 *) VariableName,\r
+                            (EFI_GUID *) VariableGuid,\r
+                            NULL,\r
+                            &Size,\r
+                            Buffer\r
+                            );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  *VariableSize = Size;\r
+  *VariableData = Buffer;\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
 \r
-\r
-UINTN\r
-PeiGetPcdEntrySizeWorker (\r
-  IN UINTN                TokenNumber,\r
-  IN CONST EFI_GUID       *Guid  OPTIONAL\r
-  )\r
+UINT32\r
+GetSkuEnabledTokenNumber (\r
+  UINT32 LocalTokenNumber,\r
+  UINTN  Size\r
+  ) \r
 {\r
-  PCD_DATABASE      *Database;\r
-  EFI_HOB_GUID_TYPE *GuidHob;\r
-\r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
+  PEI_PCD_DATABASE      *PeiPcdDb;\r
+  SKU_HEAD              *SkuHead;\r
+  SKU_ID                *SkuIdTable;\r
+  INTN                  i;\r
+  UINT8                 *Value;\r
+\r
+  PeiPcdDb = GetPcdDatabase ();\r
+\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
+\r
+  SkuHead     = (SKU_HEAD *) ((UINT8 *)PeiPcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));\r
+  Value       = (UINT8 *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuDataStartOffset));\r
+  SkuIdTable  = (SKU_ID *) ((UINT8 *)PeiPcdDb + (SkuHead->SkuIdTableOffset));\r
+        \r
+  for (i = 0; i < SkuIdTable[0]; i++) {\r
+    if (PeiPcdDb->Init.SystemSkuId == SkuIdTable[i + 1]) {\r
+      break;\r
+    }\r
+  }\r
 \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
+  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+    case PCD_TYPE_VPD:\r
+      Value += sizeof(VPD_HEAD) * i;\r
+      return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_VPD);\r
+\r
+    case PCD_TYPE_HII:\r
+      Value += sizeof(VARIABLE_HEAD) * i;\r
+      return ((Value - (UINT8 *) PeiPcdDb) | PCD_TYPE_HII);\r
+      \r
+    case 0: //Change to a MACRO PCD_TYPE_DATA\r
+      Value += Size * i;\r
+      return (Value - (UINT8 *) PeiPcdDb);\r
+      \r
+    default:\r
+      ASSERT (FALSE);\r
+  }\r
 \r
-  return GetPcdEntrySizeWorker (&Database->Info,\r
-                                TokenNumber,\r
-                                Guid\r
-                                );\r
+  ASSERT (FALSE);\r
 \r
+  return 0;\r
+  \r
 }\r
 \r
 \r
 \r
-/**\r
-  The function registers the CallBackOnSet fucntion\r
-  according to TokenNumber and EFI_GUID space.\r
-\r
-  @param[in]  TokenNumber       The token number.\r
-  @param[in]  Guid              The GUID space.\r
-  @param[in]  CallBackFunction  The Callback function to be registered.\r
 \r
-  @retval EFI_SUCCESS If the Callback function is registered.\r
-  @retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.\r
---*/\r
-EFI_STATUS\r
-PeiRegisterCallBackWorker (\r
-  IN  UINTN                       TokenNumber,\r
-  IN  CONST EFI_GUID              *Guid, OPTIONAL\r
-  IN  PCD_PPI_CALLBACK            CallBackFunction,\r
-  IN  BOOLEAN                     Register\r
-)\r
+VOID\r
+InvokeCallbackOnSet (\r
+  UINT32            ExTokenNumber,\r
+  CONST EFI_GUID    *Guid, OPTIONAL\r
+  UINTN             TokenNumber,\r
+  VOID              *Data,\r
+  UINTN             Size\r
+  )\r
 {\r
-  PCD_DATABASE        *Database;\r
   EFI_HOB_GUID_TYPE   *GuidHob;\r
-  PCD_INDEX           *PcdIndex;\r
-  UINTN               Idx;\r
   PCD_PPI_CALLBACK    *CallbackTable;\r
-  PCD_PPI_CALLBACK    Compare;\r
-  PCD_PPI_CALLBACK    Assign;\r
+  UINTN               Idx;\r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+  if (Guid == NULL)\r
+    ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+\r
+  GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
   ASSERT (GuidHob != NULL);\r
   \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
-\r
-  PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
-\r
-  ASSERT (PcdIndex != NULL);\r
-\r
-  if (PcdIndex->StateByte.VpdEnable) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
+  CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
 \r
-  Idx = ((UINTN) PcdIndex - Database->Info.CallbackTableOffset) / sizeof(PCD_INDEX);\r
+  CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
 \r
-  CallbackTable = (PCD_PPI_CALLBACK *) GetAbsoluteAddress (\r
-                                              sizeof (PCD_PPI_CALLBACK) * Idx * Database->Info.MaxCallbackNum,\r
-                                              Database->Info.CallbackTableOffset,\r
-                                              &Database->Info\r
-                                              );\r
-\r
-  Compare = Register? NULL: CallBackFunction;\r
-  Assign  = Register? CallBackFunction: NULL;\r
-\r
-  for (Idx = 0; Idx < Database->Info.MaxCallbackNum; Idx++) {\r
-    if (CallbackTable[Idx] == Compare) {\r
-      CallbackTable[Idx] = Assign;\r
-      return EFI_SUCCESS;\r
+  for (Idx = 0; Idx < FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry); Idx++) {\r
+    if (CallbackTable[Idx] != NULL) {\r
+      CallbackTable[Idx] (Guid,\r
+                          (Guid == NULL)? TokenNumber: ExTokenNumber,\r
+                          Data,\r
+                          Size\r
+                          );\r
     }\r
   }\r
-\r
-  return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
-\r
+  \r
 }\r
 \r
-\r
-\r
 EFI_STATUS\r
-PeiGetNextTokenWorker (\r
-  IN OUT UINTN                *TokenNumber,\r
-  IN CONST EFI_GUID           *Guid     OPTIONAL\r
+SetWorker (\r
+  UINTN         TokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType\r
   )\r
 {\r
-  PCD_DATABASE        *Database;\r
-  EFI_HOB_GUID_TYPE   *GuidHob;\r
-\r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
-  \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
-\r
-  return GetNextTokenWorker (&Database->Info,\r
-                             TokenNumber,\r
-                             Guid\r
-                             );\r
-\r
-}\r
+  UINT32              LocalTokenNumber;\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
 \r
+  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+    \r
+  PeiPcdDb = GetPcdDatabase ();\r
 \r
+  LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
-VOID\r
-GetPcdImageInfo (\r
-  IN CONST UINT8          *PcdImageOnFlash,\r
-  OUT PCD_IMAGE_RECORD    *ImageInfo\r
-)\r
-{\r
-  PCD_FFS_ENCODING *PcdFfsHdr;\r
-\r
-  PcdFfsHdr = (PCD_FFS_ENCODING *) PcdImageOnFlash;\r
+  if (PtrType) {\r
+    ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] >= Size);\r
+  } else {\r
+    ASSERT (PeiPcdDb->Init.SizeTable[TokenNumber] == Size);\r
+  }\r
 \r
-  ZeroMem (ImageInfo, sizeof (*ImageInfo));\r
+  InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
 \r
-  ImageInfo->ImageStart = PcdImageOnFlash;\r
+  return SetWorkerByLocalTokenNumber (LocalTokenNumber, Data, Size, PtrType);\r
 \r
-  CopyMem (&ImageInfo->EntryCount,              PcdFfsHdr->EntryCount,         3);\r
-  \r
-  CopyMem (&ImageInfo->GlobalDatumLength,       PcdFfsHdr->GlobalDatumLength,  1);\r
-  ASSERT  (ImageInfo->GlobalDatumLength <= 3);\r
-  \r
-  CopyMem (&ImageInfo->GlobalOffsetLength,      PcdFfsHdr->GlobalOffsetLength, 1);\r
-  ASSERT  (ImageInfo->GlobalOffsetLength <= 3);\r
-  \r
-  CopyMem (&ImageInfo->GlobalTokenLength,       PcdFfsHdr->GlobalTokenLength,  1);\r
-  ASSERT  (ImageInfo->GlobalTokenLength <= 4);\r
-\r
-  CopyMem (&ImageInfo->GlobalGuidTabIdxLength,  PcdFfsHdr->GuidLength,         1);\r
-  ASSERT  (ImageInfo->GlobalGuidTabIdxLength <= 2);\r
-\r
-  CopyMem (&ImageInfo->GlobalStrTabIdxLength,   PcdFfsHdr->GlobalStrTabIdxLength, 1);\r
-  ASSERT  (ImageInfo->GlobalStrTabIdxLength <= 2);\r
-\r
-  CopyMem (&ImageInfo->ImageLength,             PcdFfsHdr->ImageLength,        3);\r
-  CopyMem (&ImageInfo->IndexLength,             PcdFfsHdr->PcdIndexLength,     3);\r
-  CopyMem (&ImageInfo->WholeDataDefaultLength,  PcdFfsHdr->WholeDataBufferLength, 3);\r
-  CopyMem (&ImageInfo->DataDefaultLength,       PcdFfsHdr->DataBufferLength, 3);\r
-  CopyMem (&ImageInfo->GuidTableLength,         PcdFfsHdr->GuidTableLength,  3);\r
-\r
-  ImageInfo->StringTableLength = ImageInfo->ImageLength\r
-                                  - sizeof (PCD_FFS_ENCODING)\r
-                                  - ImageInfo->DataDefaultLength\r
-                                  - ImageInfo->IndexLength\r
-                                  - ImageInfo->GuidTableLength;\r
-\r
-  ImageInfo->DataDefaultStart = PcdImageOnFlash + sizeof (PCD_FFS_ENCODING);\r
-  ImageInfo->IndexStart       = ImageInfo->DataDefaultStart + ImageInfo->DataDefaultLength;\r
-  ImageInfo->GuidTableStart   = (CONST EFI_GUID *)(ImageInfo->IndexStart + ImageInfo->IndexLength);\r
-  ImageInfo->StringTableStart = (CONST UINT16 *) ((UINT8 *) ImageInfo->GuidTableStart + ImageInfo->GuidTableLength);\r
-  \r
-  return;\r
 }\r
 \r
 \r
 \r
-/**\r
-  The function builds the PCD database based on the\r
-  PCD_IMAGE on the flash.\r
-\r
-  The layout of the PCD_DATABASE is as follows:\r
-\r
-  ---------------------------\r
-  |  PCD_DATABASE_HEADER    |\r
-  ---------------------------\r
-  |  GUID_TABLE             |  Aligned on GUID    (128 bits)\r
-  ---------------------------\r
-  |  PCD_CALL_BACK_TABLE    |  Aligned on Pointer (32 bits or 64 bits)\r
-  ---------------------------\r
-  |  PCD_INDEX_TABLE        |  Aligned on PCD_INDEX (see PCD_INDEX's declaration)\r
-  ---------------------------\r
-  |  IMAGE_STRING_TABLE     |  Aligned on 16 Bits\r
-  ---------------------------\r
-  |  IMAGE_PCD_INDEX        |  Unaligned\r
-  ---------------------------\r
-  |  Data Defaults          |  Unaligned\r
-  ---------------------------\r
-  |  Data Buffer            |\r
-  |  for entries without    |\r
-  |  defaults               |\r
-  ---------------------------\r
-\r
-  @param[in] PcdImageOnFlash  The PCD image on flash.\r
 \r
-  @retval VOID\r
---*/\r
-UINTN\r
-GetPcdDatabaseLen (\r
-  IN CONST UINT8          *PcdImageOnFlash,\r
-  OUT PCD_DATABASE_HEADER *Info,\r
-  OUT PCD_IMAGE_RECORD    *ImageInfo\r
+EFI_STATUS\r
+ExSetWorker (\r
+  IN UINT32               ExTokenNumber,\r
+  IN CONST EFI_GUID       *Guid,\r
+  VOID                    *Data,\r
+  UINTN                   Size,\r
+  BOOLEAN                 PtrType\r
   )\r
 {\r
-  UINTN DatabaseLen;\r
-  UINTN DatabaseHeaderLength;\r
-  UINTN PcdIndexLength;\r
-  UINTN CallbackBufferLength;\r
-\r
-\r
-  GetPcdImageInfo (PcdImageOnFlash, ImageInfo);\r
-\r
-  Info->MaxCallbackNum = FixedPcdGet32(PcdMaxPcdCallBackNumber) ;\r
+  PEI_PCD_DATABASE          *PeiPcdDb;\r
+  EX_PCD_ENTRY_ATTRIBUTE    Attr;\r
 \r
-  DatabaseHeaderLength = sizeof (PCD_DATABASE) - sizeof(UINT8);\r
 \r
-  PcdIndexLength       = sizeof (PCD_INDEX) * ImageInfo->EntryCount;\r
-  CallbackBufferLength = sizeof (PCD_PPI_CALLBACK) * Info->MaxCallbackNum * ImageInfo->EntryCount;\r
+  PeiPcdDb = GetPcdDatabase ();\r
 \r
-  Info->EntryCount          = ImageInfo->EntryCount;\r
-  Info->GuidTableOffset     = DatabaseHeaderLength;\r
-  Info->CallbackTableOffset = Info->GuidTableOffset + ImageInfo->GuidTableLength;\r
-  Info->PcdIndexOffset      = Info->PcdIndexOffset + PcdIndexLength;\r
-  Info->ImageIndexOffset    = Info->CallbackTableOffset + CallbackBufferLength;\r
-  Info->DataBufferOffset    = Info->ImageIndexOffset + ImageInfo->DataDefaultLength;\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
 \r
-  Info->HiiGuidOffsetLength = ImageInfo->GlobalGuidTabIdxLength;\r
-  Info->HiiVariableOffsetLength = ImageInfo->GlobalStrTabIdxLength;\r
-  Info->ExtendedOffsetLength    = ImageInfo->GlobalOffsetLength;\r
+  ASSERT (!PtrType && Attr.Size);\r
 \r
-  Info->SkuId = 0;\r
+  ASSERT (PtrType && Attr.Size >= Size);\r
 \r
-  DatabaseLen = DatabaseHeaderLength\r
-              + ImageInfo->GuidTableLength\r
-              + PcdIndexLength\r
-              + CallbackBufferLength\r
-              + ImageInfo->IndexLength\r
-              + ImageInfo->WholeDataDefaultLength;\r
+  InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Size);\r
 \r
-  Info->DatabaseLen = DatabaseLen;\r
+  SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Size, PtrType);\r
 \r
-  return DatabaseLen;\r
+  return EFI_SUCCESS;\r
+  \r
 }\r
 \r
 \r
-/**\r
-  The function constructs a single PCD_INDEX according a index in\r
-  <PCD_IMAGE>.\r
 \r
-  @param[in] ImageIndex  The starting address of a PCD index defined in PCD spec 0.51.\r
-  @param[in] Index       The output PCD_INDEX. \r
-  @param[in] ImageInfo   The attributes of the PCD_IMAGE as this binary stream is highly\r
-                          optimized for size.\r
 \r
-  @retval UINTN The length of the current PCD index.\r
-**/\r
-UINTN\r
-BuildPcdIndex (\r
-  IN CONST UINT8            *ImageIndex,\r
-  OUT PCD_INDEX             *Index,\r
-  IN CONST PCD_IMAGE_RECORD *ImageInfo\r
-)\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+  UINT32        LocalTokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType\r
+  )\r
 {\r
-  UINTN       SkuCount;\r
-  CONST UINT8 *ImageIndexBackUp;\r
-\r
-  ImageIndexBackUp = ImageIndex;\r
+  PEI_PCD_DATABASE      *PeiPcdDb;\r
+  UINT8                 *PeiPcdDbRaw;\r
+  UINT16                StringTableIdx;\r
+  UINTN                 Offset;\r
+  VOID                  *InternalData;\r
\r
+\r
+  PeiPcdDb    =    GetPcdDatabase ();\r
+  PeiPcdDbRaw =    (UINT8 *) PeiPcdDb;\r
   \r
-  //\r
-  // Token Number\r
-  //\r
-  CopyMem (&Index->TokenNumber,\r
-            ImageIndex,\r
-            ImageInfo->GlobalTokenLength\r
-            );\r
-\r
-  ImageIndex += ImageInfo->GlobalTokenLength;\r
-  \r
-  //\r
-  // State Byte\r
-  //\r
-  PcdImageExpandStateByte (&Index->StateByte,\r
-                           *ImageIndex\r
-                           );\r
+  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
+  }\r
 \r
-  ImageIndex += 1;\r
+  Offset          = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+  InternalData    = (VOID *) (PeiPcdDbRaw + Offset);\r
   \r
-  //\r
-  // Dataum Size\r
-  //\r
-  CopyMem (&Index->DatumSize,\r
-          ImageIndex,\r
-          ImageInfo->GlobalDatumLength\r
-          );\r
+  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+    case PCD_TYPE_VPD:\r
+    case PCD_TYPE_HII:\r
+    {\r
+      ASSERT (FALSE);\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
 \r
-  ImageIndex += ImageInfo->GlobalDatumLength;\r
+    case PCD_TYPE_STRING:\r
+      StringTableIdx = *((UINT16 *)InternalData);\r
+      CopyMem (&PeiPcdDb->Init.StringTable[StringTableIdx], Data, Size);\r
+      break;\r
 \r
-  //\r
-  // SKU_DATA\r
-  //\r
-  if (Index->StateByte.SkuEnable) {\r
-    Index->SkuCount     = *ImageIndex;\r
-    SkuCount            = *ImageIndex;\r
-    ImageIndex++;\r
-    Index->SkuIdArray   = (UINT32) ImageIndex - (UINT32) ImageInfo->IndexStart;\r
-    ImageIndex         += Index->SkuCount;\r
-  } else {\r
-    //\r
-    // There is always a default SKU_ID of zero even \r
-    // if SKU is not enabled for this PCD entry.\r
-    // \r
-    //\r
-    SkuCount = 1;\r
-  }\r
+    case PCD_TYPE_DATA:\r
+    {\r
+      \r
+      if (PtrType) {\r
+        CopyMem (InternalData, Data, Size);\r
+        return EFI_SUCCESS;\r
+      }\r
 \r
-  //\r
-  // Extended Offset\r
-  //\r
-  CopyMem (&Index->ExtendedDataOffset,\r
-           ImageIndex,\r
-           ImageInfo->GlobalOffsetLength\r
-           );\r
+      switch (Size) {\r
+        case sizeof(UINT8):\r
+          *((UINT8 *) InternalData) = *((UINT8 *) Data);\r
+          return EFI_SUCCESS;\r
 \r
-  ImageIndex += ImageInfo->GlobalOffsetLength * SkuCount;\r
+        case sizeof(UINT16):\r
+          *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
+          return EFI_SUCCESS;\r
 \r
-  //\r
-  // DynamicEX Guid Offset\r
-  //\r
-  if (Index->StateByte.ExtendedGuidPresent) {\r
-    CopyMem (&Index->DynamicExGuid,\r
-             ImageIndex,\r
-             ImageInfo->GlobalGuidTabIdxLength\r
-             );\r
+        case sizeof(UINT32):\r
+          *((UINT32 *) InternalData) = *((UINT32 *) Data);\r
+          return EFI_SUCCESS;\r
 \r
-    ImageIndex += ImageInfo->GlobalGuidTabIdxLength;\r
-  }\r
+        case sizeof(UINT64):\r
+          *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
+          return EFI_SUCCESS;\r
 \r
-  //\r
-  // HII_DATA\r
-  //\r
-  if (Index->StateByte.HiiEnable) {\r
-    Index->HiiData = (UINT32) ImageIndex - (UINT32) ImageInfo->IndexStart;\r
-    ImageIndex += ((ImageInfo->GlobalStrTabIdxLength + ImageInfo->GlobalGuidTabIdxLength) * SkuCount);\r
+        default:\r
+          ASSERT (FALSE);\r
+          return EFI_NOT_FOUND;\r
+      }\r
+    }\r
+      \r
   }\r
 \r
-  return (UINTN) (ImageIndex - ImageIndexBackUp);\r
+  ASSERT (FALSE);\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 \r
-\r
-\r
-/**\r
-  The function builds the PCD database based on the\r
-  PCD_IMAGE on the flash.\r
-\r
-  @param[in] Database  The database instance.\r
-  @param[in] ImageIndex The starting address of a PCD index defined in PCD spec 0.51.\r
-  @param[in] ImageInfo The attributes of the PCD_IMAGE as this binary stream is highly\r
-              optimized for size.\r
-\r
-  @retval VOID\r
-**/\r
-VOID\r
-BuildPcdDatabaseIndex (\r
-  PCD_DATABASE     *Database,\r
-  UINT8            *ImageIndex,\r
-  PCD_IMAGE_RECORD *ImageInfo\r
+VOID *\r
+GetWorkerByLocalTokenNumber (\r
+  PEI_PCD_DATABASE    *PeiPcdDb,\r
+  UINT32              LocalTokenNumber,\r
+  UINTN               Size\r
   )\r
 {\r
-  UINTN     Idx;\r
-  UINTN     Len;\r
-  PCD_INDEX *IndexTable;\r
+  UINT32              Offset;\r
+  EFI_GUID            *Guid;\r
+  UINT16              *Name;\r
+  VARIABLE_HEAD       *VariableHead;\r
+  EFI_STATUS          Status;\r
+  UINTN               DataSize;\r
+  VOID                *Data;\r
+  UINT16              *StringTable;\r
+  UINT16              StringTableIdx;\r
+      \r
+  PeiPcdDb        = GetPcdDatabase ();\r
+\r
+  if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
+    LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size);\r
+  }\r
 \r
-  IndexTable = (PCD_INDEX *) GetAbsoluteAddress (0, Database->Info.PcdIndexOffset, Database);\r
+  Offset      = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+  StringTable = PeiPcdDb->Init.StringTable;\r
+  \r
+  switch (LocalTokenNumber & ~PCD_DATABASE_OFFSET_MASK) {\r
+    case PCD_TYPE_VPD:\r
+    {\r
+      VPD_HEAD *VpdHead;\r
+      VpdHead = (VPD_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
+      return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);\r
+    }\r
+      \r
+    case PCD_TYPE_HII:\r
+    {\r
+      VariableHead = (VARIABLE_HEAD *) ((UINT8 *)PeiPcdDb + Offset);\r
+      \r
+      Guid = &(PeiPcdDb->Init.GuidTable[VariableHead->GuidTableIndex]);\r
+      Name = &StringTable[VariableHead->StringIndex];\r
+\r
+      Status = GetHiiVariable (Guid, Name, &Data, &DataSize);\r
+      ASSERT_EFI_ERROR (Status);\r
+      ASSERT (DataSize >= (UINTN) (VariableHead->Offset + Size));\r
+\r
+      return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
+    }\r
 \r
-  for (Idx = 0; Idx < Database->Info.EntryCount; Idx++) {\r
-    Len = BuildPcdIndex (ImageIndex, &IndexTable[Idx], ImageInfo);\r
-    ImageIndex += Len;\r
-  }\r
+    case PCD_TYPE_DATA:\r
+      return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
+      break;\r
 \r
-  return;\r
-}\r
+    case PCD_TYPE_STRING:\r
+      StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
+      return (VOID *) (&StringTable[StringTableIdx]);\r
 \r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+      \r
+  }\r
 \r
-/**\r
-  The function builds the PCD database based on the\r
-  PCD_IMAGE on the flash.\r
+  ASSERT (FALSE);\r
+      \r
+  return NULL;\r
+  \r
+}\r
 \r
-  @param[in] PcdImageOnFlash  The PCD image on flash.\r
 \r
-  @retval VOID\r
---*/\r
-VOID\r
-BuildPcdDatabase (\r
-  UINT8 *PcdImageOnFlash\r
+VOID *\r
+ExGetWorker (\r
+  IN CONST  EFI_GUID  *Guid,\r
+  IN UINT32           ExTokenNumber,\r
+  IN UINTN            GetSize\r
   )\r
 {\r
-  PCD_DATABASE        *Database;\r
-  UINTN               Len;\r
-  PCD_IMAGE_RECORD    ImageInfo;\r
-  UINT8               *ImageIndex;\r
-  PCD_DATABASE_HEADER DatabaseHeader;\r
-\r
-  Len = GetPcdDatabaseLen(PcdImageOnFlash, &DatabaseHeader, &ImageInfo);\r
-\r
-  Database = BuildGuidHob (&gPcdDataBaseHobGuid, Len);\r
-  ASSERT (Database != NULL);\r
+  EX_PCD_ENTRY_ATTRIBUTE      Attr;\r
 \r
-  ZeroMem (Database, Len);\r
-\r
-  //\r
-  // Update Database header\r
-  //\r
-  CopyMem (&Database->Info, &DatabaseHeader, sizeof (DatabaseHeader));\r
-\r
-  //\r
-  // I need this to get the GuidTableOffset as we don't\r
-  // know if Database field of PCD_DATABASE starts from an aligned\r
-  // address. The compilor may add padding after PCD_DATABASE_HEADER field.\r
-  //\r
-  Database->Info.GuidTableOffset = ((UINTN) &Database->GuidTable) - (UINTN)Database;\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
   \r
-  //\r
-  // Copy Guid Table from Flash\r
-  //\r
-  CopyMem ((UINT8 *) Database + Database->Info.GuidTableOffset,\r
-            ImageInfo.GuidTableStart,\r
-            ImageInfo.GuidTableLength\r
-            );\r
-\r
-  //\r
-  // Copy ImageIndex from Flash\r
-  //\r
-  CopyMem ((UINT8 *) Database + Database->Info.ImageIndexOffset,\r
-            ImageInfo.IndexStart,\r
-            ImageInfo.IndexLength\r
-            );\r
+  ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
 \r
-  //\r
-  // Copy Default Value\r
-  //\r
-  CopyMem ((UINT8 *) Database + Database->Info.DataBufferOffset,\r
-           ImageInfo.DataDefaultStart,\r
-           ImageInfo.DataDefaultLength\r
-           );\r
-\r
-  //\r
-  // Copy String Table\r
-  //\r
-  CopyMem ((UINT8 *) Database + Database->Info.StringTableOffset,\r
-           ImageInfo.StringTableStart,\r
-           ImageInfo.StringTableLength\r
-           );\r
-\r
-  ImageIndex = GetAbsoluteAddress (0, Database->Info.ImageIndexOffset, Database);\r
-\r
-  BuildPcdDatabaseIndex (Database, ImageIndex, &ImageInfo);\r
-\r
-  return;\r
+  return GetWorkerByLocalTokenNumber (GetPcdDatabase(),\r
+                                      Attr.LocalTokenNumberAlias,\r
+                                      Attr.Size\r
+                                      );\r
 }\r
 \r
-\r
-\r
-/**\r
-  The function is provided by PCD PEIM and PCD DXE driver to\r
-  do the work of reading a HII variable from variable service.\r
-\r
-  @param[in] VariableGuid     The Variable GUID.\r
-  @param[in] VariableName     The Variable Name.\r
-  @param[out] VariableData    The output data.\r
-  @param[out] VariableSize    The size of the variable.\r
-\r
-  @retval EFI_SUCCESS         Operation successful.\r
-  @retval EFI_SUCCESS         Variablel not found.\r
---*/\r
-EFI_STATUS\r
-GetHiiVariable (\r
-  IN  EFI_GUID     *VariableGuid,\r
-  IN  UINT16       *VariableName,\r
-  OUT VOID         **VariableData,\r
-  OUT UINTN        *VariableSize\r
+VOID *\r
+GetWorker (\r
+  UINTN  TokenNumber,\r
+  UINTN   GetSize\r
   )\r
 {\r
-  UINTN      Size;\r
-  EFI_STATUS Status;\r
-  VOID       *Buffer;\r
-  EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;\r
-\r
-  Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);\r
-  ASSERT_EFI_ERROR (Status);\r
+  PEI_PCD_DATABASE      *PeiPcdDb;\r
 \r
-  Size = 0;\r
+  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
-  Status = VariablePpi->PeiGetVariable (\r
-                          GetPeiServicesTablePointer (),\r
-                          VariableName,\r
-                          VariableGuid,\r
-                          NULL,\r
-                          &Size,\r
-                          NULL\r
-                            );\r
-  ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
+  ASSERT (GetSize == PeiPcdGetSize (TokenNumber) || GetSize == 0);\r
 \r
-  Status = PeiCoreAllocatePool (Size, &Buffer);\r
-  ASSERT_EFI_ERROR (Status);\r
+  PeiPcdDb = GetPcdDatabase ();\r
+  \r
+  return  GetWorkerByLocalTokenNumber (PeiPcdDb, PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber], GetSize);\r
+}\r
 \r
-  // declare a local for STP.\r
-  //\r
-  Status = VariablePpi->PeiGetVariable (\r
-                            GetPeiServicesTablePointer (),\r
-                            (UINT16 *) VariableName,\r
-                            VariableGuid,\r
-                            NULL,\r
-                            &Size,\r
-                            Buffer\r
-                            );\r
-  ASSERT_EFI_ERROR (Status);\r
 \r
-  *VariableSize = Size;\r
-  *VariableData = Buffer;\r
+VOID\r
+GetExPcdTokenAttributes (\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINT32                     ExTokenNumber,\r
+  OUT EX_PCD_ENTRY_ATTRIBUTE    *ExAttr\r
+  )\r
+{\r
+  UINT32              i;\r
+  DYNAMICEX_MAPPING   *ExMap;\r
+  EFI_GUID            *GuidTable;\r
+  PEI_PCD_DATABASE    *PeiPcdDb;\r
 \r
-  return EFI_SUCCESS;\r
+  PeiPcdDb    = GetPcdDatabase();\r
+  \r
+  ExMap       = PeiPcdDb->Init.ExMapTable;\r
+  GuidTable   = PeiPcdDb->Init.GuidTable;\r
+  \r
+  for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {\r
+    if ((ExTokenNumber == ExMap[i].ExTokenNumber) && \r
+        CompareGuid (Guid, (CONST EFI_GUID *) &GuidTable[ExMap[i].ExGuidIndex])) {\r
+      ExAttr->TokenNumber               = i + PEI_NEX_TOKEN_NUMBER;\r
+      ExAttr->Size                      = PeiPcdDb->Init.SizeTable[i + PEI_NEX_TOKEN_NUMBER];\r
+      ExAttr->LocalTokenNumberAlias     = ExMap[i].LocalTokenNumber;\r
+    }\r
+  }\r
+  \r
+  ASSERT (FALSE);\r
+  \r
+  return;\r
 }\r
 \r
 \r
 \r
-/**\r
-  The function is provided by PCD PEIM and PCD DXE driver to\r
-  do the work of reading a HII variable from variable service.\r
-\r
-  @param[in] VariableGuid     The Variable GUID.\r
-  @param[in] VariableName     The Variable Name.\r
-  @param[in] Data             The input data.\r
-  @param[out] VariableSize    The size of the variable.\r
-  @param[in] Offset           The offset of the variable data that a PCD entry will starts from.\r
-\r
-  @retval EFI_SUCCESS         Operation successful.\r
-  @retval EFI_SUCCESS         Variablel not found.\r
---*/\r
-EFI_STATUS\r
-SetHiiVariable (\r
-  IN  EFI_GUID     *VariableGuid,\r
-  IN  UINT16       *VariableName,\r
-  IN  CONST VOID   *Data,\r
-  IN  UINTN        VariableSize,\r
-  IN  UINTN        Offset\r
+PEI_PCD_DATABASE *\r
+GetPcdDatabase (\r
+  VOID\r
   )\r
 {\r
-  ASSERT (FALSE);\r
-  return EFI_INVALID_PARAMETER;\r
-}\r
+  EFI_HOB_GUID_TYPE *GuidHob;\r
 \r
+  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+  ASSERT (GuidHob != NULL);\r
+  \r
+  return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+}\r
 \r
index d775a12..647a006 100644 (file)
@@ -18,53 +18,213 @@ Module Name: Service.h
 #ifndef _SERVICE_H\r
 #define _SERVICE_H\r
 \r
+#define USE_AUTOGEN\r
+\r
+#ifndef USE_AUTOGEN\r
+//\r
+// The following definition will be generated by build tool \r
 //\r
-// Offset of StateByte\r
+\r
 //\r
-#define PCD_STATEBYTE_HIIENABLE           0x01\r
-#define PCD_STATEBYTE_SKUENABLE           0x02\r
-#define PCD_STATEBYTE_VPDENABLE           0x04\r
-#define PCD_STATEBYTE_SKUDATAARRAYENABLE  0x08\r
-#define PCD_STATEBYTE_DATUMTYPE           0x70\r
-#define PCD_STATEBYTE_EXTENDEDGUIDPRESENT 0x80\r
+// Common definitions that is shared by PEI and DXE PCD database\r
+//\r
+#define PCD_TYPE_SHIFT        24\r
+\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
+\r
+\r
+#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED))\r
+\r
+typedef struct  {\r
+  UINT32                ExTokenNumber;\r
+  UINT32                LocalTokenNumber;         // PCD Number of this particular platform build\r
+  UINT16                ExGuidIndex;              // Index of GuidTable\r
+} DYNAMICEX_MAPPING;\r
+\r
+\r
+typedef struct {\r
+  UINT32  SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler\r
+  UINT32  SkuIdTableOffset;   //Offset from the PCD_DB\r
+} SKU_HEAD;\r
+\r
+\r
+typedef struct {\r
+  UINT16  GuidTableIndex;   // Offset in Guid Table in units of GUID.\r
+  UINT16  StringIndex;      // Offset in String Table in units of UINT16.\r
+  UINT16  Offset;           // Offset in Variable\r
+} VARIABLE_HEAD  ;\r
+\r
+\r
+typedef  struct {\r
+  UINT32  Offset;\r
+} VPD_HEAD;\r
+\r
+typedef struct {\r
+  UINT32 LocalTokenNumber;\r
+  UINT16 TokenNumber;\r
+  UINT16 Size;\r
+} SIZEINFO;\r
+\r
+#define offsetof(s,m)             (UINT32)&(((s *)0)->m)\r
 \r
-#define PCD_DATUMTYPE_OFFSET 4\r
 \r
+\r
+\r
+\r
+//\r
+// C Structure generate for PEI PCD Database\r
 //\r
-// The definitions for interpreting DatumType\r
+#define PEI_EXMAPPING_TABLE_SIZE  1\r
+#define PEI_GUID_TABLE_SIZE         1\r
+#define PEI_LOCAL_TOKEN_NUMBER            1\r
+#define PEI_STRING_TABLE_SIZE        2\r
+#define PEI_SKUID_TABLE_SIZE         3\r
+\r
+\r
+#define PEI_DATABASE_EMPTRY          FALSE\r
+#define PEI_EXMAP_TABLE_EMPTY        FALSE\r
+#define PEI_GUID_TABLE_EMPTY         FALSE\r
+#define PEI_STRINGTABLE_EMPTY        FALSE\r
+#define PEI_SIZETABLE_EMPTY          FALSE\r
+#define PEI_SKUID_TABLE_EMPTY        FALSE\r
+\r
+\r
+typedef struct {\r
+\r
+  DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];\r
+  EFI_GUID          GuidTable[PEI_GUID_TABLE_SIZE];\r
+\r
+  UINT32            LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER];\r
+\r
+\r
+  UINT16            StringTable[PEI_STRING_TABLE_SIZE];\r
+  UINT16            SizeTable[PEI_LOCAL_TOKEN_NUMBER];\r
+\r
+  UINT8             SkuIdTable[PEI_SKUID_TABLE_SIZE];\r
+  \r
+  SKU_ID            SystemSkuId;\r
+\r
+} PEI_PCD_DATABASE_INIT;\r
+\r
+typedef struct {\r
+  UINT8 Dummy;\r
+} PEI_PCD_DATABASE_UNINIT;\r
+\r
+#define PEI_PCD_DB_INIT_VALUE \\r
+    /* ExMapTable */ \\r
+  { \\r
+    { /* ExTokenNumber */ 0x00000001, /* LocalTokenNumberIndex */ 0, /* ExGuidIndex */ 0} \\r
+  }, \\r
+  \\r
+  /* GuidTable */ \\r
+  { \\r
+    { 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD }} \\r
+  }, \\r
+  \\r
+  /* LocalTokenNumberTable */ \\r
+  { \\r
+    0 \\r
+  }, \\r
+  \\r
+  /* StringTable */ \\r
+  { \\r
+    L"\0" \\r
+  }, \\r
+  \\r
+  /* SizeTable */ \\r
+  { \\r
+    4 \\r
+  }, \\r
+  \\r
+  /* SkuIdTable */ \\r
+  { \\r
+    /*MaxSku*/ 2, /*SkuId*/ 100, /*SkuId*/200   \\r
+  },\\r
+  \\r
+  /* SystemSkuId */ \\r
+  0 \\r
+\r
+\r
 //\r
-#define PCD_BYTE8   (0x00 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BYTE16  (0x01 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BYTE32  (0x02 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BYTE64  (0x03 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_POINTER (0x04 << PCD_DATUMTYPE_OFFSET)\r
-#define PCD_BOOLEAN (0x05 << PCD_DATUMTYPE_OFFSET)\r
+// End of Autogen Code\r
+//\r
+#endif\r
 \r
-extern GUID gEfiPcdImageHobGuid;\r
+/*\r
+typedef struct {\r
+  PEI_PCD_DATABASE_INIT Init;\r
+  PEI_PCD_DATABASE_UNINIT Uninit;\r
+} PEI_PCD_DATABASE;\r
+*/\r
 \r
 /* Internal Function definitions */\r
 \r
-VOID\r
-PeiGetPcdEntryWorker (\r
-  IN UINTN Token,\r
-  IN CONST GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE    Type,\r
-  OUT VOID            *Data\r
-  );\r
+PEI_PCD_DATABASE *\r
+GetPcdDatabase (\r
+  VOID\r
+  )\r
+;\r
 \r
 EFI_STATUS\r
-PeiSetPcdEntryWorker (\r
-  IN UINTN Token,\r
-  IN CONST GUID       *Guid,  OPTIONAL\r
-  IN PCD_DATA_TYPE    Type,\r
-  IN VOID       *Data\r
-  );\r
+SetWorker (\r
+  IN UINTN         TokenNumber,\r
+  IN VOID          *Data,\r
+  IN UINTN         Size,\r
+  IN BOOLEAN       PtrType\r
+  )\r
+;\r
 \r
-UINTN\r
-PeiGetPcdEntrySizeWorker (\r
-  IN UINTN Token,\r
-  IN CONST GUID       *Guid  OPTIONAL\r
-  );\r
+EFI_STATUS\r
+SetWorkerByLocalTokenNumber (\r
+  UINT32        LocalTokenNumber,\r
+  VOID          *Data,\r
+  UINTN         Size,\r
+  BOOLEAN       PtrType\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+ExSetWorker (\r
+  IN UINT32               ExTokenNumber,\r
+  IN CONST EFI_GUID       *Guid,\r
+  VOID                    *Data,\r
+  UINTN                   Size,\r
+  BOOLEAN                 PtrType\r
+  )\r
+;\r
+\r
+VOID *\r
+GetWorker (\r
+  UINTN     TokenNumber,\r
+  UINTN     GetSize\r
+  )\r
+;\r
+\r
+VOID *\r
+ExGetWorker (\r
+  IN CONST EFI_GUID   *Guid,\r
+  IN UINT32           ExTokenNumber,\r
+  IN UINTN            GetSize\r
+  )\r
+;\r
+\r
+typedef struct {\r
+  UINTN   TokenNumber;\r
+  UINTN   Size;\r
+  UINT32  LocalTokenNumberAlias;\r
+} EX_PCD_ENTRY_ATTRIBUTE;\r
+\r
+VOID\r
+GetExPcdTokenAttributes (\r
+  IN CONST EFI_GUID             *Guid,\r
+  IN UINT32                     ExTokenNumber,\r
+  OUT EX_PCD_ENTRY_ATTRIBUTE    *ExAttr\r
+  )\r
+;\r
 \r
 EFI_STATUS\r
 PeiRegisterCallBackWorker (\r
@@ -74,25 +234,9 @@ PeiRegisterCallBackWorker (
   IN  BOOLEAN                 Register\r
 );\r
 \r
-EFI_STATUS\r
-PeiSetSku (\r
-  UINTN Id\r
-);\r
-\r
-EFI_STATUS\r
-PeiGetNextTokenWorker (\r
-  IN OUT UINTN *Token,\r
-  IN CONST GUID           *Guid     OPTIONAL\r
-  );\r
-\r
-UINT8 *\r
-LocatePcdImage (\r
-  VOID\r
-);\r
-\r
 VOID\r
 BuildPcdDatabase (\r
-  UINT8 *PcdImageOnFlash\r
+  VOID\r
   )\r
 ;\r
 \r
@@ -368,4 +512,11 @@ PeiPcdGetNextToken (
   IN OUT  UINTN    *TokenNumber\r
   )\r
 ;\r
+\r
+extern EFI_GUID gPcdDataBaseHobGuid;\r
+\r
+extern EFI_GUID gPcdPeiCallbackFnTableHobGuid;\r
+\r
+extern PEI_PCD_DATABASE_INIT gPEIPcdDbInit;\r
+\r
 #endif\r
index 77e25ac..21fa67a 100644 (file)
@@ -38,59 +38,25 @@ DoTest(
   VOID\r
   )\r
 {\r
-  PCD_TOKEN_NUMBER tn;\r
-  UINTN Size;\r
-  VOID * Ptr;\r
-  UINT32 Uint32;\r
-  UINT32 Uint32a;\r
-  UINT64 Uint64;\r
-  UINT64 Uint64a;\r
-  INTN i;\r
-\r
-  tn = 0x00001000;\r
-\r
-  Size = LibPcdGetSize (tn);\r
-  Ptr = LibPcdGetPtr (tn); /* a:RW;2880;512!e:RW;262144;512 */\r
-  \r
-  tn = 0x00001001;\r
-  Size = LibPcdGetSize (tn); /* FW;40960;512 */\r
-  \r
-  tn = 0x00001002;\r
-  Size = LibPcdGetSize (tn); /* FW;40960;512 */\r
-  Ptr = LibPcdGetPtr (tn);\r
-  \r
-  LibPcdSetSku (0x0a);\r
-  tn = 0x2233;\r
-  Uint64 = LibPcdGet64 (tn);\r
-  \r
-  LibPcdSetSku (0x0b);\r
-  Uint64 = LibPcdGet64 (tn);\r
-  \r
-  LibPcdSetSku (0x0c);\r
-  Uint64a = LibPcdGet64 (tn);\r
-  \r
-  LibPcdSetSku (0);\r
-  tn = 0x2233;\r
-  Uint64 = LibPcdGet64 (tn);\r
-  \r
-  \r
-  tn = 0xfaceface;\r
-  Size = LibPcdGetExSize (&Guid1, tn);\r
-  Uint32 = LibPcdGetEx32 (&Guid1, tn);\r
-  \r
-  LibPcdCallBackOnSet (&Guid1, tn, OnsetCallback1);\r
-  \r
-  LibPcdCancelCallBackOnSet (&Guid1, tn, OnsetCallback1);\r
-  \r
-  for (i = 0; i < 2; i++) {\r
-    Uint32a = LibPcdSetEx32 (&Guid1, tn, Uint32 + i);\r
-    DebugPrint (0x80000000, "%x\n", Uint32a);\r
-  }\r
-  \r
-  \r
-  \r
-  Uint32 = LibPcdGet32 (tn);\r
+  UINT8     u8;\r
+  UINT16    u16;\r
+  UINT32    u32;\r
+  UINT64    u64;\r
   \r
+  u32 = 0xafafafaf;\r
+  PcdSet32(PcdTestDynamicUint32, u32);\r
+\r
+  u64 = 0xafafafaf00000000;\r
+  PcdSet64(PcdTestDynamicUint64, u64);\r
+\r
+  u8 = PcdGet8(PcdTestDynamicUint8);\r
+  u16 = PcdGet16(PcdTestDynamicUint16);\r
+\r
+\r
+  ASSERT (u8 == 0x01);\r
+  ASSERT (u16 == 0x1234);\r
+  ASSERT (u64 == PcdGet64(PcdTestDynamicUint64));\r
+  ASSERT (u32 == PcdGet32(PcdTestDynamicUint32));\r
   \r
   return;\r
 }\r