public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Liming Gao" <liming.gao@intel.com>
To: "Fan, ZhijuX" <zhijux.fan@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Feng, Bob C" <bob.c.feng@intel.com>
Subject: Re: [PATCH V6] BaseTools:Add the spare space FV image size checker
Date: Wed, 15 Apr 2020 13:20:50 +0000	[thread overview]
Message-ID: <BN6PR11MB39723BDB1CE8E5A9CCFCFB9D80DB0@BN6PR11MB3972.namprd11.prod.outlook.com> (raw)
In-Reply-To: <CY4PR11MB1479E57F3BE8D3918CAED79194DB0@CY4PR11MB1479.namprd11.prod.outlook.com>

Zhiju:
  Thanks for your update. The change is good to me. For the report error message, I suggest as below

xx FV free space xxxx is not enough to meet with the required spare space xxxx set by -D FV_SPARE_SPACE_THRESHOLD option.

Thanks
Liming
> -----Original Message-----
> From: Fan, ZhijuX <zhijux.fan@intel.com>
> Sent: Wednesday, April 15, 2020 7:49 PM
> To: devel@edk2.groups.io
> Cc: Gao, Liming <liming.gao@intel.com>; Feng, Bob C <bob.c.feng@intel.com>
> Subject: [PATCH V6] BaseTools:Add the spare space FV image size checker
> 
> REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2654
> 
> If FV is placed in FD region, its FV image size is fixed.
> When FV image size exceeds it, it will trig the build break.
> To alert the developer to adjust FV image size earlier,
> I request to add new checker for the the spare FV space.
> When the spare FV space is less than the specified threshold,
> build tool will report the error.
> 
> This checker is the optional.
> It can be enabled by -D FV_SPARE_SPACE_THRESHOLD=10000.
> Macro is the value of the spare space threshold size.
> It can be decimal or hex format. If it is enabled,
> BaseTools will check every FV with the fixed size.
> If FV doesn't meet with the size requirement,
> Build tool will report error message to say there is no
> enough spare space.
> 
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Bob Feng <bob.c.feng@intel.com>
> Signed-off-by: Zhiju.Fan <zhijux.fan@intel.com>
> ---
> changed the error message
> 
>  BaseTools/Source/Python/Common/BuildToolError.py |  2 +
>  BaseTools/Source/Python/build/build.py           | 47 ++++++++++
>  2 files changed, 49 insertions(+)
> 
> diff --git a/BaseTools/Source/Python/Common/BuildToolError.py b/BaseTools/Source/Python/Common/BuildToolError.py
> index ecc83d0f48bd..21549683cd19 100644
> --- a/BaseTools/Source/Python/Common/BuildToolError.py
> +++ b/BaseTools/Source/Python/Common/BuildToolError.py
> @@ -64,6 +64,8 @@ COMMAND_FAILURE = 0x7000
> 
>  PERMISSION_FAILURE = 0x8000
> 
> +FV_FREESIZE_ERROR = 0x9000
> +
>  CODE_ERROR = 0xC0DE
> 
>  AUTOGEN_ERROR = 0xF000
> diff --git a/BaseTools/Source/Python/build/build.py b/BaseTools/Source/Python/build/build.py
> index bec848a7b2e3..68f5b8cabea3 100755
> --- a/BaseTools/Source/Python/build/build.py
> +++ b/BaseTools/Source/Python/build/build.py
> @@ -25,6 +25,7 @@ import traceback
>  import multiprocessing
>  from threading import Thread,Event,BoundedSemaphore
>  import threading
> +from linecache import getlines
>  from subprocess import Popen,PIPE, STDOUT
>  from collections import OrderedDict, defaultdict
> 
> @@ -1413,6 +1414,9 @@ class Build():
>          if Target == 'fds':
>              if GenFdsApi(AutoGenObject.GenFdsCommandDict, self.Db):
>                  EdkLogger.error("build", COMMAND_FAILURE)
> +            Threshold = self.GetFreeSizeThreshold()
> +            if Threshold:
> +                self.CheckFreeSizeThreshold(Threshold, AutoGenObject.FvDir)
>              return True
> 
>          # run
> @@ -2311,6 +2315,9 @@ class Build():
>                          GenFdsStart = time.time()
>                          if GenFdsApi(Wa.GenFdsCommandDict, self.Db):
>                              EdkLogger.error("build", COMMAND_FAILURE)
> +                        Threshold = self.GetFreeSizeThreshold()
> +                        if Threshold:
> +                            self.CheckFreeSizeThreshold(Threshold, Wa.FvDir)
> 
>                          #
>                          # Create MAP file for all platform FVs after GenFds.
> @@ -2322,6 +2329,46 @@ class Build():
>                      #
>                      self._SaveMapFile(MapBuffer, Wa)
>                  self.CreateGuidedSectionToolsFile(Wa)
> +
> +    ## GetFreeSizeThreshold()
> +    #
> +    #   @retval int             Threshold value
> +    #
> +    def GetFreeSizeThreshold(self):
> +        Threshold = None
> +        Threshold_Str = GlobalData.gCommandLineDefines.get('FV_SPARE_SPACE_THRESHOLD')
> +        if Threshold_Str:
> +            try:
> +                if Threshold_Str.lower().startswith('0x'):
> +                    Threshold = int(Threshold_Str, 16)
> +                else:
> +                    Threshold = int(Threshold_Str)
> +            except:
> +                EdkLogger.warn("build", 'incorrect value for FV_SPARE_SPACE_THRESHOLD %s.Only decimal or hex format is allowed.' %
> Threshold_Str)
> +        return Threshold
> +
> +    def CheckFreeSizeThreshold(self, Threshold=None, FvDir=None):
> +        if not isinstance(Threshold, int):
> +            return
> +        if not isinstance(FvDir, str) or not FvDir:
> +            return
> +        FdfParserObject = GlobalData.gFdfParser
> +        FvRegionNameList = [FvName for FvName in FdfParserObject.Profile.FvDict if
> FdfParserObject.Profile.FvDict[FvName].FvRegionInFD]
> +        for FvName in FdfParserObject.Profile.FvDict:
> +            if FvName in FvRegionNameList:
> +                FvSpaceInfoFileName = os.path.join(FvDir, FvName.upper() + '.Fv.map')
> +                if os.path.exists(FvSpaceInfoFileName):
> +                    FileLinesList = getlines(FvSpaceInfoFileName)
> +                    for Line in FileLinesList:
> +                        NameValue = Line.split('=')
> +                        if len(NameValue) == 2 and NameValue[0].strip() == 'EFI_FV_SPACE_SIZE':
> +                            FreeSizeValue = int(NameValue[1].strip(), 0)
> +                            if FreeSizeValue < Threshold:
> +                                EdkLogger.error("build", FV_FREESIZE_ERROR,
> +                                                'the required spare space in fv image size %d of %s FV exceeds the set spare space in fv image size %d' %
> (
> +                                                    FreeSizeValue, FvName, Threshold))
> +                            break
> +
>      ## Generate GuidedSectionTools.txt in the FV directories.
>      #
>      def CreateGuidedSectionToolsFile(self,Wa):
> --
> 2.14.1.windows.1


  reply	other threads:[~2020-04-15 13:20 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-15 11:49 [PATCH V6] BaseTools:Add the spare space FV image size checker Fan, ZhijuX
2020-04-15 13:20 ` Liming Gao [this message]
2020-04-20  1:17   ` Fan, ZhijuX
2020-04-20  1:18     ` Liming Gao

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=BN6PR11MB39723BDB1CE8E5A9CCFCFB9D80DB0@BN6PR11MB3972.namprd11.prod.outlook.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