]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: Generate macro for the size of PCD value
authorBob Feng <bob.c.feng@intel.com>
Mon, 24 Aug 2015 05:01:38 +0000 (05:01 +0000)
committerlgao4 <lgao4@Edk2>
Mon, 24 Aug 2015 05:01:38 +0000 (05:01 +0000)
PcdLib introduces new APIs to get the size of PCD value.
BaseTools generates those macros in AutoGen code.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Bob Feng <bob.c.feng@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18270 6f19259b-4bc3-4df7-8a09-765794883524

BaseTools/Source/Python/AutoGen/GenC.py

index 3afded6f659cc78f2e34c6ba28a1f22fcd5401c0..381c14b581243c5e5fdc0918fc69cbc198a9bd00 100644 (file)
@@ -733,6 +733,29 @@ def DynExPcdTokenNumberMapping(Info, AutoGenH):
                                     % (Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName, Pcd.TokenCName))\r
                 TokenCNameList.append(TokenCName)\r
 \r
+def GetPcdSize(Pcd):\r
+    if Pcd.DatumType == 'VOID*':\r
+        Value = Pcd.DefaultValue\r
+        if Value in [None, '']:\r
+            return 1\r
+        elif Value[0] == 'L':\r
+            return (len(Value) - 2) * 2\r
+        elif Value[0] == '{':\r
+            return len(Value.split(','))\r
+        else:\r
+            return len(Value) - 1\r
+    if Pcd.DatumType == 'UINT64':\r
+        return 8\r
+    if Pcd.DatumType == 'UINT32':\r
+        return 4\r
+    if Pcd.DatumType == 'UINT16':\r
+        return 2\r
+    if Pcd.DatumType == 'UINT8':\r
+        return 1\r
+    if Pcd.DatumType == 'BOOLEAN':\r
+        return 1\r
+\r
+\r
 ## Create code for module PCDs\r
 #\r
 #   @param      Info        The ModuleAutoGen object\r
@@ -747,6 +770,10 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
     # Write PCDs\r
     #\r
     PcdTokenName = '_PCD_TOKEN_' + Pcd.TokenCName\r
+    PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + Pcd.TokenCName +'_SIZE'\r
+    PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + Pcd.TokenCName\r
+    FixPcdSizeTokenName = '_PCD_SIZE_' + Pcd.TokenCName\r
+    \r
     if Pcd.Type in gDynamicExPcd:\r
         TokenNumber = int(Pcd.TokenValue, 0)\r
         # Add TokenSpaceGuidValue value to PcdTokenName to discriminate the DynamicEx PCDs with \r
@@ -788,7 +815,8 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
     GetModeName = '_PCD_GET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName\r
     SetModeName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_' + Pcd.TokenCName\r
     SetModeStatusName = '_PCD_SET_MODE_' + gDatumSizeStringDatabaseH[Pcd.DatumType] + '_S_' + Pcd.TokenCName\r
-\r
+    GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + Pcd.TokenCName\r
+    \r
     PcdExCNameList  = []\r
     if Pcd.Type in gDynamicExPcd:\r
         if Info.IsLibrary:\r
@@ -805,6 +833,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n')\r
             AutoGenH.Append('// #define %s  %s\n' % (PcdTokenName, PcdExTokenName))\r
             AutoGenH.Append('// #define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
+            AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
             if Pcd.DatumType == 'VOID*':\r
                 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
                 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
@@ -814,6 +843,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
         else:\r
             AutoGenH.Append('#define %s  %s\n' % (PcdTokenName, PcdExTokenName))\r
             AutoGenH.Append('#define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
+            AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
             if Pcd.DatumType == 'VOID*':\r
                 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
                 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
@@ -822,6 +852,7 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 AutoGenH.Append('#define %s(Value)  LibPcdSetEx%sS(&%s, %s, (Value))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
     elif Pcd.Type in gDynamicPcd:\r
         AutoGenH.Append('#define %s  LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))\r
+        AutoGenH.Append('#define %s  LibPcdGetSize(%s)\n' % (GetModeSizeName, PcdTokenName))\r
         if Pcd.DatumType == 'VOID*':\r
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))\r
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
@@ -946,23 +977,43 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             # For unicode, UINT16 array will be generated, so the alignment of unicode is guaranteed.\r
             #\r
             if Unicode:\r
-                AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))\r
                 AutoGenH.Append('#define %s  %s%s\n' %(PcdValueName, Type, PcdVariableName))\r
                 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT16 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
                 AutoGenH.Append('extern %s UINT16 %s%s;\n' %(Const, PcdVariableName, Array))\r
                 AutoGenH.Append('#define %s  %s%s\n' %(GetModeName, Type, PcdVariableName))\r
             else:\r
-                AutoGenH.Append('#define _PCD_PATCHABLE_%s_SIZE %s\n' % (Pcd.TokenCName, Pcd.MaxDatumSize))\r
                 AutoGenH.Append('#define %s  %s%s\n' %(PcdValueName, Type, PcdVariableName))\r
                 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s UINT8 %s%s = %s;\n' % (Const, PcdVariableName, Array, Value))\r
                 AutoGenH.Append('extern %s UINT8 %s%s;\n' %(Const, PcdVariableName, Array))\r
                 AutoGenH.Append('#define %s  %s%s\n' %(GetModeName, Type, PcdVariableName))\r
+                \r
+            PcdDataSize = GetPcdSize(Pcd)\r
+            if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD:\r
+                AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
+                AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,FixPcdSizeTokenName))\r
+            \r
+            if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
+                AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, Pcd.MaxDatumSize))\r
+                AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
+                AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
+                AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))\r
         elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:\r
             AutoGenH.Append('#define %s  %s\n' %(PcdValueName, Value))\r
             AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))\r
             AutoGenH.Append('extern volatile %s  %s  %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
             AutoGenH.Append('#define %s  %s%s\n' % (GetModeName, Type, PcdVariableName))\r
+            \r
+            PcdDataSize = GetPcdSize(Pcd)\r
+            AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
+            \r
+            AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
+            AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
+            AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))\r
         else:\r
+            PcdDataSize = GetPcdSize(Pcd)\r
+            AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
+            AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,FixPcdSizeTokenName))\r
+            \r
             AutoGenH.Append('#define %s  %s\n' %(PcdValueName, Value))\r
             AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))\r
             AutoGenH.Append('extern %s  %s  %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))\r
@@ -990,6 +1041,10 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
     TokenSpaceGuidCName = Pcd.TokenSpaceGuidCName\r
     TokenCName  = Pcd.TokenCName\r
     PcdTokenName = '_PCD_TOKEN_' + TokenCName\r
+    FixPcdSizeTokenName = '_PCD_SIZE_' + Pcd.TokenCName\r
+    PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + Pcd.TokenCName +'_SIZE'\r
+    PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + Pcd.TokenCName\r
+    \r
     #\r
     # Write PCDs\r
     #\r
@@ -1029,6 +1084,7 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
     GetModeName = '_PCD_GET_MODE_' + DatumSize + '_' + TokenCName\r
     SetModeName = '_PCD_SET_MODE_' + DatumSize + '_' + TokenCName\r
     SetModeStatusName = '_PCD_SET_MODE_' + DatumSize + '_S_' + TokenCName\r
+    GetModeSizeName = '_PCD_GET_MODE_SIZE' + '_' + Pcd.TokenCName\r
 \r
     Type = ''\r
     Array = ''\r
@@ -1055,6 +1111,7 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
             AutoGenH.Append('// Disabled the macros, as PcdToken and PcdGet/Set are not allowed in the case that more than one DynamicEx Pcds are different Guids but same CName.\n')\r
             AutoGenH.Append('// #define %s  %s\n' % (PcdTokenName, PcdExTokenName))\r
             AutoGenH.Append('// #define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
+            AutoGenH.Append('// #define %s LibPcdGetExSize(&%s, %s \n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
             if Pcd.DatumType == 'VOID*':\r
                 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
                 AutoGenH.Append('// #define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
@@ -1064,6 +1121,7 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
         else:\r
             AutoGenH.Append('#define %s  %s\n' % (PcdTokenName, PcdExTokenName))\r
             AutoGenH.Append('#define %s  LibPcdGetEx%s(&%s, %s)\n' % (GetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
+            AutoGenH.Append('#define %s LibPcdGetExSize(&%s, %s)\n' % (GetModeSizeName,Pcd.TokenSpaceGuidCName, PcdTokenName))\r
             if Pcd.DatumType == 'VOID*':\r
                 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%s(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
                 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSetEx%sS(&%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, Pcd.TokenSpaceGuidCName, PcdTokenName))\r
@@ -1074,6 +1132,7 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
         AutoGenH.Append('#define _PCD_TOKEN_%s  %dU\n' % (TokenCName, TokenNumber))\r
     if PcdItemType in gDynamicPcd:\r
         AutoGenH.Append('#define %s  LibPcdGet%s(%s)\n' % (GetModeName, DatumSizeLib, PcdTokenName))\r
+        AutoGenH.Append('#define %s  LibPcdGetSize(%s)\n' % (GetModeSizeName, PcdTokenName))\r
         if DatumType == 'VOID*':\r
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSet%s(%s, (SizeOfBuffer), (Buffer))\n' %(SetModeName, DatumSizeLib, PcdTokenName))\r
             AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))\r
@@ -1086,11 +1145,17 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
         AutoGenH.Append('#define %s  %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))\r
         AutoGenH.Append('#define %s(Value)  (%s = (Value))\n' % (SetModeName, PcdVariableName))\r
         AutoGenH.Append('#define %s(Value)  ((%s = (Value)), RETURN_SUCCESS)\n' % (SetModeStatusName, PcdVariableName))\r
+        \r
+        PcdDataSize = GetPcdSize(Pcd)\r
+        AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))\r
+        AutoGenH.Append('#define %s %s\n' % (GetModeSizeName,PatchPcdSizeVariableName))\r
+        AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)\r
+        \r
     if PcdItemType == TAB_PCDS_FIXED_AT_BUILD or PcdItemType == TAB_PCDS_FEATURE_FLAG:\r
         key = ".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName))\r
         \r
         if DatumType == 'VOID*' and Array == '[]':\r
-          DatumType = ['UINT8', 'UINT16'][Pcd.DefaultValue[0] == 'L']\r
+            DatumType = ['UINT8', 'UINT16'][Pcd.DefaultValue[0] == 'L']\r
         AutoGenH.Append('extern const %s _gPcd_FixedAtBuild_%s%s;\n' %(DatumType, TokenCName, Array))\r
         AutoGenH.Append('#define %s  %s_gPcd_FixedAtBuild_%s\n' %(GetModeName, Type, TokenCName))\r
         AutoGenH.Append('//#define %s  ASSERT(FALSE)  // It is not allowed to set value for a FIXED_AT_BUILD PCD\n' % SetModeName)\r
@@ -1098,7 +1163,10 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
         if PcdItemType == TAB_PCDS_FIXED_AT_BUILD and key in Info.ConstPcd:\r
             AutoGenH.Append('#define _PCD_VALUE_%s %s\n' %(TokenCName, Pcd.DefaultValue))\r
         \r
-\r
+        if PcdItemType == TAB_PCDS_FIXED_AT_BUILD:\r
+            PcdDataSize = GetPcdSize(Pcd)\r
+            AutoGenH.Append('#define %s %s\n' % (FixPcdSizeTokenName, PcdDataSize))\r
+            AutoGenH.Append('#define %s %s\n' % (GetModeSizeName,FixPcdSizeTokenName))\r
 \r
 ## Create code for library constructor\r
 #\r