4 # Copyright (c) 2007, Intel Corporation
6 # All rights reserved. This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
22 import FfsInfStatement
23 import FfsFileStatement
29 import CompressSection
34 import RuleComplexFile
38 import ComponentStatement
40 import OptRomInfStatement
41 import OptRomFileStatement
43 from Common
.BuildToolError
import *
44 from Common
import EdkLogger
49 ##define T_CHAR_SPACE ' '
50 ##define T_CHAR_NULL '\0'
51 ##define T_CHAR_CR '\r'
52 ##define T_CHAR_TAB '\t'
53 ##define T_CHAR_LF '\n'
54 ##define T_CHAR_SLASH '/'
55 ##define T_CHAR_BACKSLASH '\\'
56 ##define T_CHAR_DOUBLE_QUOTE '\"'
57 ##define T_CHAR_SINGLE_QUOTE '\''
58 ##define T_CHAR_STAR '*'
59 ##define T_CHAR_HASH '#'
61 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
62 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
63 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
65 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
68 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
70 # All Macro values when parsing file, not replace existing Macro
73 def GetRealFileLine (File
, Line
):
76 for Profile
in IncludeFileList
:
77 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
78 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
79 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
80 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
82 return (File
, Line
- InsertedLines
)
84 ## The exception class that used to report error messages when parsing FDF
86 # Currently the "ToolName" is set to be "FDF Parser".
88 class Warning (Exception):
91 # @param self The object pointer
92 # @param Str The message to record
93 # @param File The FDF name
94 # @param Line The Line number that error occurs
96 def __init__(self
, Str
, File
= None, Line
= None):
98 FileLineTuple
= GetRealFileLine(File
, Line
)
99 self
.FileName
= FileLineTuple
[0]
100 self
.LineNumber
= FileLineTuple
[1]
102 self
.ToolName
= 'FdfParser'
107 ## The MACRO class that used to record macro value data when parsing include file
113 # @param self The object pointer
114 # @param FileName The file that to be parsed
116 def __init__(self
, FileName
, Line
):
117 self
.FileName
= FileName
118 self
.DefinedAtLine
= Line
119 self
.MacroName
= None
120 self
.MacroValue
= None
122 ## The Include file content class that used to record file data when parsing include file
124 # May raise Exception when opening file.
126 class IncludeFileProfile
:
129 # @param self The object pointer
130 # @param FileName The file that to be parsed
132 def __init__(self
, FileName
):
133 self
.FileName
= FileName
134 self
.FileLinesList
= []
136 fsock
= open(FileName
, "rb", 0)
138 self
.FileLinesList
= fsock
.readlines()
143 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
145 self
.InsertStartLineNumber
= None
146 self
.InsertAdjust
= 0
148 ## The FDF content class that used to record file data when parsing FDF
150 # May raise Exception when opening file.
155 # @param self The object pointer
156 # @param FileName The file that to be parsed
158 def __init__(self
, FileName
):
159 self
.FileLinesList
= []
161 fsock
= open(FileName
, "rb", 0)
163 self
.FileLinesList
= fsock
.readlines()
168 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
176 self
.CapsuleList
= []
181 ## The syntax parser for FDF
183 # PreprocessFile method should be called prior to ParseFile
184 # CycleReferenceCheck method can detect cycles in FDF contents
186 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
187 # Get*** procedures mean these procedures will make judgement on current token only.
192 # @param self The object pointer
193 # @param FileName The file that to be parsed
195 def __init__(self
, FileName
):
196 self
.Profile
= FileProfile(FileName
)
197 self
.FileName
= FileName
198 self
.CurrentLineNumber
= 1
199 self
.CurrentOffsetWithinLine
= 0
200 self
.CurrentFdName
= None
201 self
.CurrentFvName
= None
203 self
.__SkippedChars
= ""
205 self
.__WipeOffArea
= []
207 ## __IsWhiteSpace() method
209 # Whether char at current FileBufferPos is whitespace
211 # @param self The object pointer
212 # @param Char The char to test
213 # @retval True The char is a kind of white space
214 # @retval False The char is NOT a kind of white space
216 def __IsWhiteSpace(self
, Char
):
217 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
222 ## __SkipWhiteSpace() method
224 # Skip white spaces from current char, return number of chars skipped
226 # @param self The object pointer
227 # @retval Count The number of chars skipped
229 def __SkipWhiteSpace(self
):
231 while not self
.__EndOfFile
():
233 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
234 self
.__SkippedChars
+= str(self
.__CurrentChar
())
241 ## __EndOfFile() method
243 # Judge current buffer pos is at file end
245 # @param self The object pointer
246 # @retval True Current File buffer position is at file end
247 # @retval False Current File buffer position is NOT at file end
249 def __EndOfFile(self
):
250 NumberOfLines
= len(self
.Profile
.FileLinesList
)
251 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
252 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
254 elif self
.CurrentLineNumber
> NumberOfLines
:
259 ## __EndOfLine() method
261 # Judge current buffer pos is at line end
263 # @param self The object pointer
264 # @retval True Current File buffer position is at line end
265 # @retval False Current File buffer position is NOT at line end
267 def __EndOfLine(self
):
268 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
270 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
271 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
278 # Reset file data buffer to the initial state
280 # @param self The object pointer
283 self
.CurrentLineNumber
= 1
284 self
.CurrentOffsetWithinLine
= 0
286 ## __UndoOneChar() method
288 # Go back one char in the file buffer
290 # @param self The object pointer
291 # @retval True Successfully go back one char
292 # @retval False Not able to go back one char as file beginning reached
294 def __UndoOneChar(self
):
296 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
298 elif self
.CurrentOffsetWithinLine
== 0:
299 self
.CurrentLineNumber
-= 1
300 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
302 self
.CurrentOffsetWithinLine
-= 1
305 ## __GetOneChar() method
307 # Move forward one char in the file buffer
309 # @param self The object pointer
311 def __GetOneChar(self
):
312 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
313 self
.CurrentLineNumber
+= 1
314 self
.CurrentOffsetWithinLine
= 0
316 self
.CurrentOffsetWithinLine
+= 1
318 ## __CurrentChar() method
320 # Get the char pointed to by the file buffer pointer
322 # @param self The object pointer
323 # @retval Char Current char
325 def __CurrentChar(self
):
326 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
328 ## __NextChar() method
330 # Get the one char pass the char pointed to by the file buffer pointer
332 # @param self The object pointer
333 # @retval Char Next char
335 def __NextChar(self
):
336 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
337 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
339 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
341 ## __SetCurrentCharValue() method
343 # Modify the value of current char
345 # @param self The object pointer
346 # @param Value The new value of current char
348 def __SetCurrentCharValue(self
, Value
):
349 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
351 ## __CurrentLine() method
353 # Get the list that contains current line contents
355 # @param self The object pointer
356 # @retval List current line contents
358 def __CurrentLine(self
):
359 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
361 def __StringToList(self
):
362 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
363 self
.Profile
.FileLinesList
[-1].append(' ')
365 def __ReplaceMacros(self
, Str
, File
, Line
):
367 while Str
.find('$(', MacroEnd
) >= 0:
368 MacroStart
= Str
.find('$(', MacroEnd
)
369 if Str
.find(')', MacroStart
) > 0:
370 MacroEnd
= Str
.find(')', MacroStart
)
371 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
373 if Name
in InputMacroDict
:
374 Value
= InputMacroDict
[Name
]
377 for Profile
in AllMacroList
:
378 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
379 Value
= Profile
.MacroValue
382 Str
= Str
.replace('$(' + Name
+ ')', Value
)
383 MacroEnd
= MacroStart
+ len(Value
)
386 raise Warning("Macro not complete", self
.FileName
, self
.CurrentLineNumber
)
389 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
390 if StartPos
[0] == EndPos
[0]:
392 while Offset
<= EndPos
[1]:
393 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
398 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
399 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
403 while Line
< EndPos
[0]:
405 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
406 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
411 while Offset
<= EndPos
[1]:
412 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
416 ## PreprocessFile() method
418 # Preprocess file contents, replace comments with spaces.
419 # In the end, rewind the file buffer pointer to the beginning
420 # BUGBUG: No !include statement processing contained in this procedure
421 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
423 # @param self The object pointer
425 def PreprocessFile(self
):
429 DoubleSlashComment
= False
431 # HashComment in quoted string " " is ignored.
434 while not self
.__EndOfFile
():
436 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
437 InString
= not InString
438 # meet new line, then no longer in a comment for // and '#'
439 if self
.__CurrentChar
() == T_CHAR_LF
:
440 self
.CurrentLineNumber
+= 1
441 self
.CurrentOffsetWithinLine
= 0
442 if InComment
and DoubleSlashComment
:
444 DoubleSlashComment
= False
445 if InComment
and HashComment
:
448 # check for */ comment end
449 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
450 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
452 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
455 # set comments to spaces
457 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
459 # check for // comment
460 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
462 DoubleSlashComment
= True
463 # check for '#' comment
464 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
467 # check for /* comment start
468 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
469 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
471 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
477 # restore from ListOfList to ListOfString
478 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
481 ## PreprocessIncludeFile() method
483 # Preprocess file contents, replace !include statements with file contents.
484 # In the end, rewind the file buffer pointer to the beginning
486 # @param self The object pointer
488 def PreprocessIncludeFile(self
):
490 while self
.__GetNextToken
():
492 if self
.__Token
== '!include':
493 IncludeLine
= self
.CurrentLineNumber
494 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
495 if not self
.__GetNextToken
():
496 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
497 IncFileName
= self
.__Token
498 if not os
.path
.isabs(IncFileName
):
499 if IncFileName
.startswith('$(WORKSPACE)'):
500 Str
= IncFileName
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
501 if os
.path
.exists(Str
):
502 if not os
.path
.isabs(Str
):
503 Str
= os
.path
.abspath(Str
)
506 # file is in the same dir with FDF file
507 FullFdf
= self
.FileName
508 if not os
.path
.isabs(self
.FileName
):
509 FullFdf
= os
.path
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
511 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
513 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
514 raise Warning("Include file not exists", self
.FileName
, self
.CurrentLineNumber
)
516 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
518 CurrentLine
= self
.CurrentLineNumber
519 CurrentOffset
= self
.CurrentOffsetWithinLine
520 # list index of the insertion, note that line number is 'CurrentLine + 1'
521 InsertAtLine
= CurrentLine
522 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
523 # deal with remaining portions after "!include filename", if exists.
524 if self
.__GetNextToken
():
525 if self
.CurrentLineNumber
== CurrentLine
:
526 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
527 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
528 IncFileProfile
.InsertAdjust
+= 1
529 self
.CurrentLineNumber
+= 1
530 self
.CurrentOffsetWithinLine
= 0
532 for Line
in IncFileProfile
.FileLinesList
:
533 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
534 self
.CurrentLineNumber
+= 1
537 IncludeFileList
.append(IncFileProfile
)
539 # comment out the processed include file statement
540 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
541 TempList
.insert(IncludeOffset
, '#')
542 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
546 ## PreprocessIncludeFile() method
548 # Preprocess file contents, replace !include statements with file contents.
549 # In the end, rewind the file buffer pointer to the beginning
551 # @param self The object pointer
553 def PreprocessConditionalStatement(self
):
554 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
556 while self
.__GetNextToken
():
557 if self
.__Token
== 'DEFINE':
558 DefineLine
= self
.CurrentLineNumber
- 1
559 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
560 if not self
.__GetNextToken
():
561 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
563 if not self
.__IsToken
( "="):
564 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
566 if not self
.__GetNextToken
():
567 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
569 if self
.__GetStringData
():
572 if not Macro
in InputMacroDict
:
573 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
574 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
575 MacProfile
.MacroName
= Macro
576 MacProfile
.MacroValue
= Value
577 AllMacroList
.append(MacProfile
)
578 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
580 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
581 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
582 IfList
.append([IfStartPos
, None, None])
583 CondLabel
= self
.__Token
585 if not self
.__GetNextToken
():
586 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
587 MacroName
= self
.__Token
589 if MacroName
.startswith('!'):
591 MacroName
= MacroName
[1:]
593 NotDefineFlag
= False
594 if CondLabel
== '!ifndef':
596 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
598 raise Warning("'NOT' operation not allowed for Macro name", self
.FileName
, self
.CurrentLineNumber
)
600 if CondLabel
== '!if':
602 if not self
.__GetNextOp
():
603 raise Warning("expected !endif", self
.FileName
, self
.CurrentLineNumber
)
605 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
607 if not self
.__GetNextToken
():
608 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
609 if self
.__GetStringData
():
611 MacroValue
= self
.__Token
612 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
614 ConditionSatisfied
= not ConditionSatisfied
615 BranchDetermined
= ConditionSatisfied
617 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
618 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
620 ConditionSatisfied
= not ConditionSatisfied
621 BranchDetermined
= ConditionSatisfied
622 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
623 if ConditionSatisfied
:
624 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
627 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
629 ConditionSatisfied
= not ConditionSatisfied
630 BranchDetermined
= ConditionSatisfied
631 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
632 if ConditionSatisfied
:
633 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
635 elif self
.__Token
in ('!elseif', '!else'):
636 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
638 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
640 IfList
[-1] = [ElseStartPos
, False, True]
641 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
643 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
644 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
645 if self
.__Token
== '!elseif':
646 if not self
.__GetNextToken
():
647 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
648 MacroName
= self
.__Token
650 if MacroName
.startswith('!'):
652 MacroName
= MacroName
[1:]
654 if not self
.__GetNextOp
():
655 raise Warning("expected !endif", self
.FileName
, self
.CurrentLineNumber
)
657 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
659 if not self
.__GetNextToken
():
660 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
661 if self
.__GetStringData
():
663 MacroValue
= self
.__Token
664 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
666 ConditionSatisfied
= not ConditionSatisfied
669 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
670 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
672 ConditionSatisfied
= not ConditionSatisfied
674 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
678 IfList
[-1][1] = False
681 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
684 elif self
.__Token
== '!endif':
686 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
688 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
694 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
697 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
699 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
700 if Name
in InputMacroDict
:
701 MacroValue
= InputMacroDict
[Name
]
703 if Value
== 'Bool' and MacroValue
== None or MacroValue
.upper() == 'FALSE':
707 if Value
!= MacroValue
:
712 if Value
== MacroValue
:
717 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
!= None and MacroValue
.isdigit())):
718 InputVal
= long(Value
, 0)
719 MacroVal
= long(MacroValue
, 0)
721 if MacroVal
> InputVal
:
726 if MacroVal
>= InputVal
:
731 if MacroVal
< InputVal
:
736 if MacroVal
<= InputVal
:
743 raise Warning("Value %s is not a number", self
.FileName
, Line
)
745 for Profile
in AllMacroList
:
746 if Profile
.FileName
== FileLineTuple
[0] and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
748 if Value
== 'Bool' and Profile
.MacroValue
== None or Profile
.MacroValue
.upper() == 'FALSE':
752 if Value
!= Profile
.MacroValue
:
757 if Value
== Profile
.MacroValue
:
762 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
!= None and Profile
.MacroValue
.isdigit())):
763 InputVal
= long(Value
, 0)
764 MacroVal
= long(Profile
.MacroValue
, 0)
766 if MacroVal
> InputVal
:
771 if MacroVal
>= InputVal
:
776 if MacroVal
< InputVal
:
781 if MacroVal
<= InputVal
:
788 raise Warning("Value %s is not a number", self
.FileName
, Line
)
792 ## __IsToken() method
794 # Check whether input string is found from current char position along
795 # If found, the string value is put into self.__Token
797 # @param self The object pointer
798 # @param String The string to search
799 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
800 # @retval True Successfully find string, file buffer pointer moved forward
801 # @retval False Not able to find string, file buffer pointer not changed
803 def __IsToken(self
, String
, IgnoreCase
= False):
804 self
.__SkipWhiteSpace
()
806 # Only consider the same line, no multi-line token allowed
807 StartPos
= self
.CurrentOffsetWithinLine
810 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
812 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
814 self
.CurrentOffsetWithinLine
+= len(String
)
815 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
819 ## __IsKeyword() method
821 # Check whether input keyword is found from current char position along, whole word only!
822 # If found, the string value is put into self.__Token
824 # @param self The object pointer
825 # @param Keyword The string to search
826 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
827 # @retval True Successfully find string, file buffer pointer moved forward
828 # @retval False Not able to find string, file buffer pointer not changed
830 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
831 self
.__SkipWhiteSpace
()
833 # Only consider the same line, no multi-line token allowed
834 StartPos
= self
.CurrentOffsetWithinLine
837 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
839 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
841 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
842 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
844 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
845 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
849 ## __GetNextWord() method
851 # Get next C name from file lines
852 # If found, the string value is put into self.__Token
854 # @param self The object pointer
855 # @retval True Successfully find a C name string, file buffer pointer moved forward
856 # @retval False Not able to find a C name string, file buffer pointer not changed
858 def __GetNextWord(self
):
859 self
.__SkipWhiteSpace
()
860 if self
.__EndOfFile
():
863 TempChar
= self
.__CurrentChar
()
864 StartPos
= self
.CurrentOffsetWithinLine
865 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
867 while not self
.__EndOfLine
():
868 TempChar
= self
.__CurrentChar
()
869 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
870 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
876 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
881 ## __GetNextToken() method
883 # Get next token unit before a seperator
884 # If found, the string value is put into self.__Token
886 # @param self The object pointer
887 # @retval True Successfully find a token unit, file buffer pointer moved forward
888 # @retval False Not able to find a token unit, file buffer pointer not changed
890 def __GetNextToken(self
):
891 # Skip leading spaces, if exist.
892 self
.__SkipWhiteSpace
()
893 if self
.__EndOfFile
():
895 # Record the token start position, the position of the first non-space char.
896 StartPos
= self
.CurrentOffsetWithinLine
897 StartLine
= self
.CurrentLineNumber
898 while not self
.__EndOfLine
():
899 TempChar
= self
.__CurrentChar
()
900 # Try to find the end char that is not a space and not in seperator tuple.
901 # That is, when we got a space or any char in the tuple, we got the end of token.
902 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
904 # if we happen to meet a seperator as the first char, we must proceed to get it.
905 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
906 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
914 EndPos
= self
.CurrentOffsetWithinLine
915 if self
.CurrentLineNumber
!= StartLine
:
916 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
917 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
918 if StartPos
!= self
.CurrentOffsetWithinLine
:
923 def __GetNextOp(self
):
924 # Skip leading spaces, if exist.
925 self
.__SkipWhiteSpace
()
926 if self
.__EndOfFile
():
928 # Record the token start position, the position of the first non-space char.
929 StartPos
= self
.CurrentOffsetWithinLine
930 while not self
.__EndOfLine
():
931 TempChar
= self
.__CurrentChar
()
932 # Try to find the end char that is not a space
933 if not str(TempChar
).isspace():
940 if StartPos
!= self
.CurrentOffsetWithinLine
:
941 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
945 ## __GetNextGuid() method
947 # Get next token unit before a seperator
948 # If found, the GUID string is put into self.__Token
950 # @param self The object pointer
951 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
952 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
954 def __GetNextGuid(self
):
956 if not self
.__GetNextToken
():
958 p
= re
.compile('[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')
959 if p
.match(self
.__Token
) != None:
965 ## __UndoToken() method
967 # Go back one token unit in file buffer
969 # @param self The object pointer
971 def __UndoToken(self
):
973 while self
.__CurrentChar
().isspace():
974 if not self
.__UndoOneChar
():
979 StartPos
= self
.CurrentOffsetWithinLine
980 CurrentLine
= self
.CurrentLineNumber
981 while CurrentLine
== self
.CurrentLineNumber
:
983 TempChar
= self
.__CurrentChar
()
984 # Try to find the end char that is not a space and not in seperator tuple.
985 # That is, when we got a space or any char in the tuple, we got the end of token.
986 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
987 if not self
.__UndoOneChar
():
989 # if we happen to meet a seperator as the first char, we must proceed to get it.
990 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
991 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
998 ## __HexDigit() method
1000 # Whether char input is a Hex data bit
1002 # @param self The object pointer
1003 # @param TempChar The char to test
1004 # @retval True The char is a Hex data bit
1005 # @retval False The char is NOT a Hex data bit
1007 def __HexDigit(self
, TempChar
):
1008 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1009 or (TempChar
>= '0' and TempChar
<= '9'):
1014 def __IsHex(self
, HexStr
):
1015 if not HexStr
.upper().startswith("0X"):
1017 if len(self
.__Token
) <= 2:
1019 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1020 if len(charList
) == 0:
1024 ## __GetNextHexNumber() method
1026 # Get next HEX data before a seperator
1027 # If found, the HEX data is put into self.__Token
1029 # @param self The object pointer
1030 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1031 # @retval False Not able to find a HEX data, file buffer pointer not changed
1033 def __GetNextHexNumber(self
):
1034 if not self
.__GetNextToken
():
1036 if self
.__IsHex
(self
.__Token
):
1042 ## __GetNextDecimalNumber() method
1044 # Get next decimal data before a seperator
1045 # If found, the decimal data is put into self.__Token
1047 # @param self The object pointer
1048 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1049 # @retval False Not able to find a decimal data, file buffer pointer not changed
1051 def __GetNextDecimalNumber(self
):
1052 if not self
.__GetNextToken
():
1054 if self
.__Token
.isdigit():
1060 ## __GetNextPcdName() method
1062 # Get next PCD token space C name and PCD C name pair before a seperator
1063 # If found, the decimal data is put into self.__Token
1065 # @param self The object pointer
1066 # @retval Tuple PCD C name and PCD token space C name pair
1068 def __GetNextPcdName(self
):
1069 if not self
.__GetNextWord
():
1070 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1071 pcdTokenSpaceCName
= self
.__Token
1073 if not self
.__IsToken
( "."):
1074 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1076 if not self
.__GetNextWord
():
1077 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1078 pcdCName
= self
.__Token
1080 return (pcdCName
, pcdTokenSpaceCName
)
1082 ## __GetStringData() method
1084 # Get string contents quoted in ""
1085 # If found, the decimal data is put into self.__Token
1087 # @param self The object pointer
1088 # @retval True Successfully find a string data, file buffer pointer moved forward
1089 # @retval False Not able to find a string data, file buffer pointer not changed
1091 def __GetStringData(self
):
1092 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1094 self
.__SkipToToken
("\"")
1095 currentLineNumber
= self
.CurrentLineNumber
1097 if not self
.__SkipToToken
("\""):
1098 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1099 if currentLineNumber
!= self
.CurrentLineNumber
:
1100 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1101 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1104 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1106 self
.__SkipToToken
("\'")
1107 currentLineNumber
= self
.CurrentLineNumber
1109 if not self
.__SkipToToken
("\'"):
1110 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1111 if currentLineNumber
!= self
.CurrentLineNumber
:
1112 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1113 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1119 ## __SkipToToken() method
1121 # Search forward in file buffer for the string
1122 # The skipped chars are put into self.__SkippedChars
1124 # @param self The object pointer
1125 # @param String The string to search
1126 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1127 # @retval True Successfully find the string, file buffer pointer moved forward
1128 # @retval False Not able to find the string, file buffer pointer not changed
1130 def __SkipToToken(self
, String
, IgnoreCase
= False):
1131 StartPos
= self
.GetFileBufferPos()
1133 self
.__SkippedChars
= ""
1134 while not self
.__EndOfFile
():
1137 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1139 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1141 self
.CurrentOffsetWithinLine
+= len(String
)
1142 self
.__SkippedChars
+= String
1144 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1147 self
.SetFileBufferPos( StartPos
)
1148 self
.__SkippedChars
= ""
1151 ## GetFileBufferPos() method
1153 # Return the tuple of current line and offset within the line
1155 # @param self The object pointer
1156 # @retval Tuple Line number and offset pair
1158 def GetFileBufferPos(self
):
1159 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1161 ## SetFileBufferPos() method
1163 # Restore the file buffer position
1165 # @param self The object pointer
1166 # @param Pos The new file buffer position
1168 def SetFileBufferPos(self
, Pos
):
1169 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1171 ## ParseFile() method
1173 # Parse the file profile buffer to extract fd, fv ... information
1174 # Exception will be raised if syntax error found
1176 # @param self The object pointer
1178 def ParseFile(self
):
1181 self
.__StringToList
()
1182 self
.PreprocessFile()
1183 self
.PreprocessIncludeFile()
1184 self
.__StringToList
()
1185 self
.PreprocessFile()
1186 self
.PreprocessConditionalStatement()
1187 self
.__StringToList
()
1188 for Pos
in self
.__WipeOffArea
:
1189 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1190 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1192 while self
.__GetDefines
():
1196 while Index
< len(self
.Profile
.FileLinesList
):
1197 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1198 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1201 while self
.__GetFd
():
1204 while self
.__GetFv
():
1207 while self
.__GetCapsule
():
1210 while self
.__GetVtf
():
1213 while self
.__GetRule
():
1216 while self
.__GetOptionRom
():
1221 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1222 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1223 X
.Message
+= ' near line %d, column %d: %s' \
1224 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1227 ## __GetDefines() method
1229 # Get Defines section contents and store its data into AllMacrosList
1231 # @param self The object pointer
1232 # @retval True Successfully find a Defines
1233 # @retval False Not able to find a Defines
1235 def __GetDefines(self
):
1237 if not self
.__GetNextToken
():
1240 S
= self
.__Token
.upper()
1241 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1242 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1243 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1244 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1249 if not self
.__IsToken
("[DEFINES", True):
1250 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1251 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1252 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1253 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1255 if not self
.__IsToken
( "]"):
1256 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1258 while self
.__GetNextWord
():
1259 Macro
= self
.__Token
1261 if not self
.__IsToken
("="):
1262 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1263 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1264 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1265 Value
= self
.__Token
1266 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1267 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1268 MacProfile
.MacroName
= Macro
1269 MacProfile
.MacroValue
= Value
1270 AllMacroList
.append(MacProfile
)
1276 # Get FD section contents and store its data into FD dictionary of self.Profile
1278 # @param self The object pointer
1279 # @retval True Successfully find a FD
1280 # @retval False Not able to find a FD
1284 if not self
.__GetNextToken
():
1287 S
= self
.__Token
.upper()
1288 if S
.startswith("[") and not S
.startswith("[FD."):
1289 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1290 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1291 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1296 if not self
.__IsToken
("[FD.", True):
1297 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1298 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1299 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1300 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1302 FdName
= self
.__GetUiName
()
1303 self
.CurrentFdName
= FdName
.upper()
1305 if not self
.__IsToken
( "]"):
1306 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1309 FdObj
.FdUiName
= self
.CurrentFdName
1310 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1311 Status
= self
.__GetCreateFile
(FdObj
)
1313 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1315 if not self
.__GetTokenStatements
(FdObj
):
1318 self
.__GetDefineStatements
(FdObj
)
1320 self
.__GetSetStatements
(FdObj
)
1322 if not self
.__GetRegionLayout
(FdObj
):
1323 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1325 while self
.__GetRegionLayout
(FdObj
):
1329 ## __GetUiName() method
1331 # Return the UI name of a section
1333 # @param self The object pointer
1334 # @retval FdName UI name
1336 def __GetUiName(self
):
1338 if self
.__GetNextWord
():
1343 ## __GetCreateFile() method
1345 # Return the output file name of object
1347 # @param self The object pointer
1348 # @param Obj object whose data will be stored in file
1349 # @retval FdName UI name
1351 def __GetCreateFile(self
, Obj
):
1353 if self
.__IsKeyword
( "CREATE_FILE"):
1354 if not self
.__IsToken
( "="):
1355 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1357 if not self
.__GetNextToken
():
1358 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1360 FileName
= self
.__Token
1361 Obj
.CreateFileName
= FileName
1365 ## __GetTokenStatements() method
1367 # Get token statements
1369 # @param self The object pointer
1370 # @param Obj for whom token statement is got
1371 # @retval True Successfully find a token statement
1372 # @retval False Not able to find a token statement
1374 def __GetTokenStatements(self
, Obj
):
1375 if not self
.__IsKeyword
( "BaseAddress"):
1376 raise Warning("BaseAddress missing", self
.FileName
, self
.CurrentLineNumber
)
1378 if not self
.__IsToken
( "="):
1379 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1381 if not self
.__GetNextHexNumber
():
1382 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1384 Obj
.BaseAddress
= self
.__Token
1386 if self
.__IsToken
( "|"):
1387 pcdPair
= self
.__GetNextPcdName
()
1388 Obj
.BaseAddressPcd
= pcdPair
1389 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1391 if not self
.__IsKeyword
( "Size"):
1392 raise Warning("Size missing", self
.FileName
, self
.CurrentLineNumber
)
1394 if not self
.__IsToken
( "="):
1395 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1397 if not self
.__GetNextHexNumber
():
1398 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1402 if self
.__IsToken
( "|"):
1403 pcdPair
= self
.__GetNextPcdName
()
1404 Obj
.SizePcd
= pcdPair
1405 self
.Profile
.PcdDict
[pcdPair
] = Size
1406 Obj
.Size
= long(Size
, 0)
1408 if not self
.__IsKeyword
( "ErasePolarity"):
1409 raise Warning("ErasePolarity missing", self
.FileName
, self
.CurrentLineNumber
)
1411 if not self
.__IsToken
( "="):
1412 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1414 if not self
.__GetNextToken
():
1415 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1417 if self
.__Token
!= "1" and self
.__Token
!= "0":
1418 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1420 Obj
.ErasePolarity
= self
.__Token
1422 Status
= self
.__GetBlockStatements
(Obj
)
1425 ## __GetAddressStatements() method
1427 # Get address statements
1429 # @param self The object pointer
1430 # @param Obj for whom address statement is got
1431 # @retval True Successfully find
1432 # @retval False Not able to find
1434 def __GetAddressStatements(self
, Obj
):
1436 if self
.__IsKeyword
("BsBaseAddress"):
1437 if not self
.__IsToken
( "="):
1438 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1440 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1441 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1443 BsAddress
= long(self
.__Token
, 0)
1444 Obj
.BsBaseAddress
= BsAddress
1446 if self
.__IsKeyword
("RtBaseAddress"):
1447 if not self
.__IsToken
( "="):
1448 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1450 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1451 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1453 RtAddress
= long(self
.__Token
, 0)
1454 Obj
.RtBaseAddress
= RtAddress
1456 ## __GetBlockStatements() method
1458 # Get block statements
1460 # @param self The object pointer
1461 # @param Obj for whom block statement is got
1462 # @retval True Successfully find
1463 # @retval False Not able to find
1465 def __GetBlockStatements(self
, Obj
):
1467 if not self
.__GetBlockStatement
(Obj
):
1468 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1470 while self
.__GetBlockStatement
(Obj
):
1474 ## __GetBlockStatement() method
1476 # Get block statement
1478 # @param self The object pointer
1479 # @param Obj for whom block statement is got
1480 # @retval True Successfully find
1481 # @retval False Not able to find
1483 def __GetBlockStatement(self
, Obj
):
1484 if not self
.__IsKeyword
( "BlockSize"):
1487 if not self
.__IsToken
( "="):
1488 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1490 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1491 raise Warning("expected Hex block size", self
.FileName
, self
.CurrentLineNumber
)
1493 BlockSize
= self
.__Token
1495 if self
.__IsToken
( "|"):
1496 PcdPair
= self
.__GetNextPcdName
()
1497 BlockSizePcd
= PcdPair
1498 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1499 BlockSize
= long(self
.__Token
, 0)
1502 if self
.__IsKeyword
( "NumBlocks"):
1503 if not self
.__IsToken
( "="):
1504 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1506 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1507 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1509 BlockNumber
= long(self
.__Token
, 0)
1511 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1514 ## __GetDefineStatements() method
1516 # Get define statements
1518 # @param self The object pointer
1519 # @param Obj for whom define statement is got
1520 # @retval True Successfully find
1521 # @retval False Not able to find
1523 def __GetDefineStatements(self
, Obj
):
1524 while self
.__GetDefineStatement
( Obj
):
1527 ## __GetDefineStatement() method
1529 # Get define statement
1531 # @param self The object pointer
1532 # @param Obj for whom define statement is got
1533 # @retval True Successfully find
1534 # @retval False Not able to find
1536 def __GetDefineStatement(self
, Obj
):
1537 if self
.__IsKeyword
("DEFINE"):
1538 self
.__GetNextToken
()
1539 Macro
= self
.__Token
1540 if not self
.__IsToken
( "="):
1541 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1543 if not self
.__GetNextToken
():
1544 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1546 Value
= self
.__Token
1547 Macro
= '$(' + Macro
+ ')'
1548 Obj
.DefineVarDict
[Macro
] = Value
1553 ## __GetSetStatements() method
1555 # Get set statements
1557 # @param self The object pointer
1558 # @param Obj for whom set statement is got
1559 # @retval True Successfully find
1560 # @retval False Not able to find
1562 def __GetSetStatements(self
, Obj
):
1563 while self
.__GetSetStatement
(Obj
):
1566 ## __GetSetStatement() method
1570 # @param self The object pointer
1571 # @param Obj for whom set statement is got
1572 # @retval True Successfully find
1573 # @retval False Not able to find
1575 def __GetSetStatement(self
, Obj
):
1576 if self
.__IsKeyword
("SET"):
1577 PcdPair
= self
.__GetNextPcdName
()
1579 if not self
.__IsToken
( "="):
1580 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1582 if not self
.__GetNextToken
():
1583 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1585 Value
= self
.__Token
1586 if Value
.startswith("{"):
1587 # deal with value with {}
1588 if not self
.__SkipToToken
( "}"):
1589 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1590 Value
+= self
.__SkippedChars
1592 Obj
.SetVarDict
[PcdPair
] = Value
1593 self
.Profile
.PcdDict
[PcdPair
] = Value
1598 ## __GetRegionLayout() method
1600 # Get region layout for FD
1602 # @param self The object pointer
1603 # @param Fd for whom region is got
1604 # @retval True Successfully find
1605 # @retval False Not able to find
1607 def __GetRegionLayout(self
, Fd
):
1608 if not self
.__GetNextHexNumber
():
1611 RegionObj
= Region
.Region()
1612 RegionObj
.Offset
= long(self
.__Token
, 0)
1613 Fd
.RegionList
.append(RegionObj
)
1615 if not self
.__IsToken
( "|"):
1616 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1618 if not self
.__GetNextHexNumber
():
1619 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1620 RegionObj
.Size
= long(self
.__Token
, 0)
1622 if not self
.__GetNextWord
():
1625 if not self
.__Token
in ("SET", "FV", "FILE", "DATA"):
1627 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1628 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1629 if self
.__IsToken
( "|"):
1630 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1631 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1633 if not self
.__GetNextWord
():
1636 if self
.__Token
== "SET":
1638 self
.__GetSetStatements
( RegionObj
)
1639 if not self
.__GetNextWord
():
1642 if self
.__Token
== "FV":
1644 self
.__GetRegionFvType
( RegionObj
)
1646 elif self
.__Token
== "FILE":
1648 self
.__GetRegionFileType
( RegionObj
)
1652 self
.__GetRegionDataType
( RegionObj
)
1656 ## __GetRegionFvType() method
1658 # Get region fv data for region
1660 # @param self The object pointer
1661 # @param RegionObj for whom region data is got
1663 def __GetRegionFvType(self
, RegionObj
):
1665 if not self
.__IsKeyword
( "FV"):
1666 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1668 if not self
.__IsToken
( "="):
1669 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1671 if not self
.__GetNextToken
():
1672 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1674 RegionObj
.RegionType
= "FV"
1675 RegionObj
.RegionDataList
.append(self
.__Token
)
1677 while self
.__IsKeyword
( "FV"):
1679 if not self
.__IsToken
( "="):
1680 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1682 if not self
.__GetNextToken
():
1683 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1685 RegionObj
.RegionDataList
.append(self
.__Token
)
1687 ## __GetRegionFileType() method
1689 # Get region file data for region
1691 # @param self The object pointer
1692 # @param RegionObj for whom region data is got
1694 def __GetRegionFileType(self
, RegionObj
):
1696 if not self
.__IsKeyword
( "FILE"):
1697 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1699 if not self
.__IsToken
( "="):
1700 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1702 if not self
.__GetNextToken
():
1703 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1705 RegionObj
.RegionType
= "FILE"
1706 RegionObj
.RegionDataList
.append( self
.__Token
)
1708 while self
.__IsKeyword
( "FILE"):
1710 if not self
.__IsToken
( "="):
1711 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1713 if not self
.__GetNextToken
():
1714 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1716 RegionObj
.RegionDataList
.append(self
.__Token
)
1718 ## __GetRegionDataType() method
1720 # Get region array data for region
1722 # @param self The object pointer
1723 # @param RegionObj for whom region data is got
1725 def __GetRegionDataType(self
, RegionObj
):
1727 if not self
.__IsKeyword
( "DATA"):
1728 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
1730 if not self
.__IsToken
( "="):
1731 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1733 if not self
.__IsToken
( "{"):
1734 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1736 if not self
.__GetNextHexNumber
():
1737 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1739 if len(self
.__Token
) > 4:
1740 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1742 DataString
= self
.__Token
1745 while self
.__IsToken
(","):
1746 if not self
.__GetNextHexNumber
():
1747 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1748 if len(self
.__Token
) > 4:
1749 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1750 DataString
+= self
.__Token
1753 if not self
.__IsToken
( "}"):
1754 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1756 DataString
= DataString
.rstrip(",")
1757 RegionObj
.RegionType
= "DATA"
1758 RegionObj
.RegionDataList
.append( DataString
)
1760 while self
.__IsKeyword
( "DATA"):
1762 if not self
.__IsToken
( "="):
1763 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1765 if not self
.__IsToken
( "{"):
1766 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1768 if not self
.__GetNextHexNumber
():
1769 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1771 if len(self
.__Token
) > 4:
1772 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1774 DataString
= self
.__Token
1777 while self
.__IsToken
(","):
1778 self
.__GetNextHexNumber
()
1779 if len(self
.__Token
) > 4:
1780 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1781 DataString
+= self
.__Token
1784 if not self
.__IsToken
( "}"):
1785 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1787 DataString
= DataString
.rstrip(",")
1788 RegionObj
.RegionDataList
.append( DataString
)
1792 # Get FV section contents and store its data into FV dictionary of self.Profile
1794 # @param self The object pointer
1795 # @retval True Successfully find a FV
1796 # @retval False Not able to find a FV
1799 if not self
.__GetNextToken
():
1802 S
= self
.__Token
.upper()
1803 if S
.startswith("[") and not S
.startswith("[FV."):
1804 if not S
.startswith("[CAPSULE.") \
1805 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1806 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1811 if not self
.__IsToken
("[FV.", True):
1812 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1813 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1814 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1815 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1817 FvName
= self
.__GetUiName
()
1818 self
.CurrentFvName
= FvName
.upper()
1820 if not self
.__IsToken
( "]"):
1821 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1824 FvObj
.UiFvName
= self
.CurrentFvName
1825 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1827 Status
= self
.__GetCreateFile
(FvObj
)
1829 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
1831 self
.__GetDefineStatements
(FvObj
)
1833 self
.__GetAddressStatements
(FvObj
)
1835 self
.__GetBlockStatement
(FvObj
)
1837 self
.__GetSetStatements
(FvObj
)
1839 self
.__GetFvAlignment
(FvObj
)
1841 self
.__GetFvAttributes
(FvObj
)
1843 self
.__GetFvNameGuid
(FvObj
)
1845 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1846 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1849 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1850 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1851 if not isInf
and not isFile
:
1856 ## __GetFvAlignment() method
1858 # Get alignment for FV
1860 # @param self The object pointer
1861 # @param Obj for whom alignment is got
1862 # @retval True Successfully find a alignment statement
1863 # @retval False Not able to find a alignment statement
1865 def __GetFvAlignment(self
, Obj
):
1867 if not self
.__IsKeyword
( "FvAlignment"):
1870 if not self
.__IsToken
( "="):
1871 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1873 if not self
.__GetNextToken
():
1874 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
1876 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1877 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1878 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1880 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1881 Obj
.FvAlignment
= self
.__Token
1884 ## __GetFvAttributes() method
1886 # Get attributes for FV
1888 # @param self The object pointer
1889 # @param Obj for whom attribute is got
1892 def __GetFvAttributes(self
, FvObj
):
1894 while self
.__GetNextWord
():
1896 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1897 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1898 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1899 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1900 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
1901 "WRITE_POLICY_RELIABLE"):
1905 if not self
.__IsToken
( "="):
1906 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1908 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
1909 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
1911 FvObj
.FvAttributeDict
[name
] = self
.__Token
1915 ## __GetFvNameGuid() method
1917 # Get FV GUID for FV
1919 # @param self The object pointer
1920 # @param Obj for whom GUID is got
1923 def __GetFvNameGuid(self
, FvObj
):
1925 if not self
.__IsKeyword
( "FvNameGuid"):
1928 if not self
.__IsToken
( "="):
1929 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1931 if not self
.__GetNextGuid
():
1932 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
1934 FvObj
.FvNameGuid
= self
.__Token
1938 ## __GetAprioriSection() method
1940 # Get token statements
1942 # @param self The object pointer
1943 # @param FvObj for whom apriori is got
1944 # @param MacroDict dictionary used to replace macro
1945 # @retval True Successfully find apriori statement
1946 # @retval False Not able to find apriori statement
1948 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
1950 if not self
.__IsKeyword
( "APRIORI"):
1953 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
1954 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
1955 AprType
= self
.__Token
1957 if not self
.__IsToken
( "{"):
1958 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1960 AprSectionObj
= AprioriSection
.AprioriSection()
1961 AprSectionObj
.AprioriType
= AprType
1963 self
.__GetDefineStatements
(AprSectionObj
)
1964 MacroDict
.update(AprSectionObj
.DefineVarDict
)
1967 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
1968 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
1969 if not IsInf
and not IsFile
:
1972 if not self
.__IsToken
( "}"):
1973 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1975 FvObj
.AprioriSectionList
.append(AprSectionObj
)
1978 ## __GetInfStatement() method
1980 # Get INF statements
1982 # @param self The object pointer
1983 # @param Obj for whom inf statement is got
1984 # @param MacroDict dictionary used to replace macro
1985 # @retval True Successfully find inf statement
1986 # @retval False Not able to find inf statement
1988 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
1990 if not self
.__IsKeyword
( "INF"):
1993 ffsInf
= FfsInfStatement
.FfsInfStatement()
1994 self
.__GetInfOptions
( ffsInf
)
1996 if not self
.__GetNextToken
():
1997 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
1998 ffsInf
.InfFileName
= self
.__Token
2000 # if ffsInf.InfFileName.find('$') >= 0:
2001 # ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
2003 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2004 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2006 if self
.__IsToken
('|'):
2007 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2008 ffsInf
.KeepReloc
= False
2009 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2010 ffsInf
.KeepReloc
= True
2012 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2015 capsuleFfs
= CapsuleData
.CapsuleFfs()
2016 capsuleFfs
.Ffs
= ffsInf
2017 Obj
.CapsuleDataList
.append(capsuleFfs
)
2019 Obj
.FfsList
.append(ffsInf
)
2022 ## __GetInfOptions() method
2024 # Get options for INF
2026 # @param self The object pointer
2027 # @param FfsInfObj for whom option is got
2029 def __GetInfOptions(self
, FfsInfObj
):
2031 if self
.__IsKeyword
( "RuleOverride"):
2032 if not self
.__IsToken
( "="):
2033 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2034 if not self
.__GetNextToken
():
2035 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2036 FfsInfObj
.Rule
= self
.__Token
2038 if self
.__IsKeyword
( "VERSION"):
2039 if not self
.__IsToken
( "="):
2040 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2041 if not self
.__GetNextToken
():
2042 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2044 if self
.__GetStringData
():
2045 FfsInfObj
.Version
= self
.__Token
2047 if self
.__IsKeyword
( "UI"):
2048 if not self
.__IsToken
( "="):
2049 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2050 if not self
.__GetNextToken
():
2051 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2053 if self
.__GetStringData
():
2054 FfsInfObj
.Ui
= self
.__Token
2056 if self
.__IsKeyword
( "USE"):
2057 if not self
.__IsToken
( "="):
2058 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2059 if not self
.__GetNextToken
():
2060 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2061 FfsInfObj
.UseArch
= self
.__Token
2064 if self
.__GetNextToken
():
2065 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2066 if p
.match(self
.__Token
):
2067 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2068 if not self
.__IsToken
(","):
2074 while self
.__GetNextToken
():
2075 if not p
.match(self
.__Token
):
2076 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2077 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2079 if not self
.__IsToken
(","):
2082 ## __GetFileStatement() method
2084 # Get FILE statements
2086 # @param self The object pointer
2087 # @param Obj for whom FILE statement is got
2088 # @param MacroDict dictionary used to replace macro
2089 # @retval True Successfully find FILE statement
2090 # @retval False Not able to find FILE statement
2092 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2094 if not self
.__IsKeyword
( "FILE"):
2097 FfsFileObj
= FfsFileStatement
.FileStatement()
2099 if not self
.__GetNextWord
():
2100 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2101 FfsFileObj
.FvFileType
= self
.__Token
2103 if not self
.__IsToken
( "="):
2104 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2106 if not self
.__GetNextGuid
():
2107 if not self
.__GetNextWord
():
2108 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2109 if self
.__Token
== 'PCD':
2110 if not self
.__IsToken
( "("):
2111 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2112 PcdPair
= self
.__GetNextPcdName
()
2113 if not self
.__IsToken
( ")"):
2114 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2115 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2117 FfsFileObj
.NameGuid
= self
.__Token
2119 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2122 capsuleFfs
= CapsuleData
.CapsuleFfs()
2123 capsuleFfs
.Ffs
= FfsFileObj
2124 Obj
.CapsuleDataList
.append(capsuleFfs
)
2126 Obj
.FfsList
.append(FfsFileObj
)
2130 ## __FileCouldHaveRelocFlag() method
2132 # Check whether reloc strip flag can be set for a file type.
2134 # @param self The object pointer
2135 # @param FileType The file type to check with
2136 # @retval True This type could have relocation strip flag
2137 # @retval False No way to have it
2140 def __FileCouldHaveRelocFlag (self
, FileType
):
2141 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2146 ## __SectionCouldHaveRelocFlag() method
2148 # Check whether reloc strip flag can be set for a section type.
2150 # @param self The object pointer
2151 # @param SectionType The section type to check with
2152 # @retval True This type could have relocation strip flag
2153 # @retval False No way to have it
2156 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2157 if SectionType
in ('TE', 'PE32'):
2162 ## __GetFilePart() method
2164 # Get components for FILE statement
2166 # @param self The object pointer
2167 # @param FfsFileObj for whom component is got
2168 # @param MacroDict dictionary used to replace macro
2170 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2172 self
.__GetFileOpts
( FfsFileObj
)
2174 if not self
.__IsToken
("{"):
2175 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2176 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2177 # if self.__Token == 'RELOCS_STRIPPED':
2178 # FfsFileObj.KeepReloc = False
2180 # FfsFileObj.KeepReloc = True
2182 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2184 # if not self.__IsToken("{"):
2185 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2187 if not self
.__GetNextToken
():
2188 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2190 if self
.__Token
== "FV":
2191 if not self
.__IsToken
( "="):
2192 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2193 if not self
.__GetNextToken
():
2194 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2195 FfsFileObj
.FvName
= self
.__Token
2197 elif self
.__Token
== "FD":
2198 if not self
.__IsToken
( "="):
2199 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2200 if not self
.__GetNextToken
():
2201 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2202 FfsFileObj
.FdName
= self
.__Token
2204 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2206 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2208 FfsFileObj
.FileName
= self
.__Token
2210 if not self
.__IsToken
( "}"):
2211 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2213 ## __GetFileOpts() method
2215 # Get options for FILE statement
2217 # @param self The object pointer
2218 # @param FfsFileObj for whom options is got
2220 def __GetFileOpts(self
, FfsFileObj
):
2222 if self
.__GetNextToken
():
2223 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2224 if Pattern
.match(self
.__Token
):
2225 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2226 if self
.__IsToken
(","):
2227 while self
.__GetNextToken
():
2228 if not Pattern
.match(self
.__Token
):
2229 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2230 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2232 if not self
.__IsToken
(","):
2238 if self
.__IsKeyword
( "FIXED", True):
2239 FfsFileObj
.Fixed
= True
2241 if self
.__IsKeyword
( "CHECKSUM", True):
2242 FfsFileObj
.CheckSum
= True
2244 if self
.__GetAlignment
():
2245 FfsFileObj
.Alignment
= self
.__Token
2249 ## __GetAlignment() method
2251 # Return the alignment value
2253 # @param self The object pointer
2254 # @retval True Successfully find alignment
2255 # @retval False Not able to find alignment
2257 def __GetAlignment(self
):
2258 if self
.__IsKeyword
( "Align", True):
2259 if not self
.__IsToken
( "="):
2260 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2262 if not self
.__GetNextToken
():
2263 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2268 ## __GetFilePart() method
2270 # Get section data for FILE statement
2272 # @param self The object pointer
2273 # @param FfsFileObj for whom section is got
2274 # @param MacroDict dictionary used to replace macro
2276 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2278 Dict
.update(MacroDict
)
2280 self
.__GetDefineStatements
(FfsFileObj
)
2282 Dict
.update(FfsFileObj
.DefineVarDict
)
2283 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2284 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2287 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2288 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2289 if not IsLeafSection
and not IsEncapSection
:
2292 ## __GetLeafSection() method
2294 # Get leaf section for Obj
2296 # @param self The object pointer
2297 # @param Obj for whom leaf section is got
2298 # @param MacroDict dictionary used to replace macro
2299 # @retval True Successfully find section statement
2300 # @retval False Not able to find section statement
2302 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2304 OldPos
= self
.GetFileBufferPos()
2306 if not self
.__IsKeyword
( "SECTION"):
2307 if len(Obj
.SectionList
) == 0:
2308 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2313 if self
.__GetAlignment
():
2314 AlignValue
= self
.__Token
2317 if self
.__IsKeyword
( "BUILD_NUM"):
2318 if not self
.__IsToken
( "="):
2319 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2321 if not self
.__GetNextToken
():
2322 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2324 BuildNum
= self
.__Token
2326 if self
.__IsKeyword
( "VERSION"):
2327 if not self
.__IsToken
( "="):
2328 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2329 if not self
.__GetNextToken
():
2330 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2331 VerSectionObj
= VerSection
.VerSection()
2332 VerSectionObj
.Alignment
= AlignValue
2333 VerSectionObj
.BuildNum
= BuildNum
2334 if self
.__GetStringData
():
2335 VerSectionObj
.StringData
= self
.__Token
2337 VerSectionObj
.FileName
= self
.__Token
2338 Obj
.SectionList
.append(VerSectionObj
)
2340 elif self
.__IsKeyword
( "UI"):
2341 if not self
.__IsToken
( "="):
2342 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2343 if not self
.__GetNextToken
():
2344 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2345 UiSectionObj
= UiSection
.UiSection()
2346 UiSectionObj
.Alignment
= AlignValue
2347 if self
.__GetStringData
():
2348 UiSectionObj
.StringData
= self
.__Token
2350 UiSectionObj
.FileName
= self
.__Token
2351 Obj
.SectionList
.append(UiSectionObj
)
2353 elif self
.__IsKeyword
( "FV_IMAGE"):
2354 if not self
.__IsToken
( "="):
2355 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2356 if not self
.__GetNextToken
():
2357 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2359 FvName
= self
.__Token
2362 if self
.__IsToken
( "{"):
2364 FvObj
.UiFvName
= FvName
.upper()
2365 self
.__GetDefineStatements
(FvObj
)
2366 MacroDict
.update(FvObj
.DefineVarDict
)
2367 self
.__GetBlockStatement
(FvObj
)
2368 self
.__GetSetStatements
(FvObj
)
2369 self
.__GetFvAlignment
(FvObj
)
2370 self
.__GetFvAttributes
(FvObj
)
2371 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2372 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2375 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2376 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2377 if not IsInf
and not IsFile
:
2380 if not self
.__IsToken
( "}"):
2381 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2383 FvImageSectionObj
= FvImageSection
.FvImageSection()
2384 FvImageSectionObj
.Alignment
= AlignValue
2386 FvImageSectionObj
.Fv
= FvObj
2387 FvImageSectionObj
.FvName
= None
2389 FvImageSectionObj
.FvName
= FvName
.upper()
2390 FvImageSectionObj
.FvFileName
= FvName
2392 Obj
.SectionList
.append(FvImageSectionObj
)
2394 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2395 DepexSectionObj
= DepexSection
.DepexSection()
2396 DepexSectionObj
.Alignment
= AlignValue
2397 DepexSectionObj
.DepexType
= self
.__Token
2399 if not self
.__IsToken
( "="):
2400 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2401 if not self
.__IsToken
( "{"):
2402 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2403 if not self
.__SkipToToken
( "}"):
2404 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2406 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2407 Obj
.SectionList
.append(DepexSectionObj
)
2411 if not self
.__GetNextWord
():
2412 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2414 # Encapsulation section appear, UndoToken and return
2415 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2416 self
.SetFileBufferPos(OldPos
)
2419 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2420 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2421 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2423 DataSectionObj
= DataSection
.DataSection()
2424 DataSectionObj
.Alignment
= AlignValue
2425 DataSectionObj
.SecType
= self
.__Token
2427 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2428 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2429 if self
.__Token
== 'RELOCS_STRIPPED':
2430 DataSectionObj
.KeepReloc
= False
2432 DataSectionObj
.KeepReloc
= True
2434 raise Warning("File type %s, section type %s, could not have reloc strip flag%d" % (Obj
.FvFileType
, DataSectionObj
.SecType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2436 if self
.__IsToken
("="):
2437 if not self
.__GetNextToken
():
2438 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2439 DataSectionObj
.SectFileName
= self
.__Token
2441 if not self
.__GetCglSection
(DataSectionObj
):
2444 Obj
.SectionList
.append(DataSectionObj
)
2448 ## __GetCglSection() method
2450 # Get compressed or GUIDed section for Obj
2452 # @param self The object pointer
2453 # @param Obj for whom leaf section is got
2454 # @param AlignValue alignment value for complex section
2455 # @retval True Successfully find section statement
2456 # @retval False Not able to find section statement
2458 def __GetCglSection(self
, Obj
, AlignValue
= None):
2460 if self
.__IsKeyword
( "COMPRESS"):
2462 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2465 if not self
.__IsToken
("{"):
2466 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2468 CompressSectionObj
= CompressSection
.CompressSection()
2469 CompressSectionObj
.Alignment
= AlignValue
2470 CompressSectionObj
.CompType
= type
2471 # Recursive sections...
2473 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2474 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2475 if not IsLeafSection
and not IsEncapSection
:
2479 if not self
.__IsToken
( "}"):
2480 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2481 Obj
.SectionList
.append(CompressSectionObj
)
2484 # raise Warning("Compress type not known")
2488 elif self
.__IsKeyword
( "GUIDED"):
2490 if self
.__GetNextGuid
():
2491 GuidValue
= self
.__Token
2493 AttribDict
= self
.__GetGuidAttrib
()
2494 if not self
.__IsToken
("{"):
2495 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2496 GuidSectionObj
= GuidSection
.GuidSection()
2497 GuidSectionObj
.Alignment
= AlignValue
2498 GuidSectionObj
.NameGuid
= GuidValue
2499 GuidSectionObj
.SectionType
= "GUIDED"
2500 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2501 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2502 # Recursive sections...
2504 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2505 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2506 if not IsLeafSection
and not IsEncapSection
:
2509 if not self
.__IsToken
( "}"):
2510 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2511 Obj
.SectionList
.append(GuidSectionObj
)
2517 ## __GetGuidAttri() method
2519 # Get attributes for GUID section
2521 # @param self The object pointer
2522 # @retval AttribDict Dictionary of key-value pair of section attributes
2524 def __GetGuidAttrib(self
):
2527 AttribDict
["PROCESSING_REQUIRED"] = False
2528 AttribDict
["AUTH_STATUS_VALID"] = False
2529 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2530 AttribKey
= self
.__Token
2532 if not self
.__IsToken
("="):
2533 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2535 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2536 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2537 AttribDict
[AttribKey
] = self
.__Token
2539 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2540 AttribKey
= self
.__Token
2542 if not self
.__IsToken
("="):
2543 raise Warning("expected '='")
2545 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2546 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2547 AttribDict
[AttribKey
] = self
.__Token
2551 ## __GetEncapsulationSec() method
2553 # Get encapsulation section for FILE
2555 # @param self The object pointer
2556 # @param FfsFile for whom section is got
2557 # @retval True Successfully find section statement
2558 # @retval False Not able to find section statement
2560 def __GetEncapsulationSec(self
, FfsFileObj
):
2562 OldPos
= self
.GetFileBufferPos()
2563 if not self
.__IsKeyword
( "SECTION"):
2564 if len(FfsFileObj
.SectionList
) == 0:
2565 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2570 if self
.__GetAlignment
():
2571 AlignValue
= self
.__Token
2573 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2574 self
.SetFileBufferPos(OldPos
)
2579 ## __GetCapsule() method
2581 # Get capsule section contents and store its data into capsule list of self.Profile
2583 # @param self The object pointer
2584 # @retval True Successfully find a capsule
2585 # @retval False Not able to find a capsule
2587 def __GetCapsule(self
):
2589 if not self
.__GetNextToken
():
2592 S
= self
.__Token
.upper()
2593 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2594 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2595 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2600 if not self
.__IsToken
("[CAPSULE.", True):
2601 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2602 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2603 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2604 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2606 CapsuleObj
= Capsule
.Capsule()
2608 CapsuleName
= self
.__GetUiName
()
2610 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2612 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2614 if not self
.__IsToken
( "]"):
2615 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2617 if self
.__IsKeyword
("CREATE_FILE"):
2618 if not self
.__IsToken
( "="):
2619 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2621 if not self
.__GetNextToken
():
2622 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2624 CapsuleObj
.CreateFile
= self
.__Token
2626 self
.__GetCapsuleStatements
(CapsuleObj
)
2627 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2630 ## __GetCapsuleStatements() method
2632 # Get statements for capsule
2634 # @param self The object pointer
2635 # @param Obj for whom statements are got
2637 def __GetCapsuleStatements(self
, Obj
):
2638 self
.__GetCapsuleTokens
(Obj
)
2639 self
.__GetDefineStatements
(Obj
)
2640 self
.__GetSetStatements
(Obj
)
2642 self
.__GetCapsuleData
(Obj
)
2644 ## __GetCapsuleStatements() method
2646 # Get token statements for capsule
2648 # @param self The object pointer
2649 # @param Obj for whom token statements are got
2651 def __GetCapsuleTokens(self
, Obj
):
2653 if not self
.__IsKeyword
("CAPSULE_GUID"):
2654 raise Warning("expected 'CAPSULE_GUID'", self
.FileName
, self
.CurrentLineNumber
)
2656 while self
.__CurrentLine
().find("=") != -1:
2657 NameValue
= self
.__CurrentLine
().split("=")
2658 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2659 self
.CurrentLineNumber
+= 1
2660 self
.CurrentOffsetWithinLine
= 0
2662 ## __GetCapsuleData() method
2664 # Get capsule data for capsule
2666 # @param self The object pointer
2667 # @param Obj for whom capsule data are got
2669 def __GetCapsuleData(self
, Obj
):
2672 IsInf
= self
.__GetInfStatement
(Obj
, True)
2673 IsFile
= self
.__GetFileStatement
(Obj
, True)
2674 IsFv
= self
.__GetFvStatement
(Obj
)
2675 if not IsInf
and not IsFile
and not IsFv
:
2678 ## __GetFvStatement() method
2680 # Get FV for capsule
2682 # @param self The object pointer
2683 # @param CapsuleObj for whom FV is got
2684 # @retval True Successfully find a FV statement
2685 # @retval False Not able to find a FV statement
2687 def __GetFvStatement(self
, CapsuleObj
):
2689 if not self
.__IsKeyword
("FV"):
2692 if not self
.__IsToken
("="):
2693 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2695 if not self
.__GetNextToken
():
2696 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2698 CapsuleFv
= CapsuleData
.CapsuleFv()
2699 CapsuleFv
.FvName
= self
.__Token
2700 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
2703 ## __GetRule() method
2705 # Get Rule section contents and store its data into rule list of self.Profile
2707 # @param self The object pointer
2708 # @retval True Successfully find a Rule
2709 # @retval False Not able to find a Rule
2711 def __GetRule(self
):
2713 if not self
.__GetNextToken
():
2716 S
= self
.__Token
.upper()
2717 if S
.startswith("[") and not S
.startswith("[RULE."):
2718 if not S
.startswith("[OPTIONROM."):
2719 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2723 if not self
.__IsToken
("[Rule.", True):
2724 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2725 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2726 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2727 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
2729 if not self
.__SkipToToken
("."):
2730 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
2732 Arch
= self
.__SkippedChars
.rstrip(".")
2733 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
2734 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2736 ModuleType
= self
.__GetModuleType
()
2739 if self
.__IsToken
("."):
2740 if not self
.__GetNextWord
():
2741 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
2742 TemplateName
= self
.__Token
2744 if not self
.__IsToken
( "]"):
2745 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2747 RuleObj
= self
.__GetRuleFileStatements
()
2748 RuleObj
.Arch
= Arch
.upper()
2749 RuleObj
.ModuleType
= ModuleType
2750 RuleObj
.TemplateName
= TemplateName
2751 if TemplateName
== '' :
2752 self
.Profile
.RuleDict
['RULE' + \
2756 ModuleType
.upper() ] = RuleObj
2758 self
.Profile
.RuleDict
['RULE' + \
2762 ModuleType
.upper() + \
2764 TemplateName
.upper() ] = RuleObj
2765 # self.Profile.RuleList.append(rule)
2768 ## __GetModuleType() method
2770 # Return the module type
2772 # @param self The object pointer
2773 # @retval string module type
2775 def __GetModuleType(self
):
2777 if not self
.__GetNextWord
():
2778 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
2779 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2780 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2781 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2782 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2783 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2784 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_DRIVER", "SMM_CORE"):
2785 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2788 ## __GetFileExtension() method
2790 # Return the file extension
2792 # @param self The object pointer
2793 # @retval string file name extension
2795 def __GetFileExtension(self
):
2796 if not self
.__IsToken
("."):
2797 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
2800 if self
.__GetNextToken
():
2801 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
2802 if Pattern
.match(self
.__Token
):
2806 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2809 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
2811 ## __GetRuleFileStatement() method
2815 # @param self The object pointer
2816 # @retval Rule Rule object
2818 def __GetRuleFileStatements(self
):
2820 if not self
.__IsKeyword
("FILE"):
2821 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
2823 if not self
.__GetNextWord
():
2824 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2826 Type
= self
.__Token
.strip().upper()
2827 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2828 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM_DXE_COMBO", "SMM", "SMM_CORE"):
2829 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2831 if not self
.__IsToken
("="):
2832 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2834 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2835 if not self
.__GetNextWord
():
2836 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2837 if self
.__Token
== 'PCD':
2838 if not self
.__IsToken
( "("):
2839 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2840 PcdPair
= self
.__GetNextPcdName
()
2841 if not self
.__IsToken
( ")"):
2842 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2843 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2845 NameGuid
= self
.__Token
2848 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2849 if self
.__FileCouldHaveRelocFlag
(Type
):
2850 if self
.__Token
== 'RELOCS_STRIPPED':
2855 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2858 if self
.__GetNextToken
():
2859 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2860 if Pattern
.match(self
.__Token
):
2861 KeyStringList
.append(self
.__Token
)
2862 if self
.__IsToken
(","):
2863 while self
.__GetNextToken
():
2864 if not Pattern
.match(self
.__Token
):
2865 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2866 KeyStringList
.append(self
.__Token
)
2868 if not self
.__IsToken
(","):
2876 if self
.__IsKeyword
("Fixed", True):
2880 if self
.__IsKeyword
("CheckSum", True):
2884 if self
.__GetAlignment
():
2885 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2886 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2887 AlignValue
= self
.__Token
2889 if self
.__IsToken
("{"):
2890 # Complex file rule expected
2891 Rule
= RuleComplexFile
.RuleComplexFile()
2892 Rule
.FvFileType
= Type
2893 Rule
.NameGuid
= NameGuid
2894 Rule
.Alignment
= AlignValue
2895 Rule
.CheckSum
= CheckSum
2897 Rule
.KeyStringList
= KeyStringList
2898 if KeepReloc
!= None:
2899 Rule
.KeepReloc
= KeepReloc
2902 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2903 IsLeaf
= self
.__GetEfiSection
(Rule
)
2904 if not IsEncapsulate
and not IsLeaf
:
2907 if not self
.__IsToken
("}"):
2908 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2912 elif self
.__IsToken
("|"):
2914 Ext
= self
.__GetFileExtension
()
2916 Rule
= RuleSimpleFile
.RuleSimpleFile()
2918 Rule
.FvFileType
= Type
2919 Rule
.NameGuid
= NameGuid
2920 Rule
.Alignment
= AlignValue
2921 Rule
.CheckSum
= CheckSum
2923 Rule
.FileExtension
= Ext
2924 Rule
.KeyStringList
= KeyStringList
2925 if KeepReloc
!= None:
2926 Rule
.KeepReloc
= KeepReloc
2931 # Simple file rule expected
2932 if not self
.__GetNextWord
():
2933 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
2935 SectionName
= self
.__Token
2937 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2938 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2939 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2942 if self
.__IsKeyword
("Fixed", True):
2945 if self
.__IsKeyword
("CheckSum", True):
2948 if self
.__GetAlignment
():
2949 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2950 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2951 AlignValue
= self
.__Token
2953 if not self
.__GetNextToken
():
2954 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
2956 Rule
= RuleSimpleFile
.RuleSimpleFile()
2957 Rule
.SectionType
= SectionName
2958 Rule
.FvFileType
= Type
2959 Rule
.NameGuid
= NameGuid
2960 Rule
.Alignment
= AlignValue
2961 Rule
.CheckSum
= CheckSum
2963 Rule
.FileName
= self
.__Token
2964 Rule
.KeyStringList
= KeyStringList
2965 if KeepReloc
!= None:
2966 Rule
.KeepReloc
= KeepReloc
2969 ## __GetEfiSection() method
2971 # Get section list for Rule
2973 # @param self The object pointer
2974 # @param Obj for whom section is got
2975 # @retval True Successfully find section statement
2976 # @retval False Not able to find section statement
2978 def __GetEfiSection(self
, Obj
):
2980 OldPos
= self
.GetFileBufferPos()
2981 if not self
.__GetNextWord
():
2983 SectionName
= self
.__Token
2985 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2986 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
2990 if SectionName
== "FV_IMAGE":
2991 FvImageSectionObj
= FvImageSection
.FvImageSection()
2992 if self
.__IsKeyword
("FV_IMAGE"):
2994 if self
.__IsToken
( "{"):
2996 self
.__GetDefineStatements
(FvObj
)
2997 self
.__GetBlockStatement
(FvObj
)
2998 self
.__GetSetStatements
(FvObj
)
2999 self
.__GetFvAlignment
(FvObj
)
3000 self
.__GetFvAttributes
(FvObj
)
3001 self
.__GetAprioriSection
(FvObj
)
3002 self
.__GetAprioriSection
(FvObj
)
3005 IsInf
= self
.__GetInfStatement
(FvObj
)
3006 IsFile
= self
.__GetFileStatement
(FvObj
)
3007 if not IsInf
and not IsFile
:
3010 if not self
.__IsToken
( "}"):
3011 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3012 FvImageSectionObj
.Fv
= FvObj
3013 FvImageSectionObj
.FvName
= None
3016 if not self
.__IsKeyword
("FV"):
3017 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3018 FvImageSectionObj
.FvFileType
= self
.__Token
3020 if self
.__GetAlignment
():
3021 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3022 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3023 FvImageSectionObj
.Alignment
= self
.__Token
3025 if self
.__IsKeyword
("FV"):
3026 FvImageSectionObj
.FvFileType
= self
.__Token
3028 if self
.__GetAlignment
():
3029 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3030 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3031 FvImageSectionObj
.Alignment
= self
.__Token
3033 if self
.__IsToken
('|'):
3034 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3035 elif self
.__GetNextToken
():
3036 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3037 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3038 FvImageSectionObj
.FvFileName
= self
.__Token
3042 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3044 Obj
.SectionList
.append(FvImageSectionObj
)
3047 EfiSectionObj
= EfiSection
.EfiSection()
3048 EfiSectionObj
.SectionType
= SectionName
3050 if not self
.__GetNextToken
():
3051 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3053 if self
.__Token
== "STRING":
3054 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3055 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3057 if not self
.__IsToken
('='):
3058 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3060 if not self
.__GetNextToken
():
3061 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3063 if self
.__GetStringData
():
3064 EfiSectionObj
.StringData
= self
.__Token
3066 if self
.__IsKeyword
("BUILD_NUM"):
3067 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3068 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3070 if not self
.__IsToken
("="):
3071 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3072 if not self
.__GetNextToken
():
3073 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3074 EfiSectionObj
.BuildNum
= self
.__Token
3077 EfiSectionObj
.FileType
= self
.__Token
3078 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3080 if self
.__IsKeyword
("Optional"):
3081 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3082 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3083 EfiSectionObj
.Optional
= True
3085 if self
.__IsKeyword
("BUILD_NUM"):
3086 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3087 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3089 if not self
.__IsToken
("="):
3090 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3091 if not self
.__GetNextToken
():
3092 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3093 EfiSectionObj
.BuildNum
= self
.__Token
3095 if self
.__GetAlignment
():
3096 EfiSectionObj
.Alignment
= self
.__Token
3098 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3099 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3100 if self
.__Token
== 'RELOCS_STRIPPED':
3101 EfiSectionObj
.KeepReloc
= False
3103 EfiSectionObj
.KeepReloc
= True
3104 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3105 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3107 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3110 if self
.__IsToken
('|'):
3111 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3112 elif self
.__GetNextToken
():
3113 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3114 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3116 if self
.__Token
.startswith('PCD'):
3118 self
.__GetNextWord
()
3120 if self
.__Token
== 'PCD':
3121 if not self
.__IsToken
( "("):
3122 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3123 PcdPair
= self
.__GetNextPcdName
()
3124 if not self
.__IsToken
( ")"):
3125 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3126 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3128 EfiSectionObj
.FileName
= self
.__Token
3133 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3135 Obj
.SectionList
.append(EfiSectionObj
)
3138 ## __RuleSectionCouldBeOptional() method
3140 # Get whether a section could be optional
3142 # @param self The object pointer
3143 # @param SectionType The section type to check
3144 # @retval True section could be optional
3145 # @retval False section never optional
3147 def __RuleSectionCouldBeOptional(self
, SectionType
):
3148 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3153 ## __RuleSectionCouldHaveBuildNum() method
3155 # Get whether a section could have build number information
3157 # @param self The object pointer
3158 # @param SectionType The section type to check
3159 # @retval True section could have build number information
3160 # @retval False section never have build number information
3162 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3163 if SectionType
in ("VERSION"):
3168 ## __RuleSectionCouldHaveString() method
3170 # Get whether a section could have string
3172 # @param self The object pointer
3173 # @param SectionType The section type to check
3174 # @retval True section could have string
3175 # @retval False section never have string
3177 def __RuleSectionCouldHaveString(self
, SectionType
):
3178 if SectionType
in ("UI", "VERSION"):
3183 ## __CheckRuleSectionFileType() method
3185 # Get whether a section matches a file type
3187 # @param self The object pointer
3188 # @param SectionType The section type to check
3189 # @param FileType The file type to check
3191 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3192 if SectionType
== "COMPAT16":
3193 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3194 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3195 elif SectionType
== "PE32":
3196 if FileType
not in ("PE32", "SEC_PE32"):
3197 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3198 elif SectionType
== "PIC":
3199 if FileType
not in ("PIC", "PIC"):
3200 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3201 elif SectionType
== "TE":
3202 if FileType
not in ("TE", "SEC_TE"):
3203 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3204 elif SectionType
== "RAW":
3205 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3206 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3207 elif SectionType
== "DXE_DEPEX":
3208 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX"):
3209 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3210 elif SectionType
== "UI":
3211 if FileType
not in ("UI", "SEC_UI"):
3212 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3213 elif SectionType
== "VERSION":
3214 if FileType
not in ("VERSION", "SEC_VERSION"):
3215 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3216 elif SectionType
== "PEI_DEPEX":
3217 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3218 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3219 elif SectionType
== "GUID":
3220 if FileType
not in ("PE32", "SEC_GUID"):
3221 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3223 ## __GetRuleEncapsulationSection() method
3225 # Get encapsulation section for Rule
3227 # @param self The object pointer
3228 # @param Rule for whom section is got
3229 # @retval True Successfully find section statement
3230 # @retval False Not able to find section statement
3232 def __GetRuleEncapsulationSection(self
, Rule
):
3234 if self
.__IsKeyword
( "COMPRESS"):
3236 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3239 if not self
.__IsToken
("{"):
3240 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3242 CompressSectionObj
= CompressSection
.CompressSection()
3244 CompressSectionObj
.CompType
= Type
3245 # Recursive sections...
3247 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3248 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3249 if not IsEncapsulate
and not IsLeaf
:
3252 if not self
.__IsToken
( "}"):
3253 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3254 Rule
.SectionList
.append(CompressSectionObj
)
3258 elif self
.__IsKeyword
( "GUIDED"):
3260 if self
.__GetNextGuid
():
3261 GuidValue
= self
.__Token
3263 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3264 GuidValue
= self
.__Token
3266 AttribDict
= self
.__GetGuidAttrib
()
3268 if not self
.__IsToken
("{"):
3269 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3270 GuidSectionObj
= GuidSection
.GuidSection()
3271 GuidSectionObj
.NameGuid
= GuidValue
3272 GuidSectionObj
.SectionType
= "GUIDED"
3273 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3274 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3278 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3279 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3280 if not IsEncapsulate
and not IsLeaf
:
3283 if not self
.__IsToken
( "}"):
3284 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3285 Rule
.SectionList
.append(GuidSectionObj
)
3291 ## __GetVtf() method
3293 # Get VTF section contents and store its data into VTF list of self.Profile
3295 # @param self The object pointer
3296 # @retval True Successfully find a VTF
3297 # @retval False Not able to find a VTF
3301 if not self
.__GetNextToken
():
3304 S
= self
.__Token
.upper()
3305 if S
.startswith("[") and not S
.startswith("[VTF."):
3306 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3307 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3312 if not self
.__IsToken
("[VTF.", True):
3313 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3314 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3315 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3316 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3318 if not self
.__SkipToToken
("."):
3319 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3321 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3322 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3323 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3325 if not self
.__GetNextWord
():
3326 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3327 Name
= self
.__Token
.upper()
3330 VtfObj
.UiName
= Name
3331 VtfObj
.KeyArch
= Arch
3333 if self
.__IsToken
(","):
3334 if not self
.__GetNextWord
():
3335 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3336 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3337 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3338 VtfObj
.ArchList
= self
.__Token
.upper()
3340 if not self
.__IsToken
( "]"):
3341 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3343 if self
.__IsKeyword
("IA32_RST_BIN"):
3344 if not self
.__IsToken
("="):
3345 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3347 if not self
.__GetNextToken
():
3348 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3350 VtfObj
.ResetBin
= self
.__Token
3352 while self
.__GetComponentStatement
(VtfObj
):
3355 self
.Profile
.VtfList
.append(VtfObj
)
3358 ## __GetComponentStatement() method
3360 # Get components in VTF
3362 # @param self The object pointer
3363 # @param VtfObj for whom component is got
3364 # @retval True Successfully find a component
3365 # @retval False Not able to find a component
3367 def __GetComponentStatement(self
, VtfObj
):
3369 if not self
.__IsKeyword
("COMP_NAME"):
3372 if not self
.__IsToken
("="):
3373 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3375 if not self
.__GetNextWord
():
3376 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3378 CompStatementObj
= ComponentStatement
.ComponentStatement()
3379 CompStatementObj
.CompName
= self
.__Token
3381 if not self
.__IsKeyword
("COMP_LOC"):
3382 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3384 if not self
.__IsToken
("="):
3385 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3387 CompStatementObj
.CompLoc
= ""
3388 if self
.__GetNextWord
():
3389 CompStatementObj
.CompLoc
= self
.__Token
3390 if self
.__IsToken
('|'):
3391 if not self
.__GetNextWord
():
3392 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3394 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3395 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3397 CompStatementObj
.FilePos
= self
.__Token
3399 self
.CurrentLineNumber
+= 1
3400 self
.CurrentOffsetWithinLine
= 0
3402 if not self
.__IsKeyword
("COMP_TYPE"):
3403 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3405 if not self
.__IsToken
("="):
3406 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3408 if not self
.__GetNextToken
():
3409 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3410 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3411 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3412 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3413 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3414 CompStatementObj
.CompType
= self
.__Token
3416 if not self
.__IsKeyword
("COMP_VER"):
3417 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
3419 if not self
.__IsToken
("="):
3420 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3422 if not self
.__GetNextToken
():
3423 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
3425 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3426 if Pattern
.match(self
.__Token
) == None:
3427 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3428 CompStatementObj
.CompVer
= self
.__Token
3430 if not self
.__IsKeyword
("COMP_CS"):
3431 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3433 if not self
.__IsToken
("="):
3434 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3436 if not self
.__GetNextToken
():
3437 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3438 if self
.__Token
not in ("1", "0"):
3439 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3440 CompStatementObj
.CompCs
= self
.__Token
3443 if not self
.__IsKeyword
("COMP_BIN"):
3444 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3446 if not self
.__IsToken
("="):
3447 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3449 if not self
.__GetNextToken
():
3450 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3452 CompStatementObj
.CompBin
= self
.__Token
3454 if not self
.__IsKeyword
("COMP_SYM"):
3455 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3457 if not self
.__IsToken
("="):
3458 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3460 if not self
.__GetNextToken
():
3461 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3463 CompStatementObj
.CompSym
= self
.__Token
3465 if not self
.__IsKeyword
("COMP_SIZE"):
3466 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3468 if not self
.__IsToken
("="):
3469 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3471 if self
.__IsToken
("-"):
3472 CompStatementObj
.CompSize
= self
.__Token
3473 elif self
.__GetNextDecimalNumber
():
3474 CompStatementObj
.CompSize
= self
.__Token
3475 elif self
.__GetNextHexNumber
():
3476 CompStatementObj
.CompSize
= self
.__Token
3478 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3480 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3483 ## __GetOptionRom() method
3485 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3487 # @param self The object pointer
3488 # @retval True Successfully find a OptionROM
3489 # @retval False Not able to find a OptionROM
3491 def __GetOptionRom(self
):
3493 if not self
.__GetNextToken
():
3496 S
= self
.__Token
.upper()
3497 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3498 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3501 if not self
.__IsToken
("[OptionRom.", True):
3502 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3504 OptRomName
= self
.__GetUiName
()
3506 if not self
.__IsToken
( "]"):
3507 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3509 OptRomObj
= OptionRom
.OPTIONROM()
3510 OptRomObj
.DriverName
= OptRomName
3511 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3514 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3515 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3516 if not isInf
and not isFile
:
3521 ## __GetOptRomInfStatement() method
3523 # Get INF statements
3525 # @param self The object pointer
3526 # @param Obj for whom inf statement is got
3527 # @retval True Successfully find inf statement
3528 # @retval False Not able to find inf statement
3530 def __GetOptRomInfStatement(self
, Obj
):
3532 if not self
.__IsKeyword
( "INF"):
3535 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3536 self
.__GetInfOptions
( ffsInf
)
3538 if not self
.__GetNextToken
():
3539 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3540 ffsInf
.InfFileName
= self
.__Token
3542 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
3543 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
3546 self
.__GetOptRomOverrides
(ffsInf
)
3548 Obj
.FfsList
.append(ffsInf
)
3551 ## __GetOptRomOverrides() method
3553 # Get overrides for OptROM INF & FILE
3555 # @param self The object pointer
3556 # @param FfsInfObj for whom overrides is got
3558 def __GetOptRomOverrides(self
, Obj
):
3559 if self
.__IsToken
('{'):
3560 Overrides
= OptionRom
.OverrideAttribs()
3561 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
3562 if not self
.__IsToken
( "="):
3563 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3564 if not self
.__GetNextHexNumber
():
3565 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
3566 Overrides
.PciVendorId
= self
.__Token
3568 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
3569 if not self
.__IsToken
( "="):
3570 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3571 if not self
.__GetNextHexNumber
():
3572 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
3573 Overrides
.PciClassCode
= self
.__Token
3575 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
3576 if not self
.__IsToken
( "="):
3577 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3578 if not self
.__GetNextHexNumber
():
3579 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
3581 Overrides
.PciDeviceId
= self
.__Token
3583 if self
.__IsKeyword
( "PCI_REVISION"):
3584 if not self
.__IsToken
( "="):
3585 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3586 if not self
.__GetNextHexNumber
():
3587 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
3588 Overrides
.PciRevision
= self
.__Token
3590 if self
.__IsKeyword
( "COMPRESS"):
3591 if not self
.__IsToken
( "="):
3592 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3593 if not self
.__GetNextToken
():
3594 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
3596 if self
.__Token
.upper() == 'TRUE':
3597 Overrides
.NeedCompress
= True
3599 if not self
.__IsToken
( "}"):
3601 if self
.__Token
not in ("PCI_CLASS_CODE", "PCI_VENDOR_ID", "PCI_DEVICE_ID", "PCI_REVISION", "COMPRESS"):
3602 raise Warning("unknown attribute %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3604 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3606 Obj
.OverrideAttribs
= Overrides
3608 ## __GetOptRomFileStatement() method
3610 # Get FILE statements
3612 # @param self The object pointer
3613 # @param Obj for whom FILE statement is got
3614 # @retval True Successfully find FILE statement
3615 # @retval False Not able to find FILE statement
3617 def __GetOptRomFileStatement(self
, Obj
):
3619 if not self
.__IsKeyword
( "FILE"):
3622 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
3624 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
3625 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
3626 FfsFileObj
.FileType
= self
.__Token
3628 if not self
.__GetNextToken
():
3629 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
3630 FfsFileObj
.FileName
= self
.__Token
3632 if FfsFileObj
.FileType
== 'EFI':
3633 self
.__GetOptRomOverrides
(FfsFileObj
)
3635 Obj
.FfsList
.append(FfsFileObj
)
3640 ## __GetFvInFd() method
3642 # Get FV list contained in FD
3644 # @param self The object pointer
3645 # @param FdName FD name
3646 # @retval FvList list of FV in FD
3648 def __GetFvInFd (self
, FdName
):
3651 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3652 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3653 for elementRegion
in FdObj
.RegionList
:
3654 if elementRegion
.RegionType
== 'FV':
3655 for elementRegionData
in elementRegion
.RegionDataList
:
3656 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3657 FvList
.append(elementRegionData
.upper())
3660 ## __GetReferencedFdFvTuple() method
3662 # Get FD and FV list referenced by a FFS file
3664 # @param self The object pointer
3665 # @param FfsFile contains sections to be searched
3666 # @param RefFdList referenced FD by section
3667 # @param RefFvList referenced FV by section
3669 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3671 for FfsObj
in FvObj
.FfsList
:
3672 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3673 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3674 RefFvList
.append(FfsObj
.FvName
.upper())
3675 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3676 RefFdList
.append(FfsObj
.FdName
.upper())
3678 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3680 ## __GetReferencedFdFvTupleFromSection() method
3682 # Get FD and FV list referenced by a FFS section
3684 # @param self The object pointer
3685 # @param FfsFile contains sections to be searched
3686 # @param FdList referenced FD by section
3687 # @param FvList referenced FV by section
3689 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3692 SectionStack
.extend(FfsFile
.SectionList
)
3693 while SectionStack
!= []:
3694 SectionObj
= SectionStack
.pop()
3695 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3696 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
3697 FvList
.append(SectionObj
.FvName
.upper())
3698 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3699 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3700 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3702 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3703 SectionStack
.extend(SectionObj
.SectionList
)
3705 ## CycleReferenceCheck() method
3707 # Check whether cycle reference exists in FDF
3709 # @param self The object pointer
3710 # @retval True cycle reference exists
3711 # @retval False Not exists cycle reference
3713 def CycleReferenceCheck(self
):
3715 CycleRefExists
= False
3718 for FvName
in self
.Profile
.FvDict
.keys():
3719 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3721 RefFvStack
.append(FvName
)
3724 while RefFvStack
!= []:
3725 FvNameFromStack
= RefFvStack
.pop()
3726 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3727 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3733 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3735 for RefFdName
in RefFdList
:
3736 if RefFdName
in FdAnalyzedList
:
3739 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3740 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3741 if FvInFdList
!= []:
3742 LogStr
+= "FD %s contains FV: " % RefFdName
3743 for FvObj
in FvInFdList
:
3746 if FvObj
not in RefFvStack
:
3747 RefFvStack
.append(FvObj
)
3749 if FvName
in RefFvStack
:
3750 CycleRefExists
= True
3751 raise Warning(LogStr
)
3752 FdAnalyzedList
.append(RefFdName
)
3754 for RefFvName
in RefFvList
:
3755 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3756 if RefFvName
not in RefFvStack
:
3757 RefFvStack
.append(RefFvName
)
3759 if FvName
in RefFvStack
:
3760 CycleRefExists
= True
3761 raise Warning(LogStr
)
3767 return CycleRefExists
3769 if __name__
== "__main__":
3770 parser
= FdfParser("..\LakeportX64Pkg.fdf")
3773 parser
.CycleReferenceCheck()