Reviewed-by: [email protected]

> -----Original Message-----
> From: Chiu, Chasel
> Sent: Wednesday, September 26, 2018 7:29 PM
> To: [email protected]
> Cc: Yao, Jiewen <[email protected]>; Gao, Liming
> <[email protected]>; Zhu, Yonghong <[email protected]>; Chiu,
> Chasel <[email protected]>
> Subject: [PATCH] IntelFsp2Pkg/GenCfgOpt.py: Support UPD offset auto
> assignment
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1211
> 
> For reducing maintenance effort, the UPD offset can be
> automatic assigned by GenCfgOpt.py following by alignment
> requirements.
> 
> The usage model as below:
> . If UPD offset in DSC file are all '*', GenCfgOpt.py will
>   assign offset for all UPD automatically. In this case no
>   need to manually hardcode offset to all UPD in DSC.
> 
> . If UPD offset in DSC file are all not '*', GenCfgOpt.py
>   will use hardcoded offset directly (original usage model)
> 
> . Tool does not support mixing scenario so UPD offset in DSC
>   should be all '*' or all hardcoded but not mixed.
> 
> In auto mode UPD offset will be assigned following natural
> alignment (size aligned) rule and the whole structure size
> will align to either 32bits or 64bits depends on maximal UPD
> size in the structure.
> 
> Test: Verified by both UPD offset hardcoded or '*' in DSC and
>       generated UPD header files are correct.
> 
> Cc: Jiewen Yao <[email protected]>
> Cc: Gao Liming <[email protected]>
> Cc: Zhu Yonghong <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Chasel Chiu <[email protected]>
> ---
>  IntelFsp2Pkg/Tools/GenCfgOpt.py | 68
> +++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 65 insertions(+), 3 deletions(-)
> 
> diff --git a/IntelFsp2Pkg/Tools/GenCfgOpt.py
> b/IntelFsp2Pkg/Tools/GenCfgOpt.py
> index c9b7bc5373..9b8943b702 100644
> --- a/IntelFsp2Pkg/Tools/GenCfgOpt.py
> +++ b/IntelFsp2Pkg/Tools/GenCfgOpt.py
> @@ -1,6 +1,6 @@
>  ## @ GenCfgOpt.py
>  #
> -# Copyright (c) 2014 - 2017, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
>  # This program and the accompanying materials are licensed and made
> available under
>  # the terms and conditions of the BSD License that accompanies this
> distribution.
>  # The full text of the license may be found at
> @@ -418,6 +418,8 @@ EndList
>          return ""
> 
>      def ParseDscFile (self, DscFile, FvDir):
> +        Hardcode = False
> +        AutoAlign = False
>          self._CfgItemList = []
>          self._CfgPageDict = {}
>          self._CfgBlkDict  = {}
> @@ -438,6 +440,8 @@ EndList
>          DscLines     = DscFd.readlines()
>          DscFd.close()
> 
> +        MaxAlign = 32   #Default align to 32, but if there are 64 bit unit,
> align to 64
> +        SizeAlign = 0   #record the struct max align
>          while len(DscLines):
>              DscLine  = DscLines.pop(0).strip()
>              Handle   = False
> @@ -464,6 +468,7 @@ EndList
>                      ConfigDict['comment'] = ''
>                      ConfigDict['subreg']  = []
>                      IsUpdSect = True
> +                    Offset    = 0
>              else:
>                  if IsDefSect or IsPcdSect or IsUpdSect or IsVpdSect:
>                      if re.match("^!else($|\s+#.+)", DscLine):
> @@ -530,6 +535,7 @@ EndList
>                                          NewDscLines =
> IncludeDsc.readlines()
>                                          IncludeDsc.close()
>                                          DscLines = NewDscLines +
> DscLines
> +                                        Offset = 0
>                                      else:
>                                          if DscLine.startswith('!'):
>                                              print("ERROR:
> Unrecoginized directive for line '%s'" % DscLine)
> @@ -620,13 +626,22 @@ EndList
> 
>                  # Check VPD/UPD
>                  if IsUpdSect:
> -                    Match =
> re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)\s*\|\s*(\d+
> |0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)
> +                    Match =
> re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+|\*)\s*\|\s*(
> \d+|0x[0-9a-fA-F]+)\s*\|\s*(.+)",DscLine)
>                  else:
>                      Match =
> re.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)(?:\s*\|\s*(.
> +))?",  DscLine)
>                  if Match:
>                      ConfigDict['space']  = Match.group(1)
>                      ConfigDict['cname']  = Match.group(2)
> -                    ConfigDict['offset'] = int (Match.group(3), 16)
> +                    if Match.group(3) != '*':
> +                        Hardcode = True
> +                        Offset =  int (Match.group(3), 16)
> +                    else:
> +                        AutoAlign = True
> +
> +                    if Hardcode and AutoAlign:
> +                        print("Hardcode and auto-align mixed mode is
> not supported by GenCfgOpt")
> +                        raise SystemExit
> +                    ConfigDict['offset'] = Offset
>                      if ConfigDict['order'] == -1:
>                          ConfigDict['order'] = ConfigDict['offset'] << 8
>                      else:
> @@ -638,6 +653,7 @@ EndList
>                              Length  = int (Match.group(4), 16)
>                          else :
>                              Length  = int (Match.group(4))
> +                        Offset += Length
>                      else:
>                          Value = Match.group(4)
>                          if Value is None:
> @@ -665,6 +681,52 @@ EndList
>                          ConfigDict['help']   = ''
>                          ConfigDict['type']   = ''
>                          ConfigDict['option'] = ''
> +                    if IsUpdSect and AutoAlign:
> +                        ItemLength = int(ConfigDict['length'])
> +                        ItemOffset = int(ConfigDict['offset'])
> +                        ItemStruct = ConfigDict['struct']
> +                        Unit = 1
> +                        if ItemLength in [1, 2, 4, 8] and not
> ConfigDict['value'].startswith('{'):
> +                            Unit = ItemLength
> +                            # If there are 64 bit unit, align to 64
> +                            if Unit == 8:
> +                                MaxAlign = 64
> +                                SizeAlign = 8
> +                        if ItemStruct != '':
> +                            UnitDict = {'UINT8':1, 'UINT16':2,
> 'UINT32':4, 'UINT64':8}
> +                            if ItemStruct in ['UINT8', 'UINT16',
> 'UINT32', 'UINT64']:
> +                                Unit = UnitDict[ItemStruct]
> +                                # If there are 64 bit unit, align to 64
> +                                if Unit == 8:
> +                                    MaxAlign = 64
> +                                SizeAlign = max(SizeAlign, Unit)
> +                        if (ConfigDict['embed'].find(':START') != -1):
> +                            Base = ItemOffset
> +                        SubOffset = ItemOffset - Base
> +                        SubRemainder = SubOffset % Unit
> +                        if SubRemainder:
> +                            Diff = Unit - SubRemainder
> +                            Offset = Offset + Diff
> +                            ItemOffset = ItemOffset + Diff
> +
> +                        if (ConfigDict['embed'].find(':END') != -1):
> +                            Remainder = Offset % (MaxAlign/8)   #
> MaxAlign is either 32 or 64
> +                            if Remainder:
> +                                Diff = (MaxAlign/8) - Remainder
> +                                Offset = Offset + Diff
> +                                ItemOffset = ItemOffset + Diff
> +                            MaxAlign = 32
> # Reset to default 32 align when struct end
> +                        if (ConfigDict['cname'] == 'UpdTerminator'):
> +                            # ItemLength is the size of
> UpdTerminator
> +                            # Itemlength might be 16, 32, or 64
> +                            # Struct align to 64 if UpdTerminator
> +                            # or struct size is 64 bit, else align to 32
> +                            Remainder = Offset % max(ItemLength/8,
> 4, SizeAlign)
> +                            Offset = Offset + ItemLength
> +                            if Remainder:
> +                                Diff = max(ItemLength/8, 4,
> SizeAlign) - Remainder
> +                                ItemOffset = ItemOffset + Diff
> +                        ConfigDict['offset'] = ItemOffset
> 
>                      self._CfgItemList.append(ConfigDict.copy())
>                      ConfigDict['name']   = ''
> --
> 2.13.3.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to