BaseTools/Source/Python/AutoGen/GenC.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-)
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
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
© 2016 - 2024 Red Hat, Inc.