]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) remove some dead code from WinNtBusDriver.c
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 23 Jun 2006 04:30:23 +0000 (04:30 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 23 Jun 2006 04:30:23 +0000 (04:30 +0000)
2) change PCD_INVALID_TOKEN_NUMBER to 0 as stipulated in MWG spec and PCD spec.
3) support returning a Default Value when a read failure by variable service for PCD entry with Variable Enabled.
4) Remove a lot of unreferenced JAVA import from CollectPCDAction.java, PCDAutoGenAction.java, MemoryDatabaseManager.java, Token.java and UsageInstance.java.
5) Opimized to merge elements in all tables in PCD database for make the code compact.
6) Did a tighter check on how dynamic PCD entry is referenced in each module.
7) Update the PCD driver/PEIM and PCD database generation verion to 2.

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

16 files changed:
EdkModulePkg/Universal/PCD/Dxe/Pcd.c
EdkModulePkg/Universal/PCD/Dxe/Service.c
EdkModulePkg/Universal/PCD/Dxe/Service.h
EdkModulePkg/Universal/PCD/Pei/Pcd.c
EdkModulePkg/Universal/PCD/Pei/Service.c
EdkModulePkg/Universal/PCD/Pei/Service.h
EdkNt32Pkg/Dxe/WinNtThunk/Bus/WinNtBusDriver/WinNtBusDriver.c
MdePkg/Include/Library/PcdLib.h
MdePkg/Include/Ppi/Pcd.h
MdePkg/Include/Protocol/Pcd.h
Tools/Conf/Pcd/PcdDatabaseCommonDefinitions.sample
Tools/Source/GenBuild/org/tianocore/build/pcd/action/CollectPCDAction.java
Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
Tools/Source/GenBuild/org/tianocore/build/pcd/entity/MemoryDatabaseManager.java
Tools/Source/GenBuild/org/tianocore/build/pcd/entity/Token.java
Tools/Source/GenBuild/org/tianocore/build/pcd/entity/UsageInstance.java

index 45a6c5932affbaf3cb25ecb819f29eb30f3168a1..55040fe159386576feff909d34d5fae48c34cd6d 100644 (file)
@@ -183,7 +183,13 @@ DxePcdGetSize (
   )\r
 {\r
   UINT16 * SizeTable;\r
-\r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+  \r
   SizeTable = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? mPcdDatabase->PeiDb.Init.SizeTable :\r
                                                     mPcdDatabase->DxeDb.Init.SizeTable;\r
 \r
@@ -493,7 +499,7 @@ DxeUnRegisterCallBackOnSet (
 {\r
   ASSERT (CallBackFunction != NULL);\r
   \r
-  return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+  return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
 }\r
 \r
 \r
index 36e859c779d15e114ca1303ae507971615230b47..9513143f26a15398a4b06dceaea8aff9d8da37c3 100644 (file)
@@ -50,10 +50,16 @@ GetWorker (
   UINT16              StringTableIdx;      \r
   UINT32              LocalTokenNumber;\r
 \r
-\r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+  \r
   ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
 \r
-  Size = DxePcdGetSize (TokenNumber);\r
+  Size = DxePcdGetSize (TokenNumber + 1);\r
   ASSERT (GetSize == Size || GetSize == 0);\r
 \r
   \r
@@ -100,11 +106,10 @@ GetWorker (
         return (UINT8 *) Data + VariableHead->Offset;\r
       } else {\r
         //\r
-        // BugBug: Need to support default value. The current implementation\r
-        // will return a memory buffer with ALL ZERO.\r
-        // \r
-        return AllocateZeroPool (Size);\r
-       }\r
+        // Return the default value specified by Platform Integrator \r
+        //\r
+        return (VOID *) ((UINT8 *) PcdDb + VariableHead->DefaultValueOffset);\r
+     }\r
 \r
     case PCD_TYPE_STRING:\r
       StringTableIdx = (UINT16) *((UINT8 *) PcdDb + Offset);\r
@@ -143,6 +148,13 @@ DxeRegisterCallBackWorker (
     TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber);\r
   }\r
 \r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+\r
   ListHead = &mCallbackFnTable[TokenNumber];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
@@ -186,6 +198,13 @@ DxeUnRegisterCallBackWorker (
     TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber);\r
   }\r
 \r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+\r
   ListHead = &mCallbackFnTable[TokenNumber];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
@@ -342,13 +361,17 @@ GetHiiVariable (
   EFI_STATUS Status;\r
   VOID       *Buffer;\r
 \r
+  Size = 0;\r
+  Buffer = NULL;\r
+  \r
   Status = EfiGetVariable (\r
     (UINT16 *)VariableName,\r
     VariableGuid,\r
     NULL,\r
     &Size,\r
-    NULL\r
+    Buffer\r
     );\r
+  \r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
 \r
     Buffer = AllocatePool (Size);\r
@@ -366,6 +389,9 @@ GetHiiVariable (
     ASSERT (Status == EFI_SUCCESS);\r
   }\r
 \r
+  *VariableData = Buffer;\r
+  *VariableSize = Size;\r
+\r
   return Status;\r
 \r
 }\r
@@ -444,6 +470,13 @@ InvokeCallbackOnSet (
   LIST_ENTRY              *ListHead;\r
   LIST_ENTRY              *ListNode;\r
 \r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+  \r
   ListHead = &mCallbackFnTable[TokenNumber];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
@@ -485,13 +518,19 @@ SetWorker (
   UINTN               Offset;\r
   UINT8               *PcdDb;\r
 \r
-\r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+  \r
   ASSERT (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
 \r
   if (PtrType) {\r
-    ASSERT (Size <= DxePcdGetSize (TokenNumber));\r
+    ASSERT (Size <= DxePcdGetSize (TokenNumber + 1));\r
   } else {\r
-    ASSERT (Size == DxePcdGetSize (TokenNumber));\r
+    ASSERT (Size == DxePcdGetSize (TokenNumber + 1));\r
   }\r
   \r
   IsPeiDb = (TokenNumber < PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;\r
@@ -501,7 +540,7 @@ SetWorker (
 \r
   if ((TokenNumber < PEI_NEX_TOKEN_NUMBER) ||\r
       (TokenNumber >= PEI_LOCAL_TOKEN_NUMBER || TokenNumber < (PEI_LOCAL_TOKEN_NUMBER + DXE_NEX_TOKEN_NUMBER))) {\r
-    InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
+    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size);\r
   }\r
 \r
   TokenNumber = IsPeiDb ? TokenNumber\r
index a1757ed056f162e97c2eba43e221755c766e795c..c8bec08539cd37b8339c5ab7514c1f1d42666690 100644 (file)
@@ -22,7 +22,7 @@ Module Name: Service.h
 // Please make sure the PCD Serivce PEIM Version is consistent with\r
 // the version of PCD Database generation tool\r
 //\r
-#define PCD_DXE_SERVICE_DRIVER_VERSION      1\r
+#define PCD_DXE_SERVICE_DRIVER_VERSION      2\r
 \r
 //\r
 // PCD_DXE_DATABASE_GENTOOL_VERSION is defined in Autogen.h\r
index b41d3ed09b0a9332ab5338d39a870a5bec761893..34af220f6686ded58515fd20fb4aa9c2b33ea5af 100644 (file)
@@ -169,6 +169,13 @@ PeiPcdGetSize (
   IN UINTN             TokenNumber\r
   )\r
 {\r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+\r
   ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
   return GetPcdDatabase()->Init.SizeTable[TokenNumber];\r
@@ -559,10 +566,10 @@ PeiPcdGetNextToken (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_GUID *\r
+EFI_STATUS\r
 EFIAPI\r
 PeiPcdGetNextTokenSpaceGuid (\r
-  IN CONST EFI_GUID               *Guid\r
+  IN OUT CONST EFI_GUID               **Guid\r
   )\r
 {\r
   UINTN               GuidTableIdx;\r
@@ -572,9 +579,17 @@ PeiPcdGetNextTokenSpaceGuid (
   UINTN               i;\r
   BOOLEAN             Found;\r
 \r
-  if (PEI_EXMAP_TABLE_EMPTY) {\r
-    return NULL;\r
-  }\r
+   if (*Guid == NULL) {\r
+    if (PEI_EXMAP_TABLE_EMPTY) {\r
+      return EFI_SUCCESS;\r
+    } else {\r
+      //\r
+      // return the first Token Space Guid.\r
+      //\r
+      *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[0].ExGuidIndex];\r
+      return EFI_SUCCESS;\r
+    }\r
+   }\r
 \r
   //\r
   // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order\r
@@ -583,10 +598,10 @@ PeiPcdGetNextTokenSpaceGuid (
   //\r
   PeiPcdDb = GetPcdDatabase ();\r
 \r
-  MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), Guid);\r
+  MatchGuid = ScanGuid (PeiPcdDb->Init.GuidTable, sizeof(PeiPcdDb->Init.GuidTable), *Guid);\r
 \r
   if (MatchGuid == NULL) {\r
-    return NULL;\r
+    return EFI_NOT_FOUND;\r
   }\r
   \r
   GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\r
@@ -604,16 +619,13 @@ PeiPcdGetNextTokenSpaceGuid (
   if (Found) {\r
     for ( ; i < PEI_EXMAPPING_TABLE_SIZE; i++ ) {\r
       if (ExMapTable[i].ExGuidIndex != GuidTableIdx ) {\r
-        if (i < PEI_EXMAPPING_TABLE_SIZE) {\r
-          return &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
-        } else {\r
-          return NULL;\r
-        }\r
+        *Guid = &PeiPcdDb->Init.GuidTable[ExMapTable[i].ExGuidIndex];\r
+        return EFI_SUCCESS;\r
       }\r
     }\r
   }\r
 \r
-  return NULL;\r
+  return EFI_NOT_FOUND;\r
 \r
 }\r
 \r
index 01fe0151bf302591e9f5135c643a5ae7adbc261b..8d03d9c2b190ae4b6427d78bac6f9bf5a820424e 100644 (file)
@@ -46,12 +46,27 @@ PeiRegisterCallBackWorker (
 \r
   if (Guid == NULL) {\r
     TokenNumber = ExTokenNumber;\r
+\r
+    //\r
+    // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+    // We have to decrement TokenNumber by 1 to make it usable\r
+    // as the array index.\r
+    //\r
+    TokenNumber--;\r
     ASSERT (TokenNumber < PEI_NEX_TOKEN_NUMBER);\r
   } else {\r
     TokenNumber = GetExPcdTokenNumber (Guid, ExTokenNumber);\r
+\r
+    //\r
+    // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+    // We have to decrement TokenNumber by 1 to make it usable\r
+    // as the array index.\r
+    //\r
+    TokenNumber--;\r
     ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
   }\r
 \r
+\r
   LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
   ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\r
@@ -248,6 +263,13 @@ InvokeCallbackOnSet (
   PCD_PPI_CALLBACK    *CallbackTable;\r
   UINTN               Idx;\r
 \r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+  \r
   if (Guid == NULL)\r
     ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
@@ -287,6 +309,13 @@ SetWorker (
   UINTN               Offset;\r
   VOID                *InternalData;\r
 \r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+\r
   ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
     \r
   PeiPcdDb = GetPcdDatabase ();\r
@@ -305,7 +334,7 @@ SetWorker (
   // type PCD entry in ExSetWorker.\r
   //\r
   if (TokenNumber < PEI_NEX_TOKEN_NUMBER) {\r
-    InvokeCallbackOnSet (0, NULL, TokenNumber, Data, Size);\r
+    InvokeCallbackOnSet (0, NULL, TokenNumber + 1, Data, Size);\r
   }\r
 \r
   if ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == PCD_TYPE_SKU_ENABLED) {\r
@@ -425,9 +454,16 @@ GetWorker (
   UINT32              LocalTokenNumber;\r
   UINTN               Size;\r
 \r
+  //\r
+  // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.\r
+  // We have to decrement TokenNumber by 1 to make it usable\r
+  // as the array index.\r
+  //\r
+  TokenNumber--;\r
+\r
   ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
-  Size = PeiPcdGetSize(TokenNumber);\r
+  Size = PeiPcdGetSize(TokenNumber + 1);\r
   \r
   ASSERT (GetSize == Size || GetSize == 0);\r
 \r
@@ -464,16 +500,14 @@ GetWorker (
         return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
       } else {\r
         //\r
-        // BugBug: Need to support default value. The current implementation\r
-        // will return a memory buffer with ALL ZERO.\r
-        // \r
-        return AllocateZeroPool (Size);\r
+        // Return the default value specified by Platform Integrator \r
+        //\r
+        return (VOID *) ((UINT8 *) PeiPcdDb + VariableHead->DefaultValueOffset);\r
       }\r
     }\r
 \r
     case PCD_TYPE_DATA:\r
       return (VOID *) ((UINT8 *)PeiPcdDb + Offset);\r
-      break;\r
 \r
     case PCD_TYPE_STRING:\r
       StringTableIdx = (UINT16) *((UINT8 *) PeiPcdDb + Offset);\r
index e62d0307a71273a686bbb87b1fe88f8bb6ae3654..563e82ae22e4a890a87c977db6f0aef6f5fb3ad1 100644 (file)
@@ -22,7 +22,7 @@ Module Name: Service.h
 // Please make sure the PCD Serivce PEIM Version is consistent with\r
 // the version of PCD Database generation tool\r
 //\r
-#define PCD_PEI_SERVICE_DRIVER_VERSION      1\r
+#define PCD_PEI_SERVICE_DRIVER_VERSION      2\r
 \r
 //\r
 // PCD_PEI_DATABASE_GENTOOL_VERSION is defined in Autogen.h\r
index eb071575e03260301fe02f4799f3e7d4a0af0b7d..73a345a4316518ad236749acffe122bc33b44d1b 100644 (file)
@@ -317,26 +317,6 @@ Returns:
   CHAR16                          *PcdTempStr;\r
   UINTN                           TempStrSize;\r
 \r
-  //\r
-  // Test Feature Set and Binary Patchable Case\r
-  //\r
-  if (FeaturePcdGet (PcdWinNtFeatureFlag1)) {\r
-       TempStrSize = PatchPcdGet32(PcdWinNtBinaryPatch1) + PatchPcdGet32(PcdWinNtBinaryPatch2);\r
-  }\r
-  \r
-  if (0) {\r
-    //\r
-    // Test Dynamic and DynamicEx \r
-    // (Please add PcdWinNtConsole in "WinNtBusDriver.inf" before enable this code!!!)\r
-    //\r
-    PcdTempStr = PcdGetPtr (PcdWinNtConsole);\r
-  }\r
-\r
-  //\r
-  // Test Dynamic Set and Dynamic Set Ex\r
-  //\r
-  PcdSet32 (PcdWinNtDynamicUINT32, 2006);\r
-\r
   Status = EFI_UNSUPPORTED;\r
 \r
   //\r
index b513a61e86034f327cc15799b7f7628c345b348c..90e19ba2a9e3b022c0b3ddf58bfc8faacfc3e2c2 100644 (file)
@@ -18,7 +18,7 @@ Module Name: PcdLib.h
 #ifndef __PCD_LIB_H__\r
 #define __PCD_LIB_H__\r
 \r
-#define PCD_INVALID_TOKEN_NUMBER ((UINTN) -1)\r
+#define PCD_INVALID_TOKEN_NUMBER ((UINTN) 0)\r
 \r
 #define PcdToken(TokenName)  _PCD_TOKEN_##TokenName\r
 \r
index 13b56406dc4f80267ef53a03d8638244baf235df..360eea3bebf9a9f1e0e10da2b51bc51b0e6d453b 100644 (file)
@@ -22,7 +22,7 @@ extern EFI_GUID gPcdPpiGuid;
 #define PCD_PPI_GUID \\r
   { 0x6e81c58, 0x4ad7, 0x44bc, { 0x83, 0x90, 0xf1, 0x2, 0x65, 0xf7, 0x24, 0x80 } }\r
 \r
-#define PCD_INVALID_TOKEN_NUMBER ((UINTN) -1)\r
+#define PCD_INVALID_TOKEN_NUMBER ((UINTN) 0)\r
 \r
 typedef \r
 VOID\r
index 323c16ccf1c96a930eab52a6d76cb87222f408b0..07517ffbb1d5d72413b903ee2b2c5815818a3382 100644 (file)
@@ -22,7 +22,7 @@ extern EFI_GUID gPcdProtocolGuid;
 #define PCD_PROTOCOL_GUID \\r
   { 0x11b34006, 0xd85b, 0x4d0a, { 0xa2, 0x90, 0xd5, 0xa5, 0x71, 0x31, 0xe, 0xf7 } }\r
 \r
-#define PCD_INVALID_TOKEN_NUMBER ((UINTN) -1)\r
+#define PCD_INVALID_TOKEN_NUMBER ((UINTN) 0)\r
 \r
 typedef \r
 VOID\r
index 011d3df60342ef60f24964d81cd14c1d1eb87420..eaa692d25e8bd2eef40456ef88872832c2268534 100644 (file)
@@ -33,9 +33,10 @@ typedef struct {
 \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
+  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
+  UINT16  DefaultValueOffset; // Offset of the Default Value\r
 } VARIABLE_HEAD  ;\r
 \r
 \r
@@ -43,6 +44,8 @@ typedef  struct {
   UINT32  Offset;\r
 } VPD_HEAD;\r
 \r
+typedef UINT16 STRING_HEAD;\r
+\r
 typedef struct {\r
   UINT32 LocalTokenNumber;\r
   UINT16 TokenNumber;\r
index 3edadc69595c593483d6e43d749923598b9bec6b..b54f68c815f9443fd24dce85160ecd957f50f533 100644 (file)
@@ -23,25 +23,17 @@ import java.io.FileReader;
 import java.io.IOException;\r
 import java.math.BigInteger;\r
 import java.util.ArrayList;\r
-import java.util.Collections;\r
 import java.util.Comparator;\r
 import java.util.HashMap;\r
 import java.util.List;\r
-import java.util.Map;\r
 import java.util.UUID;\r
 \r
 import org.apache.xmlbeans.XmlException;\r
 import org.apache.xmlbeans.XmlObject;\r
-import org.tianocore.DynamicPcdBuildDefinitionsDocument;\r
 import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions;\r
-import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData;\r
-import org.tianocore.DynamicPcdBuildDefinitionsDocument.DynamicPcdBuildDefinitions.PcdBuildData.SkuInfo;\r
 import org.tianocore.FrameworkModulesDocument;\r
 import org.tianocore.FrameworkPlatformDescriptionDocument;\r
-import org.tianocore.FrameworkPlatformDescriptionDocument.FrameworkPlatformDescription;\r
 import org.tianocore.ModuleSADocument;\r
-import org.tianocore.ModuleSADocument.ModuleSA;\r
-import org.tianocore.PackageSurfaceAreaDocument;\r
 import org.tianocore.PcdBuildDefinitionDocument.PcdBuildDefinition;\r
 import org.tianocore.build.global.GlobalData;\r
 import org.tianocore.build.global.SurfaceAreaQuery;\r
@@ -54,21 +46,31 @@ import org.tianocore.build.pcd.entity.UsageInstance;
 import org.tianocore.build.pcd.exception.EntityException;\r
 import org.tianocore.ModuleTypeDef;\r
 \r
+class CStructTypeDeclaration {\r
+    String key;\r
+    int alignmentSize;\r
+    String cCode;\r
+    boolean initTable;\r
+    \r
+    public CStructTypeDeclaration (String key, int alignmentSize, String cCode, boolean initTable) {\r
+        this.key = key;\r
+        this.alignmentSize = alignmentSize;\r
+        this.cCode = cCode;\r
+        this.initTable = initTable;\r
+    }\r
+}\r
+\r
 class StringTable {\r
     private ArrayList<String>   al; \r
     private ArrayList<String>   alComments;\r
     private String              phase;\r
     int                         len; \r
-    int                         bodyStart;\r
-    int                         bodyLineNum;\r
 \r
     public StringTable (String phase) {\r
         this.phase = phase;\r
         al = new ArrayList<String>();\r
         alComments = new ArrayList<String>();\r
         len = 0;\r
-        bodyStart = 0;\r
-        bodyLineNum = 0;\r
     }\r
 \r
     public String getSizeMacro () {\r
@@ -89,6 +91,74 @@ class StringTable {
     public String getExistanceMacro () {\r
         return String.format(PcdDatabase.StringTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
     }\r
+    \r
+    public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable) {\r
+        final String stringTable = "StringTable";\r
+        final String tab         = "\t";\r
+        final String newLine     = "\r\n";\r
+        final String commaNewLine = ",\r\n";\r
+        \r
+        CStructTypeDeclaration decl;\r
+\r
+        String cDeclCode = "";\r
+        String cInstCode = "";\r
+\r
+        //\r
+        // If we have a empty StringTable\r
+        //\r
+        if (al.size() == 0) {\r
+            cDeclCode += tab + String.format("UINT16             %s[1]; /* StringTable is Empty */", stringTable) + newLine; \r
+            decl = new CStructTypeDeclaration (\r
+                                                stringTable,\r
+                                                2,\r
+                                                cDeclCode,\r
+                                                true\r
+                                        );  \r
+            declaList.add(decl);\r
+\r
+            cInstCode = tab + " { 0 } " + String.format("/* %s */", stringTable) + commaNewLine;\r
+            instTable.put(stringTable, cInstCode);\r
+        } else {\r
+\r
+            //\r
+            // If there is any String in the StringTable\r
+            //\r
+            for (int i = 0; i < al.size(); i++) {\r
+                String str = al.get(i);\r
+                String stringTableName;\r
+                \r
+                if (i == 0) {\r
+                    //\r
+                    // StringTable is a well-known name in the PCD DXE driver\r
+                    //\r
+                    stringTableName = stringTable;\r
+    \r
+                } else {\r
+                    stringTableName = String.format("%s_%d", stringTable, i);\r
+                    cDeclCode += tab;\r
+                }\r
+                cDeclCode += String.format("UINT16              %s[%d]; /* %s */", stringTableName, str.length() + 1, alComments.get(i)) + newLine;\r
+                \r
+                if (i == 0) {\r
+                    cInstCode = "/* StringTable */" + newLine;\r
+                }\r
+                cInstCode += tab + String.format("L\"%s\" /* %s */", al.get(i), alComments.get(i));\r
+                if (i != al.size() - 1) {\r
+                    cInstCode += commaNewLine;\r
+                }\r
+            }\r
+            \r
+            decl = new CStructTypeDeclaration (\r
+                    stringTable,\r
+                    2,\r
+                    cDeclCode,\r
+                    true\r
+            );  \r
+            declaList.add(decl);\r
+    \r
+            instTable.put(stringTable, cInstCode);\r
+        }\r
+    }\r
 \r
     public String getTypeDeclaration () {\r
 \r
@@ -143,9 +213,33 @@ class StringTable {
         return output;\r
     }\r
 \r
-    public int add (String str, Token token) {\r
+    public int add (String inputStr, Token token) {\r
         int i;\r
+        int pos;\r
+\r
+        String str = inputStr;\r
+        \r
+        //\r
+        // The input can be two types:\r
+        // "L\"Bootmode\"" or "Bootmode". \r
+        // We drop the L\" and \" for the first type. \r
+        if (str.startsWith("L\"") && str.endsWith("\"")) {\r
+            str = str.substring(2, str.length() - 1);\r
+        }\r
+        //\r
+        // Check if StringTable has this String already.\r
+        // If so, return the current pos.\r
+        //\r
+        for (i = 0, pos = 0; i < al.size(); i++) {\r
+            String s = al.get(i);;\r
 \r
+            if (str.equals(s)) {\r
+                return pos;\r
+            }\r
+            pos = s.length() + 1;\r
+            \r
+        }\r
+        \r
         i = len;\r
         //\r
         // Include the NULL character at the end of String\r
@@ -163,16 +257,32 @@ class SizeTable {
     private ArrayList<String>   alComments;\r
     private String              phase;\r
     private int                 len;\r
-    private int             bodyStart;\r
-    private int             bodyLineNum;\r
-\r
+    \r
     public SizeTable (String phase) {\r
         this.phase = phase;\r
         al = new ArrayList<Integer>();\r
         alComments = new ArrayList<String>();\r
         len = 0;\r
-        bodyStart = 0;\r
-        bodyLineNum = 0;\r
+    }\r
+\r
+    public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+        final String name = "SizeTable";\r
+        \r
+        CStructTypeDeclaration decl;\r
+        String cCode;\r
+\r
+        cCode = String.format(PcdDatabase.SizeTableDeclaration, phase); \r
+        decl = new CStructTypeDeclaration (\r
+                                            name,\r
+                                            2,\r
+                                            cCode,\r
+                                            true\r
+                                           );  \r
+        declaList.add(decl);\r
+\r
+\r
+        cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+        instTable.put(name, cCode);\r
     }\r
 \r
     public String getTypeDeclaration () {\r
@@ -184,14 +294,12 @@ class SizeTable {
 \r
         Output.add("/* SizeTable */");\r
         Output.add("{");\r
-        bodyStart = 2;\r
-\r
         if (al.size() == 0) {\r
             Output.add("0");\r
         } else {\r
             for (int index = 0; index < al.size(); index++) {\r
                 Integer n = al.get(index);\r
-                String str = n.toString();\r
+                String str = "\t" + n.toString();\r
 \r
                 if (index != (al.size() - 1)) {\r
                     str += ",";\r
@@ -199,7 +307,6 @@ class SizeTable {
 \r
                 str += " /* " + alComments.get(index) + " */"; \r
                 Output.add(str);\r
-                bodyLineNum++;\r
     \r
             }\r
         }\r
@@ -208,14 +315,6 @@ class SizeTable {
         return Output;\r
     }\r
 \r
-    public int getBodyStart() {\r
-        return bodyStart;\r
-    }\r
-\r
-    public int getBodyLineNum () {\r
-        return bodyLineNum;\r
-    }\r
-\r
     public int add (Token token) {\r
         int index = len;\r
 \r
@@ -226,18 +325,6 @@ class SizeTable {
         return index;\r
     }\r
     \r
-    private int getDatumSize(Token token) {\r
-        /*\r
-        switch (token.datumType) {\r
-        case Token.DATUM_TYPE.UINT8:\r
-            return 1;\r
-        default:\r
-            return 0;\r
-        }\r
-        */\r
-        return 0;\r
-    }\r
-\r
     public int getTableLen () {\r
         return al.size() == 0 ? 1 : al.size();\r
     }\r
@@ -249,7 +336,6 @@ class GuidTable {
     private ArrayList<String> alComments;\r
     private String          phase;\r
     private int             len;\r
-    private int             bodyStart;\r
     private int             bodyLineNum;\r
 \r
     public GuidTable (String phase) {\r
@@ -257,7 +343,6 @@ class GuidTable {
         al = new ArrayList<UUID>();\r
         alComments = new ArrayList<String>();\r
         len = 0;\r
-        bodyStart = 0;\r
         bodyLineNum = 0;\r
     }\r
 \r
@@ -273,6 +358,26 @@ class GuidTable {
         return String.format(PcdDatabase.GuidTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
     }\r
 \r
+    public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+        final String name = "GuidTable";\r
+        \r
+        CStructTypeDeclaration decl;\r
+        String cCode = "";\r
+\r
+        cCode += String.format(PcdDatabase.GuidTableDeclaration, phase); \r
+        decl = new CStructTypeDeclaration (\r
+                                            name,\r
+                                            8,\r
+                                            cCode,\r
+                                            true\r
+                                           );  \r
+        declaList.add(decl);\r
+\r
+\r
+        cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+        instTable.put(name, cCode);\r
+    }\r
+\r
     public String getTypeDeclaration () {\r
         return String.format(PcdDatabase.GuidTableDeclaration, phase);\r
     }\r
@@ -302,17 +407,15 @@ class GuidTable {
 \r
         Output.add("/* GuidTable */");\r
         Output.add("{");\r
-        bodyStart = 2;\r
-\r
         if (al.size() == 0) {\r
             Output.add(getUuidCString(new UUID(0, 0)));\r
         }\r
         \r
-        for (Object u : al) {\r
-            UUID uuid = (UUID)u;\r
-            String str = getUuidCString(uuid);\r
+        for (int i = 0; i < al.size(); i++) {\r
+            String str = "\t" + getUuidCString(al.get(i));\r
 \r
-            if (al.indexOf(u) != (al.size() - 1)) {\r
+            str += "/* " + alComments.get(i) +  " */";\r
+            if (i != (al.size() - 1)) {\r
                 str += ",";\r
             }\r
             Output.add(str);\r
@@ -324,23 +427,25 @@ class GuidTable {
         return Output;\r
     }\r
 \r
-    public int getBodyStart() {\r
-        return bodyStart;\r
-    }\r
-\r
-    public int getBodyLineNum () {\r
-        return bodyLineNum;\r
-    }\r
-\r
     public int add (UUID uuid, String name) {\r
-        int index = len;\r
         //\r
-        // Include the NULL character at the end of String\r
+        // Check if GuidTable has this entry already.\r
+        // If so, return the GuidTable index.\r
         //\r
+        for (int i = 0; i < al.size(); i++) {\r
+            if (al.get(i).equals(uuid)) {\r
+                return i;\r
+            }\r
+        }\r
+        \r
         len++; \r
         al.add(uuid);\r
+        alComments.add(name);\r
 \r
-        return index;\r
+        //\r
+        // Return the previous Table Index\r
+        //\r
+        return len - 1;\r
     }\r
 \r
     public int getTableLen () {\r
@@ -354,15 +459,11 @@ class SkuIdTable {
     private ArrayList<String>    alComment;\r
     private String               phase;\r
     private int                  len;\r
-    private int                   bodyStart;\r
-    private int                   bodyLineNum;\r
 \r
     public SkuIdTable (String phase) {\r
         this.phase = phase;\r
         al = new ArrayList<Integer[]>();\r
         alComment = new ArrayList<String>();\r
-        bodyStart = 0;\r
-        bodyLineNum = 0;\r
         len = 0;\r
     }\r
 \r
@@ -371,13 +472,49 @@ class SkuIdTable {
     }\r
 \r
     private int getSize () {\r
-        return (al.size() == 0)? 1 : al.size();\r
+        return (len == 0)? 1 : len;\r
     }\r
 \r
     public String getExistanceMacro () {\r
         return String.format(PcdDatabase.SkuTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
     }\r
 \r
+    public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+        final String name = "SkuIdTable";\r
+        \r
+        CStructTypeDeclaration decl;\r
+        String cCode = "";\r
+\r
+        cCode += String.format(PcdDatabase.SkuIdTableDeclaration, phase); \r
+        decl = new CStructTypeDeclaration (\r
+                                            name,\r
+                                            1,\r
+                                            cCode,\r
+                                            true\r
+                                           );  \r
+        declaList.add(decl);\r
+\r
+\r
+        cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+        instTable.put(name, cCode);\r
+\r
+        //\r
+        // SystemSkuId is in PEI phase PCD Database\r
+        //\r
+        if (phase.equalsIgnoreCase("PEI")) {\r
+            decl = new CStructTypeDeclaration (\r
+                                                "SystemSkuId",\r
+                                                1,\r
+                                                "SKU_ID          SystemSkuId;\r\n",\r
+                                                true\r
+                                              );\r
+            declaList.add(decl);\r
+            \r
+            instTable.put("SystemSkuId", "0");\r
+        }\r
+\r
+    }\r
+\r
     public String getTypeDeclaration () {\r
         return String.format(PcdDatabase.SkuIdTableDeclaration, phase);\r
     }\r
@@ -387,10 +524,9 @@ class SkuIdTable {
 \r
         Output.add("/* SkuIdTable */");\r
         Output.add("{");\r
-        bodyStart = 2;\r
 \r
         if (al.size() == 0) {\r
-            Output.add("0");\r
+            Output.add("\t0");\r
         }\r
         \r
         for (int index = 0; index < al.size(); index++) {\r
@@ -402,16 +538,15 @@ class SkuIdTable {
 \r
             Integer[] ia = al.get(index);\r
 \r
-            str += ia[0].toString() + ", ";\r
+            str += "\t" + ia[0].toString() + ", ";\r
             for (int index2 = 1; index2 < ia.length; index2++) {\r
                str += ia[index2].toString();\r
-               if (index != al.size() - 1) {\r
+               if (!((index2 == ia.length - 1) && (index == al.size() - 1))) {\r
                    str += ", ";\r
                }\r
             }\r
 \r
             Output.add(str);\r
-            bodyLineNum++;\r
 \r
         }\r
 \r
@@ -423,6 +558,31 @@ class SkuIdTable {
     public int add (Token token) {\r
 \r
         int index;\r
+        int pos;\r
+        \r
+        //\r
+        // Check if this SKU_ID Array is already in the table\r
+        //\r
+        pos = 0;\r
+        for (Object o: al) {\r
+            Integer [] s = (Integer[]) o;\r
+            boolean different = false;\r
+            if (s[0] == token.getSkuIdCount()) {\r
+                for (index = 1; index < s.length; index++) {\r
+                    if (s[index] != token.skuData.get(index-1).id) {\r
+                        different = true;\r
+                        break;\r
+                    }\r
+                }\r
+            } else {\r
+                different = true;\r
+            }\r
+            if (different) {\r
+                pos += s[0] + 1;\r
+            } else {\r
+                return pos;\r
+            }\r
+        }\r
 \r
         Integer [] skuIds = new Integer[token.skuData.size() + 1];\r
         skuIds[0] = new Integer(token.skuData.size());\r
@@ -472,6 +632,25 @@ class LocalTokenNumberTable {
         return String.format(PcdDatabase.DatabaseExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
     }\r
 \r
+    public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+        final String name = "LocalTokenNumberTable";\r
+        \r
+        CStructTypeDeclaration decl;\r
+        String cCode = "";\r
+\r
+        cCode += String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase); \r
+        decl = new CStructTypeDeclaration (\r
+                                            name,\r
+                                            4,\r
+                                            cCode,\r
+                                            true\r
+                                           );  \r
+        declaList.add(decl);\r
+\r
+        cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+        instTable.put(name, cCode);\r
+    }\r
+\r
     public String getTypeDeclaration () {\r
         return String.format(PcdDatabase.LocalTokenNumberTableDeclaration, phase);\r
     }\r
@@ -489,7 +668,7 @@ class LocalTokenNumberTable {
         for (int index = 0; index < al.size(); index++) {\r
             String str;\r
 \r
-            str = (String)al.get(index);\r
+            str = "\t" + (String)al.get(index);\r
 \r
             str += " /* " + alComment.get(index) + " */ ";\r
 \r
@@ -556,15 +735,12 @@ class ExMapTable {
     private ArrayList<String>    alComment;\r
     private String               phase;\r
     private int                  len;\r
-    private int                   bodyStart;\r
     private int                   bodyLineNum;\r
-    private int                   base;\r
-\r
+    \r
     public ExMapTable (String phase) {\r
         this.phase = phase;\r
         al = new ArrayList<ExTriplet>();\r
         alComment = new ArrayList<String>();\r
-        bodyStart = 0;\r
         bodyLineNum = 0;\r
         len = 0;\r
     }\r
@@ -574,14 +750,32 @@ class ExMapTable {
              + String.format(PcdDatabase.ExTokenNumber, phase, al.size());\r
     }\r
 \r
-    private int getSize () {\r
-        return (al.size() == 0)? 1 : al.size();\r
-    }\r
-\r
     public String getExistanceMacro () {\r
         return String.format(PcdDatabase.ExMapTableExistenceMacro, phase, (al.size() == 0)? "TRUE":"FALSE");\r
     }\r
 \r
+    public void genCodeNew (ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) {\r
+        final String exMapTableName = "ExMapTable";\r
+        \r
+        sortTable();\r
+        \r
+        CStructTypeDeclaration decl;\r
+        String cCode = "";\r
+\r
+        cCode += String.format(PcdDatabase.ExMapTableDeclaration, phase); \r
+        decl = new CStructTypeDeclaration (\r
+                                            exMapTableName,\r
+                                            4,\r
+                                            cCode,\r
+                                            true\r
+                                           );  \r
+        declaList.add(decl);\r
+\r
+\r
+        cCode = PcdDatabase.genInstantiationStr(getInstantiation());\r
+        instTable.put(exMapTableName, cCode);\r
+    }\r
+    \r
     public String getTypeDeclaration () {\r
         return String.format(PcdDatabase.ExMapTableDeclaration, phase);\r
     }\r
@@ -591,10 +785,8 @@ class ExMapTable {
 \r
         Output.add("/* ExMapTable */");\r
         Output.add("{");\r
-        bodyStart = 2;\r
-\r
         if (al.size() == 0) {\r
-            Output.add("{0, 0, 0}");\r
+            Output.add("\t{0, 0, 0}");\r
         }\r
         \r
         int index;\r
@@ -603,11 +795,11 @@ class ExMapTable {
 \r
             ExTriplet e = (ExTriplet)al.get(index);\r
 \r
-            str = "{ " + e.exTokenNumber.toString() + ", ";\r
+            str = "\t" + "{ " + String.format("0x%08X", e.exTokenNumber) + ", ";\r
             str += e.localTokenIdx.toString() + ", ";\r
             str += e.guidTableIdx.toString();\r
 \r
-            str += " /* " + alComment.get(index) + " */";\r
+            str += "}" + " /* " + alComment.get(index) + " */" ;\r
 \r
             if (index != al.size() - 1) {\r
                 str += ",";\r
@@ -637,21 +829,52 @@ class ExMapTable {
         return al.size() == 0 ? 1 : al.size();\r
     }\r
 \r
+    //\r
+    // To simplify the algorithm for GetNextToken and GetNextTokenSpace in\r
+    // PCD PEIM/Driver, we need to sort the ExMapTable according to the\r
+    // following order:\r
+    // 1) ExGuid\r
+    // 2) ExTokenNumber\r
+    // \r
+    class ExTripletComp implements Comparator<ExTriplet> {\r
+        public int compare (ExTriplet a, ExTriplet b) {\r
+            if (a.guidTableIdx == b.guidTableIdx ) {\r
+                if (a.exTokenNumber > b.exTokenNumber) {\r
+                    return 1;\r
+                } else if (a.exTokenNumber > b.exTokenNumber) {\r
+                    return 1;\r
+                } else {\r
+                    return 0;\r
+                }\r
+            }\r
+            \r
+            return a.guidTableIdx - b.guidTableIdx;\r
+        }\r
+    }\r
+\r
+    private void sortTable () {\r
+        java.util.Comparator<ExTriplet> comparator = new ExTripletComp();\r
+        java.util.Collections.sort(al, comparator);\r
+    }\r
 }\r
 \r
 class PcdDatabase {\r
 \r
+    private final static int    SkuHeadAlignmentSize             = 4;\r
+    private final String        newLine                         = "\r\n";\r
+    private final String        commaNewLine                    = ",\r\n";\r
+    private final String        tab                             = "\t";\r
     public final static String ExMapTableDeclaration            = "DYNAMICEX_MAPPING ExMapTable[%s_EXMAPPING_TABLE_SIZE];\r\n";\r
     public final static String GuidTableDeclaration             = "EFI_GUID          GuidTable[%s_GUID_TABLE_SIZE];\r\n";\r
     public final static String LocalTokenNumberTableDeclaration = "UINT32            LocalTokenNumberTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
     public final static String StringTableDeclaration           = "UINT16            StringTable[%s_STRING_TABLE_SIZE];\r\n";\r
     public final static String SizeTableDeclaration             = "UINT16            SizeTable[%s_LOCAL_TOKEN_NUMBER_TABLE_SIZE];\r\n";\r
-    public final static String SkuIdTableDeclaration              = "UINT8             SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
+    public final static String SkuIdTableDeclaration            = "UINT8             SkuIdTable[%s_SKUID_TABLE_SIZE];\r\n";\r
 \r
 \r
     public final static String ExMapTableSizeMacro              = "#define %s_EXMAPPING_TABLE_SIZE  %d\r\n";\r
     public final static String ExTokenNumber                    = "#define %s_EX_TOKEN_NUMBER       %d\r\n";\r
-    public final static String GuidTableSizeMacro               = "#define %s_GUID_TABLE_SIZE         %d\r\n";\r
+    public final static String GuidTableSizeMacro               = "#define %s_GUID_TABLE_SIZE         %d\r\n"; \r
     public final static String LocalTokenNumberTableSizeMacro   = "#define %s_LOCAL_TOKEN_NUMBER_TABLE_SIZE            %d\r\n";\r
     public final static String LocalTokenNumberSizeMacro               = "#define %s_LOCAL_TOKEN_NUMBER            %d\r\n";\r
     public final static String StringTableSizeMacro             = "#define %s_STRING_TABLE_SIZE       %d\r\n";\r
@@ -665,7 +888,11 @@ class PcdDatabase {
     public final static String SkuTableExistenceMacro           = "#define %s_SKUID_TABLE_EMPTY    %s\r\n";\r
 \r
     public final static String offsetOfSkuHeadStrTemplate       = "offsetof(%s_PCD_DATABASE, %s.%s_SkuDataTable)";\r
+    public final static String offsetOfVariableEnabledDefault   = "offsetof(%s_PCD_DATABASE, %s.%s_VariableDefault_%d)";\r
     public final static String offsetOfStrTemplate              = "offsetof(%s_PCD_DATABASE, %s.%s)";\r
+    \r
+    private final static String  skuDataTableTemplate           = "SkuDataTable";\r
+\r
 \r
     private StringTable stringTable;\r
     private GuidTable   guidTable;\r
@@ -678,6 +905,12 @@ class PcdDatabase {
     private String phase;\r
     private int assignedTokenNumber;\r
     \r
+    //\r
+    // Use two class global variable to store\r
+    // temperary \r
+    //\r
+    private String      privateGlobalName;\r
+    private String      privateGlobalCCode;\r
     //\r
     // After Major changes done to the PCD\r
     // database generation class PcdDatabase\r
@@ -685,7 +918,7 @@ class PcdDatabase {
     // also update the version number in PCD\r
     // service PEIM and DXE driver accordingly.\r
     //\r
-    private final int version = 1;\r
+    private final int version = 2;\r
 \r
     private String hString;\r
     private String cString;\r
@@ -697,7 +930,7 @@ class PcdDatabase {
                     - getAlignmentSize(a);\r
         }\r
     }\r
-\r
+    \r
     public PcdDatabase (ArrayList<Token> alTokens, String exePhase, int startLen) {\r
        phase = exePhase;\r
 \r
@@ -708,10 +941,23 @@ class PcdDatabase {
        sizeTable = new SizeTable(phase);\r
        exMapTable = new ExMapTable(phase); \r
 \r
-       assignedTokenNumber = startLen;\r
+       assignedTokenNumber = startLen + 1;\r
        this.alTokens = alTokens;\r
     }\r
 \r
+    private void getNonExAndExTokens (ArrayList<Token> alTokens, List<Token> nexTokens, List<Token> exTokens) {\r
+        for (int i = 0; i < alTokens.size(); i++) {\r
+            Token t = (Token)alTokens.get(i);\r
+            if (t.isDynamicEx()) {\r
+                exTokens.add(t);\r
+            } else {\r
+                nexTokens.add(t);\r
+            }\r
+        }\r
+\r
+        return;\r
+    }\r
+\r
     private void getTwoGroupsOfTokens (ArrayList<Token> alTokens, List<Token> initTokens, List<Token> uninitTokens) {\r
         for (int i = 0; i < alTokens.size(); i++) {\r
             Token t = (Token)alTokens.get(i);\r
@@ -725,6 +971,25 @@ class PcdDatabase {
         return;\r
     }\r
 \r
+    private int getDataTypeAlignmentSize (Token token) {\r
+        switch (token.datumType) {\r
+        case UINT8:\r
+            return 1;\r
+        case UINT16:\r
+            return 2;\r
+        case UINT32:\r
+            return 4;\r
+        case UINT64:\r
+            return 8;\r
+        case POINTER:\r
+            return 1;\r
+        case BOOLEAN:\r
+            return 1;\r
+        default:\r
+            return 1;\r
+        }\r
+    }\r
+    \r
     private int getAlignmentSize (Token token) {\r
         if (token.getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
             return 2;\r
@@ -737,22 +1002,8 @@ class PcdDatabase {
         if (token.isUnicodeStringType()) {\r
             return 2;\r
         }\r
-\r
-        switch (token.datumType) {\r
-            case UINT8:\r
-                return 1;\r
-            case UINT16:\r
-                return 2;\r
-            case UINT32:\r
-                return 4;\r
-            case UINT64:\r
-                return 8;\r
-            case POINTER:\r
-                return 1;\r
-            case BOOLEAN:\r
-                return 1;\r
-            }\r
-            return 1;\r
+        \r
+        return getDataTypeAlignmentSize(token);\r
      }\r
 \r
     public String getCString () {\r
@@ -762,6 +1013,224 @@ class PcdDatabase {
     public String getHString () {\r
         return hString;\r
     }\r
+    \r
+    private void genCodeWorker(Token t,\r
+            ArrayList<CStructTypeDeclaration> declaList,\r
+            HashMap<String, String> instTable, String phase)\r
+            throws EntityException {\r
+\r
+        CStructTypeDeclaration decl;\r
+\r
+        //\r
+        // Insert SKU_HEAD if isSkuEnable is true\r
+        //\r
+        if (t.isSkuEnable()) {\r
+            int tableIdx;\r
+            tableIdx = skuIdTable.add(t);\r
+            decl = new CStructTypeDeclaration(t.getPrimaryKeyString(),\r
+                    SkuHeadAlignmentSize, getSkuEnabledTypeDeclaration(t), true);\r
+            declaList.add(decl);\r
+            instTable.put(t.getPrimaryKeyString(),\r
+                    getSkuEnabledTypeInstantiaion(t, tableIdx));\r
+        }\r
+\r
+        //\r
+        // Insert PCD_ENTRY declaration and instantiation\r
+        //\r
+        getCDeclarationString(t);\r
+\r
+        decl = new CStructTypeDeclaration(privateGlobalName,\r
+                getAlignmentSize(t), privateGlobalCCode, t.hasDefaultValue());\r
+        declaList.add(decl);\r
+\r
+        if (t.hasDefaultValue()) {\r
+            instTable.put(privateGlobalName, \r
+                          getTypeInstantiation(t, declaList, instTable, phase)\r
+                          );\r
+        }\r
+\r
+    }\r
+\r
+    private void ProcessTokensNew (List<Token> tokens, \r
+                                   ArrayList<CStructTypeDeclaration> cStructDeclList,\r
+                                   HashMap<String, String> cStructInstTable,\r
+                                   String phase\r
+                                   ) \r
+    throws EntityException {\r
+        \r
+        for (int idx = 0; idx < tokens.size(); idx++) {\r
+            Token t = tokens.get(idx);\r
+            \r
+            genCodeWorker (t, cStructDeclList, cStructInstTable, phase);\r
+            \r
+            sizeTable.add(t);\r
+            localTokenNumberTable.add(t);\r
+            t.tokenNumber = assignedTokenNumber++;\r
+            \r
+            //\r
+            // Add a mapping if this dynamic PCD entry is a EX type\r
+            //\r
+            if (t.isDynamicEx()) {\r
+                exMapTable.add(t.tokenNumber, \r
+                                t.dynamicExTokenNumber, \r
+                                guidTable.add(t.tokenSpaceName, t.getPrimaryKeyString()), \r
+                                t.getPrimaryKeyString()\r
+                                );\r
+            }\r
+        }\r
+\r
+    }\r
+    \r
+    public void genCodeNew () throws EntityException {\r
+        \r
+        ArrayList<CStructTypeDeclaration> cStructDeclList = new ArrayList<CStructTypeDeclaration>();\r
+        HashMap<String, String> cStructInstTable = new HashMap<String, String>();\r
+        \r
+        List<Token> nexTokens = new ArrayList<Token> ();\r
+        List<Token> exTokens = new ArrayList<Token> ();\r
+\r
+        getNonExAndExTokens (alTokens, nexTokens, exTokens);\r
+\r
+        //\r
+        // We have to process Non-Ex type PCD entry first. The reason is\r
+        // that our optimization assumes that the Token Number of Non-Ex \r
+        // PCD entry start from 1 (for PEI phase) and grows continously upwards.\r
+        // \r
+        // EX type token number starts from the last Non-EX PCD entry and\r
+        // grows continously upwards.\r
+        //\r
+        ProcessTokensNew (nexTokens, cStructDeclList, cStructInstTable, phase);\r
+        ProcessTokensNew (exTokens, cStructDeclList, cStructInstTable, phase);\r
+        \r
+        stringTable.genCodeNew(cStructDeclList, cStructInstTable);\r
+        skuIdTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+        exMapTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+        localTokenNumberTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+        sizeTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+        guidTable.genCodeNew(cStructDeclList, cStructInstTable, phase);\r
+        \r
+        hString = genCMacroCode ();\r
+        \r
+        HashMap <String, String> result;\r
+        \r
+        result = genCStructCode(cStructDeclList, \r
+                cStructInstTable, \r
+                phase\r
+                );\r
+        \r
+        hString += result.get("initDeclStr");\r
+        hString += result.get("uninitDeclStr");\r
+        \r
+        hString += String.format("#define PCD_%s_SERVICE_DRIVER_VERSION         %d", phase, version);\r
+        \r
+        cString = newLine + newLine + result.get("initInstStr");\r
+        \r
+    }\r
+    \r
+    private String genCMacroCode () {\r
+        String macroStr   = "";\r
+\r
+        //\r
+        // Generate size info Macro for all Tables\r
+        //\r
+        macroStr += guidTable.getSizeMacro();\r
+        macroStr += stringTable.getSizeMacro();\r
+        macroStr += skuIdTable.getSizeMacro();\r
+        macroStr += localTokenNumberTable.getSizeMacro();\r
+        macroStr += exMapTable.getSizeMacro();\r
+\r
+        //\r
+        // Generate existance info Macro for all Tables\r
+        //\r
+        macroStr += guidTable.getExistanceMacro();\r
+        macroStr += stringTable.getExistanceMacro();\r
+        macroStr += skuIdTable.getExistanceMacro();\r
+        macroStr += localTokenNumberTable.getExistanceMacro();\r
+        macroStr += exMapTable.getExistanceMacro();\r
+\r
+        macroStr += newLine;\r
+        \r
+        return macroStr;\r
+    }\r
+    \r
+    private HashMap <String, String> genCStructCode(\r
+                                            ArrayList<CStructTypeDeclaration> declaList, \r
+                                            HashMap<String, String> instTable, \r
+                                            String phase\r
+                                            ) {\r
+        \r
+        int i;\r
+        HashMap <String, String> result = new HashMap<String, String>();\r
+        HashMap <Integer, ArrayList<String>>    alignmentInitDecl = new HashMap<Integer, ArrayList<String>>();\r
+        HashMap <Integer, ArrayList<String>>    alignmentUninitDecl = new HashMap<Integer, ArrayList<String>>();\r
+        HashMap <Integer, ArrayList<String>>    alignmentInitInst = new HashMap<Integer, ArrayList<String>>();\r
+        \r
+        //\r
+        // Initialize the storage for each alignment\r
+        //\r
+        for (i = 8; i > 0; i>>=1) {\r
+            alignmentInitDecl.put(new Integer(i), new ArrayList<String>());\r
+            alignmentInitInst.put(new Integer(i), new ArrayList<String>());\r
+            alignmentUninitDecl.put(new Integer(i), new ArrayList<String>());\r
+        }\r
+        \r
+        String initDeclStr   = "typedef struct {" + newLine;\r
+        String initInstStr   = String.format("%s_PCD_DATABASE_INIT g%sPcdDbInit = { ", phase.toUpperCase(), phase.toUpperCase()) + newLine;\r
+        String uninitDeclStr = "typedef struct {" + newLine;\r
+\r
+        //\r
+        // Sort all C declaration and instantiation base on Alignment Size \r
+        //\r
+        for (Object d : declaList) {\r
+            CStructTypeDeclaration decl = (CStructTypeDeclaration) d;\r
+            \r
+            if (decl.initTable) {\r
+                alignmentInitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
+                alignmentInitInst.get(new Integer(decl.alignmentSize)).add(instTable.get(decl.key));\r
+            } else {\r
+                alignmentUninitDecl.get(new Integer(decl.alignmentSize)).add(decl.cCode);\r
+            }\r
+        }\r
+\r
+        //\r
+        // Generate code for every alignment size\r
+        //\r
+        for (int align = 8; align > 0; align >>= 1) {\r
+            ArrayList<String> declaListBasedOnAlignment = alignmentInitDecl.get(new Integer(align));\r
+            ArrayList<String> instListBasedOnAlignment = alignmentInitInst.get(new Integer(align));\r
+            for (i = 0; i < declaListBasedOnAlignment.size(); i++) {\r
+                initDeclStr += tab + declaListBasedOnAlignment.get(i);\r
+                initInstStr += tab + instListBasedOnAlignment.get(i);\r
+                \r
+                //\r
+                // We made a assumption that both PEI_PCD_DATABASE and DXE_PCD_DATABASE\r
+                // has a least one data memember with alignment size of 1. So we can\r
+                // remove the last "," in the C structure instantiation string.\r
+                //\r
+                if ((align == 1) && (i == declaListBasedOnAlignment.size() - 1)) {\r
+                    initInstStr += newLine;\r
+                } else {\r
+                    initInstStr += commaNewLine;\r
+                }\r
+            }\r
+            \r
+            declaListBasedOnAlignment = alignmentUninitDecl.get(new Integer(align));\r
+            for (Object d : declaListBasedOnAlignment) {\r
+                String s = (String)d;\r
+                uninitDeclStr += tab + s;\r
+            }\r
+        }\r
+        \r
+        initDeclStr += String.format("} %s_PCD_DATABASE_INIT;", phase) + newLine + newLine;\r
+        initInstStr += "};";\r
+        uninitDeclStr += String.format("} %s_PCD_DATABASE_UNINIT;", phase) + newLine + newLine;\r
+        \r
+        result.put("initDeclStr", initDeclStr);\r
+        result.put("initInstStr", initInstStr);\r
+        result.put("uninitDeclStr", uninitDeclStr);\r
+\r
+        return result;\r
+    }\r
 \r
      public void genCode () \r
         throws EntityException {\r
@@ -916,10 +1385,13 @@ class PcdDatabase {
 \r
     }\r
 \r
-    private String genInstantiationStr (ArrayList<String> alStr) {\r
+    public static String genInstantiationStr (ArrayList<String> alStr) {\r
         String str = "";\r
         for (int i = 0; i< alStr.size(); i++) {\r
-            str += "\t" + alStr.get(i);\r
+            if (i != 0) {\r
+                str += "\t";\r
+            }\r
+            str += alStr.get(i);\r
             if (i != alStr.size() - 1) {\r
                 str += "\r\n";\r
             }\r
@@ -999,7 +1471,7 @@ class PcdDatabase {
     private String getSkuEnabledTypeInstantiaion (Token token, int SkuTableIdx) {\r
 \r
         String offsetof = String.format(PcdDatabase.offsetOfSkuHeadStrTemplate, phase, token.hasDefaultValue()? "Init" : "Uninit", token.getPrimaryKeyString());\r
-        return String.format("{ %s, %d }", offsetof, SkuTableIdx);\r
+        return String.format("{ %s, %d } /* SKU_ENABLED: %s */", offsetof, SkuTableIdx, token.getPrimaryKeyString());\r
     }\r
 \r
     private String getDataTypeDeclarationForSkuEnabled (Token token) {\r
@@ -1043,6 +1515,10 @@ class PcdDatabase {
 \r
     }\r
 \r
+    private String getDataTypeInstantiationForVariableDefault_new (Token token, String cName, int skuId) {\r
+        return String.format("%s /* %s */", token.skuData.get(skuId).value.hiiDefaultValue, cName);\r
+    }\r
+\r
     private String getDataTypeInstantiation (Token token) {\r
 \r
         if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
@@ -1052,7 +1528,82 @@ class PcdDatabase {
         }\r
     }\r
 \r
+    private String getCType (Token t) \r
+        throws EntityException {\r
+        \r
+        if (t.isHiiEnable()) {\r
+            return "VARIABLE_HEAD";\r
+        }\r
+        \r
+        if (t.isVpdEnable()) {\r
+            return "VPD_HEAD";\r
+        }\r
+        \r
+        if (t.isUnicodeStringType()) {\r
+            return "STRING_HEAD";\r
+        }\r
+        \r
+        switch (t.datumType) {\r
+        case UINT64:\r
+            return "UINT64";\r
+        case UINT32:\r
+            return "UINT32";\r
+        case UINT16:\r
+            return "UINT16";\r
+        case UINT8:\r
+            return "UINT8";\r
+        case BOOLEAN:\r
+            return "BOOLEAN";\r
+        case POINTER:\r
+            return "UINT8";\r
+        default:\r
+            throw new EntityException("Unknown type in getDataTypeCDeclaration");\r
+        }\r
+    }\r
+    \r
+    private void getCDeclarationString(Token t) \r
+        throws EntityException {\r
+        \r
+        if (t.isSkuEnable()) {\r
+            privateGlobalName = String.format("%s_%s", t.getPrimaryKeyString(), skuDataTableTemplate);\r
+        } else {\r
+            privateGlobalName = t.getPrimaryKeyString();\r
+        }\r
+\r
+        if (t.isUnicodeStringType()) {\r
+            privateGlobalCCode = String.format("STRING_HEAD              %s[%d];\r\n", t.getPrimaryKeyString(), t.getSkuIdCount());\r
+        } else {\r
+            String type = getCType(t);\r
+            if (t.datumType == Token.DATUM_TYPE.POINTER) {\r
+                privateGlobalCCode = String.format("%s              %s[%d][%d];\r\n", type, privateGlobalName, t.getSkuIdCount(), t.datumSize);\r
+            } else {\r
+                privateGlobalCCode = String.format("%s              %s[%d];\r\n", type, privateGlobalName, t.getSkuIdCount());\r
+            }\r
+        }\r
+    }\r
+    \r
+    private String getDataTypeDeclarationForVariableDefault_new (Token token, String cName, int skuId) {\r
+\r
+        String typeStr = "";\r
+\r
+        if (token.datumType == Token.DATUM_TYPE.UINT8) {\r
+            typeStr = "UINT8";\r
+        } else if (token.datumType == Token.DATUM_TYPE.UINT16) {\r
+            typeStr = "UINT16";\r
+        } else if (token.datumType == Token.DATUM_TYPE.UINT32) {\r
+            typeStr = "UINT32";\r
+        } else if (token.datumType == Token.DATUM_TYPE.UINT64) {\r
+            typeStr = "UINT64";\r
+        } else if (token.datumType == Token.DATUM_TYPE.BOOLEAN) {\r
+            typeStr = "BOOLEAN";\r
+        } else if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
+            return String.format("UINT8 %s[%d]", cName, token.datumSize);\r
+        } else {\r
+        }\r
 \r
+        return String.format("%s             %s;\r\n", typeStr, cName);\r
+    }\r
+    \r
     private String getDataTypeDeclaration (Token token) {\r
 \r
         String typeStr = "";\r
@@ -1078,7 +1629,67 @@ class PcdDatabase {
     private String getVpdEnableTypeDeclaration (Token token) {\r
         return String.format("VPD_HEAD %s", token.getPrimaryKeyString());\r
     }\r
+    \r
+    private String getTypeInstantiation (Token t, ArrayList<CStructTypeDeclaration> declaList, HashMap<String, String> instTable, String phase) throws EntityException {\r
+      \r
+        int     i;\r
+\r
+        String s;\r
+        s = String.format("/* %s */", t.getPrimaryKeyString()) + newLine;\r
+        s += tab + "{" + newLine;\r
+\r
+        for (i = 0; i < t.skuData.size(); i++) {\r
+            if (t.isUnicodeStringType() && !t.isHiiEnable()) {\r
+                s += tab + tab + String.format("{ %d }", stringTable.add(t.skuData.get(i).value.value, t));\r
+            } else if (t.isHiiEnable()) {\r
+                /* VPD_HEAD definition\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
+                String variableDefaultName = String.format("%s_VariableDefault_%d", t.getPrimaryKeyString(), i); \r
+                \r
+                s += tab + tab + String.format("{ %d, %d, %s, %s }", guidTable.add(t.skuData.get(i).value.variableGuid, t.getPrimaryKeyString()),\r
+                                                          stringTable.add(t.skuData.get(i).value.getStringOfVariableName(), t),\r
+                                                          t.skuData.get(i).value.variableOffset,\r
+                                                          String.format("offsetof(%s_PCD_DATABASE, Init.%s)", phase, variableDefaultName)\r
+                                                          );\r
+                //\r
+                // We need to support the default value, so we add the declaration and\r
+                // the instantiation for the default value.\r
+                //\r
+                CStructTypeDeclaration decl = new CStructTypeDeclaration (variableDefaultName,\r
+                                                        getDataTypeAlignmentSize(t),\r
+                                                        getDataTypeDeclarationForVariableDefault_new(t, variableDefaultName, i),\r
+                                                        true\r
+                                                        ); \r
+                declaList.add(decl);\r
+                instTable.put(variableDefaultName, getDataTypeInstantiationForVariableDefault_new (t, variableDefaultName, i));\r
+            } else if (t.isVpdEnable()) {\r
+                    /* typedef  struct {\r
+                        UINT32  Offset;\r
+                      } VPD_HEAD;\r
+                    */\r
+                s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.vpdOffset);\r
+            } else {\r
+                s += tab + tab + String.format("{ %s }", t.skuData.get(i).value.value);\r
+            }\r
+            \r
+            if (i != t.skuData.size() - 1) {\r
+                s += commaNewLine;\r
+            } else {\r
+                s += newLine;\r
+            }\r
 \r
+        }\r
+        \r
+        s += tab + "}";\r
+        \r
+        return s;\r
+    }\r
+    \r
     private String getVpdEnableTypeInstantiation (Token token) {\r
         return String.format("{ %s } /* %s */", token.getDefaultSku().vpdOffset,\r
                                                 token.getPrimaryKeyString());\r
@@ -1321,19 +1932,19 @@ public class CollectPCDAction {
 \r
         dbManager.getTwoPhaseDynamicRecordArray(alPei, alDxe);\r
         PcdDatabase pcdPeiDatabase = new PcdDatabase (alPei, "PEI", 0);\r
-        pcdPeiDatabase.genCode();\r
-        dbManager.PcdPeimHString        = PcdCommonHeaderString + pcdPeiDatabase.getHString()\r
+        pcdPeiDatabase.genCodeNew();\r
+        MemoryDatabaseManager.PcdPeimHString        = PcdCommonHeaderString + pcdPeiDatabase.getHString()\r
                                             + PcdDatabase.getPcdPeiDatabaseDefinitions();\r
-        dbManager.PcdPeimCString        = pcdPeiDatabase.getCString();\r
+        MemoryDatabaseManager.PcdPeimCString        = pcdPeiDatabase.getCString();\r
 \r
         PcdDatabase pcdDxeDatabase = new PcdDatabase (alDxe, \r
                                                       "DXE",\r
                                                       alPei.size()\r
                                                       );\r
-        pcdDxeDatabase.genCode();\r
-        dbManager.PcdDxeHString   = dbManager.PcdPeimHString + pcdDxeDatabase.getHString()\r
+        pcdDxeDatabase.genCodeNew();\r
+        MemoryDatabaseManager.PcdDxeHString   = MemoryDatabaseManager.PcdPeimHString + pcdDxeDatabase.getHString()\r
                                       + PcdDatabase.getPcdDxeDatabaseDefinitions();\r
-        dbManager.PcdDxeCString   = pcdDxeDatabase.getCString();\r
+        MemoryDatabaseManager.PcdDxeCString   = pcdDxeDatabase.getCString();\r
     }\r
 \r
     /**\r
index fdf90b620c876b41bf7fdac8b8c7c60b4d1bb968..c363aab6a5340a7bd0b9670daa19e4e3c52adeb5 100644 (file)
@@ -19,15 +19,11 @@ package org.tianocore.build.pcd.action;
 import java.io.File;\r
 import java.util.ArrayList;\r
 import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
 import java.util.UUID;\r
 import java.util.regex.Matcher;\r
 import java.util.regex.Pattern;\r
 \r
-import org.apache.xmlbeans.XmlObject;\r
 import org.tianocore.build.global.GlobalData;\r
-import org.tianocore.build.global.SurfaceAreaQuery;\r
 import org.tianocore.build.pcd.entity.MemoryDatabaseManager;\r
 import org.tianocore.build.pcd.entity.Token;\r
 import org.tianocore.build.pcd.entity.UsageInstance;\r
@@ -398,7 +394,7 @@ public class PCDAutoGenAction extends BuildAction {
     **/\r
     public static void main(String argv[]) {\r
 \r
-        String WorkSpace = "M:/tianocore/edk2";\r
+        String WorkSpace = "X:/edk2";\r
         String logFilePath = WorkSpace  + "/EdkNt32Pkg/Nt32.fpd";\r
         String[] nameArray = null;\r
 \r
@@ -421,13 +417,13 @@ public class PCDAutoGenAction extends BuildAction {
         //\r
         // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
         //\r
-        PCDAutoGenAction autogenAction = new PCDAutoGenAction("MonoStatusCode",\r
+        PCDAutoGenAction autogenAction = new PCDAutoGenAction("PcdPeim",\r
                                                               null,\r
                                                               null,\r
                                                               null,\r
                                                               "IA32",\r
                                                               null,\r
-                                                              false,\r
+                                                              true,\r
                                                               nameArray);\r
         autogenAction.execute();\r
 \r
index 0ff5b8e33801f9ec89ba82a3dd8f510284abc069..0439c11d7ce60cde711b981ada79eb92871daba2 100644 (file)
@@ -15,20 +15,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 package org.tianocore.build.pcd.entity;\r
 \r
-import java.io.BufferedWriter;\r
-import java.io.File;\r
-import java.io.FileWriter;\r
-import java.io.IOException;\r
 import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Comparator;\r
 import java.util.HashMap;\r
-import java.util.Hashtable;\r
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.UUID;\r
 \r
-import org.tianocore.build.pcd.action.ActionMessage;\r
+import org.tianocore.build.pcd.exception.EntityException;\r
 \r
 /** Database hold all PCD information comes from SPD, MSA, FPD file in memory.\r
 **/\r
@@ -141,7 +134,6 @@ public class MemoryDatabaseManager {
     private ArrayList getDynamicRecordArray() {\r
         Token[]     tokenArray  =   getRecordArray();\r
         int         index       =   0;\r
-        int         count       =   0;\r
         ArrayList<Token>   al   =   new ArrayList<Token>();\r
 \r
         for (index = 0; index < tokenArray.length; index++) {\r
@@ -159,8 +151,10 @@ public class MemoryDatabaseManager {
           The output array is sorted based on descending order of the size of alignment for each feilds.\r
 \r
       @return the token record array contained all PCD token referenced in PEI phase.\r
+     * @throws EntityException \r
     **/\r
-    public void getTwoPhaseDynamicRecordArray(ArrayList<Token> pei, ArrayList<Token> dxe) {\r
+    public void getTwoPhaseDynamicRecordArray(ArrayList<Token> pei, ArrayList<Token> dxe) \r
+        throws EntityException {\r
         int                     usageInstanceIndex  =   0;\r
         int                     index               =   0;\r
         ArrayList               tokenArrayList      =   getDynamicRecordArray();\r
@@ -185,10 +179,30 @@ public class MemoryDatabaseManager {
                 }\r
             }\r
 \r
-            // If no PEI components reference the PCD entry, we insert it to DXE list\r
+            //\r
+            // If no PEI components reference the PCD entry, \r
+            // we check if it is referenced in DXE driver. \r
             //\r
             if (!found) {\r
-                dxe.add(token);\r
+                if (token.consumers != null) {\r
+                    usageInstanceArray = token.consumers.entrySet().toArray();\r
+                    for (usageInstanceIndex = 0; usageInstanceIndex < token.consumers.size(); usageInstanceIndex ++) {\r
+                        usageInstance =(UsageInstance) (((Map.Entry)usageInstanceArray[usageInstanceIndex]).getValue());\r
+                        if (usageInstance.isDxePhaseComponent()) {\r
+                            dxe.add(token);\r
+                            found = true;\r
+                            break;\r
+                        }\r
+                    }\r
+                }\r
+                \r
+                if (!found) {\r
+                    //\r
+                    // We only support Dynamice(EX) type for PEI and DXE phase.\r
+                    // If it is not referenced in either PEI or DXE, throw exception now.\r
+                    //\r
+                    throw new EntityException("Dynamic(EX) PCD Entries are referenced in module that is not in PEI phase nor in DXE phase.");\r
+                }\r
             }\r
         }\r
 \r
index 9a54a3e579bb14ac8240463baa8bc252a800e834..7d1e0191dbe3e8c1b3cde278857e2a56829dabdf 100644 (file)
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.Map;\r
 import java.util.UUID;\r
 \r
-import org.tianocore.build.pcd.action.ActionMessage;\r
 import org.tianocore.build.pcd.exception.EntityException;\r
 \r
 /** This class is to descript a PCD token object. The information of a token mainly \r
@@ -164,6 +163,17 @@ public class Token {
         return false;\r
     }\r
 \r
+    public boolean isDynamicEx() {\r
+        \r
+        for (int i = 0; i < supportedPcdType.size(); i++) {\r
+            if (supportedPcdType.get(i) == PCD_TYPE.DYNAMIC_EX) {\r
+                return true;\r
+            }\r
+        }\r
+        \r
+        return false;\r
+    }\r
+\r
     /**\r
       Use "TokencName + "-" + SpaceTokenName" as primary key when adding token into database\r
       \r
@@ -194,6 +204,20 @@ public class Token {
         }\r
         return false;\r
     }\r
+    \r
+    public boolean isHiiEnable() {\r
+        if (getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.HII_TYPE) {\r
+            return true;\r
+        }\r
+        return false;\r
+    }\r
+\r
+    public boolean isVpdEnable() {\r
+        if (getDefaultSku().type == DynamicTokenValue.VALUE_TYPE.VPD_TYPE) {\r
+            return true;\r
+        }\r
+        return false;\r
+    }\r
 \r
     /**\r
        Get the token primary key in token database.\r
@@ -471,6 +495,7 @@ public class Token {
 \r
       @return string of datum type.\r
     **/\r
+\r
     public static String getAutogendatumTypeString(DATUM_TYPE datumType) {\r
         switch (datumType) {\r
         case UINT8:\r
@@ -545,6 +570,11 @@ public class Token {
 \r
         return null;\r
     }\r
+    \r
+    public int getSkuIdCount () {\r
+        return this.skuData.size();\r
+    }\r
+    \r
 \r
     /**\r
        Get default value for a token, For HII type, HiiDefaultValue of default\r
@@ -576,13 +606,17 @@ public class Token {
         boolean           isInteger     = true;\r
         DynamicTokenValue dynamicValue  = null;\r
 \r
+        if (isSkuEnable()) {\r
+            return true;\r
+        }\r
+        \r
         if (this.isDynamicPCD) {\r
             dynamicValue = getDefaultSku();\r
             switch (dynamicValue.type) {\r
             case HII_TYPE:\r
-                return !isValidNullValue(dynamicValue.hiiDefaultValue);\r
+                return true;\r
             case VPD_TYPE:\r
-                return false;\r
+                return true;\r
             case DEFAULT_TYPE:\r
                 return !isValidNullValue(dynamicValue.value);\r
             }\r
index 20f0b9b14d75cfa4f1e22de6b1b71e762a59ea64..85806b4289740dfa371b1b5d38833fd5783f2823 100644 (file)
@@ -20,8 +20,6 @@ package org.tianocore.build.pcd.entity;
 \r
 import java.util.UUID;\r
 import org.tianocore.ModuleTypeDef;\r
-import org.tianocore.build.autogen.CommonDefinition;\r
-import org.tianocore.build.pcd.action.ActionMessage;\r
 import org.tianocore.build.pcd.exception.EntityException;\r
 \r
 /**\r
@@ -186,6 +184,23 @@ public class UsageInstance {
         }\r
         return false;\r
     }\r
+  \r
+  public boolean isDxePhaseComponent() {\r
+      //\r
+      // BugBug: May need confirmation on which type of module can\r
+      //         make use of Dynamic(EX) PCD entry.\r
+      //\r
+      if ((moduleType == ModuleTypeDef.DXE_DRIVER) ||\r
+          (moduleType == ModuleTypeDef.DXE_RUNTIME_DRIVER) ||\r
+          (moduleType == ModuleTypeDef.DXE_SAL_DRIVER) ||\r
+          (moduleType == ModuleTypeDef.DXE_SMM_DRIVER) ||\r
+          (moduleType == ModuleTypeDef.UEFI_DRIVER) ||\r
+          (moduleType == ModuleTypeDef.UEFI_APPLICATION)\r
+          ) {\r
+          return true;\r
+      }\r
+      return false;\r
+  }\r
 \r
     /**\r
        Generate autogen string for header file and C code file.\r