]> git.proxmox.com Git - mirror_edk2.git/commitdiff
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 1d75273ceeda0507aa57ea74ebe24c57e8cc7a89..bf77ad093c8c7f0c9814380071f1d566120078f0 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>
       <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>
     <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>
     <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>
     <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>
       <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>
   </PcdDefinitions>
 </PackageSurfaceArea>
index 4ed7eb0cd02e37e0bd0e9dbfabb6249925fd9e09..20fd4a15b56566ab818787dbb20eb8b5ead64eab 100644 (file)
@@ -15,7 +15,6 @@ Module Name: Pcd.c
 \r
 **/\r
 \r
 \r
 **/\r
 \r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \r
 #include "Service.h"\r
 \r
 \r
@@ -70,9 +69,19 @@ PcdDxeInit (
   IN EFI_SYSTEM_TABLE     *SystemTable\r
   )\r
 {\r
   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
   \r
-  InitPcdDxeDataBase ();\r
+  BuildPcdDxeDataBase ();\r
+\r
+  //\r
+  // BugBug Check if PcdDatabase is already installed.\r
+  //\r
   \r
   Status = gBS->InstallProtocolInterface (\r
                   &NewHandle,\r
   \r
   Status = gBS->InstallProtocolInterface (\r
                   &NewHandle,\r
@@ -91,10 +100,10 @@ PcdDxeInit (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetSku (\r
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetSku (\r
-  IN  UINTN                  SkuId\r
+  IN  UINTN        SkuId\r
   )\r
 {\r
   )\r
 {\r
-  return DxeSetSku(SkuId);\r
+  return gPcdDatabase->PeiDb.Init.SystemSkuId = (SKU_ID) SkuId;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -102,10 +111,12 @@ DxePcdSetSku (
 UINT8\r
 EFIAPI\r
 DxePcdGet8 (\r
 UINT8\r
 EFIAPI\r
 DxePcdGet8 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN         TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return DxePcdGet8Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT8) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return *((UINT8 *) GetWorker (TokenNumber));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -113,10 +124,12 @@ DxePcdGet8 (
 UINT16\r
 EFIAPI\r
 DxePcdGet16 (\r
 UINT16\r
 EFIAPI\r
 DxePcdGet16 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN         TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return DxePcdGet16Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT16) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return ReadUnaligned16 (GetWorker (TokenNumber));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -124,10 +137,12 @@ DxePcdGet16 (
 UINT32\r
 EFIAPI\r
 DxePcdGet32 (\r
 UINT32\r
 EFIAPI\r
 DxePcdGet32 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN         TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return DxePcdGet32Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT32) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return ReadUnaligned32 (GetWorker (TokenNumber));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -135,10 +150,12 @@ DxePcdGet32 (
 UINT64\r
 EFIAPI\r
 DxePcdGet64 (\r
 UINT64\r
 EFIAPI\r
 DxePcdGet64 (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return DxePcdGet32Ex (NULL, TokenNumber);\r
+  ASSERT (sizeof (UINT64) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return ReadUnaligned64(GetWorker (TokenNumber));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -146,10 +163,10 @@ DxePcdGet64 (
 VOID *\r
 EFIAPI\r
 DxePcdGetPtr (\r
 VOID *\r
 EFIAPI\r
 DxePcdGetPtr (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return DxePcdGetPtrEx (NULL, TokenNumber);\r
+  return GetWorker (TokenNumber);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -157,10 +174,12 @@ DxePcdGetPtr (
 BOOLEAN\r
 EFIAPI\r
 DxePcdGetBool (\r
 BOOLEAN\r
 EFIAPI\r
 DxePcdGetBool (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\r
   )\r
 {\r
-  return DxePcdGetBoolEx (NULL, TokenNumber);\r
+  ASSERT (sizeof (BOOLEAN) == DxePcdGetSize (TokenNumber));\r
+  \r
+  return *((BOOLEAN *) GetWorker (TokenNumber));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -168,10 +187,18 @@ DxePcdGetBool (
 UINTN\r
 EFIAPI\r
 DxePcdGetSize (\r
 UINTN\r
 EFIAPI\r
 DxePcdGetSize (\r
-  IN UINTN  TokenNumber\r
+  IN UINTN          TokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -179,15 +206,11 @@ DxePcdGetSize (
 UINT8\r
 EFIAPI\r
 DxePcdGet8Ex (\r
 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
   )\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
 }\r
 \r
 \r
@@ -196,14 +219,10 @@ UINT16
 EFIAPI\r
 DxePcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                 ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -212,14 +231,10 @@ UINT32
 EFIAPI\r
 DxePcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -228,14 +243,13 @@ UINT64
 EFIAPI\r
 DxePcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -244,14 +258,10 @@ VOID *
 EFIAPI\r
 DxePcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -260,12 +270,10 @@ BOOLEAN
 EFIAPI\r
 DxePcdGetBoolEx (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdGetBoolEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -274,10 +282,14 @@ UINTN
 EFIAPI\r
 DxePcdGetSizeEx (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdGetSizeEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -285,11 +297,11 @@ DxePcdGetSizeEx (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet8 (\r
 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
   )\r
 {\r
-  return DxePcdSet8Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -297,11 +309,11 @@ DxePcdSet8 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet16 (\r
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet16 (\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN              TokenNumber,\r
   IN UINT16             Value\r
   )\r
 {\r
   IN UINT16             Value\r
   )\r
 {\r
-  return DxePcdSet16Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -309,11 +321,11 @@ DxePcdSet16 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet32 (\r
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet32 (\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN              TokenNumber,\r
   IN UINT32             Value\r
   )\r
 {\r
   IN UINT32             Value\r
   )\r
 {\r
-  return DxePcdSet32Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -321,11 +333,11 @@ DxePcdSet32 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSet64 (\r
 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
   )\r
 {\r
-  return DxePcdSet64Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -333,11 +345,16 @@ DxePcdSet64 (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetPtr (\r
 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
   )\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
 }\r
 \r
 \r
@@ -345,11 +362,11 @@ DxePcdSetPtr (
 EFI_STATUS\r
 EFIAPI\r
 DxePcdSetBool (\r
 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
   )\r
 {\r
-  return DxePcdSetBoolEx (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -358,11 +375,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 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
   )\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
 }\r
 \r
 \r
@@ -371,11 +394,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdSet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN UINT16            Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -384,11 +413,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdSet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN UINT32             Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -397,11 +432,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdSet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN UINT64            Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -410,11 +451,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
 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
   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
 }\r
 \r
 \r
@@ -423,12 +470,17 @@ EFI_STATUS
 EFIAPI\r
 DxePcdSetBoolEx (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 DxePcdSetBoolEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber,\r
+  IN UINTN  ExTokenNumber,\r
   IN BOOLEAN           Value\r
   )\r
 {\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
 }\r
 \r
 \r
index 280a45ea3188a88dc8c1d0b2a3f2a25c5c93a2e3..52097ade7e877d0baef83fd08a6c4362db1becee 100644 (file)
@@ -14,427 +14,463 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 Module Name: Service.c\r
 \r
 **/\r
 Module Name: Service.c\r
 \r
 **/\r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
 #include "Service.h"\r
 \r
-static PCD_DATABASE *PrivatePcdDxeDatabase;\r
-static LIST_ENTRY   mPcdDatabaseListHead = INITIALIZE_LIST_HEAD_VARIABLE(mPcdDatabaseListHead);\r
 \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
 \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
 \r
+PCD_DATABASE * gPcdDatabase;\r
 \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
 {\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
 \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
 \r
+      return (UINT8 *) Data + VariableHead->Offset;\r
 \r
 \r
-  return;\r
-}\r
+    case PCD_TYPE_STRING:\r
+      StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
+      return (VOID *) &StringTable[StringTableIdx];\r
 \r
 \r
+    case PCD_TYPE_DATA:\r
+      return (VOID *) ((UINT8 *) PcdDb + Offset);\r
+      break;\r
 \r
 \r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+      \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
   )\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
 \r
-  ASSERT (PcdIndex != NULL);\r
+  ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
+  \r
+  IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
 \r
 \r
-  ASSERT (PcdIndex->StateByte.DataType == Type);\r
+  LocalTokenNumberTable  = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+                                     gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\r
 \r
 \r
-  //\r
-  // Invoke the callback function.\r
-  //\r
+  SizeTable              = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable: \r
+                                     gPcdDatabase->DxeDb.Init.SizeTable;\r
 \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
 \r
-  return Status;\r
 \r
 \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
 \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
   )\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
 }\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
 {\r
-  PCD_GUID_SPACE    *GuidSpaceEntry;\r
+  PEI_PCD_DATABASE    *PeiDatabase;\r
+  EFI_HOB_GUID_TYPE   *GuidHob;\r
 \r
 \r
-  GuidSpaceEntry = AllocatePool (sizeof (PCD_GUID_SPACE));\r
-  ASSERT (GuidSpaceEntry != NULL);\r
+  gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));\r
+  ASSERT (gPcdDatabase != NULL);\r
 \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
 \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
 }\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
   )\r
 {\r
-  PCD_TOKEN_SPACE   *TokenSpaceEntry;\r
+  UINTN      Size;\r
+  EFI_STATUS Status;\r
+  VOID       *Buffer;\r
 \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
 \r
-  TokenSpaceEntry->TokeNumber = TokenNumber;\r
-  InitializeListHead (&TokenSpaceEntry->CallbackListHead);\r
-  \r
-  InsertTailList (TokenSpaceListHead, &TokenSpaceEntry->ListNode);\r
+  Buffer = AllocatePool (Size);\r
 \r
 \r
-  return &TokenSpaceEntry->CallbackListHead;\r
-}\r
+  ASSERT (Buffer != NULL);\r
 \r
 \r
+  Status = EfiGetVariable (\r
+    VariableName,\r
+    VariableGuid,\r
+    NULL,\r
+    &Size,\r
+    Buffer\r
+    );\r
 \r
 \r
+  return Status;\r
 \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
 }\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
 \r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);\r
 \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
-  \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
-      //\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
-    \r
-    GuidListNode = GetNextNode (GuidListHead, GuidListNode);\r
   }\r
   }\r
+  ASSERT (i < SkuIdTable[0]);\r
 \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
 \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
   \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
 \r
-  ListNode = GetFirstNode (CallbackListHead);\r
 \r
 \r
-  while (!IsNull(CallbackListHead, ListNode)) {\r
-    CallbackEntry = PCD_CALLBACK_ENTRY_FROM_LISTNODE(ListNode);\r
 \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
 \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
 \r
 \r
 \r
+\r
 EFI_STATUS\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
   )\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
-  \r
-  GuidListHead = GetPcdDatabaseListHead ();\r
 \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
-      //\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
-\r
-  return EFI_NOT_FOUND;\r
   \r
   \r
-}\r
-\r
+  IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
 \r
 \r
+  LocalTokenNumberTable  = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable : \r
+                                     gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;\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
-  PCD_DATABASE *Database;\r
-  PCD_INDEX    *PcdIndex;\r
+  TokenNumber = IsPeiDb ? TokenNumber\r
+                        : TokenNumber - PEI_LOCAL_TOKEN_NUMBER;\r
   \r
   \r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
 \r
 \r
-  PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);\r
+  return SetWorkerByLocalTokenNumber (LocalTokenNumberTable[TokenNumber], Data, Size, PtrType, IsPeiDb);\r
 \r
 \r
-  if (PcdIndex == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\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
 \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
 {\r
-  PCD_DATABASE * Database;\r
+  EX_PCD_ENTRY_ATTRIBUTE Attr;\r
 \r
 \r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
 \r
 \r
-  return Database->Info.SkuId = Id;\r
+  ASSERT ((GetSize == Attr.Size) || (GetSize == 0));\r
 \r
 \r
+  return GetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias,\r
+                                                Attr.IsPeiDb,\r
+                                                Attr.Size\r
+                                                );\r
 }\r
 \r
 \r
 \r
 }\r
 \r
 \r
 \r
+\r
+\r
 EFI_STATUS\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
   )\r
 {\r
-  PCD_DATABASE * Database;\r
+  EX_PCD_ENTRY_ATTRIBUTE Attr;\r
 \r
 \r
-  Database = GetPcdDxeDataBaseInstance ();\r
+  GetExPcdTokenAttributes (Guid, ExTokenNumber, &Attr);\r
 \r
 \r
-  return GetNextTokenWorker (&Database->Info,\r
-                             TokenNumber,\r
-                             Guid\r
-                             );\r
-}\r
+  ASSERT (!PtrType && (SetSize == Attr.Size));\r
 \r
 \r
+  ASSERT (PtrType && (SetSize <= Attr.Size));\r
 \r
 \r
+  InvokeCallbackOnSet (ExTokenNumber, Guid, Attr.TokenNumber, Data, Attr.Size);\r
 \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
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
+  return EFI_SUCCESS;\r
+  \r
+}\r
 \r
 \r
-  PeiDatabase = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
 \r
 \r
-  DxeDatabase = AllocateCopyPool (PeiDatabase->Info.DatabaseLen, PeiDatabase);\r
 \r
 \r
-  ASSERT (DxeDatabase != NULL);\r
 \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
 \r
-  return;\r
-}\r
+  Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
 \r
 \r
+  PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);\r
 \r
 \r
+  StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :\r
+                          gPcdDatabase->DxeDb.Init.StringTable;\r
+  \r
+  InternalData = PcdDb + Offset;\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
-  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
 \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
 \r
-  Buffer = AllocatePool (Size);\r
+      return EFI_SUCCESS;\r
 \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
 \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
 \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
 \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
 }\r
 \r
 \r
@@ -448,16 +484,17 @@ SetHiiVariable (
   IN  UINTN        Offset\r
   )\r
 {\r
   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
 \r
   Size = 0;\r
 \r
   Status = EfiGetVariable (\r
     (UINT16 *)VariableName,\r
     VariableGuid,\r
-    NULL,\r
+    &Attribute,\r
     &Size,\r
     NULL\r
     );\r
     &Size,\r
     NULL\r
     );\r
@@ -471,7 +508,7 @@ SetHiiVariable (
   Status = EfiGetVariable (\r
     VariableName,\r
     VariableGuid,\r
   Status = EfiGetVariable (\r
     VariableName,\r
     VariableGuid,\r
-    NULL,\r
+    &Attribute,\r
     &Size,\r
     Buffer\r
     );\r
     &Size,\r
     Buffer\r
     );\r
@@ -482,10 +519,67 @@ SetHiiVariable (
   return EfiSetVariable (\r
     VariableName,\r
     VariableGuid,\r
   return EfiSetVariable (\r
     VariableName,\r
     VariableGuid,\r
-    0,\r
+    Attribute,\r
     Size,\r
     Buffer\r
     );\r
 \r
 }\r
 \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 86e3dfdee31ea37bc1b8006f8daa3eb563e57c4f..fd2087146e5c4987748db9832fbd6f2c88ae2b90 100644 (file)
@@ -18,27 +18,251 @@ Module Name: Service.h
 #ifndef _SERVICE_H\r
 #define _SERVICE_H\r
 \r
 #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
 \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
 \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
 \r
 EFI_STATUS\r
 DxeRegisterCallBackWorker (\r
@@ -48,11 +272,6 @@ DxeRegisterCallBackWorker (
   IN  BOOLEAN                 Reigster\r
 );\r
 \r
   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
 EFI_STATUS\r
 DxeGetNextTokenWorker (\r
   IN OUT UINTN *Token,\r
@@ -60,10 +279,26 @@ DxeGetNextTokenWorker (
   );\r
 \r
 VOID\r
   );\r
 \r
 VOID\r
-InitPcdDxeDataBase (\r
+BuildPcdDxeDataBase (\r
   VOID\r
 );\r
 \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
 //\r
 // Protocol Interface function declaration.\r
 //\r
@@ -339,61 +574,20 @@ DxePcdGetNextToken (
   )\r
 ;\r
 \r
   )\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
-/*\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
 \r
-#define PCD_TOKEN_SPACE_FROM_LISTNODE(a) \\r
-  _CR(a, PCD_TOKEN_SPACE, ListNode)\r
+extern PCD_DATABASE * gPcdDatabase;\r
 \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
 \r
 #endif\r
index 3fb49dd54f925617256f56c9168d91b4b15dd128..88d1fb0f62a1276193fdb47dec076056d7a20099 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
 \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
 \r
 **/\r
 \r
-#include "../Common/PcdCommon.h"\r
+#include "PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \r
 #include "Service.h"\r
 \r
 \r
@@ -75,12 +74,9 @@ PcdPeimInit (
   )\r
 {\r
   EFI_STATUS Status;\r
   )\r
 {\r
   EFI_STATUS Status;\r
-  UINT8      *PcdImage;\r
-\r
-  PcdImage = (UINT8 *) LocatePcdImage ();\r
-\r
-  BuildPcdDatabase (PcdImage);\r
 \r
 \r
+  BuildPcdDatabase ();\r
+  \r
   Status = PeiCoreInstallPpi (&mPpiPCD);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
   Status = PeiCoreInstallPpi (&mPpiPCD);\r
 \r
   ASSERT_EFI_ERROR (Status);\r
@@ -88,25 +84,16 @@ PcdPeimInit (
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
-\r
 EFI_STATUS\r
 EFIAPI\r
 PeiPcdSetSku (\r
   IN  UINTN                  SkuId\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
 \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
 \r
-  return SkuId;\r
+  return  EFI_SUCCESS;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -117,7 +104,7 @@ PeiPcdGet8 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet8Ex (NULL, TokenNumber);\r
+  return *((UINT8 *) GetWorker (TokenNumber, sizeof (UINT8)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -128,7 +115,7 @@ PeiPcdGet16 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet16Ex (NULL, TokenNumber);\r
+  return ReadUnaligned16 (GetWorker (TokenNumber, sizeof (UINT16)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -139,7 +126,7 @@ PeiPcdGet32 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet32Ex (NULL, TokenNumber);\r
+  return ReadUnaligned32 (GetWorker (TokenNumber, sizeof (UINT32)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -150,7 +137,7 @@ PeiPcdGet64 (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGet64Ex (NULL, TokenNumber);\r
+  return ReadUnaligned64 (GetWorker (TokenNumber, sizeof (UINT64)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -161,7 +148,7 @@ PeiPcdGetPtr (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGetPtrEx (NULL, TokenNumber);\r
+  return GetWorker (TokenNumber, 0);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -172,7 +159,7 @@ PeiPcdGetBool (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   IN UINTN  TokenNumber\r
   )\r
 {\r
-  return PeiPcdGetBoolEx (NULL, TokenNumber);\r
+  return *((BOOLEAN *) GetWorker (TokenNumber, sizeof (BOOLEAN)));\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -183,7 +170,9 @@ PeiPcdGetSize (
   IN UINTN  TokenNumber\r
   )\r
 {\r
   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
 }\r
 \r
 \r
@@ -192,14 +181,10 @@ UINT8
 EFIAPI\r
 PeiPcdGet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet8Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -208,14 +193,10 @@ UINT16
 EFIAPI\r
 PeiPcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet16Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -224,14 +205,10 @@ UINT32
 EFIAPI\r
 PeiPcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet32Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -240,14 +217,10 @@ UINT64
 EFIAPI\r
 PeiPcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGet64Ex (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -256,14 +229,10 @@ VOID *
 EFIAPI\r
 PeiPcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGetPtrEx (\r
   IN CONST EFI_GUID        *Guid,\r
-  IN UINTN  TokenNumber\r
+  IN UINTN  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -272,14 +241,10 @@ BOOLEAN
 EFIAPI\r
 PeiPcdGetBoolEx (\r
   IN CONST  EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGetBoolEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -288,10 +253,14 @@ UINTN
 EFIAPI\r
 PeiPcdGetSizeEx (\r
   IN CONST  EFI_GUID        *Guid,\r
 EFIAPI\r
 PeiPcdGetSizeEx (\r
   IN CONST  EFI_GUID        *Guid,\r
-  IN UINTN                  TokenNumber\r
+  IN UINTN                  ExTokenNumber\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -303,7 +272,7 @@ PeiPcdSet8 (
   IN UINT8             Value\r
   )\r
 {\r
   IN UINT8             Value\r
   )\r
 {\r
-  return PeiPcdSet8Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -315,7 +284,7 @@ PeiPcdSet16 (
   IN UINT16             Value\r
   )\r
 {\r
   IN UINT16             Value\r
   )\r
 {\r
-  return PeiPcdSet16Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -327,7 +296,7 @@ PeiPcdSet32 (
   IN UINT32             Value\r
   )\r
 {\r
   IN UINT32             Value\r
   )\r
 {\r
-  return PeiPcdSet32Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -339,7 +308,7 @@ PeiPcdSet64 (
   IN UINT64             Value\r
   )\r
 {\r
   IN UINT64             Value\r
   )\r
 {\r
-  return PeiPcdSet64Ex (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -350,7 +319,12 @@ PeiPcdSetPtr (
   IN CONST VOID         *Value\r
   )\r
 {\r
   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
 }\r
 \r
 \r
@@ -362,7 +336,7 @@ PeiPcdSetBool (
   IN BOOLEAN            Value\r
   )\r
 {\r
   IN BOOLEAN            Value\r
   )\r
 {\r
-  return PeiPcdSetBoolEx (NULL, TokenNumber, Value);\r
+  return SetWorker (TokenNumber, &Value, sizeof (Value), FALSE);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
@@ -371,11 +345,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet8Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet8Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT8                  Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -384,11 +364,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet16Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet16Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT16                 Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -397,11 +383,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet32Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet32Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT32                 Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -410,11 +402,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSet64Ex (\r
   IN CONST EFI_GUID         *Guid,\r
 EFIAPI\r
 PeiPcdSet64Ex (\r
   IN CONST EFI_GUID         *Guid,\r
-  IN UINTN                  TokenNumber,\r
+  IN UINTN                  ExTokenNumber,\r
   IN UINT64                 Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -423,11 +421,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetPtrEx (\r
   IN CONST EFI_GUID         *Guid,\r
 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
   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
 }\r
 \r
 \r
@@ -436,12 +440,17 @@ EFI_STATUS
 EFIAPI\r
 PeiPcdSetBoolEx (\r
   IN CONST EFI_GUID       *Guid,\r
 EFIAPI\r
 PeiPcdSetBoolEx (\r
   IN CONST EFI_GUID       *Guid,\r
-  IN UINTN                TokenNumber,\r
+  IN UINTN                ExTokenNumber,\r
   IN BOOLEAN              Value\r
   )\r
 {\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
 }\r
 \r
 \r
@@ -450,12 +459,12 @@ PeiPcdSetBoolEx (
 EFI_STATUS\r
 EFIAPI\r
 PcdRegisterCallBackOnSet (\r
 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
   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
 }\r
 \r
 \r
@@ -463,12 +472,12 @@ PcdRegisterCallBackOnSet (
 EFI_STATUS\r
 EFIAPI\r
 PcdUnRegisterCallBackOnSet (\r
 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
   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
 }\r
 \r
 \r
@@ -480,7 +489,19 @@ PeiPcdGetNextToken (
   IN OUT  UINTN                   *TokenNumber\r
   )\r
 {\r
   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
 }\r
 \r
 \r
index 38293252bc52b4be65e30c5ba28bb041fb6acf88..052ff9e91f56dc9975a256e82e2807ff0b49c229 100644 (file)
@@ -14,799 +14,560 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 Module Name: Service.c\r
 \r
 **/\r
 Module Name: Service.c\r
 \r
 **/\r
-#include "../Common/PcdCommon.h"\r
 #include "Service.h"\r
 \r
 \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
 \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
 \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
 \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
 \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
 --*/\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
 )\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
---*/\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
 \r
-  ASSERT (Data != NULL);\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
+  ASSERT ((LocalTokenNumber & PCD_TYPE_VPD) == 0);\r
 \r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+  GuidHob = GetFirstGuidHob (&gPcdPeiCallbackFnTableHobGuid);\r
   ASSERT (GuidHob != NULL);\r
   ASSERT (GuidHob != NULL);\r
+  \r
+  CallbackTable = GET_GUID_HOB_DATA (GuidHob);\r
 \r
 \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
+  Compare = Register? NULL: CallBackFunction;\r
+  Assign  = Register? CallBackFunction: NULL;\r
 \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
 \r
+  return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
 \r
 \r
-  return;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
-/**\r
-  The function set the PCD data value according to\r
-  TokenNumber and Guid space given.\r
 \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
+/**\r
+  The function builds the PCD database based on the\r
+  PCD_IMAGE on the flash.\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
+  @param[in] PcdImageOnFlash  The PCD image on flash.\r
 \r
 \r
+  @retval VOID\r
 --*/\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
   )\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
 \r
-  ASSERT (PcdIndex->StateByte.DataType == Type);\r
+  ZeroMem (Database, sizeof (PEI_PCD_DATABASE));\r
 \r
   //\r
 \r
   //\r
-  // Invoke the callback function.\r
+  // gPEIPcdDbInit is smaller than PEI_PCD_DATABASE\r
   //\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
   \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
 \r
-  Status = SetPcdData (PcdIndex, &Database->Info, Data);\r
+  SizeOfCallbackFnTable = PEI_LOCAL_TOKEN_NUMBER * sizeof (PCD_PPI_CALLBACK) * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry);\r
 \r
 \r
-  return Status;\r
+  CallbackFnTable = BuildGuidHob (&gPcdPeiCallbackFnTableHobGuid, SizeOfCallbackFnTable);\r
+  \r
+  ZeroMem (CallbackFnTable, SizeOfCallbackFnTable);\r
+  \r
+  return;\r
 }\r
 \r
 \r
 \r
 /**\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
 \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
 \r
+  @retval EFI_SUCCESS         Operation successful.\r
+  @retval EFI_SUCCESS         Variablel not found.\r
 --*/\r
 EFI_STATUS\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
   )\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
 \r
-  ASSERT (Data != NULL);\r
+  Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
 \r
-  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
-  ASSERT (GuidHob != NULL);\r
-  \r
-  Database = GET_GUID_HOB_DATA (GuidHob);\r
+  Size = 0;\r
 \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
   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
 {\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
 \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
 \r
-  return GetPcdEntrySizeWorker (&Database->Info,\r
-                                TokenNumber,\r
-                                Guid\r
-                                );\r
+  ASSERT (FALSE);\r
 \r
 \r
+  return 0;\r
+  \r
 }\r
 \r
 \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
 \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
 {\r
-  PCD_DATABASE        *Database;\r
   EFI_HOB_GUID_TYPE   *GuidHob;\r
   EFI_HOB_GUID_TYPE   *GuidHob;\r
-  PCD_INDEX           *PcdIndex;\r
-  UINTN               Idx;\r
   PCD_PPI_CALLBACK    *CallbackTable;\r
   PCD_PPI_CALLBACK    *CallbackTable;\r
-  PCD_PPI_CALLBACK    Compare;\r
-  PCD_PPI_CALLBACK    Assign;\r
+  UINTN               Idx;\r
 \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
   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
 \r
-  Idx = ((UINTN) PcdIndex - Database->Info.CallbackTableOffset) / sizeof(PCD_INDEX);\r
+  CallbackTable += (TokenNumber * FixedPcdGet32(PcdMaxPeiPcdCallBackNumberPerPcdEntry));\r
 \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
   }\r
-\r
-  return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;\r
-\r
+  \r
 }\r
 \r
 }\r
 \r
-\r
-\r
 EFI_STATUS\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
   )\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
 \r
+  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
+    \r
+  PeiPcdDb = GetPcdDatabase ();\r
 \r
 \r
+  LocalTokenNumber = PeiPcdDb->Init.LocalTokenNumberTable[TokenNumber];\r
 \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
 \r
-  ZeroMem (ImageInfo, sizeof (*ImageInfo));\r
+  InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
 \r
 \r
-  ImageInfo->ImageStart = PcdImageOnFlash;\r
+  return SetWorkerByLocalTokenNumber (LocalTokenNumber, Data, Size, PtrType);\r
 \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
 \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
 \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
   )\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
 \r
-  DatabaseHeaderLength = sizeof (PCD_DATABASE) - sizeof(UINT8);\r
 \r
 \r
-  PcdIndexLength       = sizeof (PCD_INDEX) * ImageInfo->EntryCount;\r
-  CallbackBufferLength = sizeof (PCD_PPI_CALLBACK) * Info->MaxCallbackNum * ImageInfo->EntryCount;\r
+  PeiPcdDb = GetPcdDatabase ();\r
 \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
 \r
-  Info->HiiGuidOffsetLength = ImageInfo->GlobalGuidTabIdxLength;\r
-  Info->HiiVariableOffsetLength = ImageInfo->GlobalStrTabIdxLength;\r
-  Info->ExtendedOffsetLength    = ImageInfo->GlobalOffsetLength;\r
+  ASSERT (!PtrType && Attr.Size);\r
 \r
 \r
-  Info->SkuId = 0;\r
+  ASSERT (PtrType && Attr.Size >= Size);\r
 \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
 \r
-  Info->DatabaseLen = DatabaseLen;\r
+  SetWorkerByLocalTokenNumber (Attr.LocalTokenNumberAlias, Data, Size, PtrType);\r
 \r
 \r
-  return DatabaseLen;\r
+  return EFI_SUCCESS;\r
+  \r
 }\r
 \r
 \r
 }\r
 \r
 \r
-/**\r
-  The function constructs a single PCD_INDEX according a index in\r
-  <PCD_IMAGE>.\r
 \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
 \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
 {\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
-  //\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
 \r
-  ImageIndex += 1;\r
+  Offset          = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+  InternalData    = (VOID *) (PeiPcdDbRaw + Offset);\r
   \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
 \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
-  //\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
-  //\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
 \r
-  ImageIndex += ImageInfo->GlobalOffsetLength * SkuCount;\r
+        case sizeof(UINT16):\r
+          *((UINT16 *) InternalData) = *((UINT16 *) Data);\r
+          return EFI_SUCCESS;\r
 \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
 \r
-    ImageIndex += ImageInfo->GlobalGuidTabIdxLength;\r
-  }\r
+        case sizeof(UINT64):\r
+          *((UINT64 *) InternalData) = *((UINT64 *) Data);\r
+          return EFI_SUCCESS;\r
 \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
   }\r
 \r
-  return (UINTN) (ImageIndex - ImageIndexBackUp);\r
+  ASSERT (FALSE);\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 \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
   )\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
 \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
 \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
 \r
-  return;\r
-}\r
+    case PCD_TYPE_STRING:\r
+      StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
+      return (VOID *) (&StringTable[StringTableIdx]);\r
 \r
 \r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+      \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
 \r
-  @param[in] PcdImageOnFlash  The PCD image on flash.\r
 \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
   )\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
 \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
-  //\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
-  //\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
-\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
   )\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
 \r
-  Size = 0;\r
+  ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \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
 \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
 \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
 \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
 \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
 \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
   )\r
 {\r
-  ASSERT (FALSE);\r
-  return EFI_INVALID_PARAMETER;\r
-}\r
+  EFI_HOB_GUID_TYPE *GuidHob;\r
 \r
 \r
+  GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);\r
+  ASSERT (GuidHob != NULL);\r
+  \r
+  return (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);\r
+}\r
 \r
 \r
index d775a12a170612104757ba61a44af06ee76b75fc..647a0068e1e98dd557c456dac782053eb5a36af0 100644 (file)
@@ -18,53 +18,213 @@ Module Name: Service.h
 #ifndef _SERVICE_H\r
 #define _SERVICE_H\r
 \r
 #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
 //\r
-// Offset of StateByte\r
+\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
 \r
-#define PCD_DATUMTYPE_OFFSET 4\r
 \r
 \r
+\r
+\r
+\r
+//\r
+// C Structure generate for PEI PCD Database\r
 //\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
 //\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
 \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
 \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
 \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
 \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
 \r
 EFI_STATUS\r
 PeiRegisterCallBackWorker (\r
@@ -74,25 +234,9 @@ PeiRegisterCallBackWorker (
   IN  BOOLEAN                 Register\r
 );\r
 \r
   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
 VOID\r
 BuildPcdDatabase (\r
-  UINT8 *PcdImageOnFlash\r
+  VOID\r
   )\r
 ;\r
 \r
   )\r
 ;\r
 \r
@@ -368,4 +512,11 @@ PeiPcdGetNextToken (
   IN OUT  UINTN    *TokenNumber\r
   )\r
 ;\r
   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
 #endif\r
index 77e25ac2b6811eeea9743dad4f0215e9d0089714..21fa67a6aa9789e1a9d9642cf251c37b400f9af7 100644 (file)
@@ -38,59 +38,25 @@ DoTest(
   VOID\r
   )\r
 {\r
   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
   \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
   \r
   return;\r
 }\r