[edk2] [Patch] BaseTools: Fix size override issue for Void* Patchable pcd

Yonghong Zhu posted 1 patch 6 years, 1 month ago
Failed in applying to current master (apply log)
BaseTools/Source/Python/AutoGen/GenC.py | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
[edk2] [Patch] BaseTools: Fix size override issue for Void* Patchable pcd
Posted by Yonghong Zhu 6 years, 1 month ago
when multiple driver link same library, and the drivers override the pcd
to different value in the DSC component section, it cause the pcd size
incorrect.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
---
 BaseTools/Source/Python/AutoGen/GenC.py | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py
index 0509a9f..a895067 100644
--- a/BaseTools/Source/Python/AutoGen/GenC.py
+++ b/BaseTools/Source/Python/AutoGen/GenC.py
@@ -912,10 +912,11 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             TokenCName = PcdItem[0]
             break
     PcdTokenName = '_PCD_TOKEN_' + TokenCName
     PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'
     PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName
+    PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' + TokenCName
     FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName
     FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName
 
     if Pcd.PcdValueFromComm:
         Pcd.DefaultValue = Pcd.PcdValueFromComm
@@ -1159,10 +1160,11 @@ def CreateModulePcdCode(Info, AutoGenC, AutoGenH, Pcd):
             if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
                 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, Pcd.MaxDatumSize))
                 AutoGenH.Append('#define %s  %s \n' % (GetModeSizeName,PatchPcdSizeVariableName))
                 AutoGenH.Append('extern UINTN %s; \n' % PatchPcdSizeVariableName)
                 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s = %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))
+                AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED const UINTN %s = %s;\n' % (PatchPcdMaxSizeVariable,Pcd.MaxDatumSize))
         elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
             AutoGenH.Append('#define %s  %s\n' %(PcdValueName, Value))
             AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
             AutoGenH.Append('extern volatile %s  %s  %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
             AutoGenH.Append('#define %s  %s%s\n' % (GetModeName, Type, PcdVariableName))
@@ -1210,10 +1212,11 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
             break
     PcdTokenName = '_PCD_TOKEN_' + TokenCName
     FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName
     PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'
     PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName
+    PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' + TokenCName
     FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName
 
     if Pcd.PcdValueFromComm:
         Pcd.DefaultValue = Pcd.PcdValueFromComm
     #
@@ -1316,26 +1319,27 @@ def CreateLibraryPcdCode(Info, AutoGenC, AutoGenH, Pcd):
                 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))
             else:
                 AutoGenH.Append('#define %s(Value)  LibPcdSet%s(%s, (Value))\n' % (SetModeName, DatumSizeLib, PcdTokenName))
                 AutoGenH.Append('#define %s(Value)  LibPcdSet%sS(%s, (Value))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))
     if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:
+        GetModeMaxSizeName = '_PCD_GET_MODE_MAXSIZE' + '_' + TokenCName
         PcdVariableName = '_gPcd_' + gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' + TokenCName
         if DatumType not in ['UINT8', 'UINT16', 'UINT32', 'UINT64', 'BOOLEAN']:
-            ArraySize = int(Pcd.MaxDatumSize, 0)
-            if Pcd.DefaultValue[0] == 'L':
-                ArraySize = ArraySize / 2
-            Array = '[%d]' % ArraySize
-            DatumType = ['UINT8', 'UINT16'][Pcd.DefaultValue[0] == 'L']
+            if DatumType == 'VOID*' and Array == '[]':
+                DatumType = ['UINT8', 'UINT16'][Pcd.DefaultValue[0] == 'L']
+            else:
+                DatumType = 'UINT8'
             AutoGenH.Append('extern %s _gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array))
         else:
             AutoGenH.Append('extern volatile  %s  %s%s;\n' % (DatumType, PcdVariableName, Array))
         AutoGenH.Append('#define %s  %s_gPcd_BinaryPatch_%s\n' %(GetModeName, Type, TokenCName))
         PcdDataSize = GetPcdSize(Pcd)
         if Pcd.DatumType not in ['UINT8', 'UINT16', 'UINT32', 'UINT64', 'BOOLEAN']:
-            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &_gPcd_BinaryPatch_Size_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName, TokenCName, TokenCName))
-            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &_gPcd_BinaryPatch_Size_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName, TokenCName, TokenCName))
-            AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, Pcd.MaxDatumSize))
+            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))
+            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)  LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &%s, %s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName, PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))
+            AutoGenH.Append('#define %s %s\n' % (GetModeMaxSizeName,PatchPcdMaxSizeVariable))
+            AutoGenH.Append('extern const UINTN %s; \n' % PatchPcdMaxSizeVariable)
         else:
             AutoGenH.Append('#define %s(Value)  (%s = (Value))\n' % (SetModeName, PcdVariableName))
             AutoGenH.Append('#define %s(Value)  ((%s = (Value)), RETURN_SUCCESS)\n' % (SetModeStatusName, PcdVariableName))
             AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName, PcdDataSize))
 
-- 
2.6.1.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [Patch] BaseTools: Fix size override issue for Void* Patchable pcd
Posted by Gao, Liming 6 years ago
Reviewed-by: Liming Gao <liming.gao@intel.com>

>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>Yonghong Zhu
>Sent: Friday, March 23, 2018 1:58 PM
>To: edk2-devel@lists.01.org
>Subject: [edk2] [Patch] BaseTools: Fix size override issue for Void* Patchable
>pcd
>
>when multiple driver link same library, and the drivers override the pcd
>to different value in the DSC component section, it cause the pcd size
>incorrect.
>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
>---
> BaseTools/Source/Python/AutoGen/GenC.py | 20 ++++++++++++--------
> 1 file changed, 12 insertions(+), 8 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/GenC.py
>b/BaseTools/Source/Python/AutoGen/GenC.py
>index 0509a9f..a895067 100644
>--- a/BaseTools/Source/Python/AutoGen/GenC.py
>+++ b/BaseTools/Source/Python/AutoGen/GenC.py
>@@ -912,10 +912,11 @@ def CreateModulePcdCode(Info, AutoGenC,
>AutoGenH, Pcd):
>             TokenCName = PcdItem[0]
>             break
>     PcdTokenName = '_PCD_TOKEN_' + TokenCName
>     PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'
>     PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName
>+    PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' +
>TokenCName
>     FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName
>     FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName
>
>     if Pcd.PcdValueFromComm:
>         Pcd.DefaultValue = Pcd.PcdValueFromComm
>@@ -1159,10 +1160,11 @@ def CreateModulePcdCode(Info, AutoGenC,
>AutoGenH, Pcd):
>             if Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
>                 AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName,
>Pcd.MaxDatumSize))
>                 AutoGenH.Append('#define %s  %s \n' %
>(GetModeSizeName,PatchPcdSizeVariableName))
>                 AutoGenH.Append('extern UINTN %s; \n' %
>PatchPcdSizeVariableName)
>                 AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED UINTN %s
>= %s;\n' % (PatchPcdSizeVariableName,PcdDataSize))
>+                AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED const
>UINTN %s = %s;\n' % (PatchPcdMaxSizeVariable,Pcd.MaxDatumSize))
>         elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
>             AutoGenH.Append('#define %s  %s\n' %(PcdValueName, Value))
>             AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const,
>Pcd.DatumType, PcdVariableName, PcdValueName))
>             AutoGenH.Append('extern volatile %s  %s  %s%s;\n' % (Const,
>Pcd.DatumType, PcdVariableName, Array))
>             AutoGenH.Append('#define %s  %s%s\n' % (GetModeName, Type,
>PcdVariableName))
>@@ -1210,10 +1212,11 @@ def CreateLibraryPcdCode(Info, AutoGenC,
>AutoGenH, Pcd):
>             break
>     PcdTokenName = '_PCD_TOKEN_' + TokenCName
>     FixPcdSizeTokenName = '_PCD_SIZE_' + TokenCName
>     PatchPcdSizeTokenName = '_PCD_PATCHABLE_' + TokenCName +'_SIZE'
>     PatchPcdSizeVariableName = '_gPcd_BinaryPatch_Size_' + TokenCName
>+    PatchPcdMaxSizeVariable = '_gPcd_BinaryPatch_MaxSize_' +
>TokenCName
>     FixedPcdSizeVariableName = '_gPcd_FixedAtBuild_Size_' + TokenCName
>
>     if Pcd.PcdValueFromComm:
>         Pcd.DefaultValue = Pcd.PcdValueFromComm
>     #
>@@ -1316,26 +1319,27 @@ def CreateLibraryPcdCode(Info, AutoGenC,
>AutoGenH, Pcd):
>                 AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)
>LibPcdSet%sS(%s, (SizeOfBuffer), (Buffer))\n' % (SetModeStatusName,
>DatumSizeLib, PcdTokenName))
>             else:
>                 AutoGenH.Append('#define %s(Value)  LibPcdSet%s(%s, (Value))\n' %
>(SetModeName, DatumSizeLib, PcdTokenName))
>                 AutoGenH.Append('#define %s(Value)  LibPcdSet%sS(%s,
>(Value))\n' % (SetModeStatusName, DatumSizeLib, PcdTokenName))
>     if PcdItemType == TAB_PCDS_PATCHABLE_IN_MODULE:
>+        GetModeMaxSizeName = '_PCD_GET_MODE_MAXSIZE' + '_' +
>TokenCName
>         PcdVariableName = '_gPcd_' +
>gItemTypeStringDatabase[TAB_PCDS_PATCHABLE_IN_MODULE] + '_' +
>TokenCName
>         if DatumType not in ['UINT8', 'UINT16', 'UINT32', 'UINT64', 'BOOLEAN']:
>-            ArraySize = int(Pcd.MaxDatumSize, 0)
>-            if Pcd.DefaultValue[0] == 'L':
>-                ArraySize = ArraySize / 2
>-            Array = '[%d]' % ArraySize
>-            DatumType = ['UINT8', 'UINT16'][Pcd.DefaultValue[0] == 'L']
>+            if DatumType == 'VOID*' and Array == '[]':
>+                DatumType = ['UINT8', 'UINT16'][Pcd.DefaultValue[0] == 'L']
>+            else:
>+                DatumType = 'UINT8'
>             AutoGenH.Append('extern %s
>_gPcd_BinaryPatch_%s%s;\n' %(DatumType, TokenCName, Array))
>         else:
>             AutoGenH.Append('extern volatile  %s  %s%s;\n' % (DatumType,
>PcdVariableName, Array))
>
>AutoGenH.Append('#define %s  %s_gPcd_BinaryPatch_%s\n' %(GetModeNa
>me, Type, TokenCName))
>         PcdDataSize = GetPcdSize(Pcd)
>         if Pcd.DatumType not in ['UINT8', 'UINT16', 'UINT32', 'UINT64',
>'BOOLEAN']:
>-            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)
>LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s,
>&_gPcd_BinaryPatch_Size_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE,
>(SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName, TokenCName,
>TokenCName))
>-            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)
>LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s,
>&_gPcd_BinaryPatch_Size_%s, (UINTN)_PCD_PATCHABLE_%s_SIZE,
>(SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName,
>TokenCName, TokenCName))
>-            AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName,
>Pcd.MaxDatumSize))
>+            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)
>LibPatchPcdSetPtrAndSize((VOID *)_gPcd_BinaryPatch_%s, &%s, %s,
>(SizeOfBuffer), (Buffer))\n' % (SetModeName, TokenCName,
>PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))
>+            AutoGenH.Append('#define %s(SizeOfBuffer, Buffer)
>LibPatchPcdSetPtrAndSizeS((VOID *)_gPcd_BinaryPatch_%s, &%s, %s,
>(SizeOfBuffer), (Buffer))\n' % (SetModeStatusName, TokenCName,
>PatchPcdSizeVariableName, PatchPcdMaxSizeVariable))
>+            AutoGenH.Append('#define %s %s\n' %
>(GetModeMaxSizeName,PatchPcdMaxSizeVariable))
>+            AutoGenH.Append('extern const UINTN %s; \n' %
>PatchPcdMaxSizeVariable)
>         else:
>             AutoGenH.Append('#define %s(Value)  (%s = (Value))\n' %
>(SetModeName, PcdVariableName))
>             AutoGenH.Append('#define %s(Value)  ((%s = (Value)),
>RETURN_SUCCESS)\n' % (SetModeStatusName, PcdVariableName))
>             AutoGenH.Append('#define %s %s\n' % (PatchPcdSizeTokenName,
>PcdDataSize))
>
>--
>2.6.1.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel