Reviewed-by: Liming Gao <liming....@intel.com>

>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-boun...@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....@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

Reply via email to