]> 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
   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
   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
 {\r
   ASSERT (CallBackFunction != NULL);\r
   \r
-  return DxeRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
+  return DxeUnRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction);\r
 }\r
 \r
 \r
 }\r
 \r
 \r
index 36e859c779d15e114ca1303ae507971615230b47..9513143f26a15398a4b06dceaea8aff9d8da37c3 100644 (file)
@@ -50,10 +50,16 @@ GetWorker (
   UINT16              StringTableIdx;      \r
   UINT32              LocalTokenNumber;\r
 \r
   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
   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
   ASSERT (GetSize == Size || GetSize == 0);\r
 \r
   \r
@@ -100,11 +106,10 @@ GetWorker (
         return (UINT8 *) Data + VariableHead->Offset;\r
       } else {\r
         //\r
         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
 \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
     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
   ListHead = &mCallbackFnTable[TokenNumber];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
@@ -186,6 +198,13 @@ DxeUnRegisterCallBackWorker (
     TokenNumber = GetExPcdTokenNumber (Guid, (UINT32) TokenNumber);\r
   }\r
 \r
     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
   ListHead = &mCallbackFnTable[TokenNumber];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
@@ -342,13 +361,17 @@ GetHiiVariable (
   EFI_STATUS Status;\r
   VOID       *Buffer;\r
 \r
   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
   Status = EfiGetVariable (\r
     (UINT16 *)VariableName,\r
     VariableGuid,\r
     NULL,\r
     &Size,\r
-    NULL\r
+    Buffer\r
     );\r
     );\r
+  \r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
 \r
     Buffer = AllocatePool (Size);\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
     ASSERT (Status == EFI_SUCCESS);\r
   }\r
 \r
+  *VariableData = Buffer;\r
+  *VariableSize = Size;\r
+\r
   return Status;\r
 \r
 }\r
   return Status;\r
 \r
 }\r
@@ -444,6 +470,13 @@ InvokeCallbackOnSet (
   LIST_ENTRY              *ListHead;\r
   LIST_ENTRY              *ListNode;\r
 \r
   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
   ListHead = &mCallbackFnTable[TokenNumber];\r
   ListNode = GetFirstNode (ListHead);\r
 \r
@@ -485,13 +518,19 @@ SetWorker (
   UINTN               Offset;\r
   UINT8               *PcdDb;\r
 \r
   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 (TokenNumber < PCD_TOTAL_TOKEN_NUMBER);\r
 \r
   if (PtrType) {\r
-    ASSERT (Size <= DxePcdGetSize (TokenNumber));\r
+    ASSERT (Size <= DxePcdGetSize (TokenNumber + 1));\r
   } else {\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
   }\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
 \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
   }\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
 // 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
 \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
   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
   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
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_GUID *\r
+EFI_STATUS\r
 EFIAPI\r
 PeiPcdGetNextTokenSpaceGuid (\r
 EFIAPI\r
 PeiPcdGetNextTokenSpaceGuid (\r
-  IN CONST EFI_GUID               *Guid\r
+  IN OUT CONST EFI_GUID               **Guid\r
   )\r
 {\r
   UINTN               GuidTableIdx;\r
   )\r
 {\r
   UINTN               GuidTableIdx;\r
@@ -572,9 +579,17 @@ PeiPcdGetNextTokenSpaceGuid (
   UINTN               i;\r
   BOOLEAN             Found;\r
 \r
   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
 \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
   //\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
 \r
   if (MatchGuid == NULL) {\r
-    return NULL;\r
+    return EFI_NOT_FOUND;\r
   }\r
   \r
   GuidTableIdx = MatchGuid - PeiPcdDb->Init.GuidTable;\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 (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
       }\r
     }\r
   }\r
 \r
-  return NULL;\r
+  return EFI_NOT_FOUND;\r
 \r
 }\r
 \r
 \r
 }\r
 \r
index 01fe0151bf302591e9f5135c643a5ae7adbc261b..8d03d9c2b190ae4b6427d78bac6f9bf5a820424e 100644 (file)
@@ -46,12 +46,27 @@ PeiRegisterCallBackWorker (
 \r
   if (Guid == NULL) {\r
     TokenNumber = ExTokenNumber;\r
 \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
     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
     ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
   }\r
 \r
+\r
   LocalTokenNumber = GetPcdDatabase()->Init.LocalTokenNumberTable[TokenNumber];\r
 \r
   ASSERT ((LocalTokenNumber & PCD_TYPE_HII) == 0);\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
   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
   if (Guid == NULL)\r
     ASSERT (TokenNumber < PEI_LOCAL_TOKEN_NUMBER);\r
 \r
@@ -287,6 +309,13 @@ SetWorker (
   UINTN               Offset;\r
   VOID                *InternalData;\r
 \r
   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
   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
   // 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
   }\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
   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
   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
   \r
   ASSERT (GetSize == Size || GetSize == 0);\r
 \r
@@ -464,16 +500,14 @@ GetWorker (
         return (VOID *) ((UINT8 *) Data + VariableHead->Offset);\r
       } else {\r
         //\r
         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
       }\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
 \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
 // 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
 \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
   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
   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
 #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
 \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_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
 \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_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
 \r
 typedef \r
 VOID\r
index 011d3df60342ef60f24964d81cd14c1d1eb87420..eaa692d25e8bd2eef40456ef88872832c2268534 100644 (file)
@@ -33,9 +33,10 @@ typedef struct {
 \r
 \r
 typedef struct {\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
+  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
 } VARIABLE_HEAD  ;\r
 \r
 \r
@@ -43,6 +44,8 @@ typedef  struct {
   UINT32  Offset;\r
 } VPD_HEAD;\r
 \r
   UINT32  Offset;\r
 } VPD_HEAD;\r
 \r
+typedef UINT16 STRING_HEAD;\r
+\r
 typedef struct {\r
   UINT32 LocalTokenNumber;\r
   UINT16 TokenNumber;\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.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.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 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;\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.FrameworkModulesDocument;\r
 import org.tianocore.FrameworkPlatformDescriptionDocument;\r
-import org.tianocore.FrameworkPlatformDescriptionDocument.FrameworkPlatformDescription;\r
 import org.tianocore.ModuleSADocument;\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
 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
 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
 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
 \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
     }\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
     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
 \r
     public String getTypeDeclaration () {\r
 \r
@@ -143,9 +213,33 @@ class StringTable {
         return output;\r
     }\r
 \r
         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 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
 \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
         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 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
     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
     }\r
 \r
     public String getTypeDeclaration () {\r
@@ -184,14 +294,12 @@ class SizeTable {
 \r
         Output.add("/* SizeTable */");\r
         Output.add("{");\r
 \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
         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
 \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
 \r
                 str += " /* " + alComments.get(index) + " */"; \r
                 Output.add(str);\r
-                bodyLineNum++;\r
     \r
             }\r
         }\r
     \r
             }\r
         }\r
@@ -208,14 +315,6 @@ class SizeTable {
         return Output;\r
     }\r
 \r
         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
     public int add (Token token) {\r
         int index = len;\r
 \r
@@ -226,18 +325,6 @@ class SizeTable {
         return index;\r
     }\r
     \r
         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
     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 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
     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
         al = new ArrayList<UUID>();\r
         alComments = new ArrayList<String>();\r
         len = 0;\r
-        bodyStart = 0;\r
         bodyLineNum = 0;\r
     }\r
 \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
         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
     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
 \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
         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
 \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
                 str += ",";\r
             }\r
             Output.add(str);\r
@@ -324,23 +427,25 @@ class GuidTable {
         return Output;\r
     }\r
 \r
         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
     public int add (UUID uuid, String name) {\r
-        int index = len;\r
         //\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
         //\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
         len++; \r
         al.add(uuid);\r
+        alComments.add(name);\r
 \r
 \r
-        return index;\r
+        //\r
+        // Return the previous Table Index\r
+        //\r
+        return len - 1;\r
     }\r
 \r
     public int getTableLen () {\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 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
 \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
         len = 0;\r
     }\r
 \r
@@ -371,13 +472,49 @@ class SkuIdTable {
     }\r
 \r
     private int getSize () {\r
     }\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
     }\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
     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
 \r
         Output.add("/* SkuIdTable */");\r
         Output.add("{");\r
-        bodyStart = 2;\r
 \r
         if (al.size() == 0) {\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
         }\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
 \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
             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
                    str += ", ";\r
                }\r
             }\r
 \r
             Output.add(str);\r
-            bodyLineNum++;\r
 \r
         }\r
 \r
 \r
         }\r
 \r
@@ -423,6 +558,31 @@ class SkuIdTable {
     public int add (Token token) {\r
 \r
         int index;\r
     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
 \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
         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
     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
         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
 \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 ArrayList<String>    alComment;\r
     private String               phase;\r
     private int                  len;\r
-    private int                   bodyStart;\r
     private int                   bodyLineNum;\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
     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
         bodyLineNum = 0;\r
         len = 0;\r
     }\r
@@ -574,14 +750,32 @@ class ExMapTable {
              + String.format(PcdDatabase.ExTokenNumber, phase, al.size());\r
     }\r
 \r
              + 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 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
     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
 \r
         Output.add("/* ExMapTable */");\r
         Output.add("{");\r
-        bodyStart = 2;\r
-\r
         if (al.size() == 0) {\r
         if (al.size() == 0) {\r
-            Output.add("{0, 0, 0}");\r
+            Output.add("\t{0, 0, 0}");\r
         }\r
         \r
         int index;\r
         }\r
         \r
         int index;\r
@@ -603,11 +795,11 @@ class ExMapTable {
 \r
             ExTriplet e = (ExTriplet)al.get(index);\r
 \r
 \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 += 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
 \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
         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
 }\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 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
 \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
     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 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
     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
 \r
     private StringTable stringTable;\r
     private GuidTable   guidTable;\r
@@ -678,6 +905,12 @@ class PcdDatabase {
     private String phase;\r
     private int assignedTokenNumber;\r
     \r
     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
     //\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
     // 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
 \r
     private String hString;\r
     private String cString;\r
@@ -697,7 +930,7 @@ class PcdDatabase {
                     - getAlignmentSize(a);\r
         }\r
     }\r
                     - getAlignmentSize(a);\r
         }\r
     }\r
-\r
+    \r
     public PcdDatabase (ArrayList<Token> alTokens, String exePhase, int startLen) {\r
        phase = exePhase;\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
        sizeTable = new SizeTable(phase);\r
        exMapTable = new ExMapTable(phase); \r
 \r
-       assignedTokenNumber = startLen;\r
+       assignedTokenNumber = startLen + 1;\r
        this.alTokens = alTokens;\r
     }\r
 \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
     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
         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
     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
         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
      }\r
 \r
     public String getCString () {\r
@@ -762,6 +1013,224 @@ class PcdDatabase {
     public String getHString () {\r
         return hString;\r
     }\r
     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
 \r
      public void genCode () \r
         throws EntityException {\r
@@ -916,10 +1385,13 @@ class PcdDatabase {
 \r
     }\r
 \r
 \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
         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
             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
     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
     }\r
 \r
     private String getDataTypeDeclarationForSkuEnabled (Token token) {\r
@@ -1043,6 +1515,10 @@ class PcdDatabase {
 \r
     }\r
 \r
 \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
     private String getDataTypeInstantiation (Token token) {\r
 \r
         if (token.datumType == Token.DATUM_TYPE.POINTER) {\r
@@ -1052,7 +1528,82 @@ class PcdDatabase {
         }\r
     }\r
 \r
         }\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
 \r
+        return String.format("%s             %s;\r\n", typeStr, cName);\r
+    }\r
+    \r
     private String getDataTypeDeclaration (Token token) {\r
 \r
         String typeStr = "";\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
     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
+        \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
     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
 \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
                                             + 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
 \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
                                       + PcdDatabase.getPcdDxeDatabaseDefinitions();\r
-        dbManager.PcdDxeCString   = pcdDxeDatabase.getCString();\r
+        MemoryDatabaseManager.PcdDxeCString   = pcdDxeDatabase.getCString();\r
     }\r
 \r
     /**\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.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 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.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
 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
     **/\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
         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
         //\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
                                                               null,\r
                                                               null,\r
                                                               null,\r
                                                               "IA32",\r
                                                               null,\r
-                                                              false,\r
+                                                              true,\r
                                                               nameArray);\r
         autogenAction.execute();\r
 \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
 **/\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.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Comparator;\r
 import java.util.HashMap;\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 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
 \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
     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
         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
           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
     **/\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
         int                     usageInstanceIndex  =   0;\r
         int                     index               =   0;\r
         ArrayList               tokenArrayList      =   getDynamicRecordArray();\r
@@ -185,10 +179,30 @@ public class MemoryDatabaseManager {
                 }\r
             }\r
 \r
                 }\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
             //\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
             }\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 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
 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
         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
     /**\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
         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
 \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
       @return string of datum type.\r
     **/\r
+\r
     public static String getAutogendatumTypeString(DATUM_TYPE datumType) {\r
         switch (datumType) {\r
         case UINT8:\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
         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
 \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
         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
         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
             case VPD_TYPE:\r
-                return false;\r
+                return true;\r
             case DEFAULT_TYPE:\r
                 return !isValidNullValue(dynamicValue.value);\r
             }\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
 \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
 import org.tianocore.build.pcd.exception.EntityException;\r
 \r
 /**\r
@@ -186,6 +184,23 @@ public class UsageInstance {
         }\r
         return false;\r
     }\r
         }\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
 \r
     /**\r
        Generate autogen string for header file and C code file.\r