* [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
@ 2018-07-05 7:27 Yonghong Zhu
2018-07-06 1:55 ` Gao, Liming
0 siblings, 1 reply; 4+ messages in thread
From: Yonghong Zhu @ 2018-07-05 7:27 UTC (permalink / raw)
To: edk2-devel; +Cc: Yunhua Feng, Liming Gao
From: Yunhua Feng <yunhuax.feng@intel.com>
V2: limit the PCD used in the [Depex] section should be used in the module
The PCD item used in INF [Depex] section must be defined as FixedAtBuild
type and VOID* datum type, and the size of the PCD must be 16 bytes.
Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=443
Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
---
BaseTools/Source/Python/AutoGen/AutoGen.py | 31 ++++++++++++++++++++---
BaseTools/Source/Python/AutoGen/GenDepex.py | 6 +++++
BaseTools/Source/Python/Workspace/InfBuildData.py | 15 +++++++----
BaseTools/Source/Python/build/BuildReport.py | 6 +++++
4 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py b/BaseTools/Source/Python/AutoGen/AutoGen.py
index 6d76afd..7d4539e 100644
--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
@@ -2745,10 +2745,14 @@ class ModuleAutoGen(AutoGen):
## Store the FixedAtBuild Pcds
#
self._FixedAtBuildPcds = []
self.ConstPcd = {}
+ ##Store the VOID* type FixedAtBuild Pcds
+ #
+ self._FixedPcdVoidTypeDict = {}
+
def __repr__(self):
return "%s [%s]" % (self.MetaFile, self.Arch)
# Get FixedAtBuild Pcds of this Module
def _GetFixedAtBuildPcds(self):
@@ -2758,11 +2762,20 @@ class ModuleAutoGen(AutoGen):
if Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
continue
if Pcd not in self._FixedAtBuildPcds:
self._FixedAtBuildPcds.append(Pcd)
- return self._FixedAtBuildPcds
+ return self._FixedAtBuildPcds
+
+ def _GetFixedAtBuildVoidTypePcds(self):
+ if self._FixedPcdVoidTypeDict:
+ return self._FixedPcdVoidTypeDict
+ for Pcd in self.ModulePcdList:
+ if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType == TAB_VOID:
+ if '{}.{}'.format(Pcd.TokenSpaceGuidCName, Pcd.TokenCName) not in self._FixedPcdVoidTypeDict:
+ self._FixedPcdVoidTypeDict['{}.{}'.format(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)] = Pcd.DefaultValue
+ return self._FixedPcdVoidTypeDict
def _GetUniqueBaseName(self):
BaseName = self.Name
for Module in self.PlatformInfo.ModuleAutoGenList:
if Module.MetaFile == self.MetaFile:
@@ -3029,11 +3042,11 @@ class ModuleAutoGen(AutoGen):
self._DepexDict = {}
if self.DxsFile or self.IsLibrary or TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:
return self._DepexDict
self._DepexDict[self.ModuleType] = []
-
+ self._GetFixedAtBuildVoidTypePcds()
for ModuleType in self._DepexDict:
DepexList = self._DepexDict[ModuleType]
#
# Append depex from dependent libraries, if not "BEFORE", "AFTER" expresion
#
@@ -3041,11 +3054,22 @@ class ModuleAutoGen(AutoGen):
Inherited = False
for D in M.Depex[self.Arch, ModuleType]:
if DepexList != []:
DepexList.append('AND')
DepexList.append('(')
- DepexList.extend(D)
+ #replace D with value if D is FixedAtBuild PCD
+ NewList = []
+ for item in D:
+ if '.' not in item:
+ NewList.append(item)
+ else:
+ if item not in self._FixedPcdVoidTypeDict:
+ EdkLogger.error("build", FORMAT_INVALID, "{} used in [Depex] section should be used as FixedAtBuild type and VOID* datum type in the module.".format(item))
+ else:
+ Value = self._FixedPcdVoidTypeDict[item]
+ NewList.append(Value)
+ DepexList.extend(NewList)
if DepexList[-1] == 'END': # no need of a END at this time
DepexList.pop()
DepexList.append(')')
Inherited = True
if Inherited:
@@ -4409,10 +4433,11 @@ class ModuleAutoGen(AutoGen):
BuildOptionIncPathList = property(_GetBuildOptionIncPathList)
BuildCommand = property(_GetBuildCommand)
FixedAtBuildPcds = property(_GetFixedAtBuildPcds)
UniqueBaseName = property(_GetUniqueBaseName)
+ FixedVoidTypePcds = property(_GetFixedAtBuildVoidTypePcds)
# This acts like the main() function for the script, unless it is 'import'ed into another script.
if __name__ == '__main__':
pass
diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py b/BaseTools/Source/Python/AutoGen/GenDepex.py
index d3b1eae..c12b613 100644
--- a/BaseTools/Source/Python/AutoGen/GenDepex.py
+++ b/BaseTools/Source/Python/AutoGen/GenDepex.py
@@ -20,10 +20,12 @@ from Common.LongFilePathSupport import OpenLongFilePath as open
from io import BytesIO
from struct import pack
from Common.BuildToolError import *
from Common.Misc import SaveFileOnChange
from Common.Misc import GuidStructureStringToGuidString
+from Common.Misc import GuidStructureByteArrayToGuidString
+from Common.Misc import GuidStringToGuidStructureString
from Common import EdkLogger as EdkLogger
from Common.BuildVersion import gBUILD_VERSION
from Common.DataType import *
## Regular expression for matching "DEPENDENCY_START ... DEPENDENCY_END"
@@ -331,10 +333,14 @@ class DependencyExpression:
# @retval array The byte array representing the GUID value
#
def GetGuidValue(self, Guid):
GuidValueString = Guid.replace("{", "").replace("}", "").replace(" ", "")
GuidValueList = GuidValueString.split(",")
+ if len(GuidValueList) != 11 and len(GuidValueList) == 16:
+ GuidValueString = GuidStringToGuidStructureString(GuidStructureByteArrayToGuidString(Guid))
+ GuidValueString = GuidValueString.replace("{", "").replace("}", "").replace(" ", "")
+ GuidValueList = GuidValueString.split(",")
if len(GuidValueList) != 11:
EdkLogger.error("GenDepex", PARSER_ERROR, "Invalid GUID value string or opcode: %s" % Guid)
return pack("1I2H8B", *(int(value, 16) for value in GuidValueList))
## Save the binary form of dependency expression in file
diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py b/BaseTools/Source/Python/Workspace/InfBuildData.py
index 165e03f..efb3de1 100644
--- a/BaseTools/Source/Python/Workspace/InfBuildData.py
+++ b/BaseTools/Source/Python/Workspace/InfBuildData.py
@@ -909,16 +909,21 @@ class InfBuildData(ModuleBuildClassObject):
if Module is None:
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "Module is not found in active platform",
ExtraData=Token, File=self.MetaFile, Line=Record[-1])
DepexList.append(Module.Guid)
else:
- # get the GUID value now
- Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)
- if Value is None:
- Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
+ # it use the Fixed PCD format
+ if '.' in Token:
+ Value = Token
+ else:
+ # get the GUID value now
+ Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)
if Value is None:
- Value = GuidValue(Token, self.Packages, self.MetaFile.Path)
+ Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
+ if Value is None:
+ Value = GuidValue(Token, self.Packages, self.MetaFile.Path)
+
if Value is None:
PackageList = "\n\t".join(str(P) for P in self.Packages)
EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,
"Value of [%s] is not found in" % Token,
ExtraData=PackageList, File=self.MetaFile, Line=Record[-1])
diff --git a/BaseTools/Source/Python/build/BuildReport.py b/BaseTools/Source/Python/build/BuildReport.py
index 897167c..0dbbba0 100644
--- a/BaseTools/Source/Python/build/BuildReport.py
+++ b/BaseTools/Source/Python/build/BuildReport.py
@@ -278,10 +278,16 @@ class DepexParser(object):
GuidValue = GuidStructureStringToGuidString(Package.Ppis[Ppi])
self._GuidDb[GuidValue.upper()] = Ppi
for Guid in Package.Guids:
GuidValue = GuidStructureStringToGuidString(Package.Guids[Guid])
self._GuidDb[GuidValue.upper()] = Guid
+ for Ma in Pa.ModuleAutoGenList:
+ for Pcd in Ma.FixedVoidTypePcds:
+ PcdValue = Ma.FixedVoidTypePcds[Pcd]
+ if len(PcdValue.split(',')) == 16:
+ GuidValue = GuidStructureByteArrayToGuidString(PcdValue)
+ self._GuidDb[GuidValue.upper()] = Pcd
##
# Parse the binary dependency expression files.
#
# This function parses the binary dependency expression file and translate it
--
2.6.1.windows.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
2018-07-05 7:27 [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section Yonghong Zhu
@ 2018-07-06 1:55 ` Gao, Liming
2018-07-06 1:58 ` Zhu, Yonghong
0 siblings, 1 reply; 4+ messages in thread
From: Gao, Liming @ 2018-07-06 1:55 UTC (permalink / raw)
To: Zhu, Yonghong, edk2-devel@lists.01.org
Yonghong:
On error handling, could you check VOID* PCD length to make sure its size is 16 when it is used in [Depex] section?
Thanks
Liming
>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>Yonghong Zhu
>Sent: Thursday, July 05, 2018 3:28 PM
>To: edk2-devel@lists.01.org
>Cc: Gao, Liming <liming.gao@intel.com>
>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in
>the [DEPEX] section
>
>From: Yunhua Feng <yunhuax.feng@intel.com>
>
>V2: limit the PCD used in the [Depex] section should be used in the module
>
>The PCD item used in INF [Depex] section must be defined as FixedAtBuild
>type and VOID* datum type, and the size of the PCD must be 16 bytes.
>
>Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=443
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
>---
> BaseTools/Source/Python/AutoGen/AutoGen.py | 31
>++++++++++++++++++++---
> BaseTools/Source/Python/AutoGen/GenDepex.py | 6 +++++
> BaseTools/Source/Python/Workspace/InfBuildData.py | 15 +++++++----
> BaseTools/Source/Python/build/BuildReport.py | 6 +++++
> 4 files changed, 50 insertions(+), 8 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
>b/BaseTools/Source/Python/AutoGen/AutoGen.py
>index 6d76afd..7d4539e 100644
>--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
>@@ -2745,10 +2745,14 @@ class ModuleAutoGen(AutoGen):
> ## Store the FixedAtBuild Pcds
> #
> self._FixedAtBuildPcds = []
> self.ConstPcd = {}
>
>+ ##Store the VOID* type FixedAtBuild Pcds
>+ #
>+ self._FixedPcdVoidTypeDict = {}
>+
> def __repr__(self):
> return "%s [%s]" % (self.MetaFile, self.Arch)
>
> # Get FixedAtBuild Pcds of this Module
> def _GetFixedAtBuildPcds(self):
>@@ -2758,11 +2762,20 @@ class ModuleAutoGen(AutoGen):
> if Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
> continue
> if Pcd not in self._FixedAtBuildPcds:
> self._FixedAtBuildPcds.append(Pcd)
>
>- return self._FixedAtBuildPcds
>+ return self._FixedAtBuildPcds
>+
>+ def _GetFixedAtBuildVoidTypePcds(self):
>+ if self._FixedPcdVoidTypeDict:
>+ return self._FixedPcdVoidTypeDict
>+ for Pcd in self.ModulePcdList:
>+ if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType ==
>TAB_VOID:
>+ if '{}.{}'.format(Pcd.TokenSpaceGuidCName, Pcd.TokenCName) not
>in self._FixedPcdVoidTypeDict:
>+
>self._FixedPcdVoidTypeDict['{}.{}'.format(Pcd.TokenSpaceGuidCName,
>Pcd.TokenCName)] = Pcd.DefaultValue
>+ return self._FixedPcdVoidTypeDict
>
> def _GetUniqueBaseName(self):
> BaseName = self.Name
> for Module in self.PlatformInfo.ModuleAutoGenList:
> if Module.MetaFile == self.MetaFile:
>@@ -3029,11 +3042,11 @@ class ModuleAutoGen(AutoGen):
> self._DepexDict = {}
> if self.DxsFile or self.IsLibrary or TAB_DEPENDENCY_EXPRESSION_FILE
>in self.FileTypes:
> return self._DepexDict
>
> self._DepexDict[self.ModuleType] = []
>-
>+ self._GetFixedAtBuildVoidTypePcds()
> for ModuleType in self._DepexDict:
> DepexList = self._DepexDict[ModuleType]
> #
> # Append depex from dependent libraries, if not "BEFORE", "AFTER"
>expresion
> #
>@@ -3041,11 +3054,22 @@ class ModuleAutoGen(AutoGen):
> Inherited = False
> for D in M.Depex[self.Arch, ModuleType]:
> if DepexList != []:
> DepexList.append('AND')
> DepexList.append('(')
>- DepexList.extend(D)
>+ #replace D with value if D is FixedAtBuild PCD
>+ NewList = []
>+ for item in D:
>+ if '.' not in item:
>+ NewList.append(item)
>+ else:
>+ if item not in self._FixedPcdVoidTypeDict:
>+ EdkLogger.error("build", FORMAT_INVALID, "{} used in
>[Depex] section should be used as FixedAtBuild type and VOID* datum type
>in the module.".format(item))
>+ else:
>+ Value = self._FixedPcdVoidTypeDict[item]
>+ NewList.append(Value)
>+ DepexList.extend(NewList)
> if DepexList[-1] == 'END': # no need of a END at this time
> DepexList.pop()
> DepexList.append(')')
> Inherited = True
> if Inherited:
>@@ -4409,10 +4433,11 @@ class ModuleAutoGen(AutoGen):
> BuildOptionIncPathList = property(_GetBuildOptionIncPathList)
> BuildCommand = property(_GetBuildCommand)
>
> FixedAtBuildPcds = property(_GetFixedAtBuildPcds)
> UniqueBaseName = property(_GetUniqueBaseName)
>+ FixedVoidTypePcds = property(_GetFixedAtBuildVoidTypePcds)
>
> # This acts like the main() function for the script, unless it is 'import'ed into
>another script.
> if __name__ == '__main__':
> pass
>
>diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py
>b/BaseTools/Source/Python/AutoGen/GenDepex.py
>index d3b1eae..c12b613 100644
>--- a/BaseTools/Source/Python/AutoGen/GenDepex.py
>+++ b/BaseTools/Source/Python/AutoGen/GenDepex.py
>@@ -20,10 +20,12 @@ from Common.LongFilePathSupport import
>OpenLongFilePath as open
> from io import BytesIO
> from struct import pack
> from Common.BuildToolError import *
> from Common.Misc import SaveFileOnChange
> from Common.Misc import GuidStructureStringToGuidString
>+from Common.Misc import GuidStructureByteArrayToGuidString
>+from Common.Misc import GuidStringToGuidStructureString
> from Common import EdkLogger as EdkLogger
> from Common.BuildVersion import gBUILD_VERSION
> from Common.DataType import *
>
> ## Regular expression for matching "DEPENDENCY_START ...
>DEPENDENCY_END"
>@@ -331,10 +333,14 @@ class DependencyExpression:
> # @retval array The byte array representing the GUID value
> #
> def GetGuidValue(self, Guid):
> GuidValueString = Guid.replace("{", "").replace("}", "").replace(" ", "")
> GuidValueList = GuidValueString.split(",")
>+ if len(GuidValueList) != 11 and len(GuidValueList) == 16:
>+ GuidValueString =
>GuidStringToGuidStructureString(GuidStructureByteArrayToGuidString(Guid))
>+ GuidValueString = GuidValueString.replace("{", "").replace("}",
>"").replace(" ", "")
>+ GuidValueList = GuidValueString.split(",")
> if len(GuidValueList) != 11:
> EdkLogger.error("GenDepex", PARSER_ERROR, "Invalid GUID value
>string or opcode: %s" % Guid)
> return pack("1I2H8B", *(int(value, 16) for value in GuidValueList))
>
> ## Save the binary form of dependency expression in file
>diff --git a/BaseTools/Source/Python/Workspace/InfBuildData.py
>b/BaseTools/Source/Python/Workspace/InfBuildData.py
>index 165e03f..efb3de1 100644
>--- a/BaseTools/Source/Python/Workspace/InfBuildData.py
>+++ b/BaseTools/Source/Python/Workspace/InfBuildData.py
>@@ -909,16 +909,21 @@ class InfBuildData(ModuleBuildClassObject):
> if Module is None:
> EdkLogger.error('build', RESOURCE_NOT_AVAILABLE, "Module
>is not found in active platform",
> ExtraData=Token, File=self.MetaFile, Line=Record[-1])
> DepexList.append(Module.Guid)
> else:
>- # get the GUID value now
>- Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)
>- if Value is None:
>- Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
>+ # it use the Fixed PCD format
>+ if '.' in Token:
>+ Value = Token
>+ else:
>+ # get the GUID value now
>+ Value = ProtocolValue(Token, self.Packages,
>self.MetaFile.Path)
> if Value is None:
>- Value = GuidValue(Token, self.Packages, self.MetaFile.Path)
>+ Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
>+ if Value is None:
>+ Value = GuidValue(Token, self.Packages,
>self.MetaFile.Path)
>+
> if Value is None:
> PackageList = "\n\t".join(str(P) for P in self.Packages)
> EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,
> "Value of [%s] is not found in" % Token,
> ExtraData=PackageList, File=self.MetaFile,
>Line=Record[-1])
>diff --git a/BaseTools/Source/Python/build/BuildReport.py
>b/BaseTools/Source/Python/build/BuildReport.py
>index 897167c..0dbbba0 100644
>--- a/BaseTools/Source/Python/build/BuildReport.py
>+++ b/BaseTools/Source/Python/build/BuildReport.py
>@@ -278,10 +278,16 @@ class DepexParser(object):
> GuidValue = GuidStructureStringToGuidString(Package.Ppis[Ppi])
> self._GuidDb[GuidValue.upper()] = Ppi
> for Guid in Package.Guids:
> GuidValue = GuidStructureStringToGuidString(Package.Guids[Guid])
> self._GuidDb[GuidValue.upper()] = Guid
>+ for Ma in Pa.ModuleAutoGenList:
>+ for Pcd in Ma.FixedVoidTypePcds:
>+ PcdValue = Ma.FixedVoidTypePcds[Pcd]
>+ if len(PcdValue.split(',')) == 16:
>+ GuidValue = GuidStructureByteArrayToGuidString(PcdValue)
>+ self._GuidDb[GuidValue.upper()] = Pcd
>
> ##
> # Parse the binary dependency expression files.
> #
> # This function parses the binary dependency expression file and translate
>it
>--
>2.6.1.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
2018-07-06 1:55 ` Gao, Liming
@ 2018-07-06 1:58 ` Zhu, Yonghong
2018-07-06 2:06 ` Gao, Liming
0 siblings, 1 reply; 4+ messages in thread
From: Zhu, Yonghong @ 2018-07-06 1:58 UTC (permalink / raw)
To: Gao, Liming, edk2-devel@lists.01.org
In GetGuidValue() function it already have this logic to handle it.
Best Regards,
Zhu Yonghong
-----Original Message-----
From: Gao, Liming
Sent: Friday, July 06, 2018 9:55 AM
To: Zhu, Yonghong <yonghong.zhu@intel.com>; edk2-devel@lists.01.org
Subject: RE: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
Yonghong:
On error handling, could you check VOID* PCD length to make sure its size is 16 when it is used in [Depex] section?
Thanks
Liming
>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>Yonghong Zhu
>Sent: Thursday, July 05, 2018 3:28 PM
>To: edk2-devel@lists.01.org
>Cc: Gao, Liming <liming.gao@intel.com>
>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>use in the [DEPEX] section
>
>From: Yunhua Feng <yunhuax.feng@intel.com>
>
>V2: limit the PCD used in the [Depex] section should be used in the
>module
>
>The PCD item used in INF [Depex] section must be defined as
>FixedAtBuild type and VOID* datum type, and the size of the PCD must be 16 bytes.
>
>Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=443
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
>---
> BaseTools/Source/Python/AutoGen/AutoGen.py | 31
>++++++++++++++++++++---
> BaseTools/Source/Python/AutoGen/GenDepex.py | 6 +++++
> BaseTools/Source/Python/Workspace/InfBuildData.py | 15 +++++++----
> BaseTools/Source/Python/build/BuildReport.py | 6 +++++
> 4 files changed, 50 insertions(+), 8 deletions(-)
>
>diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
>b/BaseTools/Source/Python/AutoGen/AutoGen.py
>index 6d76afd..7d4539e 100644
>--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
>+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
>@@ -2745,10 +2745,14 @@ class ModuleAutoGen(AutoGen):
> ## Store the FixedAtBuild Pcds
> #
> self._FixedAtBuildPcds = []
> self.ConstPcd = {}
>
>+ ##Store the VOID* type FixedAtBuild Pcds
>+ #
>+ self._FixedPcdVoidTypeDict = {}
>+
> def __repr__(self):
> return "%s [%s]" % (self.MetaFile, self.Arch)
>
> # Get FixedAtBuild Pcds of this Module
> def _GetFixedAtBuildPcds(self):
>@@ -2758,11 +2762,20 @@ class ModuleAutoGen(AutoGen):
> if Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
> continue
> if Pcd not in self._FixedAtBuildPcds:
> self._FixedAtBuildPcds.append(Pcd)
>
>- return self._FixedAtBuildPcds
>+ return self._FixedAtBuildPcds
>+
>+ def _GetFixedAtBuildVoidTypePcds(self):
>+ if self._FixedPcdVoidTypeDict:
>+ return self._FixedPcdVoidTypeDict
>+ for Pcd in self.ModulePcdList:
>+ if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType
>+ ==
>TAB_VOID:
>+ if '{}.{}'.format(Pcd.TokenSpaceGuidCName,
>+ Pcd.TokenCName) not
>in self._FixedPcdVoidTypeDict:
>+
>self._FixedPcdVoidTypeDict['{}.{}'.format(Pcd.TokenSpaceGuidCName,
>Pcd.TokenCName)] = Pcd.DefaultValue
>+ return self._FixedPcdVoidTypeDict
>
> def _GetUniqueBaseName(self):
> BaseName = self.Name
> for Module in self.PlatformInfo.ModuleAutoGenList:
> if Module.MetaFile == self.MetaFile:
>@@ -3029,11 +3042,11 @@ class ModuleAutoGen(AutoGen):
> self._DepexDict = {}
> if self.DxsFile or self.IsLibrary or
>TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:
> return self._DepexDict
>
> self._DepexDict[self.ModuleType] = []
>-
>+ self._GetFixedAtBuildVoidTypePcds()
> for ModuleType in self._DepexDict:
> DepexList = self._DepexDict[ModuleType]
> #
> # Append depex from dependent libraries, if not "BEFORE", "AFTER"
>expresion
> #
>@@ -3041,11 +3054,22 @@ class ModuleAutoGen(AutoGen):
> Inherited = False
> for D in M.Depex[self.Arch, ModuleType]:
> if DepexList != []:
> DepexList.append('AND')
> DepexList.append('(')
>- DepexList.extend(D)
>+ #replace D with value if D is FixedAtBuild PCD
>+ NewList = []
>+ for item in D:
>+ if '.' not in item:
>+ NewList.append(item)
>+ else:
>+ if item not in self._FixedPcdVoidTypeDict:
>+ EdkLogger.error("build",
>+ FORMAT_INVALID, "{} used in
>[Depex] section should be used as FixedAtBuild type and VOID* datum
>type in the module.".format(item))
>+ else:
>+ Value = self._FixedPcdVoidTypeDict[item]
>+ NewList.append(Value)
>+ DepexList.extend(NewList)
> if DepexList[-1] == 'END': # no need of a END at this time
> DepexList.pop()
> DepexList.append(')')
> Inherited = True
> if Inherited:
>@@ -4409,10 +4433,11 @@ class ModuleAutoGen(AutoGen):
> BuildOptionIncPathList = property(_GetBuildOptionIncPathList)
> BuildCommand = property(_GetBuildCommand)
>
> FixedAtBuildPcds = property(_GetFixedAtBuildPcds)
> UniqueBaseName = property(_GetUniqueBaseName)
>+ FixedVoidTypePcds = property(_GetFixedAtBuildVoidTypePcds)
>
> # This acts like the main() function for the script, unless it is
>'import'ed into another script.
> if __name__ == '__main__':
> pass
>
>diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py
>b/BaseTools/Source/Python/AutoGen/GenDepex.py
>index d3b1eae..c12b613 100644
>--- a/BaseTools/Source/Python/AutoGen/GenDepex.py
>+++ b/BaseTools/Source/Python/AutoGen/GenDepex.py
>@@ -20,10 +20,12 @@ from Common.LongFilePathSupport import
>OpenLongFilePath as open from io import BytesIO from struct import
>pack from Common.BuildToolError import * from Common.Misc import
>SaveFileOnChange from Common.Misc import
>GuidStructureStringToGuidString
>+from Common.Misc import GuidStructureByteArrayToGuidString
>+from Common.Misc import GuidStringToGuidStructureString
> from Common import EdkLogger as EdkLogger from Common.BuildVersion
> import gBUILD_VERSION from Common.DataType import *
>
> ## Regular expression for matching "DEPENDENCY_START ...
>DEPENDENCY_END"
>@@ -331,10 +333,14 @@ class DependencyExpression:
> # @retval array The byte array representing the GUID value
> #
> def GetGuidValue(self, Guid):
> GuidValueString = Guid.replace("{", "").replace("}", "").replace(" ", "")
> GuidValueList = GuidValueString.split(",")
>+ if len(GuidValueList) != 11 and len(GuidValueList) == 16:
>+ GuidValueString =
>GuidStringToGuidStructureString(GuidStructureByteArrayToGuidString(Guid
>))
>+ GuidValueString = GuidValueString.replace("{",
>+ "").replace("}",
>"").replace(" ", "")
>+ GuidValueList = GuidValueString.split(",")
> if len(GuidValueList) != 11:
> EdkLogger.error("GenDepex", PARSER_ERROR, "Invalid GUID
>value string or opcode: %s" % Guid)
> return pack("1I2H8B", *(int(value, 16) for value in
>GuidValueList))
>
> ## Save the binary form of dependency expression in file diff
>--git a/BaseTools/Source/Python/Workspace/InfBuildData.py
>b/BaseTools/Source/Python/Workspace/InfBuildData.py
>index 165e03f..efb3de1 100644
>--- a/BaseTools/Source/Python/Workspace/InfBuildData.py
>+++ b/BaseTools/Source/Python/Workspace/InfBuildData.py
>@@ -909,16 +909,21 @@ class InfBuildData(ModuleBuildClassObject):
> if Module is None:
> EdkLogger.error('build',
>RESOURCE_NOT_AVAILABLE, "Module is not found in active platform",
> ExtraData=Token, File=self.MetaFile, Line=Record[-1])
> DepexList.append(Module.Guid)
> else:
>- # get the GUID value now
>- Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)
>- if Value is None:
>- Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
>+ # it use the Fixed PCD format
>+ if '.' in Token:
>+ Value = Token
>+ else:
>+ # get the GUID value now
>+ Value = ProtocolValue(Token,
>+ self.Packages,
>self.MetaFile.Path)
> if Value is None:
>- Value = GuidValue(Token, self.Packages, self.MetaFile.Path)
>+ Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
>+ if Value is None:
>+ Value = GuidValue(Token,
>+ self.Packages,
>self.MetaFile.Path)
>+
> if Value is None:
> PackageList = "\n\t".join(str(P) for P in self.Packages)
> EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,
> "Value of [%s] is not found in" % Token,
> ExtraData=PackageList,
>File=self.MetaFile,
>Line=Record[-1])
>diff --git a/BaseTools/Source/Python/build/BuildReport.py
>b/BaseTools/Source/Python/build/BuildReport.py
>index 897167c..0dbbba0 100644
>--- a/BaseTools/Source/Python/build/BuildReport.py
>+++ b/BaseTools/Source/Python/build/BuildReport.py
>@@ -278,10 +278,16 @@ class DepexParser(object):
> GuidValue = GuidStructureStringToGuidString(Package.Ppis[Ppi])
> self._GuidDb[GuidValue.upper()] = Ppi
> for Guid in Package.Guids:
> GuidValue = GuidStructureStringToGuidString(Package.Guids[Guid])
> self._GuidDb[GuidValue.upper()] = Guid
>+ for Ma in Pa.ModuleAutoGenList:
>+ for Pcd in Ma.FixedVoidTypePcds:
>+ PcdValue = Ma.FixedVoidTypePcds[Pcd]
>+ if len(PcdValue.split(',')) == 16:
>+ GuidValue = GuidStructureByteArrayToGuidString(PcdValue)
>+ self._GuidDb[GuidValue.upper()] = Pcd
>
> ##
> # Parse the binary dependency expression files.
> #
> # This function parses the binary dependency expression file and
>translate it
>--
>2.6.1.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
2018-07-06 1:58 ` Zhu, Yonghong
@ 2018-07-06 2:06 ` Gao, Liming
0 siblings, 0 replies; 4+ messages in thread
From: Gao, Liming @ 2018-07-06 2:06 UTC (permalink / raw)
To: Zhu, Yonghong, edk2-devel@lists.01.org
Yes. It is too late. The error message says the byte value is wrong. But, it doesn't mention which PCD is wrong.
>-----Original Message-----
>From: Zhu, Yonghong
>Sent: Friday, July 06, 2018 9:58 AM
>To: Gao, Liming <liming.gao@intel.com>; edk2-devel@lists.01.org
>Cc: Zhu, Yonghong <yonghong.zhu@intel.com>
>Subject: RE: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>use in the [DEPEX] section
>
>In GetGuidValue() function it already have this logic to handle it.
>
>Best Regards,
>Zhu Yonghong
>
>
>-----Original Message-----
>From: Gao, Liming
>Sent: Friday, July 06, 2018 9:55 AM
>To: Zhu, Yonghong <yonghong.zhu@intel.com>; edk2-devel@lists.01.org
>Subject: RE: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>use in the [DEPEX] section
>
>Yonghong:
> On error handling, could you check VOID* PCD length to make sure its size is
>16 when it is used in [Depex] section?
>
>Thanks
>Liming
>>-----Original Message-----
>>From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>>Yonghong Zhu
>>Sent: Thursday, July 05, 2018 3:28 PM
>>To: edk2-devel@lists.01.org
>>Cc: Gao, Liming <liming.gao@intel.com>
>>Subject: [edk2] [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD
>>use in the [DEPEX] section
>>
>>From: Yunhua Feng <yunhuax.feng@intel.com>
>>
>>V2: limit the PCD used in the [Depex] section should be used in the
>>module
>>
>>The PCD item used in INF [Depex] section must be defined as
>>FixedAtBuild type and VOID* datum type, and the size of the PCD must be
>16 bytes.
>>
>>Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=443
>>Cc: Liming Gao <liming.gao@intel.com>
>>Cc: Yonghong Zhu <yonghong.zhu@intel.com>
>>Contributed-under: TianoCore Contribution Agreement 1.1
>>Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
>>---
>> BaseTools/Source/Python/AutoGen/AutoGen.py | 31
>>++++++++++++++++++++---
>> BaseTools/Source/Python/AutoGen/GenDepex.py | 6 +++++
>> BaseTools/Source/Python/Workspace/InfBuildData.py | 15 +++++++----
>> BaseTools/Source/Python/build/BuildReport.py | 6 +++++
>> 4 files changed, 50 insertions(+), 8 deletions(-)
>>
>>diff --git a/BaseTools/Source/Python/AutoGen/AutoGen.py
>>b/BaseTools/Source/Python/AutoGen/AutoGen.py
>>index 6d76afd..7d4539e 100644
>>--- a/BaseTools/Source/Python/AutoGen/AutoGen.py
>>+++ b/BaseTools/Source/Python/AutoGen/AutoGen.py
>>@@ -2745,10 +2745,14 @@ class ModuleAutoGen(AutoGen):
>> ## Store the FixedAtBuild Pcds
>> #
>> self._FixedAtBuildPcds = []
>> self.ConstPcd = {}
>>
>>+ ##Store the VOID* type FixedAtBuild Pcds
>>+ #
>>+ self._FixedPcdVoidTypeDict = {}
>>+
>> def __repr__(self):
>> return "%s [%s]" % (self.MetaFile, self.Arch)
>>
>> # Get FixedAtBuild Pcds of this Module
>> def _GetFixedAtBuildPcds(self):
>>@@ -2758,11 +2762,20 @@ class ModuleAutoGen(AutoGen):
>> if Pcd.Type != TAB_PCDS_FIXED_AT_BUILD:
>> continue
>> if Pcd not in self._FixedAtBuildPcds:
>> self._FixedAtBuildPcds.append(Pcd)
>>
>>- return self._FixedAtBuildPcds
>>+ return self._FixedAtBuildPcds
>>+
>>+ def _GetFixedAtBuildVoidTypePcds(self):
>>+ if self._FixedPcdVoidTypeDict:
>>+ return self._FixedPcdVoidTypeDict
>>+ for Pcd in self.ModulePcdList:
>>+ if Pcd.Type == TAB_PCDS_FIXED_AT_BUILD and Pcd.DatumType
>>+ ==
>>TAB_VOID:
>>+ if '{}.{}'.format(Pcd.TokenSpaceGuidCName,
>>+ Pcd.TokenCName) not
>>in self._FixedPcdVoidTypeDict:
>>+
>>self._FixedPcdVoidTypeDict['{}.{}'.format(Pcd.TokenSpaceGuidCName,
>>Pcd.TokenCName)] = Pcd.DefaultValue
>>+ return self._FixedPcdVoidTypeDict
>>
>> def _GetUniqueBaseName(self):
>> BaseName = self.Name
>> for Module in self.PlatformInfo.ModuleAutoGenList:
>> if Module.MetaFile == self.MetaFile:
>>@@ -3029,11 +3042,11 @@ class ModuleAutoGen(AutoGen):
>> self._DepexDict = {}
>> if self.DxsFile or self.IsLibrary or
>>TAB_DEPENDENCY_EXPRESSION_FILE in self.FileTypes:
>> return self._DepexDict
>>
>> self._DepexDict[self.ModuleType] = []
>>-
>>+ self._GetFixedAtBuildVoidTypePcds()
>> for ModuleType in self._DepexDict:
>> DepexList = self._DepexDict[ModuleType]
>> #
>> # Append depex from dependent libraries, if not "BEFORE", "AFTER"
>>expresion
>> #
>>@@ -3041,11 +3054,22 @@ class ModuleAutoGen(AutoGen):
>> Inherited = False
>> for D in M.Depex[self.Arch, ModuleType]:
>> if DepexList != []:
>> DepexList.append('AND')
>> DepexList.append('(')
>>- DepexList.extend(D)
>>+ #replace D with value if D is FixedAtBuild PCD
>>+ NewList = []
>>+ for item in D:
>>+ if '.' not in item:
>>+ NewList.append(item)
>>+ else:
>>+ if item not in self._FixedPcdVoidTypeDict:
>>+ EdkLogger.error("build",
>>+ FORMAT_INVALID, "{} used in
>>[Depex] section should be used as FixedAtBuild type and VOID* datum
>>type in the module.".format(item))
>>+ else:
>>+ Value = self._FixedPcdVoidTypeDict[item]
>>+ NewList.append(Value)
>>+ DepexList.extend(NewList)
>> if DepexList[-1] == 'END': # no need of a END at this time
>> DepexList.pop()
>> DepexList.append(')')
>> Inherited = True
>> if Inherited:
>>@@ -4409,10 +4433,11 @@ class ModuleAutoGen(AutoGen):
>> BuildOptionIncPathList = property(_GetBuildOptionIncPathList)
>> BuildCommand = property(_GetBuildCommand)
>>
>> FixedAtBuildPcds = property(_GetFixedAtBuildPcds)
>> UniqueBaseName = property(_GetUniqueBaseName)
>>+ FixedVoidTypePcds = property(_GetFixedAtBuildVoidTypePcds)
>>
>> # This acts like the main() function for the script, unless it is
>>'import'ed into another script.
>> if __name__ == '__main__':
>> pass
>>
>>diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py
>>b/BaseTools/Source/Python/AutoGen/GenDepex.py
>>index d3b1eae..c12b613 100644
>>--- a/BaseTools/Source/Python/AutoGen/GenDepex.py
>>+++ b/BaseTools/Source/Python/AutoGen/GenDepex.py
>>@@ -20,10 +20,12 @@ from Common.LongFilePathSupport import
>>OpenLongFilePath as open from io import BytesIO from struct import
>>pack from Common.BuildToolError import * from Common.Misc import
>>SaveFileOnChange from Common.Misc import
>>GuidStructureStringToGuidString
>>+from Common.Misc import GuidStructureByteArrayToGuidString
>>+from Common.Misc import GuidStringToGuidStructureString
>> from Common import EdkLogger as EdkLogger from Common.BuildVersion
>> import gBUILD_VERSION from Common.DataType import *
>>
>> ## Regular expression for matching "DEPENDENCY_START ...
>>DEPENDENCY_END"
>>@@ -331,10 +333,14 @@ class DependencyExpression:
>> # @retval array The byte array representing the GUID value
>> #
>> def GetGuidValue(self, Guid):
>> GuidValueString = Guid.replace("{", "").replace("}", "").replace(" ", "")
>> GuidValueList = GuidValueString.split(",")
>>+ if len(GuidValueList) != 11 and len(GuidValueList) == 16:
>>+ GuidValueString =
>>GuidStringToGuidStructureString(GuidStructureByteArrayToGuidString(Guid
>>))
>>+ GuidValueString = GuidValueString.replace("{",
>>+ "").replace("}",
>>"").replace(" ", "")
>>+ GuidValueList = GuidValueString.split(",")
>> if len(GuidValueList) != 11:
>> EdkLogger.error("GenDepex", PARSER_ERROR, "Invalid GUID
>>value string or opcode: %s" % Guid)
>> return pack("1I2H8B", *(int(value, 16) for value in
>>GuidValueList))
>>
>> ## Save the binary form of dependency expression in file diff
>>--git a/BaseTools/Source/Python/Workspace/InfBuildData.py
>>b/BaseTools/Source/Python/Workspace/InfBuildData.py
>>index 165e03f..efb3de1 100644
>>--- a/BaseTools/Source/Python/Workspace/InfBuildData.py
>>+++ b/BaseTools/Source/Python/Workspace/InfBuildData.py
>>@@ -909,16 +909,21 @@ class InfBuildData(ModuleBuildClassObject):
>> if Module is None:
>> EdkLogger.error('build',
>>RESOURCE_NOT_AVAILABLE, "Module is not found in active platform",
>> ExtraData=Token, File=self.MetaFile, Line=Record[-1])
>> DepexList.append(Module.Guid)
>> else:
>>- # get the GUID value now
>>- Value = ProtocolValue(Token, self.Packages, self.MetaFile.Path)
>>- if Value is None:
>>- Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
>>+ # it use the Fixed PCD format
>>+ if '.' in Token:
>>+ Value = Token
>>+ else:
>>+ # get the GUID value now
>>+ Value = ProtocolValue(Token,
>>+ self.Packages,
>>self.MetaFile.Path)
>> if Value is None:
>>- Value = GuidValue(Token, self.Packages, self.MetaFile.Path)
>>+ Value = PpiValue(Token, self.Packages, self.MetaFile.Path)
>>+ if Value is None:
>>+ Value = GuidValue(Token,
>>+ self.Packages,
>>self.MetaFile.Path)
>>+
>> if Value is None:
>> PackageList = "\n\t".join(str(P) for P in self.Packages)
>> EdkLogger.error('build', RESOURCE_NOT_AVAILABLE,
>> "Value of [%s] is not found in" % Token,
>> ExtraData=PackageList,
>>File=self.MetaFile,
>>Line=Record[-1])
>>diff --git a/BaseTools/Source/Python/build/BuildReport.py
>>b/BaseTools/Source/Python/build/BuildReport.py
>>index 897167c..0dbbba0 100644
>>--- a/BaseTools/Source/Python/build/BuildReport.py
>>+++ b/BaseTools/Source/Python/build/BuildReport.py
>>@@ -278,10 +278,16 @@ class DepexParser(object):
>> GuidValue = GuidStructureStringToGuidString(Package.Ppis[Ppi])
>> self._GuidDb[GuidValue.upper()] = Ppi
>> for Guid in Package.Guids:
>> GuidValue =
>GuidStructureStringToGuidString(Package.Guids[Guid])
>> self._GuidDb[GuidValue.upper()] = Guid
>>+ for Ma in Pa.ModuleAutoGenList:
>>+ for Pcd in Ma.FixedVoidTypePcds:
>>+ PcdValue = Ma.FixedVoidTypePcds[Pcd]
>>+ if len(PcdValue.split(',')) == 16:
>>+ GuidValue = GuidStructureByteArrayToGuidString(PcdValue)
>>+ self._GuidDb[GuidValue.upper()] = Pcd
>>
>> ##
>> # Parse the binary dependency expression files.
>> #
>> # This function parses the binary dependency expression file and
>>translate it
>>--
>>2.6.1.windows.1
>>
>>_______________________________________________
>>edk2-devel mailing list
>>edk2-devel@lists.01.org
>>https://lists.01.org/mailman/listinfo/edk2-devel
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-07-06 2:06 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-05 7:27 [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section Yonghong Zhu
2018-07-06 1:55 ` Gao, Liming
2018-07-06 1:58 ` Zhu, Yonghong
2018-07-06 2:06 ` Gao, Liming
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox