public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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


  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