Reviewed-by: Liming Gao <[email protected]>
>-----Original Message----- >From: edk2-devel [mailto:[email protected]] On Behalf Of >Yonghong Zhu >Sent: Friday, March 23, 2018 1:58 PM >To: [email protected] >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 <[email protected]> >--- > 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 >[email protected] >https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

