Reviewed-by: jiewen....@intel.com

> -----Original Message-----
> From: Ma, Maurice
> Sent: Thursday, May 26, 2016 2:52 AM
> To: edk2-devel@lists.01.org
> Cc: Ma, Maurice <maurice...@intel.com>; Yao, Jiewen
> <jiewen....@intel.com>; Mudusuru, Giri P <giri.p.mudus...@intel.com>
> Subject: [edk2] [PATCH] IntelFsp2Pkg/Tools: Add BSF bit field support in
> GenCfgOpt tool
> 
> The current GenCfgOpt tool does not generate bit fields in BSF.
> This change will allow bit fields to be created in BSF for a specific
> FSP UPD item. The argument for the tool is also updated to be in sync
> with the old usage model in IntelFspPkg.
> 
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Giri P Mudusuru <giri.p.mudus...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Maurice Ma <maurice...@intel.com>
> ---
>  IntelFsp2Pkg/Tools/GenCfgOpt.py | 224
> ++++++++++++++++++++--------------------
>  1 file changed, 113 insertions(+), 111 deletions(-)
> 
> diff --git a/IntelFsp2Pkg/Tools/GenCfgOpt.py
> b/IntelFsp2Pkg/Tools/GenCfgOpt.py
> index 4fd0562e7534..e8cec95aa735 100644
> --- a/IntelFsp2Pkg/Tools/GenCfgOpt.py
> +++ b/IntelFsp2Pkg/Tools/GenCfgOpt.py
> @@ -310,6 +310,7 @@ EndList
>          self._BuidinOption  = {'$EN_DIS' : 'EN_DIS'}
> 
>          self._MacroDict   = {}
> +        self._PcdsDict    = {}
>          self._CfgBlkDict  = {}
>          self._CfgPageDict = {}
>          self._CfgItemList = []
> @@ -374,8 +375,21 @@ EndList
>                    Line = Line.replace(Each, Each[2:-1])
>          return Line
> 
> +    def ExpandPcds (self, Input):
> +        Line = Input
> +        Match = re.findall("(\w+\.\w+)", Input)
> +        if Match:
> +            for PcdName in Match:
> +              if PcdName in self._PcdsDict:
> +                  Line = Line.replace(PcdName,
> self._PcdsDict[PcdName])
> +              else:
> +                  if self.Debug:
> +                      print "WARN : %s is not defined" % PcdName
> +        return Line
> +
>      def EvaluateExpress (self, Expr):
> -        ExpExpr = self.ExpandMacros(Expr)
> +        ExpExpr = self.ExpandPcds(Expr)
> +        ExpExpr = self.ExpandMacros(ExpExpr)
>          LogExpr = CLogicalExpression()
>          Result  = LogExpr.evaluateExpress (ExpExpr)
>          if self.Debug:
> @@ -411,7 +425,7 @@ EndList
>          ConfigDict['value'] = newvalue
>          return ""
> 
> -    def ParseDscFile (self, DscFile, FvDir, ConfigDscFile, ExtConfigDscFile):
> +    def ParseDscFile (self, DscFile, FvDir):
>          self._CfgItemList = []
>          self._CfgPageDict = {}
>          self._CfgBlkDict  = {}
> @@ -419,9 +433,9 @@ EndList
>          self._FvDir       = FvDir
> 
>          IsDefSect       = False
> +        IsPcdSect       = False
>          IsUpdSect       = False
>          IsVpdSect       = False
> -        Found           = False
> 
>          IfStack         = []
>          ElifStack       = []
> @@ -437,10 +451,14 @@ EndList
>              Handle   = False
>              Match    = re.match("^\[(.+)\]", DscLine)
>              if Match is not None:
> +                IsDefSect = False
> +                IsPcdSect = False
> +                IsVpdSect = False
> +                IsUpdSect = False
>                  if  Match.group(1).lower() == "Defines".lower():
>                      IsDefSect = True
> -                    IsVpdSect = False
> -                    IsUpdSect = False
> +                if  Match.group(1).lower() ==
> "PcdsFeatureFlag".lower():
> +                    IsPcdSect = True
>                  elif Match.group(1).lower() ==
> "PcdsDynamicVpd.Upd".lower():
>                      ConfigDict = {}
>                      ConfigDict['header']  = 'ON'
> @@ -453,16 +471,9 @@ EndList
>                      ConfigDict['embed']   = ''
>                      ConfigDict['comment'] = ''
>                      ConfigDict['subreg']  = []
> -                    IsDefSect = False
>                      IsUpdSect = True
> -                    IsVpdSect = False
> -                    Found     = True
> -                else:
> -                    IsDefSect = False
> -                    IsUpdSect = False
> -                    IsVpdSect = False
>              else:
> -                if IsDefSect or IsUpdSect or IsVpdSect:
> +                if IsDefSect or IsPcdSect or IsUpdSect or IsVpdSect:
>                      if re.match("^!else($|\s+#.+)", DscLine):
>                          if IfStack:
>                              IfStack[-1] = not IfStack[-1]
> @@ -490,41 +501,7 @@ EndList
>                          else:
>                              Match  = re.match("!(if|elseif)\s+(.+)",
> DscLine)
>                              if Match:
> -                                IsFoundInFile = False
> -                                MatchPcdFormat =
> re.match("^\s*(.+)\.(.+)\s*==\s*(.+)", Match.group(2))
> -                                if MatchPcdFormat:
> -                                       ExtConfigDsc =
> open(ExtConfigDscFile, "r")
> -                                       ExtConfigDscLines =
> ExtConfigDsc.readlines()
> -                                       ExtConfigDsc.close()
> -
> -                                       while
> len(ExtConfigDscLines):
> -                                           ExtConfigDscLine  =
> ExtConfigDscLines.pop(0).strip()
> -                                           MatchExtConfigPcd =
> re.match("^\s*(.+)\s*\|\s*(.+)", ExtConfigDscLine)
> -                                           if MatchExtConfigPcd
> and IsFoundInFile == False:
> -                                                 PcdFormatStr =
> str(str(MatchPcdFormat.group(1)) + "." + str(MatchPcdFormat.group(2)))
> -                                                 ExtConfigPcd =
> str(MatchExtConfigPcd.group(1))
> -                                                 Result = False
> -                                                 if
> PcdFormatStr.strip() == ExtConfigPcd.strip():
> -                                                       Result =
> self.EvaluateExpress(str(str(MatchExtConfigPcd.group(2)) + " == " +
> str(MatchPcdFormat.group(3))))
> -
> IsFoundInFile = True
> -                                                       break
> -                                       if IsFoundInFile == False:
> -                                           ConfigDsc =
> open(ConfigDscFile, "r")
> -                                           ConfigDscLines =
> ConfigDsc.readlines()
> -                                           ConfigDsc.close()
> -                                           while
> len(ConfigDscLines):
> -                                               ConfigDscLine  =
> ConfigDscLines.pop(0).strip()
> -                                               MatchConfigPcd
> = re.match("^\s*(.+)\s*\|\s*(.+)", ConfigDscLine)
> -                                               if
> MatchConfigPcd:
> -
> PcdFormatStr = str(str(MatchPcdFormat.group(1)) + "." +
> str(MatchPcdFormat.group(2)))
> -                                                     ConfigPcd
> = str(MatchConfigPcd.group(1))
> -                                                     Result =
> False
> -                                                     if
> PcdFormatStr.strip() == ConfigPcd.strip():
> -
> Result = self.EvaluateExpress(str(str(MatchConfigPcd.group(2)) + " == " +
> str(MatchPcdFormat.group(3))))
> -
> IsFoundInFile = True
> -
> break
> -                                else:
> -                                       Result =
> self.EvaluateExpress(Match.group(2))
> +                                Result =
> self.EvaluateExpress(Match.group(2))
>                                  if Match.group(1) == "if":
>                                      ElifStack.append(0)
>                                      IfStack.append(Result)
> @@ -571,6 +548,14 @@ EndList
>                      self._MacroDict[Match.group(1)] =
> Match.group(2)
>                      if self.Debug:
>                          print "INFO : DEFINE %s = [ %s ]" %
> (Match.group(1), Match.group(2))
> +            elif IsPcdSect:
> +                #gSiPkgTokenSpaceGuid.PcdTxtEnable|FALSE
> +                #gSiPkgTokenSpaceGuid.PcdOverclockEnable|TRUE
> +                Match = re.match("^\s*([\w\.]+)\s*\|\s*(\w+)",
> DscLine)
> +                if Match:
> +                    self._PcdsDict[Match.group(1)] = Match.group(2)
> +                    if self.Debug:
> +                        print "INFO : PCD %s = [ %s ]" %
> (Match.group(1), Match.group(2))
>              else:
>                  Match = re.match("^\s*#\s+(!BSF|@Bsf|!HDR)\s+(.+)",
> DscLine)
>                  if Match:
> @@ -693,25 +678,43 @@ EndList
>                      ConfigDict['option'] = ''
>                  else:
>                      # It could be a virtual item as below
> -                    # !BSF FIELD:{1:SerialDebugPortAddress0}
> +                    # !BSF FIELD:{SerialDebugPortAddress0:1}
>                      # or
> -                    # @Bsf FIELD:{1:SerialDebugPortAddress0}
> -                    Match =
> re.match("^\s*#\s+(!BSF|@Bsf)\s+FIELD:{(.+):(\d+)}", DscLine)
> +                    # @Bsf FIELD:{SerialDebugPortAddress0:1b}
> +                    Match =
> re.match("^\s*#\s+(!BSF|@Bsf)\s+FIELD:{(.+):(\d+)([Bb])?}", DscLine)
>                      if Match:
> -                        SubCfgDict = ConfigDict
> +                        SubCfgDict = ConfigDict.copy()
> +                        if (Match.group(4) == None) or
> (Match.group(4) == 'B'):
> +                          UnitBitLen = 8
> +                        elif Match.group(4) == 'b':
> +                          UnitBitLen = 1
> +                        else:
> +                          print("ERROR: Invalide BSF FIELD length for
> line '%s'" % DscLine)
> +                          raise SystemExit
>                          SubCfgDict['cname']  = Match.group(2)
> -                        SubCfgDict['length'] = int (Match.group(3))
> -                        if SubCfgDict['length'] > 0:
> +                        SubCfgDict['bitlength'] = int (Match.group(3))
> * UnitBitLen
> +                        if SubCfgDict['bitlength'] > 0:
>                              LastItem =  self._CfgItemList[-1]
>                              if len(LastItem['subreg']) == 0:
>                                  SubOffset  = 0
>                              else:
> -                                SubOffset +=
> LastItem['subreg'][-1]['length']
> -                            SubCfgDict['offset'] = SubOffset
> +                                SubOffset  =
> LastItem['subreg'][-1]['bitoffset'] + LastItem['subreg'][-1]['bitlength']
> +                            SubCfgDict['bitoffset'] = SubOffset
>                              LastItem['subreg'].append
> (SubCfgDict.copy())
>                          ConfigDict['name']   = ''
>          return Error
> 
> +    def GetBsfBitFields (self, subitem, bytes):
> +        start = subitem['bitoffset']
> +        end   = start + subitem['bitlength']
> +        bitsvalue = ''.join('{0:08b}'.format(i) for i in bytes[::-1])
> +        bitsvalue = bitsvalue[::-1]
> +        bitslen   = len(bitsvalue)
> +        if start > bitslen or end > bitslen:
> +            print "Invalid bits offset [%d,%d] for %s" % (start, end,
> subitem['name'])
> +            raise SystemExit
> +        return hex(int(bitsvalue[start:end][::-1], 2))
> +
>      def UpdateSubRegionDefaultValue (self):
>          Error = 0
>          for Item in self._CfgItemList:
> @@ -732,20 +735,14 @@ EndList
>                      value = int(Item['value'], 16)
>                  else:
>                      value = int(Item['value'])
> -                idx = 0;
> +                idx = 0
>                  while  idx < Item['length']:
>                      bytearray.append(value & 0xFF)
>                      value = value >> 8
>                      idx = idx + 1
>              for SubItem in Item['subreg']:
> -                if SubItem['length'] in (1,2,4,8):
> -                    valuelist = [b for b in
> bytearray[SubItem['offset']:SubItem['offset']+SubItem['length']]]
> -                    valuelist.reverse()
> -                    valuestr = "".join('%02X' % b for b in valuelist)
> -                    SubItem['value'] = '0x%s' % valuestr
> -                else:
> -                    valuestr = ",".join('0x%02X' % b for b in
> bytearray[SubItem['offset']:SubItem['offset']+SubItem['length']])
> -                    SubItem['value'] = '{%s}' % valuestr
> +                valuestr = self.GetBsfBitFields(SubItem, bytearray)
> +                SubItem['value'] = valuestr
>          return Error
> 
>      def CreateSplitUpdTxt (self, UpdTxtFile):
> @@ -969,7 +966,7 @@ EndList
>             else:
>                 OldTextBody.append (Line)
> 
> -           if Match and Match.group(3) == 'END':
> +           if Match and Match.group(3) == 'END':
>                 if (StructName != Match.group(1)) or (VariableName !=
> Match.group(2)):
>                     print "Unmatched struct name '%s' and '%s' !"  %
> (StructName, Match.group(1))
>                 else:
> @@ -1086,7 +1083,7 @@ EndList
>                                 Marker = '/* EMBED_STRUCT:%s */ ' %
> Item["embed"]
>                          else:
>                              if Embed == '':
> -                                Marker = '';
> +                                Marker = ''
>                              else:
>                                  self.Error = "Invalid embedded
> structure format '%s'!\n" % Item["embed"]
>                                  return 4
> @@ -1095,7 +1092,7 @@ EndList
>                      if Item['cname'] == 'UpdTerminator':
>                          break
>                  TxtBody.append("} " + UpdStructure[UpdIdx] + ";\n\n")
> -
> +
>          # Handle the embedded data structure
>          TxtBody = self.PostProcessBody (TxtBody)
> 
> @@ -1242,7 +1239,10 @@ EndList
>              DefaultValue = Match.group(1).strip()
>          else:
>              DefaultValue = Item['value'].strip()
> -        BsfFd.write("    %s%s%4d bytes    $_DEFAULT_ = %s\n" %
> (Line, ' ' * (64 - len(Line)), Item['length'], DefaultValue))
> +        if 'bitlength' in Item:
> +            BsfFd.write("    %s%s%4d bits     $_DEFAULT_ = %s\n" %
> (Line, ' ' * (64 - len(Line)), Item['bitlength'], DefaultValue))
> +        else:
> +            BsfFd.write("    %s%s%4d bytes    $_DEFAULT_ = %s\n" %
> (Line, ' ' * (64 - len(Line)), Item['length'], DefaultValue))
>          TmpList = []
>          if  Item['type'] == "Combo":
>              if not Item['option'] in self._BuidinOption:
> @@ -1261,20 +1261,20 @@ EndList
>                  Options = self._BuidinOption[Item['option']]
>              else:
>                  Options = PcdName
> -            BsfFd.write('    %s $%s, "%s", &%s,\n' % (Item['type'],
> PcdName, Item['name'], Options));
> +            BsfFd.write('    %s $%s, "%s", &%s,\n' % (Item['type'],
> PcdName, Item['name'], Options))
>              WriteHelp = 1
>          elif Item['type'].startswith("EditNum"):
>              Match =
> re.match("EditNum\s*,\s*(HEX|DEC)\s*,\s*\((\d+|0x[0-9A-Fa-f]+)\s*,\s*(\d
> +|0x[0-9A-Fa-f]+)\)", Item['type'])
>              if Match:
> -                BsfFd.write('    EditNum $%s, "%s", %s,\n' %
> (PcdName, Item['name'], Match.group(1)));
> +                BsfFd.write('    EditNum $%s, "%s", %s,\n' %
> (PcdName, Item['name'], Match.group(1)))
>                  WriteHelp = 2
>          elif Item['type'].startswith("EditText"):
> -            BsfFd.write('    %s $%s, "%s",\n' % (Item['type'], PcdName,
> Item['name']));
> +            BsfFd.write('    %s $%s, "%s",\n' % (Item['type'], PcdName,
> Item['name']))
>              WriteHelp = 1
>          elif Item['type'] == "Table":
>              Columns = Item['option'].split(',')
>              if len(Columns) != 0:
> -                BsfFd.write('    %s $%s "%s",' % (Item['type'],
> PcdName, Item['name']));
> +                BsfFd.write('    %s $%s "%s",' % (Item['type'],
> PcdName, Item['name']))
>                  for Col in Columns:
>                      Fmt = Col.split(':')
>                      if len(Fmt) != 3:
> @@ -1286,18 +1286,18 @@ EndList
>                      BsfFd.write('\n        Column "%s", %d
> bytes, %s' % (Fmt[0].strip(), Dtype, Fmt[2].strip()))
>                  BsfFd.write(',\n')
>                  WriteHelp = 1
> -
> +
>          if WriteHelp  > 0:
>              HelpLines = Item['help'].split('\\n\\r')
>              FirstLine = True
>              for HelpLine in HelpLines:
>                  if FirstLine:
>                      FirstLine = False
> -                    BsfFd.write('        Help "%s"\n' % (HelpLine));
> +                    BsfFd.write('        Help "%s"\n' % (HelpLine))
>                  else:
> -                    BsfFd.write('             "%s"\n' % (HelpLine));
> +                    BsfFd.write('             "%s"\n' % (HelpLine))
>              if WriteHelp == 2:
> -                    BsfFd.write('             "Valid range: %s
> ~ %s"\n' % (Match.group(2), Match.group(3)));
> +                    BsfFd.write('             "Valid range: %s
> ~ %s"\n' % (Match.group(2), Match.group(3)))
> 
>      def GenerateBsfFile (self, BsfFile):
> 
> @@ -1309,7 +1309,7 @@ EndList
>          OptionDict = {}
>          BsfFd      = open(BsfFile, "w")
>          BsfFd.write("%s\n" % (__copyright_bsf__ % date.today().year))
> -        BsfFd.write("%s\n" % self._GlobalDataDef);
> +        BsfFd.write("%s\n" % self._GlobalDataDef)
>          BsfFd.write("StructDef\n")
>          NextOffset = -1
>          for Item in self._CfgItemList:
> @@ -1321,17 +1321,30 @@ EndList
>                      BsfFd.write("        Skip %d bytes\n" %
> (Item['offset'] - NextOffset))
>                  if len(Item['subreg']) > 0:
>                      NextOffset =  Item['offset']
> +                    BitsOffset =  NextOffset * 8
>                      for SubItem in Item['subreg']:
> -                        NextOffset += SubItem['length']
> +                        BitsOffset += SubItem['bitlength']
>                          if SubItem['name'] == '':
> -                            BsfFd.write("        Skip %d bytes\n" %
> (SubItem['length']))
> +                            if 'bitlength' in SubItem:
> +                                BsfFd.write("        Skip %d
> bits\n" % (SubItem['bitlength']))
> +                            else:
> +                                BsfFd.write("        Skip %d
> bytes\n" % (SubItem['length']))
>                          else:
>                              Options = self.WriteBsfStruct(BsfFd,
> SubItem)
>                              if len(Options) > 0:
> 
> OptionDict[SubItem['space']+'_'+SubItem['cname']] = Options
> -                    if (Item['offset'] + Item['length']) <  NextOffset:
> -                        self.Error = "BSF sub region '%s' length does
> not match" % (Item['space']+'.'+Item['cname'])
> -                        return 2
> +
> +                    NextBitsOffset = (Item['offset'] + Item['length']) *
> 8
> +                    if NextBitsOffset > BitsOffset:
> +                        BitsGap     = NextBitsOffset - BitsOffset
> +                        BitsRemain  = BitsGap % 8
> +                        if BitsRemain:
> +                            BsfFd.write("        Skip %d bits\n" %
> BitsRemain)
> +                            BitsGap -= BitsRemain
> +                        BytesRemain = BitsGap / 8
> +                        if BytesRemain:
> +                            BsfFd.write("        Skip %d bytes\n" %
> BytesRemain)
> +                    NextOffset = Item['offset'] + Item['length']
>                  else:
>                      NextOffset = Item['offset'] + Item['length']
>                      Options = self.WriteBsfStruct(BsfFd, Item)
> @@ -1339,21 +1352,21 @@ EndList
>                          OptionDict[Item['space']+'_'+Item['cname']]
> = Options
>          BsfFd.write("\nEndStruct\n\n")
> 
> -        BsfFd.write("%s" % self._BuidinOptionTxt);
> +        BsfFd.write("%s" % self._BuidinOptionTxt)
> 
>          for Each in OptionDict:
> -            BsfFd.write("List &%s\n" % Each);
> +            BsfFd.write("List &%s\n" % Each)
>              for Item in OptionDict[Each]:
> -                BsfFd.write('    Selection %s , "%s"\n' % (Item[0],
> Item[1]));
> -            BsfFd.write("EndList\n\n");
> +                BsfFd.write('    Selection %s , "%s"\n' % (Item[0],
> Item[1]))
> +            BsfFd.write("EndList\n\n")
> 
> -        BsfFd.write("BeginInfoBlock\n");
> -        BsfFd.write('    PPVer       "%s"\n' %
> (self._CfgBlkDict['ver']));
> -        BsfFd.write('    Description "%s"\n' %
> (self._CfgBlkDict['name']));
> -        BsfFd.write("EndInfoBlock\n\n");
> +        BsfFd.write("BeginInfoBlock\n")
> +        BsfFd.write('    PPVer       "%s"\n' % (self._CfgBlkDict['ver']))
> +        BsfFd.write('    Description "%s"\n' % (self._CfgBlkDict['name']))
> +        BsfFd.write("EndInfoBlock\n\n")
> 
>          for Each in self._CfgPageDict:
> -            BsfFd.write('Page "%s"\n' % self._CfgPageDict[Each]);
> +            BsfFd.write('Page "%s"\n' % self._CfgPageDict[Each])
>              BsfItems = []
>              for Item in self._CfgItemList:
>                  if Item['name'] != '':
> @@ -1370,21 +1383,18 @@ EndList
> 
>              for Item in BsfItems:
>                  self.WriteBsfOption (BsfFd, Item)
> -            BsfFd.write("EndPage\n\n");
> +            BsfFd.write("EndPage\n\n")
> 
>          BsfFd.close()
>          return  Error
> 
> 
>  def Usage():
> -    print "GenCfgOpt Version 0.51"
> +    print "GenCfgOpt Version 0.52"
>      print "Usage:"
> -    print " GenCfgOpt  UPDTXT  PlatformDscFile BuildFvDir
> ConfigDscFile  ExtConfigDscFile"
> -    print "                        [-D Macros]"
> -    print " GenCfgOpt  HEADER  PlatformDscFile BuildFvDir
> ConfigDscFile  ExtConfigDscFile"
> -    print "            InputHFile  [-D Macros]"
> -    print " GenCfgOpt  GENBSF  PlatformDscFile BuildFvDir
> ConfigDscFile  ExtConfigDscFile"
> -    print "            BsfOutFile  [-D Macros]"
> +    print "    GenCfgOpt  UPDTXT  PlatformDscFile BuildFvDir
> [-D Macros]"
> +    print "    GenCfgOpt  HEADER  PlatformDscFile BuildFvDir
> InputHFile     [-D Macros]"
> +    print "    GenCfgOpt  GENBSF  PlatformDscFile BuildFvDir
> BsfOutFile     [-D Macros]"
> 
>  def Main():
>      #
> @@ -1400,21 +1410,13 @@ def Main():
>          if not os.path.exists(DscFile):
>              print "ERROR: Cannot open DSC file '%s' !" % DscFile
>              return 2
> -        ConfigDscFile = sys.argv[4]
> -        if not os.path.exists(ConfigDscFile):
> -            print "ERROR: Cannot open Config DSC file '%s' !" %
> ConfigDscFile
> -            return 2
> -        ExtConfigDscFile = sys.argv[5]
> -        if not os.path.exists(ExtConfigDscFile):
> -            print "ERROR: Cannot open Ext Config DSC file '%s' !" %
> ExtConfigDscFile
> -            return 2
> 
>          OutFile = ''
>          if argc > 4:
> -            if sys.argv[6][0] == '-':
> +            if sys.argv[4][0] == '-':
>                  Start = 4
>              else:
> -                OutFile = sys.argv[6]
> +                OutFile = sys.argv[4]
>                  Start = 5
>              GenCfgOpt.ParseBuildMode(sys.argv[3])
>              if GenCfgOpt.ParseMacros(sys.argv[Start:]) != 0:
> @@ -1425,7 +1427,7 @@ def Main():
>          if not os.path.exists(FvDir):
>              os.makedirs(FvDir)
> 
> -        if GenCfgOpt.ParseDscFile(DscFile, FvDir, ConfigDscFile,
> ExtConfigDscFile) != 0:
> +        if GenCfgOpt.ParseDscFile(DscFile, FvDir) != 0:
>              print "ERROR: %s !" % GenCfgOpt.Error
>              return 5
> 
> --
> 1.9.5.msysgit.0

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to