[edk2-devel] [PATCH V6] BaseTools:Add the spare space FV image size checker

Liming Gao liming.gao at intel.com
Wed Apr 15 13:20:50 UTC 2020


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 at intel.com>
> Sent: Wednesday, April 15, 2020 7:49 PM
> To: devel at edk2.groups.io
> Cc: Gao, Liming <liming.gao at intel.com>; Feng, Bob C <bob.c.feng at 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 at intel.com>
> Cc: Bob Feng <bob.c.feng at intel.com>
> Signed-off-by: Zhiju.Fan <zhijux.fan at 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


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#57411): https://edk2.groups.io/g/devel/message/57411
Mute This Topic: https://groups.io/mt/73030314/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list