From: "Gao, Liming" <liming.gao@intel.com>
To: "Zhu, Yonghong" <yonghong.zhu@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: [Patch V2] BaseTools: enable FixedAtBuild (VOID*) PCD use in the [DEPEX] section
Date: Fri, 6 Jul 2018 01:55:29 +0000 [thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E2B6DF3@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <1530775653-4856-1-git-send-email-yonghong.zhu@intel.com>
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
next prev parent reply other threads:[~2018-07-06 1:55 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2018-07-06 1:58 ` Zhu, Yonghong
2018-07-06 2:06 ` Gao, Liming
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E2B6DF3@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox