4fd0562e75342e12f8f8d6913070a6fbb22f6f2d
3 # Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
4 # This program and the accompanying materials are licensed and made available under
5 # the terms and conditions of the BSD License that accompanies this distribution.
6 # The full text of the license may be found at
7 # http://opensource.org/licenses/bsd-license.php.
9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 from datetime
import date
20 # Generated file copyright header
22 __copyright_txt__
= """## @file
24 # THIS IS AUTO-GENERATED FILE BY BUILD TOOLS AND PLEASE DO NOT MAKE MODIFICATION.
26 # This file lists all VPD informations for a platform collected by build.exe.
28 # Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>
29 # This program and the accompanying materials
30 # are licensed and made available under the terms and conditions of the BSD License
31 # which accompanies this distribution. The full text of the license may be found at
32 # http://opensource.org/licenses/bsd-license.php
34 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
35 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
39 __copyright_bsf__
= """/** @file
41 Boot Setting File for Platform Configuration.
43 Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>
44 This program and the accompanying materials
45 are licensed and made available under the terms and conditions of the BSD License
46 which accompanies this distribution. The full text of the license may be found at
47 http://opensource.org/licenses/bsd-license.php
49 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
50 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
52 This file is automatically generated. Please do NOT modify !!!
58 __copyright_h__
= """/** @file
60 Copyright (c) %4d, Intel Corporation. All rights reserved.<BR>
62 Redistribution and use in source and binary forms, with or without modification,
63 are permitted provided that the following conditions are met:
65 * Redistributions of source code must retain the above copyright notice, this
66 list of conditions and the following disclaimer.
67 * Redistributions in binary form must reproduce the above copyright notice, this
68 list of conditions and the following disclaimer in the documentation and/or
69 other materials provided with the distribution.
70 * Neither the name of Intel Corporation nor the names of its contributors may
71 be used to endorse or promote products derived from this software without
72 specific prior written permission.
74 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
75 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
76 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
77 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
78 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
79 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
80 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
81 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
82 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
83 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
84 THE POSSIBILITY OF SUCH DAMAGE.
86 This file is automatically generated. Please do NOT modify !!!
91 class CLogicalExpression
:
96 def errExit(self
, err
= ''):
97 print "ERROR: Express parsing for:"
98 print " %s" % self
.string
99 print " %s^" % (' ' * self
.index
)
101 print "INFO : %s" % err
104 def getNonNumber (self
, n1
, n2
):
111 def getCurr(self
, lens
= 1):
114 return self
.string
[self
.index
:]
116 if self
.index
+ lens
> len(self
.string
):
117 lens
= len(self
.string
) - self
.index
118 return self
.string
[self
.index
: self
.index
+ lens
]
123 return self
.index
== len(self
.string
)
125 def moveNext(self
, len = 1):
129 while not self
.isLast():
130 if self
.getCurr() in ' \t':
135 def normNumber (self
, val
):
136 return True if val
else False
138 def getNumber(self
, var
):
140 if re
.match('^0x[a-fA-F0-9]+$', var
):
142 elif re
.match('^[+-]?\d+$', var
):
148 def parseValue(self
):
151 while not self
.isLast():
152 char
= self
.getCurr()
153 if re
.match('^[\w.]', char
):
158 val
= self
.getNumber(var
)
165 def parseSingleOp(self
):
167 if re
.match('^NOT\W', self
.getCurr(-1)):
169 op
= self
.parseBrace()
170 val
= self
.getNumber (op
)
172 self
.errExit ("'%s' is not a number" % op
)
173 return "%d" % (not self
.normNumber(int(op
)))
175 return self
.parseValue()
177 def parseBrace(self
):
179 char
= self
.getCurr()
182 value
= self
.parseExpr()
184 if self
.getCurr() != ')':
185 self
.errExit ("Expecting closing brace or operator")
189 value
= self
.parseSingleOp()
192 def parseCompare(self
):
193 value
= self
.parseBrace()
196 char
= self
.getCurr()
197 if char
in ['<', '>']:
199 next
= self
.getCurr()
205 result
= self
.parseBrace()
206 test
= self
.getNonNumber(result
, value
)
208 value
= "%d" % self
.normNumber(eval (value
+ op
+ result
))
210 self
.errExit ("'%s' is not a valid number for comparision" % test
)
211 elif char
in ['=', '!']:
213 if op
in ['==', '!=']:
215 result
= self
.parseBrace()
216 test
= self
.getNonNumber(result
, value
)
218 value
= "%d" % self
.normNumber((eval (value
+ op
+ result
)))
220 value
= "%d" % self
.normNumber(eval ("'" + value
+ "'" + op
+ "'" + result
+ "'"))
228 value
= self
.parseCompare()
231 if re
.match('^AND\W', self
.getCurr(-1)):
233 result
= self
.parseCompare()
234 test
= self
.getNonNumber(result
, value
)
236 value
= "%d" % self
.normNumber(int(value
) & int(result
))
238 self
.errExit ("'%s' is not a valid op number for AND" % test
)
243 def parseOrXor(self
):
244 value
= self
.parseAnd()
249 if re
.match('^XOR\W', self
.getCurr(-1)):
252 elif re
.match('^OR\W', self
.getCurr(-1)):
258 result
= self
.parseAnd()
259 test
= self
.getNonNumber(result
, value
)
261 value
= "%d" % self
.normNumber(eval (value
+ op
+ result
))
263 self
.errExit ("'%s' is not a valid op number for XOR/OR" % test
)
267 return self
.parseOrXor()
270 value
= self
.parseExpr()
272 if not self
.isLast():
273 self
.errExit ("Unexpected character found '%s'" % self
.getCurr())
274 test
= self
.getNumber(value
)
276 self
.errExit ("Result '%s' is not a number" % value
)
279 def evaluateExpress (self
, Expr
):
292 self
.ReleaseMode
= True
294 self
._GlobalDataDef
= """
300 self
._BuidinOptionTxt
= """
302 Selection 0x1 , "Enabled"
303 Selection 0x0 , "Disabled"
308 self
._BsfKeyList
= ['FIND','NAME','HELP','TYPE','PAGE','OPTION','ORDER']
309 self
._HdrKeyList
= ['HEADER','STRUCT', 'EMBED', 'COMMENT']
310 self
._BuidinOption
= {'$EN_DIS' : 'EN_DIS'}
313 self
._CfgBlkDict
= {}
314 self
._CfgPageDict
= {}
315 self
._CfgItemList
= []
320 def ParseBuildMode (self
, OutputStr
):
321 if "RELEASE_" in OutputStr
:
322 self
.ReleaseMode
= True
323 if "DEBUG_" in OutputStr
:
324 self
.ReleaseMode
= False
327 def ParseMacros (self
, MacroDefStr
):
328 # ['-DABC=1', '-D', 'CFG_DEBUG=1', '-D', 'CFG_OUTDIR=Build']
331 for Macro
in MacroDefStr
:
332 if Macro
.startswith('-D'):
340 Match
= re
.match("(\w+)=(.+)", Macro
)
342 self
._MacroDict
[Match
.group(1)] = Match
.group(2)
344 Match
= re
.match("(\w+)", Macro
)
346 self
._MacroDict
[Match
.group(1)] = ''
347 if len(self
._MacroDict
) == 0:
352 print "INFO : Macro dictionary:"
353 for Each
in self
._MacroDict
:
354 print " $(%s) = [ %s ]" % (Each
, self
._MacroDict
[Each
])
357 def EvaulateIfdef (self
, Macro
):
358 Result
= Macro
in self
._MacroDict
360 print "INFO : Eval Ifdef [%s] : %s" % (Macro
, Result
)
363 def ExpandMacros (self
, Input
):
365 Match
= re
.findall("\$\(\w+\)", Input
)
368 Variable
= Each
[2:-1]
369 if Variable
in self
._MacroDict
:
370 Line
= Line
.replace(Each
, self
._MacroDict
[Variable
])
373 print "WARN : %s is not defined" % Each
374 Line
= Line
.replace(Each
, Each
[2:-1])
377 def EvaluateExpress (self
, Expr
):
378 ExpExpr
= self
.ExpandMacros(Expr
)
379 LogExpr
= CLogicalExpression()
380 Result
= LogExpr
.evaluateExpress (ExpExpr
)
382 print "INFO : Eval Express [%s] : %s" % (Expr
, Result
)
385 def FormatListValue(self
, ConfigDict
):
386 Struct
= ConfigDict
['struct']
387 if Struct
not in ['UINT8','UINT16','UINT32','UINT64']:
391 binlist
= ConfigDict
['value'][1:-1].split(',')
394 if each
.startswith('0x'):
395 value
= int(each
, 16)
398 dataarray
.append(value
)
400 unit
= int(Struct
[4:]) / 8
401 if int(ConfigDict
['length']) != unit
* len(dataarray
):
402 raise Exception("Array size is not proper for '%s' !" % ConfigDict
['cname'])
405 for each
in dataarray
:
407 for loop
in xrange(unit
):
408 bytearray
.append("0x%02X" % (value
& 0xFF))
410 newvalue
= '{' + ','.join(bytearray
) + '}'
411 ConfigDict
['value'] = newvalue
414 def ParseDscFile (self
, DscFile
, FvDir
, ConfigDscFile
, ExtConfigDscFile
):
415 self
._CfgItemList
= []
416 self
._CfgPageDict
= {}
417 self
._CfgBlkDict
= {}
418 self
._DscFile
= DscFile
431 DscFd
= open(DscFile
, "r")
432 DscLines
= DscFd
.readlines()
436 DscLine
= DscLines
.pop(0).strip()
438 Match
= re
.match("^\[(.+)\]", DscLine
)
439 if Match
is not None:
440 if Match
.group(1).lower() == "Defines".lower():
444 elif Match
.group(1).lower() == "PcdsDynamicVpd.Upd".lower():
446 ConfigDict
['header'] = 'ON'
447 ConfigDict
['region'] = 'UPD'
448 ConfigDict
['order'] = -1
449 ConfigDict
['page'] = ''
450 ConfigDict
['name'] = ''
451 ConfigDict
['find'] = ''
452 ConfigDict
['struct'] = ''
453 ConfigDict
['embed'] = ''
454 ConfigDict
['comment'] = ''
455 ConfigDict
['subreg'] = []
465 if IsDefSect
or IsUpdSect
or IsVpdSect
:
466 if re
.match("^!else($|\s+#.+)", DscLine
):
468 IfStack
[-1] = not IfStack
[-1]
470 print("ERROR: No paired '!if' found for '!else' for line '%s'" % DscLine
)
472 elif re
.match("^!endif($|\s+#.+)", DscLine
):
475 Level
= ElifStack
.pop()
479 print("ERROR: No paired '!if' found for '!endif' for line '%s'" % DscLine
)
483 Match
= re
.match("!(ifdef|ifndef)\s+(.+)", DscLine
)
485 Result
= self
.EvaulateIfdef (Match
.group(2))
486 if Match
.group(1) == 'ifndef':
488 IfStack
.append(Result
)
491 Match
= re
.match("!(if|elseif)\s+(.+)", DscLine
)
493 IsFoundInFile
= False
494 MatchPcdFormat
= re
.match("^\s*(.+)\.(.+)\s*==\s*(.+)", Match
.group(2))
496 ExtConfigDsc
= open(ExtConfigDscFile
, "r")
497 ExtConfigDscLines
= ExtConfigDsc
.readlines()
500 while len(ExtConfigDscLines
):
501 ExtConfigDscLine
= ExtConfigDscLines
.pop(0).strip()
502 MatchExtConfigPcd
= re
.match("^\s*(.+)\s*\|\s*(.+)", ExtConfigDscLine
)
503 if MatchExtConfigPcd
and IsFoundInFile
== False:
504 PcdFormatStr
= str(str(MatchPcdFormat
.group(1)) + "." + str(MatchPcdFormat
.group(2)))
505 ExtConfigPcd
= str(MatchExtConfigPcd
.group(1))
507 if PcdFormatStr
.strip() == ExtConfigPcd
.strip():
508 Result
= self
.EvaluateExpress(str(str(MatchExtConfigPcd
.group(2)) + " == " + str(MatchPcdFormat
.group(3))))
511 if IsFoundInFile
== False:
512 ConfigDsc
= open(ConfigDscFile
, "r")
513 ConfigDscLines
= ConfigDsc
.readlines()
515 while len(ConfigDscLines
):
516 ConfigDscLine
= ConfigDscLines
.pop(0).strip()
517 MatchConfigPcd
= re
.match("^\s*(.+)\s*\|\s*(.+)", ConfigDscLine
)
519 PcdFormatStr
= str(str(MatchPcdFormat
.group(1)) + "." + str(MatchPcdFormat
.group(2)))
520 ConfigPcd
= str(MatchConfigPcd
.group(1))
522 if PcdFormatStr
.strip() == ConfigPcd
.strip():
523 Result
= self
.EvaluateExpress(str(str(MatchConfigPcd
.group(2)) + " == " + str(MatchPcdFormat
.group(3))))
527 Result
= self
.EvaluateExpress(Match
.group(2))
528 if Match
.group(1) == "if":
530 IfStack
.append(Result
)
533 IfStack
[-1] = not IfStack
[-1]
534 IfStack
.append(Result
)
535 ElifStack
[-1] = ElifStack
[-1] + 1
537 print("ERROR: No paired '!if' found for '!elif' for line '%s'" % DscLine
)
541 Handle
= reduce(lambda x
,y
: x
and y
, IfStack
)
545 Match
= re
.match("!include\s+(.+)", DscLine
)
547 IncludeFilePath
= Match
.group(1)
548 IncludeFilePath
= self
.ExpandMacros(IncludeFilePath
)
550 IncludeDsc
= open(IncludeFilePath
, "r")
552 print("ERROR: Cannot open file '%s'" % IncludeFilePath
)
554 NewDscLines
= IncludeDsc
.readlines()
556 DscLines
= NewDscLines
+ DscLines
558 if DscLine
.startswith('!'):
559 print("ERROR: Unrecoginized directive for line '%s'" % DscLine
)
565 #DEFINE UPD_TOOL_GUID = 8C3D856A-9BE6-468E-850A-24F7A8D38E09
566 #DEFINE FSP_T_UPD_TOOL_GUID = 34686CA3-34F9-4901-B82A-BA630F0714C6
567 #DEFINE FSP_M_UPD_TOOL_GUID = 39A250DB-E465-4DD1-A2AC-E2BD3C0E2385
568 #DEFINE FSP_S_UPD_TOOL_GUID = CAE3605B-5B34-4C85-B3D7-27D54273C40F
569 Match
= re
.match("^\s*(?:DEFINE\s+)*(\w+)\s*=\s*([-.\w]+)", DscLine
)
571 self
._MacroDict
[Match
.group(1)] = Match
.group(2)
573 print "INFO : DEFINE %s = [ %s ]" % (Match
.group(1), Match
.group(2))
575 Match
= re
.match("^\s*#\s+(!BSF|@Bsf|!HDR)\s+(.+)", DscLine
)
577 Remaining
= Match
.group(2)
578 if Match
.group(1) == '!BSF' or Match
.group(1) == '@Bsf':
579 Match
= re
.match("(?:^|.+\s+)PAGES:{(.+?)}", Remaining
)
581 # !BSF PAGES:{HSW:"Haswell System Agent", LPT:"Lynx Point PCH"}
582 PageList
= Match
.group(1).split(',')
583 for Page
in PageList
:
585 Match
= re
.match("(\w+):\"(.+)\"", Page
)
586 self
._CfgPageDict
[Match
.group(1)] = Match
.group(2)
588 Match
= re
.match("(?:^|.+\s+)BLOCK:{NAME:\"(.+)\"\s*,\s*VER:\"(.+)\"\s*}", Remaining
)
590 self
._CfgBlkDict
['name'] = Match
.group(1)
591 self
._CfgBlkDict
['ver'] = Match
.group(2)
593 for Key
in self
._BsfKeyList
:
594 Match
= re
.match("(?:^|.+\s+)%s:{(.+?)}" % Key
, Remaining
)
596 if Key
in ['NAME', 'HELP', 'OPTION'] and Match
.group(1).startswith('+'):
597 ConfigDict
[Key
.lower()] += Match
.group(1)[1:]
599 ConfigDict
[Key
.lower()] = Match
.group(1)
601 for Key
in self
._HdrKeyList
:
602 Match
= re
.match("(?:^|.+\s+)%s:{(.+?)}" % Key
, Remaining
)
604 ConfigDict
[Key
.lower()] = Match
.group(1)
606 Match
= re
.match("^\s*#\s+@Prompt\s+(.+)", DscLine
)
608 ConfigDict
['name'] = Match
.group(1)
610 Match
= re
.match("^\s*#\s*@ValidList\s*(.+)\s*\|\s*(.+)\s*\|\s*(.+)\s*", DscLine
)
612 if Match
.group(2).strip() in self
._BuidinOption
:
613 ConfigDict
['option'] = Match
.group(2).strip()
615 OptionValueList
= Match
.group(2).split(',')
616 OptionStringList
= Match
.group(3).split(',')
618 for Option
in OptionValueList
:
619 Option
= Option
.strip()
620 ConfigDict
['option'] = ConfigDict
['option'] + str(Option
) + ':' + OptionStringList
[Index
].strip()
622 if Index
in range(len(OptionValueList
)):
623 ConfigDict
['option'] += ', '
624 ConfigDict
['type'] = "Combo"
626 Match
= re
.match("^\s*#\s*@ValidRange\s*(.+)\s*\|\s*(.+)\s*-\s*(.+)\s*", DscLine
)
628 if "0x" in Match
.group(2) or "0x" in Match
.group(3):
629 ConfigDict
['type'] = "EditNum, HEX, (%s,%s)" % (Match
.group(2), Match
.group(3))
631 ConfigDict
['type'] = "EditNum, DEC, (%s,%s)" % (Match
.group(2), Match
.group(3))
633 Match
= re
.match("^\s*##\s+(.+)", DscLine
)
635 ConfigDict
['help'] = Match
.group(1)
639 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
)
641 Match
= re
.match("^([_a-zA-Z0-9]+).([_a-zA-Z0-9]+)\s*\|\s*(0x[0-9A-F]+)(?:\s*\|\s*(.+))?", DscLine
)
643 ConfigDict
['space'] = Match
.group(1)
644 ConfigDict
['cname'] = Match
.group(2)
645 ConfigDict
['offset'] = int (Match
.group(3), 16)
646 if ConfigDict
['order'] == -1:
647 ConfigDict
['order'] = ConfigDict
['offset'] << 8
649 (Major
, Minor
) = ConfigDict
['order'].split('.')
650 ConfigDict
['order'] = (int (Major
, 16) << 8 ) + int (Minor
, 16)
652 Value
= Match
.group(5).strip()
653 if Match
.group(4).startswith("0x"):
654 Length
= int (Match
.group(4), 16)
656 Length
= int (Match
.group(4))
658 Value
= Match
.group(4)
661 Value
= Value
.strip()
663 Match
= re
.match("^.+\s*\|\s*(.+)", Value
)
665 Value
= Match
.group(1)
668 ConfigDict
['length'] = Length
669 Match
= re
.match("\$\((\w+)\)", Value
)
671 if Match
.group(1) in self
._MacroDict
:
672 Value
= self
._MacroDict
[Match
.group(1)]
674 ConfigDict
['value'] = Value
675 if (len(Value
) > 0) and (Value
[0] == '{'):
676 Value
= self
.FormatListValue(ConfigDict
)
678 if ConfigDict
['name'] == '':
679 # Clear BSF specific items
680 ConfigDict
['bsfname'] = ''
681 ConfigDict
['help'] = ''
682 ConfigDict
['type'] = ''
683 ConfigDict
['option'] = ''
685 self
._CfgItemList
.append(ConfigDict
.copy())
686 ConfigDict
['name'] = ''
687 ConfigDict
['find'] = ''
688 ConfigDict
['struct'] = ''
689 ConfigDict
['embed'] = ''
690 ConfigDict
['comment'] = ''
691 ConfigDict
['order'] = -1
692 ConfigDict
['subreg'] = []
693 ConfigDict
['option'] = ''
695 # It could be a virtual item as below
696 # !BSF FIELD:{1:SerialDebugPortAddress0}
698 # @Bsf FIELD:{1:SerialDebugPortAddress0}
699 Match
= re
.match("^\s*#\s+(!BSF|@Bsf)\s+FIELD:{(.+):(\d+)}", DscLine
)
701 SubCfgDict
= ConfigDict
702 SubCfgDict
['cname'] = Match
.group(2)
703 SubCfgDict
['length'] = int (Match
.group(3))
704 if SubCfgDict
['length'] > 0:
705 LastItem
= self
._CfgItemList
[-1]
706 if len(LastItem
['subreg']) == 0:
709 SubOffset
+= LastItem
['subreg'][-1]['length']
710 SubCfgDict
['offset'] = SubOffset
711 LastItem
['subreg'].append (SubCfgDict
.copy())
712 ConfigDict
['name'] = ''
715 def UpdateSubRegionDefaultValue (self
):
717 for Item
in self
._CfgItemList
:
718 if len(Item
['subreg']) == 0:
721 if Item
['value'][0] == '{':
722 binlist
= Item
['value'][1:-1].split(',')
725 if each
.startswith('0x'):
726 value
= int(each
, 16)
729 bytearray
.append(value
)
731 if Item
['value'].startswith('0x'):
732 value
= int(Item
['value'], 16)
734 value
= int(Item
['value'])
736 while idx
< Item
['length']:
737 bytearray
.append(value
& 0xFF)
740 for SubItem
in Item
['subreg']:
741 if SubItem
['length'] in (1,2,4,8):
742 valuelist
= [b
for b
in bytearray
[SubItem
['offset']:SubItem
['offset']+SubItem
['length']]]
744 valuestr
= "".join('%02X' % b
for b
in valuelist
)
745 SubItem
['value'] = '0x%s' % valuestr
747 valuestr
= ",".join('0x%02X' % b
for b
in bytearray
[SubItem
['offset']:SubItem
['offset']+SubItem
['length']])
748 SubItem
['value'] = '{%s}' % valuestr
751 def CreateSplitUpdTxt (self
, UpdTxtFile
):
752 GuidList
= ['FSP_T_UPD_TOOL_GUID','FSP_M_UPD_TOOL_GUID','FSP_S_UPD_TOOL_GUID']
753 SignatureList
= ['0x545F', '0x4D5F','0x535F'] # _T, _M, and _S signature for FSPT, FSPM, FSPS
754 for Index
in range(len(GuidList
)):
757 if GuidList
[Index
] not in self
._MacroDict
:
758 self
.Error
= "%s definition is missing in DSC file" % (GuidList
[Index
])
762 UpdTxtFile
= os
.path
.join(FvDir
, self
._MacroDict
[GuidList
[Index
]] + '.txt')
765 if not os
.path
.exists(UpdTxtFile
):
768 DscTime
= os
.path
.getmtime(self
._DscFile
)
769 TxtTime
= os
.path
.getmtime(UpdTxtFile
)
770 if DscTime
> TxtTime
:
774 # DSC has not been modified yet
775 # So don't have to re-generate other files
776 self
.Error
= 'No DSC file change, skip to create UPD TXT file'
779 TxtFd
= open(UpdTxtFile
, "w")
780 TxtFd
.write("%s\n" % (__copyright_txt__
% date
.today().year
))
788 for Item
in self
._CfgItemList
:
789 if Item
['cname'] == 'Signature' and str(Item
['value'])[0:6] == SignatureList
[Index
]:
790 StartAddr
= Item
['offset']
791 NextOffset
= StartAddr
793 if Item
['cname'] == 'UpdTerminator' and InRange
== True:
794 EndAddr
= Item
['offset']
797 for Item
in self
._CfgItemList
:
798 if Item
['cname'] == 'Signature' and str(Item
['value'])[0:6] == SignatureList
[Index
]:
802 if Item
['cname'] == 'UpdTerminator':
804 if Item
['region'] != 'UPD':
806 Offset
= Item
['offset']
807 if StartAddr
> Offset
or EndAddr
< Offset
:
809 if NextOffset
< Offset
:
811 TxtFd
.write("%s.UnusedUpdSpace%d|%s0x%04X|0x%04X|{0}\n" % (Item
['space'], SpaceIdx
, Default
, NextOffset
- StartAddr
, Offset
- NextOffset
))
812 SpaceIdx
= SpaceIdx
+ 1
813 NextOffset
= Offset
+ Item
['length']
814 if Item
['cname'] == 'PcdSerialIoUartDebugEnable':
815 if self
.ReleaseMode
== False:
817 TxtFd
.write("%s.%s|%s0x%04X|%s|%s\n" % (Item
['space'],Item
['cname'],Default
,Item
['offset'] - StartAddr
,Item
['length'],Item
['value']))
821 def ProcessMultilines (self
, String
, MaxCharLength
):
823 StringLength
= len(String
)
824 CurrentStringStart
= 0
827 if len(String
) <= MaxCharLength
:
828 while (StringOffset
< StringLength
):
829 if StringOffset
>= 1:
830 if String
[StringOffset
- 1] == '\\' and String
[StringOffset
] == 'n':
831 BreakLineDict
.append (StringOffset
+ 1)
833 if BreakLineDict
!= []:
834 for Each
in BreakLineDict
:
835 Multilines
+= " %s\n" % String
[CurrentStringStart
:Each
].lstrip()
836 CurrentStringStart
= Each
837 if StringLength
- CurrentStringStart
> 0:
838 Multilines
+= " %s\n" % String
[CurrentStringStart
:].lstrip()
840 Multilines
= " %s\n" % String
844 FoundSpaceChar
= False
845 while (StringOffset
< StringLength
):
846 if StringOffset
>= 1:
847 if NewLineCount
>= MaxCharLength
- 1:
848 if String
[StringOffset
] == ' ' and StringLength
- StringOffset
> 10:
849 BreakLineDict
.append (NewLineStart
+ NewLineCount
)
850 NewLineStart
= NewLineStart
+ NewLineCount
852 FoundSpaceChar
= True
853 elif StringOffset
== StringLength
- 1 and FoundSpaceChar
== False:
854 BreakLineDict
.append (0)
855 if String
[StringOffset
- 1] == '\\' and String
[StringOffset
] == 'n':
856 BreakLineDict
.append (StringOffset
+ 1)
857 NewLineStart
= StringOffset
+ 1
861 if BreakLineDict
!= []:
862 BreakLineDict
.sort ()
863 for Each
in BreakLineDict
:
865 Multilines
+= " %s\n" % String
[CurrentStringStart
:Each
].lstrip()
866 CurrentStringStart
= Each
867 if StringLength
- CurrentStringStart
> 0:
868 Multilines
+= " %s\n" % String
[CurrentStringStart
:].lstrip()
871 def CreateField (self
, Item
, Name
, Length
, Offset
, Struct
, BsfName
, Help
, Option
):
879 if Length
in [1,2,4,8]:
880 Type
= "UINT%d" % (Length
* 8)
885 if Item
and Item
['value'].startswith('{'):
891 if Struct
in ['UINT8','UINT16','UINT32','UINT64']:
893 Unit
= int(Type
[4:]) / 8
894 Length
= Length
/ Unit
899 Name
= Name
+ '[%d]' % Length
901 if len(Type
) < PosName
:
902 Space1
= PosName
- len(Type
)
907 NameLine
=" - %s\n" % BsfName
912 HelpLine
= self
.ProcessMultilines (Help
, 80)
915 OptionLine
= self
.ProcessMultilines (Option
, 80)
920 OffsetStr
= '0x%04X' % Offset
922 return "\n/** Offset %s%s%s%s**/\n %s%s%s;\n" % (OffsetStr
, NameLine
, HelpLine
, OptionLine
, Type
, ' ' * Space1
, Name
,)
924 def PostProcessBody (self
, TextBody
):
930 IsUpdHdrDefined
= False
932 for Line
in TextBody
:
933 SplitToLines
= Line
.splitlines()
934 MatchComment
= re
.match("^/\*\sCOMMENT:(\w+):([\w|\W|\s]+)\s\*/\s([\s\S]*)", SplitToLines
[0])
936 if MatchComment
.group(1) == 'FSP_UPD_HEADER':
940 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
941 CommentLine
= " " + MatchComment
.group(2) + "\n"
942 NewTextBody
.append("/**" + CommentLine
+ "**/\n")
943 Line
= Line
[(len(SplitToLines
[0]) + 1):]
945 Match
= re
.match("^/\*\sEMBED_STRUCT:(\w+):(\w+):(START|END)\s\*/\s([\s\S]*)", Line
)
947 Line
= Match
.group(4)
948 if Match
.group(1) == 'FSP_UPD_HEADER':
953 if Match
and Match
.group(3) == 'START':
954 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
955 NewTextBody
.append ('typedef struct {\n')
956 StructName
= Match
.group(1)
957 VariableName
= Match
.group(2)
958 MatchOffset
= re
.search('/\*\*\sOffset\s0x([a-fA-F0-9]+)', Line
)
960 Offset
= int(MatchOffset
.group(1), 16)
965 OldTextBody
.append (self
.CreateField (None, VariableName
, 0, Offset
, StructName
, '', '', ''))
967 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
968 NewTextBody
.append (Line
)
970 OldTextBody
.append (Line
)
972 if Match
and Match
.group(3) == 'END':
973 if (StructName
!= Match
.group(1)) or (VariableName
!= Match
.group(2)):
974 print "Unmatched struct name '%s' and '%s' !" % (StructName
, Match
.group(1))
976 if IsUpdHdrDefined
!= True or IsUpdHeader
!= True:
977 NewTextBody
.append ('} %s;\n\n' % StructName
)
978 IsUpdHdrDefined
= True
980 NewTextBody
.extend(OldTextBody
)
983 def CreateHeaderFile (self
, InputHeaderFile
):
986 HeaderFileName
= 'FspUpd.h'
987 HeaderFile
= os
.path
.join(FvDir
, HeaderFileName
)
989 # Check if header needs to be recreated
993 for Item
in self
._CfgItemList
:
994 if str(Item
['cname']) == 'Signature' and Item
['length'] == 8:
995 Value
= int(Item
['value'], 16)
998 Chars
.append(chr(Value
& 0xFF))
1000 SignatureStr
= ''.join(Chars
)
1001 # Signature will be _T / _M / _S for FSPT / FSPM / FSPS accordingly
1002 if '_T' in SignatureStr
[6:6+2]:
1003 TxtBody
.append("#define FSPT_UPD_SIGNATURE %s /* '%s' */\n\n" % (Item
['value'], SignatureStr
))
1004 elif '_M' in SignatureStr
[6:6+2]:
1005 TxtBody
.append("#define FSPM_UPD_SIGNATURE %s /* '%s' */\n\n" % (Item
['value'], SignatureStr
))
1006 elif '_S' in SignatureStr
[6:6+2]:
1007 TxtBody
.append("#define FSPS_UPD_SIGNATURE %s /* '%s' */\n\n" % (Item
['value'], SignatureStr
))
1008 TxtBody
.append("\n")
1010 for Region
in ['UPD']:
1012 UpdSignature
= ['0x545F', '0x4D5F', '0x535F'] #['_T', '_M', '_S'] signature for FSPT, FSPM, FSPS
1013 UpdStructure
= ['FSPT_UPD', 'FSPM_UPD', 'FSPS_UPD']
1014 for Item
in self
._CfgItemList
:
1015 if Item
["cname"] == 'Signature' and Item
["value"][0:6] in UpdSignature
:
1016 UpdOffsetTable
.append (Item
["offset"])
1018 for UpdIdx
in range(len(UpdOffsetTable
)):
1020 for Item
in self
._CfgItemList
:
1021 if Item
["comment"] != '' and Item
["offset"] >= UpdOffsetTable
[UpdIdx
]:
1022 MatchComment
= re
.match("^(U|V)PD_DATA_REGION:([\w|\W|\s]+)", Item
["comment"])
1023 if MatchComment
and MatchComment
.group(1) == Region
[0]:
1024 CommentLine
= " " + MatchComment
.group(2) + "\n"
1025 TxtBody
.append("/**" + CommentLine
+ "**/\n")
1026 elif Item
["offset"] >= UpdOffsetTable
[UpdIdx
] and Item
["comment"] == '':
1027 Match
= re
.match("^FSP([\w|\W|\s])_UPD", UpdStructure
[UpdIdx
])
1029 TxtBody
.append("/** Fsp " + Match
.group(1) + " UPD Configuration\n**/\n")
1030 TxtBody
.append("typedef struct {\n")
1040 for Item
in self
._CfgItemList
:
1041 if Item
['cname'] == 'Signature' and str(Item
['value'])[0:6] == UpdSignature
[UpdIdx
] or Region
[0] == 'V':
1045 if Item
['cname'] == 'UpdTerminator':
1048 if Item
['region'] != Region
:
1051 if Item
["offset"] < UpdOffsetTable
[UpdIdx
]:
1054 NextVisible
= LastVisible
1056 if LastVisible
and (Item
['header'] == 'OFF'):
1058 ResvOffset
= Item
['offset']
1059 elif (not LastVisible
) and Item
['header'] == 'ON':
1061 Name
= "Reserved" + Region
[0] + "pdSpace%d" % ResvIdx
1062 ResvIdx
= ResvIdx
+ 1
1063 TxtBody
.append(self
.CreateField (Item
, Name
, Item
["offset"] - ResvOffset
, ResvOffset
, '', '', '', ''))
1065 if Offset
< Item
["offset"]:
1067 Name
= "Unused" + Region
[0] + "pdSpace%d" % SpaceIdx
1068 LineBuffer
.append(self
.CreateField (Item
, Name
, Item
["offset"] - Offset
, Offset
, '', '', '', ''))
1069 SpaceIdx
= SpaceIdx
+ 1
1070 Offset
= Item
["offset"]
1072 LastVisible
= NextVisible
1074 Offset
= Offset
+ Item
["length"]
1076 for Each
in LineBuffer
:
1077 TxtBody
.append (Each
)
1079 Comment
= Item
["comment"]
1080 Embed
= Item
["embed"].upper()
1081 if Embed
.endswith(':START') or Embed
.endswith(':END'):
1082 if not Comment
== '' and Embed
.endswith(':START'):
1083 Marker
= '/* COMMENT:%s */ \n' % Item
["comment"]
1084 Marker
= Marker
+ '/* EMBED_STRUCT:%s */ ' % Item
["embed"]
1086 Marker
= '/* EMBED_STRUCT:%s */ ' % Item
["embed"]
1091 self
.Error
= "Invalid embedded structure format '%s'!\n" % Item
["embed"]
1093 Line
= Marker
+ self
.CreateField (Item
, Item
["cname"], Item
["length"], Item
["offset"], Item
['struct'], Item
['name'], Item
['help'], Item
['option'])
1094 TxtBody
.append(Line
)
1095 if Item
['cname'] == 'UpdTerminator':
1097 TxtBody
.append("} " + UpdStructure
[UpdIdx
] + ";\n\n")
1099 # Handle the embedded data structure
1100 TxtBody
= self
.PostProcessBody (TxtBody
)
1102 HeaderTFileName
= 'FsptUpd.h'
1103 HeaderMFileName
= 'FspmUpd.h'
1104 HeaderSFileName
= 'FspsUpd.h'
1106 UpdRegionCheck
= ['FSPT', 'FSPM', 'FSPS'] # FSPX_UPD_REGION
1107 UpdConfigCheck
= ['FSP_T', 'FSP_M', 'FSP_S'] # FSP_X_CONFIG, FSP_X_TEST_CONFIG, FSP_X_RESTRICTED_CONFIG
1108 UpdSignatureCheck
= ['FSPT_UPD_SIGNATURE', 'FSPM_UPD_SIGNATURE', 'FSPS_UPD_SIGNATURE']
1109 ExcludedSpecificUpd
= 'FSPM_ARCH_UPD'
1111 if InputHeaderFile
!= '':
1112 if not os
.path
.exists(InputHeaderFile
):
1113 self
.Error
= "Input header file '%s' does not exist" % InputHeaderFile
1116 InFd
= open(InputHeaderFile
, "r")
1117 IncLines
= InFd
.readlines()
1120 for item
in range(len(UpdRegionCheck
)):
1121 if UpdRegionCheck
[item
] == 'FSPT':
1122 HeaderFd
= open(os
.path
.join(FvDir
, HeaderTFileName
), "w")
1123 FileBase
= os
.path
.basename(os
.path
.join(FvDir
, HeaderTFileName
))
1124 elif UpdRegionCheck
[item
] == 'FSPM':
1125 HeaderFd
= open(os
.path
.join(FvDir
, HeaderMFileName
), "w")
1126 FileBase
= os
.path
.basename(os
.path
.join(FvDir
, HeaderMFileName
))
1127 elif UpdRegionCheck
[item
] == 'FSPS':
1128 HeaderFd
= open(os
.path
.join(FvDir
, HeaderSFileName
), "w")
1129 FileBase
= os
.path
.basename(os
.path
.join(FvDir
, HeaderSFileName
))
1130 FileName
= FileBase
.replace(".", "_").upper()
1131 HeaderFd
.write("%s\n" % (__copyright_h__
% date
.today().year
))
1132 HeaderFd
.write("#ifndef __%s__\n" % FileName
)
1133 HeaderFd
.write("#define __%s__\n\n" % FileName
)
1134 HeaderFd
.write("#include <%s>\n\n" % HeaderFileName
)
1135 HeaderFd
.write("#pragma pack(push, 1)\n\n")
1138 for Line
in IncLines
:
1139 Match
= re
.search ("!EXPORT\s+([A-Z]+)\s+EXTERNAL_BOOTLOADER_STRUCT_(BEGIN|END)\s+", Line
)
1141 if Match
.group(2) == "BEGIN" and Match
.group(1) == UpdRegionCheck
[item
]:
1148 HeaderFd
.write(Line
)
1149 HeaderFd
.write("\n")
1155 StructStartWithComment
= []
1157 for Line
in TxtBody
:
1159 Match
= re
.match("(typedef struct {)", Line
)
1161 StartIndex
= Index
- 1
1162 Match
= re
.match("}\s([_A-Z0-9]+);", Line
)
1163 if Match
and (UpdRegionCheck
[item
] in Match
.group(1) or UpdConfigCheck
[item
] in Match
.group(1)) and (ExcludedSpecificUpd
not in Match
.group(1)):
1165 StructStart
.append(StartIndex
)
1166 StructEnd
.append(EndIndex
)
1168 for Line
in TxtBody
:
1170 for Item
in range(len(StructStart
)):
1171 if Index
== StructStart
[Item
]:
1172 Match
= re
.match("^(/\*\*\s*)", Line
)
1174 StructStartWithComment
.append(StructStart
[Item
])
1176 StructStartWithComment
.append(StructStart
[Item
] + 1)
1178 for Line
in TxtBody
:
1180 for Item
in range(len(StructStart
)):
1181 if Index
>= StructStartWithComment
[Item
] and Index
<= StructEnd
[Item
]:
1182 HeaderFd
.write (Line
)
1183 HeaderFd
.write("#pragma pack(pop)\n\n")
1184 HeaderFd
.write("#endif\n")
1187 HeaderFd
= open(HeaderFile
, "w")
1188 FileBase
= os
.path
.basename(HeaderFile
)
1189 FileName
= FileBase
.replace(".", "_").upper()
1190 HeaderFd
.write("%s\n" % (__copyright_h__
% date
.today().year
))
1191 HeaderFd
.write("#ifndef __%s__\n" % FileName
)
1192 HeaderFd
.write("#define __%s__\n\n" % FileName
)
1193 HeaderFd
.write("#include <FspEas.h>\n\n")
1194 HeaderFd
.write("#pragma pack(push, 1)\n\n")
1196 for item
in range(len(UpdRegionCheck
)):
1201 StructStartWithComment
= []
1203 for Line
in TxtBody
:
1205 Match
= re
.match("(typedef struct {)", Line
)
1207 StartIndex
= Index
- 1
1208 Match
= re
.match("#define\s([_A-Z0-9]+)\s*", Line
)
1209 if Match
and (UpdSignatureCheck
[item
] in Match
.group(1) or UpdSignatureCheck
[item
] in Match
.group(1)):
1210 StructStart
.append(Index
- 1)
1211 StructEnd
.append(Index
)
1213 for Line
in TxtBody
:
1215 for Item
in range(len(StructStart
)):
1216 if Index
== StructStart
[Item
]:
1217 Match
= re
.match("^(/\*\*\s*)", Line
)
1219 StructStartWithComment
.append(StructStart
[Item
])
1221 StructStartWithComment
.append(StructStart
[Item
] + 1)
1223 for Line
in TxtBody
:
1225 for Item
in range(len(StructStart
)):
1226 if Index
>= StructStartWithComment
[Item
] and Index
<= StructEnd
[Item
]:
1227 HeaderFd
.write (Line
)
1228 HeaderFd
.write("#pragma pack(pop)\n\n")
1229 HeaderFd
.write("#endif\n")
1234 def WriteBsfStruct (self
, BsfFd
, Item
):
1235 if Item
['type'] == "None":
1236 Space
= "gPlatformFspPkgTokenSpaceGuid"
1238 Space
= Item
['space']
1239 Line
= " $%s_%s" % (Space
, Item
['cname'])
1240 Match
= re
.match("\s*\{([x0-9a-fA-F,\s]+)\}\s*", Item
['value'])
1242 DefaultValue
= Match
.group(1).strip()
1244 DefaultValue
= Item
['value'].strip()
1245 BsfFd
.write(" %s%s%4d bytes $_DEFAULT_ = %s\n" % (Line
, ' ' * (64 - len(Line
)), Item
['length'], DefaultValue
))
1247 if Item
['type'] == "Combo":
1248 if not Item
['option'] in self
._BuidinOption
:
1249 OptList
= Item
['option'].split(',')
1250 for Option
in OptList
:
1251 Option
= Option
.strip()
1252 (OpVal
, OpStr
) = Option
.split(':')
1253 TmpList
.append((OpVal
, OpStr
))
1256 def WriteBsfOption (self
, BsfFd
, Item
):
1257 PcdName
= Item
['space'] + '_' + Item
['cname']
1259 if Item
['type'] == "Combo":
1260 if Item
['option'] in self
._BuidinOption
:
1261 Options
= self
._BuidinOption
[Item
['option']]
1264 BsfFd
.write(' %s $%s, "%s", &%s,\n' % (Item
['type'], PcdName
, Item
['name'], Options
));
1266 elif Item
['type'].startswith("EditNum"):
1267 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'])
1269 BsfFd
.write(' EditNum $%s, "%s", %s,\n' % (PcdName
, Item
['name'], Match
.group(1)));
1271 elif Item
['type'].startswith("EditText"):
1272 BsfFd
.write(' %s $%s, "%s",\n' % (Item
['type'], PcdName
, Item
['name']));
1274 elif Item
['type'] == "Table":
1275 Columns
= Item
['option'].split(',')
1276 if len(Columns
) != 0:
1277 BsfFd
.write(' %s $%s "%s",' % (Item
['type'], PcdName
, Item
['name']));
1279 Fmt
= Col
.split(':')
1281 raise Exception("Column format '%s' is invalid !" % Fmt
)
1283 Dtype
= int(Fmt
[1].strip())
1285 raise Exception("Column size '%s' is invalid !" % Fmt
[1])
1286 BsfFd
.write('\n Column "%s", %d bytes, %s' % (Fmt
[0].strip(), Dtype
, Fmt
[2].strip()))
1291 HelpLines
= Item
['help'].split('\\n\\r')
1293 for HelpLine
in HelpLines
:
1296 BsfFd
.write(' Help "%s"\n' % (HelpLine
));
1298 BsfFd
.write(' "%s"\n' % (HelpLine
));
1300 BsfFd
.write(' "Valid range: %s ~ %s"\n' % (Match
.group(2), Match
.group(3)));
1302 def GenerateBsfFile (self
, BsfFile
):
1305 self
.Error
= "BSF output file '%s' is invalid" % BsfFile
1310 BsfFd
= open(BsfFile
, "w")
1311 BsfFd
.write("%s\n" % (__copyright_bsf__
% date
.today().year
))
1312 BsfFd
.write("%s\n" % self
._GlobalDataDef
);
1313 BsfFd
.write("StructDef\n")
1315 for Item
in self
._CfgItemList
:
1316 if Item
['find'] != '':
1317 BsfFd
.write('\n Find "%s"\n' % Item
['find'])
1318 NextOffset
= Item
['offset'] + Item
['length']
1319 if Item
['name'] != '':
1320 if NextOffset
!= Item
['offset']:
1321 BsfFd
.write(" Skip %d bytes\n" % (Item
['offset'] - NextOffset
))
1322 if len(Item
['subreg']) > 0:
1323 NextOffset
= Item
['offset']
1324 for SubItem
in Item
['subreg']:
1325 NextOffset
+= SubItem
['length']
1326 if SubItem
['name'] == '':
1327 BsfFd
.write(" Skip %d bytes\n" % (SubItem
['length']))
1329 Options
= self
.WriteBsfStruct(BsfFd
, SubItem
)
1330 if len(Options
) > 0:
1331 OptionDict
[SubItem
['space']+'_'+SubItem
['cname']] = Options
1332 if (Item
['offset'] + Item
['length']) < NextOffset
:
1333 self
.Error
= "BSF sub region '%s' length does not match" % (Item
['space']+'.'+Item
['cname'])
1336 NextOffset
= Item
['offset'] + Item
['length']
1337 Options
= self
.WriteBsfStruct(BsfFd
, Item
)
1338 if len(Options
) > 0:
1339 OptionDict
[Item
['space']+'_'+Item
['cname']] = Options
1340 BsfFd
.write("\nEndStruct\n\n")
1342 BsfFd
.write("%s" % self
._BuidinOptionTxt
);
1344 for Each
in OptionDict
:
1345 BsfFd
.write("List &%s\n" % Each
);
1346 for Item
in OptionDict
[Each
]:
1347 BsfFd
.write(' Selection %s , "%s"\n' % (Item
[0], Item
[1]));
1348 BsfFd
.write("EndList\n\n");
1350 BsfFd
.write("BeginInfoBlock\n");
1351 BsfFd
.write(' PPVer "%s"\n' % (self
._CfgBlkDict
['ver']));
1352 BsfFd
.write(' Description "%s"\n' % (self
._CfgBlkDict
['name']));
1353 BsfFd
.write("EndInfoBlock\n\n");
1355 for Each
in self
._CfgPageDict
:
1356 BsfFd
.write('Page "%s"\n' % self
._CfgPageDict
[Each
]);
1358 for Item
in self
._CfgItemList
:
1359 if Item
['name'] != '':
1360 if Item
['page'] != Each
:
1362 if len(Item
['subreg']) > 0:
1363 for SubItem
in Item
['subreg']:
1364 if SubItem
['name'] != '':
1365 BsfItems
.append(SubItem
)
1367 BsfItems
.append(Item
)
1369 BsfItems
.sort(key
=lambda x
: x
['order'])
1371 for Item
in BsfItems
:
1372 self
.WriteBsfOption (BsfFd
, Item
)
1373 BsfFd
.write("EndPage\n\n");
1380 print "GenCfgOpt Version 0.51"
1382 print " GenCfgOpt UPDTXT PlatformDscFile BuildFvDir ConfigDscFile ExtConfigDscFile"
1383 print " [-D Macros]"
1384 print " GenCfgOpt HEADER PlatformDscFile BuildFvDir ConfigDscFile ExtConfigDscFile"
1385 print " InputHFile [-D Macros]"
1386 print " GenCfgOpt GENBSF PlatformDscFile BuildFvDir ConfigDscFile ExtConfigDscFile"
1387 print " BsfOutFile [-D Macros]"
1391 # Parse the options and args
1393 GenCfgOpt
= CGenCfgOpt()
1394 argc
= len(sys
.argv
)
1399 DscFile
= sys
.argv
[2]
1400 if not os
.path
.exists(DscFile
):
1401 print "ERROR: Cannot open DSC file '%s' !" % DscFile
1403 ConfigDscFile
= sys
.argv
[4]
1404 if not os
.path
.exists(ConfigDscFile
):
1405 print "ERROR: Cannot open Config DSC file '%s' !" % ConfigDscFile
1407 ExtConfigDscFile
= sys
.argv
[5]
1408 if not os
.path
.exists(ExtConfigDscFile
):
1409 print "ERROR: Cannot open Ext Config DSC file '%s' !" % ExtConfigDscFile
1414 if sys
.argv
[6][0] == '-':
1417 OutFile
= sys
.argv
[6]
1419 GenCfgOpt
.ParseBuildMode(sys
.argv
[3])
1420 if GenCfgOpt
.ParseMacros(sys
.argv
[Start
:]) != 0:
1421 print "ERROR: Macro parsing failed !"
1425 if not os
.path
.exists(FvDir
):
1428 if GenCfgOpt
.ParseDscFile(DscFile
, FvDir
, ConfigDscFile
, ExtConfigDscFile
) != 0:
1429 print "ERROR: %s !" % GenCfgOpt
.Error
1432 if GenCfgOpt
.UpdateSubRegionDefaultValue() != 0:
1433 print "ERROR: %s !" % GenCfgOpt
.Error
1436 if sys
.argv
[1] == "UPDTXT":
1437 Ret
= GenCfgOpt
.CreateSplitUpdTxt(OutFile
)
1439 # No change is detected
1441 print "INFO: %s !" % (GenCfgOpt
.Error
)
1443 print "ERROR: %s !" % (GenCfgOpt
.Error
)
1445 elif sys
.argv
[1] == "HEADER":
1446 if GenCfgOpt
.CreateHeaderFile(OutFile
) != 0:
1447 print "ERROR: %s !" % GenCfgOpt
.Error
1449 elif sys
.argv
[1] == "GENBSF":
1450 if GenCfgOpt
.GenerateBsfFile(OutFile
) != 0:
1451 print "ERROR: %s !" % GenCfgOpt
.Error
1457 print "ERROR: Unknown command '%s' !" % sys
.argv
[1]
1464 if __name__
== '__main__':