4 # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
6 # 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.
19 import Common
.LongFilePathOs
as os
21 import CommonDataClass
.FdfClass
22 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
23 from Common
.MultipleWorkspace
import MultipleWorkspace
as mws
25 ##define T_CHAR_SPACE ' '
26 ##define T_CHAR_NULL '\0'
27 ##define T_CHAR_CR '\r'
28 ##define T_CHAR_TAB '\t'
29 ##define T_CHAR_LF '\n'
30 ##define T_CHAR_SLASH '/'
31 ##define T_CHAR_BACKSLASH '\\'
32 ##define T_CHAR_DOUBLE_QUOTE '\"'
33 ##define T_CHAR_SINGLE_QUOTE '\''
34 ##define T_CHAR_STAR '*'
35 ##define T_CHAR_HASH '#'
37 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
38 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
39 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
41 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
44 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
46 # All Macro values when parsing file, not replace existing Macro
49 def GetRealFileLine (File
, Line
):
52 for Profile
in IncludeFileList
:
53 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
54 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
55 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
56 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
58 return (File
, Line
- InsertedLines
)
60 ## The exception class that used to report error messages when parsing FDF
62 # Currently the "ToolName" is set to be "FDF Parser".
64 class Warning (Exception):
67 # @param self The object pointer
68 # @param Str The message to record
69 # @param File The FDF name
70 # @param Line The Line number that error occurs
72 def __init__(self
, Str
, File
=None, Line
=None):
74 FileLineTuple
= GetRealFileLine(File
, Line
)
75 self
.FileName
= FileLineTuple
[0]
76 self
.LineNumber
= FileLineTuple
[1]
77 self
.message
= Str
+ str(self
.LineNumber
)
78 self
.ToolName
= 'FDF Parser'
80 ## The MACRO class that used to record macro value data when parsing include file
86 # @param self The object pointer
87 # @param FileName The file that to be parsed
89 def __init__(self
, FileName
, Line
):
90 self
.FileName
= FileName
91 self
.DefinedAtLine
= Line
93 self
.MacroValue
= None
95 ## The Include file content class that used to record file data when parsing include file
97 # May raise Exception when opening file.
99 class IncludeFileProfile
:
102 # @param self The object pointer
103 # @param FileName The file that to be parsed
105 def __init__(self
, FileName
):
106 self
.FileName
= FileName
107 self
.FileLinesList
= []
109 fsock
= open(FileName
, "rb", 0)
111 self
.FileLinesList
= fsock
.readlines()
116 raise Warning("Error when opening file %s" % FileName
)
118 self
.InsertStartLineNumber
= None
119 self
.InsertAdjust
= 0
121 ## The FDF content class that used to record file data when parsing FDF
123 # May raise Exception when opening file.
128 # @param self The object pointer
129 # @param FileName The file that to be parsed
131 def __init__(self
, FileName
):
132 self
.FileLinesList
= []
134 fsock
= open(FileName
, "rb", 0)
136 self
.FileLinesList
= fsock
.readlines()
141 raise Warning("Error when opening file %s" % FileName
)
146 self
.PcdFileLineDict
= {}
147 self
.InfFileLineList
= []
151 self
.CapsuleList
= []
155 ## The syntax parser for FDF
157 # PreprocessFile method should be called prior to ParseFile
158 # CycleReferenceCheck method can detect cycles in FDF contents
160 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
161 # Get*** procedures mean these procedures will make judgement on current token only.
163 class FdfParser(object):
166 # @param self The object pointer
167 # @param FileName The file that to be parsed
169 def __init__(self
, FileName
):
170 self
.Profile
= FileProfile(FileName
)
171 self
.FileName
= FileName
172 self
.CurrentLineNumber
= 1
173 self
.CurrentOffsetWithinLine
= 0
174 self
.CurrentFdName
= None
175 self
.CurrentFvName
= None
177 self
.__SkippedChars
= ""
179 self
.__WipeOffArea
= []
181 ## __IsWhiteSpace() method
183 # Whether char at current FileBufferPos is whitespace
185 # @param self The object pointer
186 # @param Char The char to test
187 # @retval True The char is a kind of white space
188 # @retval False The char is NOT a kind of white space
190 def __IsWhiteSpace(self
, Char
):
191 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
196 ## __SkipWhiteSpace() method
198 # Skip white spaces from current char, return number of chars skipped
200 # @param self The object pointer
201 # @retval Count The number of chars skipped
203 def __SkipWhiteSpace(self
):
205 while not self
.__EndOfFile
():
207 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
208 self
.__SkippedChars
+= str(self
.__CurrentChar
())
215 ## __EndOfFile() method
217 # Judge current buffer pos is at file end
219 # @param self The object pointer
220 # @retval True Current File buffer position is at file end
221 # @retval False Current File buffer position is NOT at file end
223 def __EndOfFile(self
):
224 NumberOfLines
= len(self
.Profile
.FileLinesList
)
225 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
226 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
228 elif self
.CurrentLineNumber
> NumberOfLines
:
233 ## __EndOfLine() method
235 # Judge current buffer pos is at line end
237 # @param self The object pointer
238 # @retval True Current File buffer position is at line end
239 # @retval False Current File buffer position is NOT at line end
241 def __EndOfLine(self
):
242 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
244 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
245 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
252 # Reset file data buffer to the initial state
254 # @param self The object pointer
257 self
.CurrentLineNumber
= 1
258 self
.CurrentOffsetWithinLine
= 0
260 ## __UndoOneChar() method
262 # Go back one char in the file buffer
264 # @param self The object pointer
265 # @retval True Successfully go back one char
266 # @retval False Not able to go back one char as file beginning reached
268 def __UndoOneChar(self
):
270 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
272 elif self
.CurrentOffsetWithinLine
== 0:
273 self
.CurrentLineNumber
-= 1
274 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
276 self
.CurrentOffsetWithinLine
-= 1
279 ## __GetOneChar() method
281 # Move forward one char in the file buffer
283 # @param self The object pointer
285 def __GetOneChar(self
):
286 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
287 self
.CurrentLineNumber
+= 1
288 self
.CurrentOffsetWithinLine
= 0
290 self
.CurrentOffsetWithinLine
+= 1
292 ## __CurrentChar() method
294 # Get the char pointed to by the file buffer pointer
296 # @param self The object pointer
297 # @retval Char Current char
299 def __CurrentChar(self
):
300 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
302 ## __NextChar() method
304 # Get the one char pass the char pointed to by the file buffer pointer
306 # @param self The object pointer
307 # @retval Char Next char
309 def __NextChar(self
):
310 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
311 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
313 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
315 ## __SetCurrentCharValue() method
317 # Modify the value of current char
319 # @param self The object pointer
320 # @param Value The new value of current char
322 def __SetCurrentCharValue(self
, Value
):
323 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
325 ## __CurrentLine() method
327 # Get the list that contains current line contents
329 # @param self The object pointer
330 # @retval List current line contents
332 def __CurrentLine(self
):
333 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
335 def __StringToList(self
):
336 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
337 self
.Profile
.FileLinesList
[-1].append(' ')
339 def __ReplaceMacros(self
, Str
, File
, Line
):
341 while Str
.find('$(', MacroEnd
) >= 0:
342 MacroStart
= Str
.find('$(', MacroEnd
)
343 if Str
.find(')', MacroStart
) > 0:
344 MacroEnd
= Str
.find(')', MacroStart
)
345 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
347 if Name
in InputMacroDict
:
348 Value
= InputMacroDict
[Name
]
351 for Profile
in AllMacroList
:
352 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
353 Value
= Profile
.MacroValue
356 Str
= Str
.replace('$(' + Name
+ ')', Value
)
357 MacroEnd
= MacroStart
+ len(Value
)
360 raise Warning("Macro not complete At Line ", self
.FileName
, self
.CurrentLineNumber
)
363 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
=' '):
364 if StartPos
[0] == EndPos
[0]:
366 while Offset
<= EndPos
[1]:
367 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
372 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
373 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
377 while Line
< EndPos
[0]:
379 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
380 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
385 while Offset
<= EndPos
[1]:
386 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
390 def __GetMacroName(self
):
391 if not self
.__GetNextToken
():
392 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
393 MacroName
= self
.__Token
395 if MacroName
.startswith('!'):
397 MacroName
= MacroName
[1:].strip()
399 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
400 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
401 self
.FileName
, self
.CurrentLineNumber
)
402 MacroName
= MacroName
[2:-1]
403 return MacroName
, NotFlag
405 ## PreprocessFile() method
407 # Preprocess file contents, replace comments with spaces.
408 # In the end, rewind the file buffer pointer to the beginning
409 # BUGBUG: No !include statement processing contained in this procedure
410 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
412 # @param self The object pointer
414 def PreprocessFile(self
):
418 DoubleSlashComment
= False
420 # HashComment in quoted string " " is ignored.
423 while not self
.__EndOfFile
():
425 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
426 InString
= not InString
427 # meet new line, then no longer in a comment for // and '#'
428 if self
.__CurrentChar
() == T_CHAR_LF
:
429 self
.CurrentLineNumber
+= 1
430 self
.CurrentOffsetWithinLine
= 0
431 if InComment
and DoubleSlashComment
:
433 DoubleSlashComment
= False
434 if InComment
and HashComment
:
437 # check for */ comment end
438 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
439 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
441 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
444 # set comments to spaces
446 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
448 # check for // comment
449 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
451 DoubleSlashComment
= True
452 # check for '#' comment
453 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
456 # check for /* comment start
457 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
458 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
460 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
466 # restore from ListOfList to ListOfString
467 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
470 ## PreprocessIncludeFile() method
472 # Preprocess file contents, replace !include statements with file contents.
473 # In the end, rewind the file buffer pointer to the beginning
475 # @param self The object pointer
477 def PreprocessIncludeFile(self
):
479 while self
.__GetNextToken
():
481 if self
.__Token
== '!include':
482 IncludeLine
= self
.CurrentLineNumber
483 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
484 if not self
.__GetNextToken
():
485 raise Warning("expected include file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
486 IncFileName
= self
.__Token
487 if not os
.path
.isabs(IncFileName
):
488 if IncFileName
.startswith('$(WORKSPACE)'):
489 Str
= mws
.handleWsMacro(IncFileName
)
490 Str
= Str
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
491 if os
.path
.exists(Str
):
492 if not os
.path
.isabs(Str
):
493 Str
= os
.path
.abspath(Str
)
496 # file is in the same dir with FDF file
497 FullFdf
= self
.FileName
498 if not os
.path
.isabs(self
.FileName
):
499 FullFdf
= mws
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
501 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
503 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
504 raise Warning("Include file not exists At Line ", self
.FileName
, self
.CurrentLineNumber
)
506 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
508 CurrentLine
= self
.CurrentLineNumber
509 CurrentOffset
= self
.CurrentOffsetWithinLine
510 # list index of the insertion, note that line number is 'CurrentLine + 1'
511 InsertAtLine
= CurrentLine
512 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
513 # deal with remaining portions after "!include filename", if exists.
514 if self
.__GetNextToken
():
515 if self
.CurrentLineNumber
== CurrentLine
:
516 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
517 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
518 IncFileProfile
.InsertAdjust
+= 1
519 self
.CurrentLineNumber
+= 1
520 self
.CurrentOffsetWithinLine
= 0
522 for Line
in IncFileProfile
.FileLinesList
:
523 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
524 self
.CurrentLineNumber
+= 1
527 IncludeFileList
.append(IncFileProfile
)
529 # comment out the processed include file statement
530 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
531 TempList
.insert(IncludeOffset
, '#')
532 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
536 ## PreprocessIncludeFile() method
538 # Preprocess file contents, replace !include statements with file contents.
539 # In the end, rewind the file buffer pointer to the beginning
541 # @param self The object pointer
543 def PreprocessConditionalStatement(self
):
544 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
546 while self
.__GetNextToken
():
547 if self
.__Token
== 'DEFINE':
548 DefineLine
= self
.CurrentLineNumber
- 1
549 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
550 if not self
.__GetNextToken
():
551 raise Warning("expected Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
553 if not self
.__IsToken
( "="):
554 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
556 if not self
.__GetNextToken
():
557 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
559 if self
.__GetStringData
():
562 if not Macro
in InputMacroDict
:
563 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
564 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
565 MacProfile
.MacroName
= Macro
566 MacProfile
.MacroValue
= Value
567 AllMacroList
.append(MacProfile
)
568 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
570 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
571 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
572 IfList
.append([IfStartPos
, None, None])
573 CondLabel
= self
.__Token
575 MacroName
, NotFlag
= self
.__GetMacroName
()
576 NotDefineFlag
= False
577 if CondLabel
== '!ifndef':
579 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
581 raise Warning("'NOT' operation not allowed for Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
583 if CondLabel
== '!if':
585 if not self
.__GetNextOp
():
586 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
588 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
590 if not self
.__GetNextToken
():
591 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
592 if self
.__GetStringData
():
594 MacroValue
= self
.__Token
595 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
597 ConditionSatisfied
= not ConditionSatisfied
598 BranchDetermined
= ConditionSatisfied
600 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
601 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
603 ConditionSatisfied
= not ConditionSatisfied
604 BranchDetermined
= ConditionSatisfied
605 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
606 if ConditionSatisfied
:
607 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
610 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
612 ConditionSatisfied
= not ConditionSatisfied
613 BranchDetermined
= ConditionSatisfied
614 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
615 if ConditionSatisfied
:
616 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
618 elif self
.__Token
in ('!elseif', '!else'):
619 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
621 raise Warning("Missing !if statement At Line ", self
.FileName
, self
.CurrentLineNumber
)
623 IfList
[-1] = [ElseStartPos
, False, True]
624 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
626 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
627 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
628 if self
.__Token
== '!elseif':
629 MacroName
, NotFlag
= self
.__GetMacroName
()
630 if not self
.__GetNextOp
():
631 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
633 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
635 if not self
.__GetNextToken
():
636 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
637 if self
.__GetStringData
():
639 MacroValue
= self
.__Token
640 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
642 ConditionSatisfied
= not ConditionSatisfied
645 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
646 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
648 ConditionSatisfied
= not ConditionSatisfied
650 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
654 IfList
[-1][1] = False
657 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
660 elif self
.__Token
== '!endif':
662 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
664 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
670 raise Warning("Missing !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
673 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
675 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
676 if Name
in InputMacroDict
:
677 MacroValue
= InputMacroDict
[Name
]
679 if Value
== 'Bool' and MacroValue
== None or MacroValue
.upper() == 'FALSE':
683 if Value
!= MacroValue
:
688 if Value
== MacroValue
:
693 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
!= None and MacroValue
.isdigit())):
694 InputVal
= long(Value
, 0)
695 MacroVal
= long(MacroValue
, 0)
697 if MacroVal
> InputVal
:
702 if MacroVal
>= InputVal
:
707 if MacroVal
< InputVal
:
712 if MacroVal
<= InputVal
:
719 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
721 for Profile
in AllMacroList
:
722 if Profile
.FileName
== FileLineTuple
[0] and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
724 if Value
== 'Bool' and Profile
.MacroValue
== None or Profile
.MacroValue
.upper() == 'FALSE':
728 if Value
!= Profile
.MacroValue
:
733 if Value
== Profile
.MacroValue
:
738 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
!= None and Profile
.MacroValue
.isdigit())):
739 InputVal
= long(Value
, 0)
740 MacroVal
= long(Profile
.MacroValue
, 0)
742 if MacroVal
> InputVal
:
747 if MacroVal
>= InputVal
:
752 if MacroVal
< InputVal
:
757 if MacroVal
<= InputVal
:
764 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
768 ## __IsToken() method
770 # Check whether input string is found from current char position along
771 # If found, the string value is put into self.__Token
773 # @param self The object pointer
774 # @param String The string to search
775 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
776 # @retval True Successfully find string, file buffer pointer moved forward
777 # @retval False Not able to find string, file buffer pointer not changed
779 def __IsToken(self
, String
, IgnoreCase
= False):
780 self
.__SkipWhiteSpace
()
782 # Only consider the same line, no multi-line token allowed
783 StartPos
= self
.CurrentOffsetWithinLine
786 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
788 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
790 self
.CurrentOffsetWithinLine
+= len(String
)
791 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
795 ## __IsKeyword() method
797 # Check whether input keyword is found from current char position along, whole word only!
798 # If found, the string value is put into self.__Token
800 # @param self The object pointer
801 # @param Keyword The string to search
802 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
803 # @retval True Successfully find string, file buffer pointer moved forward
804 # @retval False Not able to find string, file buffer pointer not changed
806 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
807 self
.__SkipWhiteSpace
()
809 # Only consider the same line, no multi-line token allowed
810 StartPos
= self
.CurrentOffsetWithinLine
813 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
815 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
817 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
818 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
820 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
821 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
825 ## __GetNextWord() method
827 # Get next C name from file lines
828 # If found, the string value is put into self.__Token
830 # @param self The object pointer
831 # @retval True Successfully find a C name string, file buffer pointer moved forward
832 # @retval False Not able to find a C name string, file buffer pointer not changed
834 def __GetNextWord(self
):
835 self
.__SkipWhiteSpace
()
836 if self
.__EndOfFile
():
839 TempChar
= self
.__CurrentChar
()
840 StartPos
= self
.CurrentOffsetWithinLine
841 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
843 while not self
.__EndOfLine
():
844 TempChar
= self
.__CurrentChar
()
845 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
846 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
852 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
857 ## __GetNextToken() method
859 # Get next token unit before a seperator
860 # If found, the string value is put into self.__Token
862 # @param self The object pointer
863 # @retval True Successfully find a token unit, file buffer pointer moved forward
864 # @retval False Not able to find a token unit, file buffer pointer not changed
866 def __GetNextToken(self
):
867 # Skip leading spaces, if exist.
868 self
.__SkipWhiteSpace
()
869 if self
.__EndOfFile
():
871 # Record the token start position, the position of the first non-space char.
872 StartPos
= self
.CurrentOffsetWithinLine
873 StartLine
= self
.CurrentLineNumber
874 while not self
.__EndOfLine
():
875 TempChar
= self
.__CurrentChar
()
876 # Try to find the end char that is not a space and not in seperator tuple.
877 # That is, when we got a space or any char in the tuple, we got the end of token.
878 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
880 # if we happen to meet a seperator as the first char, we must proceed to get it.
881 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
882 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
890 EndPos
= self
.CurrentOffsetWithinLine
891 if self
.CurrentLineNumber
!= StartLine
:
892 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
893 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
894 if StartPos
!= self
.CurrentOffsetWithinLine
:
899 def __GetNextOp(self
):
900 # Skip leading spaces, if exist.
901 self
.__SkipWhiteSpace
()
902 if self
.__EndOfFile
():
904 # Record the token start position, the position of the first non-space char.
905 StartPos
= self
.CurrentOffsetWithinLine
906 while not self
.__EndOfLine
():
907 TempChar
= self
.__CurrentChar
()
908 # Try to find the end char that is not a space
909 if not str(TempChar
).isspace():
916 if StartPos
!= self
.CurrentOffsetWithinLine
:
917 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
921 ## __GetNextGuid() method
923 # Get next token unit before a seperator
924 # If found, the GUID string is put into self.__Token
926 # @param self The object pointer
927 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
928 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
930 def __GetNextGuid(self
):
932 if not self
.__GetNextToken
():
934 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}')
935 if p
.match(self
.__Token
) != None:
941 ## __UndoToken() method
943 # Go back one token unit in file buffer
945 # @param self The object pointer
947 def __UndoToken(self
):
949 while self
.__CurrentChar
().isspace():
950 if not self
.__UndoOneChar
():
955 StartPos
= self
.CurrentOffsetWithinLine
956 CurrentLine
= self
.CurrentLineNumber
957 while CurrentLine
== self
.CurrentLineNumber
:
959 TempChar
= self
.__CurrentChar
()
960 # Try to find the end char that is not a space and not in seperator tuple.
961 # That is, when we got a space or any char in the tuple, we got the end of token.
962 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
963 if not self
.__UndoOneChar
():
965 # if we happen to meet a seperator as the first char, we must proceed to get it.
966 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
967 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
974 ## __HexDigit() method
976 # Whether char input is a Hex data bit
978 # @param self The object pointer
979 # @param TempChar The char to test
980 # @retval True The char is a Hex data bit
981 # @retval False The char is NOT a Hex data bit
983 def __HexDigit(self
, TempChar
):
984 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
985 or (TempChar
>= '0' and TempChar
<= '9'):
990 def __IsHex(self
, HexStr
):
991 if not HexStr
.upper().startswith("0X"):
993 if len(self
.__Token
) <= 2:
995 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
996 if len(charList
) == 0:
1000 ## __GetNextHexNumber() method
1002 # Get next HEX data before a seperator
1003 # If found, the HEX data is put into self.__Token
1005 # @param self The object pointer
1006 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1007 # @retval False Not able to find a HEX data, file buffer pointer not changed
1009 def __GetNextHexNumber(self
):
1010 if not self
.__GetNextToken
():
1012 if self
.__IsHex
(self
.__Token
):
1018 ## __GetNextDecimalNumber() method
1020 # Get next decimal data before a seperator
1021 # If found, the decimal data is put into self.__Token
1023 # @param self The object pointer
1024 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1025 # @retval False Not able to find a decimal data, file buffer pointer not changed
1027 def __GetNextDecimalNumber(self
):
1028 if not self
.__GetNextToken
():
1030 if self
.__Token
.isdigit():
1036 ## __GetNextPcdName() method
1038 # Get next PCD token space C name and PCD C name pair before a seperator
1039 # If found, the decimal data is put into self.__Token
1041 # @param self The object pointer
1042 # @retval Tuple PCD C name and PCD token space C name pair
1044 def __GetNextPcdName(self
):
1045 if not self
.__GetNextWord
():
1046 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1047 pcdTokenSpaceCName
= self
.__Token
1049 if not self
.__IsToken
( "."):
1050 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1052 if not self
.__GetNextWord
():
1053 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1054 pcdCName
= self
.__Token
1056 return (pcdCName
, pcdTokenSpaceCName
)
1058 ## __GetStringData() method
1060 # Get string contents quoted in ""
1061 # If found, the decimal data is put into self.__Token
1063 # @param self The object pointer
1064 # @retval True Successfully find a string data, file buffer pointer moved forward
1065 # @retval False Not able to find a string data, file buffer pointer not changed
1067 def __GetStringData(self
):
1068 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1070 self
.__SkipToToken
("\"")
1071 currentLineNumber
= self
.CurrentLineNumber
1073 if not self
.__SkipToToken
("\""):
1074 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1075 if currentLineNumber
!= self
.CurrentLineNumber
:
1076 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1077 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1080 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1082 self
.__SkipToToken
("\'")
1083 currentLineNumber
= self
.CurrentLineNumber
1085 if not self
.__SkipToToken
("\'"):
1086 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1087 if currentLineNumber
!= self
.CurrentLineNumber
:
1088 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1089 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1095 ## __SkipToToken() method
1097 # Search forward in file buffer for the string
1098 # The skipped chars are put into self.__SkippedChars
1100 # @param self The object pointer
1101 # @param String The string to search
1102 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1103 # @retval True Successfully find the string, file buffer pointer moved forward
1104 # @retval False Not able to find the string, file buffer pointer not changed
1106 def __SkipToToken(self
, String
, IgnoreCase
= False):
1107 StartPos
= self
.GetFileBufferPos()
1109 self
.__SkippedChars
= ""
1110 while not self
.__EndOfFile
():
1113 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1115 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1117 self
.CurrentOffsetWithinLine
+= len(String
)
1118 self
.__SkippedChars
+= String
1120 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1123 self
.SetFileBufferPos( StartPos
)
1124 self
.__SkippedChars
= ""
1127 ## GetFileBufferPos() method
1129 # Return the tuple of current line and offset within the line
1131 # @param self The object pointer
1132 # @retval Tuple Line number and offset pair
1134 def GetFileBufferPos(self
):
1135 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1137 ## SetFileBufferPos() method
1139 # Restore the file buffer position
1141 # @param self The object pointer
1142 # @param Pos The new file buffer position
1144 def SetFileBufferPos(self
, Pos
):
1145 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1147 ## ParseFile() method
1149 # Parse the file profile buffer to extract fd, fv ... information
1150 # Exception will be raised if syntax error found
1152 # @param self The object pointer
1154 def ParseFile(self
):
1157 self
.__StringToList
()
1158 self
.PreprocessFile()
1159 self
.PreprocessIncludeFile()
1160 self
.__StringToList
()
1161 self
.PreprocessFile()
1162 self
.PreprocessConditionalStatement()
1163 self
.__StringToList
()
1164 for Pos
in self
.__WipeOffArea
:
1165 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1166 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1168 while self
.__GetDefines
():
1172 while Index
< len(self
.Profile
.FileLinesList
):
1173 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1174 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1177 while self
.__GetFd
():
1180 while self
.__GetFv
():
1183 while self
.__GetCapsule
():
1186 # while self.__GetVtf():
1189 # while self.__GetRule():
1195 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1196 X
.message
+= '\nGot Token: \"%s\" from File %s\n' % (self
.__Token
, FileLineTuple
[0]) + \
1197 'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \
1198 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'), FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1201 ## __GetDefines() method
1203 # Get Defines section contents and store its data into AllMacrosList
1205 # @param self The object pointer
1206 # @retval True Successfully find a Defines
1207 # @retval False Not able to find a Defines
1209 def __GetDefines(self
):
1211 if not self
.__GetNextToken
():
1214 S
= self
.__Token
.upper()
1215 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1216 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1217 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1218 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
)
1223 if not self
.__IsToken
("[DEFINES", True):
1224 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1225 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1226 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1227 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1229 if not self
.__IsToken
( "]"):
1230 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1232 while self
.__GetNextWord
():
1233 Macro
= self
.__Token
1235 if not self
.__IsToken
("="):
1236 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1237 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1238 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1239 Value
= self
.__Token
1240 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1241 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1242 MacProfile
.MacroName
= Macro
1243 MacProfile
.MacroValue
= Value
1244 AllMacroList
.append(MacProfile
)
1250 # Get FD section contents and store its data into FD dictionary of self.Profile
1252 # @param self The object pointer
1253 # @retval True Successfully find a FD
1254 # @retval False Not able to find a FD
1258 if not self
.__GetNextToken
():
1261 S
= self
.__Token
.upper()
1262 if S
.startswith("[") and not S
.startswith("[FD."):
1263 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1264 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1265 raise Warning("Unknown section At Line ", self
.FileName
, self
.CurrentLineNumber
)
1270 if not self
.__IsToken
("[FD.", True):
1271 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1272 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1273 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1274 raise Warning("expected [FD.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
1276 FdName
= self
.__GetUiName
()
1277 self
.CurrentFdName
= FdName
.upper()
1279 if not self
.__IsToken
( "]"):
1280 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1282 FdObj
= CommonDataClass
.FdfClass
.FDClassObject()
1283 FdObj
.FdUiName
= self
.CurrentFdName
1284 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1285 Status
= self
.__GetCreateFile
(FdObj
)
1287 raise Warning("FD name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1289 if not self
.__GetTokenStatements
(FdObj
):
1292 self
.__GetDefineStatements
(FdObj
)
1294 self
.__GetSetStatements
(FdObj
)
1296 if not self
.__GetRegionLayout
(FdObj
):
1297 raise Warning("expected region layout At Line ", self
.FileName
, self
.CurrentLineNumber
)
1299 while self
.__GetRegionLayout
(FdObj
):
1303 ## __GetUiName() method
1305 # Return the UI name of a section
1307 # @param self The object pointer
1308 # @retval FdName UI name
1310 def __GetUiName(self
):
1312 if self
.__GetNextWord
():
1313 FdName
= self
.__Token
1317 ## __GetCreateFile() method
1319 # Return the output file name of object
1321 # @param self The object pointer
1322 # @param Obj object whose data will be stored in file
1323 # @retval FdName UI name
1325 def __GetCreateFile(self
, Obj
):
1327 if self
.__IsKeyword
( "CREATE_FILE"):
1328 if not self
.__IsToken
( "="):
1329 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1331 if not self
.__GetNextToken
():
1332 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1334 FileName
= self
.__Token
1335 Obj
.CreateFileName
= FileName
1339 ## __GetTokenStatements() method
1341 # Get token statements
1343 # @param self The object pointer
1344 # @param Obj for whom token statement is got
1345 # @retval True Successfully find a token statement
1346 # @retval False Not able to find a token statement
1348 def __GetTokenStatements(self
, Obj
):
1349 if not self
.__IsKeyword
( "BaseAddress"):
1350 raise Warning("BaseAddress missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1352 if not self
.__IsToken
( "="):
1353 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1355 if not self
.__GetNextHexNumber
():
1356 raise Warning("expected Hex base address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1358 Obj
.BaseAddress
= self
.__Token
1360 if self
.__IsToken
( "|"):
1361 pcdPair
= self
.__GetNextPcdName
()
1362 Obj
.BaseAddressPcd
= pcdPair
1363 self
.Profile
.PcdDict
[pcdPair
] = long(Obj
.BaseAddress
, 0)
1364 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1365 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1367 if not self
.__IsKeyword
( "Size"):
1368 raise Warning("Size missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1370 if not self
.__IsToken
( "="):
1371 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1373 if not self
.__GetNextHexNumber
():
1374 raise Warning("expected Hex size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1377 Obj
.Size
= long(self
.__Token
, 0)
1379 if self
.__IsToken
( "|"):
1380 pcdPair
= self
.__GetNextPcdName
()
1381 Obj
.SizePcd
= pcdPair
1382 self
.Profile
.PcdDict
[pcdPair
] = Obj
.Size
1383 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1384 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1386 if not self
.__IsKeyword
( "ErasePolarity"):
1387 raise Warning("ErasePolarity missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1389 if not self
.__IsToken
( "="):
1390 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1392 if not self
.__GetNextToken
():
1393 raise Warning("expected Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1395 if self
.__Token
!= "1" and self
.__Token
!= "0":
1396 raise Warning("expected 1 or 0 Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1398 Obj
.ErasePolarity
= self
.__Token
1400 Status
= self
.__GetBlockStatements
(Obj
)
1403 ## __GetAddressStatements() method
1405 # Get address statements
1407 # @param self The object pointer
1408 # @param Obj for whom address statement is got
1409 # @retval True Successfully find
1410 # @retval False Not able to find
1412 def __GetAddressStatements(self
, Obj
):
1414 if self
.__IsKeyword
("BsBaseAddress"):
1415 if not self
.__IsToken
( "="):
1416 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1418 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1419 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1421 BsAddress
= long(self
.__Token
, 0)
1422 Obj
.BsBaseAddress
= BsAddress
1424 if self
.__IsKeyword
("RtBaseAddress"):
1425 if not self
.__IsToken
( "="):
1426 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1428 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1429 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1431 RtAddress
= long(self
.__Token
, 0)
1432 Obj
.RtBaseAddress
= RtAddress
1434 ## __GetBlockStatements() method
1436 # Get block statements
1438 # @param self The object pointer
1439 # @param Obj for whom block statement is got
1440 # @retval True Successfully find
1441 # @retval False Not able to find
1443 def __GetBlockStatements(self
, Obj
):
1445 if not self
.__GetBlockStatement
(Obj
):
1446 #set default block size is 1
1447 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1450 while self
.__GetBlockStatement
(Obj
):
1453 for Item
in Obj
.BlockSizeList
:
1454 if Item
[0] == None or Item
[1] == None:
1455 raise Warning("expected block statement for Fd Section", self
.FileName
, self
.CurrentLineNumber
)
1459 ## __GetBlockStatement() method
1461 # Get block statement
1463 # @param self The object pointer
1464 # @param Obj for whom block statement is got
1465 # @retval True Successfully find
1466 # @retval False Not able to find
1468 def __GetBlockStatement(self
, Obj
):
1469 if not self
.__IsKeyword
( "BlockSize"):
1472 if not self
.__IsToken
( "="):
1473 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1475 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1476 raise Warning("expected Hex block size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1478 BlockSize
= long(self
.__Token
, 0)
1480 if self
.__IsToken
( "|"):
1481 PcdPair
= self
.__GetNextPcdName
()
1482 BlockSizePcd
= PcdPair
1483 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1484 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1485 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1488 if self
.__IsKeyword
( "NumBlocks"):
1489 if not self
.__IsToken
( "="):
1490 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1492 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1493 raise Warning("expected block numbers At Line ", self
.FileName
, self
.CurrentLineNumber
)
1495 BlockNumber
= long(self
.__Token
, 0)
1497 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1500 ## __GetDefineStatements() method
1502 # Get define statements
1504 # @param self The object pointer
1505 # @param Obj for whom define statement is got
1506 # @retval True Successfully find
1507 # @retval False Not able to find
1509 def __GetDefineStatements(self
, Obj
):
1510 while self
.__GetDefineStatement
( Obj
):
1513 ## __GetDefineStatement() method
1515 # Get define statement
1517 # @param self The object pointer
1518 # @param Obj for whom define statement is got
1519 # @retval True Successfully find
1520 # @retval False Not able to find
1522 def __GetDefineStatement(self
, Obj
):
1523 if self
.__IsKeyword
("DEFINE"):
1524 self
.__GetNextToken
()
1525 Macro
= self
.__Token
1526 if not self
.__IsToken
( "="):
1527 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1529 if not self
.__GetNextToken
():
1530 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1532 Value
= self
.__Token
1533 Macro
= '$(' + Macro
+ ')'
1534 Obj
.DefineVarDict
[Macro
] = Value
1539 ## __GetSetStatements() method
1541 # Get set statements
1543 # @param self The object pointer
1544 # @param Obj for whom set statement is got
1545 # @retval True Successfully find
1546 # @retval False Not able to find
1548 def __GetSetStatements(self
, Obj
):
1549 while self
.__GetSetStatement
(Obj
):
1552 ## __GetSetStatement() method
1556 # @param self The object pointer
1557 # @param Obj for whom set statement is got
1558 # @retval True Successfully find
1559 # @retval False Not able to find
1561 def __GetSetStatement(self
, Obj
):
1562 if self
.__IsKeyword
("SET"):
1563 PcdPair
= self
.__GetNextPcdName
()
1565 if not self
.__IsToken
( "="):
1566 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1568 if not self
.__GetNextToken
():
1569 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1571 Value
= self
.__Token
1572 if Value
.startswith("{"):
1573 # deal with value with {}
1574 if not self
.__SkipToToken
( "}"):
1575 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1576 Value
+= self
.__SkippedChars
1578 Obj
.SetVarDict
[PcdPair
] = Value
1579 self
.Profile
.PcdDict
[PcdPair
] = Value
1580 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1581 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1586 ## __GetRegionLayout() method
1588 # Get region layout for FD
1590 # @param self The object pointer
1591 # @param Fd for whom region is got
1592 # @retval True Successfully find
1593 # @retval False Not able to find
1595 def __GetRegionLayout(self
, Fd
):
1596 if not self
.__GetNextHexNumber
():
1599 RegionObj
= CommonDataClass
.FdfClass
.RegionClassObject()
1600 RegionObj
.Offset
= long(self
.__Token
, 0)
1601 Fd
.RegionList
.append(RegionObj
)
1603 if not self
.__IsToken
( "|"):
1604 raise Warning("expected '|' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1606 if not self
.__GetNextHexNumber
():
1607 raise Warning("expected Region Size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1608 RegionObj
.Size
= long(self
.__Token
, 0)
1610 if not self
.__GetNextWord
():
1613 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1615 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1616 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0)
1617 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1618 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1619 if self
.__IsToken
( "|"):
1620 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1621 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = RegionObj
.Size
1622 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1623 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1625 if not self
.__GetNextWord
():
1628 if self
.__Token
== "SET":
1630 self
.__GetSetStatements
( RegionObj
)
1631 if not self
.__GetNextWord
():
1634 elif self
.__Token
== "FV":
1636 self
.__GetRegionFvType
( RegionObj
)
1638 elif self
.__Token
== "CAPSULE":
1640 self
.__GetRegionCapType
( RegionObj
)
1642 elif self
.__Token
== "FILE":
1644 self
.__GetRegionFileType
( RegionObj
)
1648 self
.__GetRegionDataType
( RegionObj
)
1652 ## __GetRegionFvType() method
1654 # Get region fv data for region
1656 # @param self The object pointer
1657 # @param RegionObj for whom region data is got
1659 def __GetRegionFvType(self
, RegionObj
):
1661 if not self
.__IsKeyword
( "FV"):
1662 raise Warning("expected Keyword 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1664 if not self
.__IsToken
( "="):
1665 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1667 if not self
.__GetNextToken
():
1668 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1670 RegionObj
.RegionType
= "FV"
1671 RegionObj
.RegionDataList
.append(self
.__Token
)
1673 while self
.__IsKeyword
( "FV"):
1675 if not self
.__IsToken
( "="):
1676 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1678 if not self
.__GetNextToken
():
1679 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1681 RegionObj
.RegionDataList
.append(self
.__Token
)
1683 ## __GetRegionCapType() method
1685 # Get region capsule data for region
1687 # @param self The object pointer
1688 # @param RegionObj for whom region data is got
1690 def __GetRegionCapType(self
, RegionObj
):
1692 if not self
.__IsKeyword
("CAPSULE"):
1693 raise Warning("expected Keyword 'CAPSULE' at line", self
.FileName
, self
.CurrentLineNumber
)
1695 if not self
.__IsToken
("="):
1696 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1698 if not self
.__GetNextToken
():
1699 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1701 RegionObj
.RegionType
= "CAPSULE"
1702 RegionObj
.RegionDataList
.append(self
.__Token
)
1704 while self
.__IsKeyword
("CAPSULE"):
1706 if not self
.__IsToken
("="):
1707 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1709 if not self
.__GetNextToken
():
1710 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1712 RegionObj
.RegionDataList
.append(self
.__Token
)
1714 ## __GetRegionFileType() method
1716 # Get region file data for region
1718 # @param self The object pointer
1719 # @param RegionObj for whom region data is got
1721 def __GetRegionFileType(self
, RegionObj
):
1723 if not self
.__IsKeyword
( "FILE"):
1724 raise Warning("expected Keyword 'FILE' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1726 if not self
.__IsToken
( "="):
1727 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1729 if not self
.__GetNextToken
():
1730 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1732 RegionObj
.RegionType
= "FILE"
1733 RegionObj
.RegionDataList
.append( self
.__Token
)
1735 while self
.__IsKeyword
( "FILE"):
1737 if not self
.__IsToken
( "="):
1738 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1740 if not self
.__GetNextToken
():
1741 raise Warning("expected FILE name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1743 RegionObj
.RegionDataList
.append(self
.__Token
)
1745 ## __GetRegionDataType() method
1747 # Get region array data for region
1749 # @param self The object pointer
1750 # @param RegionObj for whom region data is got
1752 def __GetRegionDataType(self
, RegionObj
):
1754 if not self
.__IsKeyword
( "DATA"):
1755 raise Warning("expected Region Data type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1757 if not self
.__IsToken
( "="):
1758 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1760 if not self
.__IsToken
( "{"):
1761 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1763 if not self
.__GetNextHexNumber
():
1764 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1766 if len(self
.__Token
) > 18:
1767 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1769 DataString
= self
.__Token
1772 while self
.__IsToken
(","):
1773 if not self
.__GetNextHexNumber
():
1774 raise Warning("Invalid Hex number At Line ", self
.FileName
, self
.CurrentLineNumber
)
1775 if len(self
.__Token
) > 4:
1776 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1777 DataString
+= self
.__Token
1780 if not self
.__IsToken
( "}"):
1781 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1783 DataString
= DataString
.rstrip(",")
1784 RegionObj
.RegionType
= "DATA"
1785 RegionObj
.RegionDataList
.append( DataString
)
1787 while self
.__IsKeyword
( "DATA"):
1789 if not self
.__IsToken
( "="):
1790 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1792 if not self
.__IsToken
( "{"):
1793 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1795 if not self
.__GetNextHexNumber
():
1796 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1798 if len(self
.__Token
) > 18:
1799 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1801 DataString
= self
.__Token
1804 while self
.__IsToken
(","):
1805 self
.__GetNextHexNumber
()
1806 if len(self
.__Token
) > 4:
1807 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1808 DataString
+= self
.__Token
1811 if not self
.__IsToken
( "}"):
1812 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1814 DataString
= DataString
.rstrip(",")
1815 RegionObj
.RegionDataList
.append( DataString
)
1819 # Get FV section contents and store its data into FV dictionary of self.Profile
1821 # @param self The object pointer
1822 # @retval True Successfully find a FV
1823 # @retval False Not able to find a FV
1826 if not self
.__GetNextToken
():
1829 S
= self
.__Token
.upper()
1830 if S
.startswith("[") and not S
.startswith("[FV."):
1831 if not S
.startswith("[CAPSULE.") \
1832 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1833 raise Warning("Unknown section or section appear sequence error \n(The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.]) At Line ", self
.FileName
, self
.CurrentLineNumber
)
1838 if not self
.__IsToken
("[FV.", True):
1839 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1840 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1841 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1842 raise Warning("Unknown Keyword At Line ", self
.FileName
, self
.CurrentLineNumber
)
1844 FvName
= self
.__GetUiName
()
1845 self
.CurrentFvName
= FvName
.upper()
1847 if not self
.__IsToken
( "]"):
1848 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1850 FvObj
= CommonDataClass
.FdfClass
.FvClassObject()
1851 FvObj
.UiFvName
= self
.CurrentFvName
1852 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1854 Status
= self
.__GetCreateFile
(FvObj
)
1856 raise Warning("FV name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1858 self
.__GetDefineStatements
(FvObj
)
1860 self
.__GetAddressStatements
(FvObj
)
1862 self
.__GetBlockStatement
(FvObj
)
1864 self
.__GetSetStatements
(FvObj
)
1866 self
.__GetFvAlignment
(FvObj
)
1868 self
.__GetFvAttributes
(FvObj
)
1870 self
.__GetFvNameGuid
(FvObj
)
1872 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1873 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1876 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1877 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1878 if not isInf
and not isFile
:
1883 ## __GetFvAlignment() method
1885 # Get alignment for FV
1887 # @param self The object pointer
1888 # @param Obj for whom alignment is got
1889 # @retval True Successfully find a alignment statement
1890 # @retval False Not able to find a alignment statement
1892 def __GetFvAlignment(self
, Obj
):
1894 if not self
.__IsKeyword
( "FvAlignment"):
1897 if not self
.__IsToken
( "="):
1898 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1900 if not self
.__GetNextToken
():
1901 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1903 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1904 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1905 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1907 raise Warning("Unknown alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1908 Obj
.FvAlignment
= self
.__Token
1911 ## __GetFvAttributes() method
1913 # Get attributes for FV
1915 # @param self The object pointer
1916 # @param Obj for whom attribute is got
1919 def __GetFvAttributes(self
, FvObj
):
1921 while self
.__GetNextWord
():
1923 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1924 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1925 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1926 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1927 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
1928 "WRITE_POLICY_RELIABLE"):
1932 if not self
.__IsToken
( "="):
1933 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1935 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
1936 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
1938 FvObj
.FvAttributeDict
[name
] = self
.__Token
1942 ## __GetFvNameGuid() method
1944 # Get FV GUID for FV
1946 # @param self The object pointer
1947 # @param Obj for whom GUID is got
1950 def __GetFvNameGuid(self
, FvObj
):
1952 if not self
.__IsKeyword
( "FvNameGuid"):
1955 if not self
.__IsToken
( "="):
1956 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1958 if not self
.__GetNextGuid
():
1959 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
1961 FvObj
.FvNameGuid
= self
.__Token
1965 ## __GetAprioriSection() method
1967 # Get token statements
1969 # @param self The object pointer
1970 # @param FvObj for whom apriori is got
1971 # @param MacroDict dictionary used to replace macro
1972 # @retval True Successfully find apriori statement
1973 # @retval False Not able to find apriori statement
1975 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
1977 if not self
.__IsKeyword
( "APRIORI"):
1980 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
1981 raise Warning("expected Apriori file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1982 AprType
= self
.__Token
1984 if not self
.__IsToken
( "{"):
1985 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1987 AprSectionObj
= CommonDataClass
.FdfClass
.AprioriSectionClassObject()
1988 AprSectionObj
.AprioriType
= AprType
1990 self
.__GetDefineStatements
(AprSectionObj
)
1991 MacroDict
.update(AprSectionObj
.DefineVarDict
)
1994 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
1995 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
1996 if not IsInf
and not IsFile
:
1999 if not self
.__IsToken
( "}"):
2000 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2002 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2005 ## __GetInfStatement() method
2007 # Get INF statements
2009 # @param self The object pointer
2010 # @param Obj for whom inf statement is got
2011 # @param MacroDict dictionary used to replace macro
2012 # @retval True Successfully find inf statement
2013 # @retval False Not able to find inf statement
2015 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2017 if not self
.__IsKeyword
( "INF"):
2020 ffsInf
= CommonDataClass
.FdfClass
.FfsInfStatementClassObject()
2021 self
.__GetInfOptions
( ffsInf
)
2023 if not self
.__GetNextToken
():
2024 raise Warning("expected INF file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2025 ffsInf
.InfFileName
= self
.__Token
2027 # if ffsInf.InfFileName.find('$') >= 0:
2028 # ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
2030 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2031 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2032 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2033 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2035 if self
.__IsToken
('|'):
2036 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2037 ffsInf
.KeepReloc
= False
2038 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2039 ffsInf
.KeepReloc
= True
2041 raise Warning("Unknown reloc strip flag At Line ", self
.FileName
, self
.CurrentLineNumber
)
2044 capsuleFfs
= CapsuleData
.CapsuleFfs()
2045 capsuleFfs
.Ffs
= ffsInf
2046 Obj
.CapsuleDataList
.append(capsuleFfs
)
2048 Obj
.FfsList
.append(ffsInf
)
2051 ## __GetInfOptions() method
2053 # Get options for INF
2055 # @param self The object pointer
2056 # @param FfsInfObj for whom option is got
2058 def __GetInfOptions(self
, FfsInfObj
):
2060 if self
.__IsKeyword
( "RuleOverride"):
2061 if not self
.__IsToken
( "="):
2062 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2063 if not self
.__GetNextToken
():
2064 raise Warning("expected Rule name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2065 FfsInfObj
.Rule
= self
.__Token
2067 if self
.__IsKeyword
( "VERSION"):
2068 if not self
.__IsToken
( "="):
2069 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2070 if not self
.__GetNextToken
():
2071 raise Warning("expected Version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2073 if self
.__GetStringData
():
2074 FfsInfObj
.Version
= self
.__Token
2076 if self
.__IsKeyword
( "UI"):
2077 if not self
.__IsToken
( "="):
2078 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2079 if not self
.__GetNextToken
():
2080 raise Warning("expected UI name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2082 if self
.__GetStringData
():
2083 FfsInfObj
.Ui
= self
.__Token
2085 if self
.__IsKeyword
( "USE"):
2086 if not self
.__IsToken
( "="):
2087 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2088 if not self
.__GetNextToken
():
2089 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2090 FfsInfObj
.UseArch
= self
.__Token
2093 if self
.__GetNextToken
():
2094 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2095 if p
.match(self
.__Token
):
2096 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2097 if not self
.__IsToken
(","):
2103 while self
.__GetNextToken
():
2104 if not p
.match(self
.__Token
):
2105 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2106 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2108 if not self
.__IsToken
(","):
2111 ## __GetFileStatement() method
2113 # Get FILE statements
2115 # @param self The object pointer
2116 # @param Obj for whom FILE statement is got
2117 # @param MacroDict dictionary used to replace macro
2118 # @retval True Successfully find FILE statement
2119 # @retval False Not able to find FILE statement
2121 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2123 if not self
.__IsKeyword
( "FILE"):
2126 FfsFileObj
= CommonDataClass
.FdfClass
.FileStatementClassObject()
2128 if not self
.__GetNextWord
():
2129 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2130 FfsFileObj
.FvFileType
= self
.__Token
2132 if not self
.__IsToken
( "="):
2133 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2135 if not self
.__GetNextGuid
():
2136 if not self
.__GetNextWord
():
2137 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2138 if self
.__Token
== 'PCD':
2139 if not self
.__IsToken
( "("):
2140 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2141 PcdPair
= self
.__GetNextPcdName
()
2142 if not self
.__IsToken
( ")"):
2143 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2144 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2146 FfsFileObj
.NameGuid
= self
.__Token
2148 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2151 capsuleFfs
= CapsuleData
.CapsuleFfs()
2152 capsuleFfs
.Ffs
= FfsFileObj
2153 Obj
.CapsuleDataList
.append(capsuleFfs
)
2155 Obj
.FfsList
.append(FfsFileObj
)
2159 ## __FileCouldHaveRelocFlag() method
2161 # Check whether reloc strip flag can be set for a file type.
2163 # @param self The object pointer
2164 # @param FileType The file type to check with
2165 # @retval True This type could have relocation strip flag
2166 # @retval False No way to have it
2169 def __FileCouldHaveRelocFlag (self
, FileType
):
2170 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2175 ## __SectionCouldHaveRelocFlag() method
2177 # Check whether reloc strip flag can be set for a section type.
2179 # @param self The object pointer
2180 # @param SectionType The section type to check with
2181 # @retval True This type could have relocation strip flag
2182 # @retval False No way to have it
2185 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2186 if SectionType
in ('TE', 'PE32'):
2191 ## __GetFilePart() method
2193 # Get components for FILE statement
2195 # @param self The object pointer
2196 # @param FfsFileObj for whom component is got
2197 # @param MacroDict dictionary used to replace macro
2199 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2201 self
.__GetFileOpts
( FfsFileObj
)
2203 if not self
.__IsToken
("{"):
2204 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2205 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2206 # if self.__Token == 'RELOCS_STRIPPED':
2207 # FfsFileObj.KeepReloc = False
2209 # FfsFileObj.KeepReloc = True
2211 # raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2213 # if not self.__IsToken("{"):
2214 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2216 if not self
.__GetNextToken
():
2217 raise Warning("expected File name or section data At Line ", self
.FileName
, self
.CurrentLineNumber
)
2219 if self
.__Token
== "FV":
2220 if not self
.__IsToken
( "="):
2221 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2222 if not self
.__GetNextToken
():
2223 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2224 FfsFileObj
.FvName
= self
.__Token
2226 elif self
.__Token
== "FD":
2227 if not self
.__IsToken
( "="):
2228 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2229 if not self
.__GetNextToken
():
2230 raise Warning("expected FD name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2231 FfsFileObj
.FdName
= self
.__Token
2233 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2235 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2237 FfsFileObj
.FileName
= self
.__Token
2239 if not self
.__IsToken
( "}"):
2240 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2242 ## __GetFileOpts() method
2244 # Get options for FILE statement
2246 # @param self The object pointer
2247 # @param FfsFileObj for whom options is got
2249 def __GetFileOpts(self
, FfsFileObj
):
2251 if self
.__GetNextToken
():
2252 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2253 if Pattern
.match(self
.__Token
):
2254 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2255 if self
.__IsToken
(","):
2256 while self
.__GetNextToken
():
2257 if not Pattern
.match(self
.__Token
):
2258 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2259 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2261 if not self
.__IsToken
(","):
2267 if self
.__IsKeyword
( "FIXED", True):
2268 FfsFileObj
.Fixed
= True
2270 if self
.__IsKeyword
( "CHECKSUM", True):
2271 FfsFileObj
.CheckSum
= True
2273 if self
.__GetAlignment
():
2274 FfsFileObj
.Alignment
= self
.__Token
2278 ## __GetAlignment() method
2280 # Return the alignment value
2282 # @param self The object pointer
2283 # @retval True Successfully find alignment
2284 # @retval False Not able to find alignment
2286 def __GetAlignment(self
):
2287 if self
.__IsKeyword
( "Align", True):
2288 if not self
.__IsToken
( "="):
2289 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2291 if not self
.__GetNextToken
():
2292 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2297 ## __GetFilePart() method
2299 # Get section data for FILE statement
2301 # @param self The object pointer
2302 # @param FfsFileObj for whom section is got
2303 # @param MacroDict dictionary used to replace macro
2305 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2307 Dict
.update(MacroDict
)
2309 self
.__GetDefineStatements
(FfsFileObj
)
2311 Dict
.update(FfsFileObj
.DefineVarDict
)
2312 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2313 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2316 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2317 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2318 if not IsLeafSection
and not IsEncapSection
:
2321 ## __GetLeafSection() method
2323 # Get leaf section for Obj
2325 # @param self The object pointer
2326 # @param Obj for whom leaf section is got
2327 # @param MacroDict dictionary used to replace macro
2328 # @retval True Successfully find section statement
2329 # @retval False Not able to find section statement
2331 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2333 OldPos
= self
.GetFileBufferPos()
2335 if not self
.__IsKeyword
( "SECTION"):
2336 if len(Obj
.SectionList
) == 0:
2337 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2342 if self
.__GetAlignment
():
2343 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2344 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2345 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2346 AlignValue
= self
.__Token
2349 if self
.__IsKeyword
( "BUILD_NUM"):
2350 if not self
.__IsToken
( "="):
2351 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2353 if not self
.__GetNextToken
():
2354 raise Warning("expected Build number value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2356 BuildNum
= self
.__Token
2358 if self
.__IsKeyword
( "VERSION"):
2359 if AlignValue
== 'Auto':
2360 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2361 if not self
.__IsToken
( "="):
2362 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2363 if not self
.__GetNextToken
():
2364 raise Warning("expected version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2365 VerSectionObj
= CommonDataClass
.FdfClass
.VerSectionClassObject()
2366 VerSectionObj
.Alignment
= AlignValue
2367 VerSectionObj
.BuildNum
= BuildNum
2368 if self
.__GetStringData
():
2369 VerSectionObj
.StringData
= self
.__Token
2371 VerSectionObj
.FileName
= self
.__Token
2372 Obj
.SectionList
.append(VerSectionObj
)
2374 elif self
.__IsKeyword
( "UI"):
2375 if AlignValue
== 'Auto':
2376 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2377 if not self
.__IsToken
( "="):
2378 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2379 if not self
.__GetNextToken
():
2380 raise Warning("expected UI At Line ", self
.FileName
, self
.CurrentLineNumber
)
2381 UiSectionObj
= CommonDataClass
.FdfClass
.UiSectionClassObject()
2382 UiSectionObj
.Alignment
= AlignValue
2383 if self
.__GetStringData
():
2384 UiSectionObj
.StringData
= self
.__Token
2386 UiSectionObj
.FileName
= self
.__Token
2387 Obj
.SectionList
.append(UiSectionObj
)
2389 elif self
.__IsKeyword
( "FV_IMAGE"):
2390 if AlignValue
== 'Auto':
2391 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2392 if not self
.__IsToken
( "="):
2393 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2394 if not self
.__GetNextWord
():
2395 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2397 FvName
= self
.__Token
.upper()
2400 if self
.__IsToken
( "{"):
2402 FvObj
.UiFvName
= FvName
2403 self
.__GetDefineStatements
(FvObj
)
2404 MacroDict
.update(FvObj
.DefineVarDict
)
2405 self
.__GetBlockStatement
(FvObj
)
2406 self
.__GetSetStatements
(FvObj
)
2407 self
.__GetFvAlignment
(FvObj
)
2408 self
.__GetFvAttributes
(FvObj
)
2409 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2410 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2413 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2414 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2415 if not IsInf
and not IsFile
:
2418 if not self
.__IsToken
( "}"):
2419 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2421 FvImageSectionObj
= CommonDataClass
.FdfClass
.FvImageSectionClassObject()
2422 FvImageSectionObj
.Alignment
= AlignValue
2424 FvImageSectionObj
.Fv
= FvObj
2425 FvImageSectionObj
.FvName
= None
2427 FvImageSectionObj
.FvName
= FvName
2429 Obj
.SectionList
.append(FvImageSectionObj
)
2431 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2432 if AlignValue
== 'Auto':
2433 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2434 DepexSectionObj
= CommonDataClass
.FdfClass
.DepexSectionClassObject()
2435 DepexSectionObj
.Alignment
= AlignValue
2436 DepexSectionObj
.DepexType
= self
.__Token
2438 if not self
.__IsToken
( "="):
2439 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2440 if not self
.__IsToken
( "{"):
2441 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2442 if not self
.__SkipToToken
( "}"):
2443 raise Warning("expected Depex expression ending '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2445 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2446 Obj
.SectionList
.append(DepexSectionObj
)
2450 if not self
.__GetNextWord
():
2451 raise Warning("expected section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2453 # Encapsulation section appear, UndoToken and return
2454 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2455 self
.SetFileBufferPos(OldPos
)
2458 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2459 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2460 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2461 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2462 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2464 DataSectionObj
= CommonDataClass
.FdfClass
.DataSectionClassObject()
2465 DataSectionObj
.Alignment
= AlignValue
2466 DataSectionObj
.SecType
= self
.__Token
2468 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2469 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2470 if self
.__Token
== 'RELOCS_STRIPPED':
2471 DataSectionObj
.KeepReloc
= False
2473 DataSectionObj
.KeepReloc
= True
2475 raise Warning("File type %s, section type %s, could not have reloc strip flag At Line %d" % (Obj
.FvFileType
, DataSectionObj
.SecType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2477 if self
.__IsToken
("="):
2478 if not self
.__GetNextToken
():
2479 raise Warning("expected section file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2480 DataSectionObj
.SectFileName
= self
.__Token
2482 if not self
.__GetCglSection
(DataSectionObj
):
2485 Obj
.SectionList
.append(DataSectionObj
)
2489 ## __GetCglSection() method
2491 # Get compressed or GUIDed section for Obj
2493 # @param self The object pointer
2494 # @param Obj for whom leaf section is got
2495 # @param AlignValue alignment value for complex section
2496 # @retval True Successfully find section statement
2497 # @retval False Not able to find section statement
2499 def __GetCglSection(self
, Obj
, AlignValue
= None):
2501 if self
.__IsKeyword
( "COMPRESS"):
2503 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2506 if not self
.__IsToken
("{"):
2507 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2509 CompressSectionObj
= CommonDataClass
.FdfClass
.CompressSectionClassObject()
2510 CompressSectionObj
.Alignment
= AlignValue
2511 CompressSectionObj
.CompType
= type
2512 # Recursive sections...
2514 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2515 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2516 if not IsLeafSection
and not IsEncapSection
:
2520 if not self
.__IsToken
( "}"):
2521 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2522 Obj
.SectionList
.append(CompressSectionObj
)
2525 # raise Warning("Compress type not known At Line ")
2529 elif self
.__IsKeyword
( "GUIDED"):
2531 if self
.__GetNextGuid
():
2532 GuidValue
= self
.__Token
2534 AttribDict
= self
.__GetGuidAttrib
()
2535 if not self
.__IsToken
("{"):
2536 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2537 GuidSectionObj
= CommonDataClass
.FdfClass
.GuidSectionClassObject()
2538 GuidSectionObj
.Alignment
= AlignValue
2539 GuidSectionObj
.NameGuid
= GuidValue
2540 GuidSectionObj
.SectionType
= "GUIDED"
2541 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2542 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2543 # Recursive sections...
2545 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2546 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2547 if not IsLeafSection
and not IsEncapSection
:
2550 if not self
.__IsToken
( "}"):
2551 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2552 Obj
.SectionList
.append(GuidSectionObj
)
2558 ## __GetGuidAttri() method
2560 # Get attributes for GUID section
2562 # @param self The object pointer
2563 # @retval AttribDict Dictionary of key-value pair of section attributes
2565 def __GetGuidAttrib(self
):
2568 AttribDict
["PROCESSING_REQUIRED"] = False
2569 AttribDict
["AUTH_STATUS_VALID"] = False
2570 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2571 AttribKey
= self
.__Token
2573 if not self
.__IsToken
("="):
2574 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2576 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2577 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2578 AttribDict
[AttribKey
] = self
.__Token
2580 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2581 AttribKey
= self
.__Token
2583 if not self
.__IsToken
("="):
2584 raise Warning("expected '=' At Line ")
2586 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2587 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2588 AttribDict
[AttribKey
] = self
.__Token
2592 ## __GetEncapsulationSec() method
2594 # Get encapsulation section for FILE
2596 # @param self The object pointer
2597 # @param FfsFile for whom section is got
2598 # @retval True Successfully find section statement
2599 # @retval False Not able to find section statement
2601 def __GetEncapsulationSec(self
, FfsFileObj
):
2603 OldPos
= self
.GetFileBufferPos()
2604 if not self
.__IsKeyword
( "SECTION"):
2605 if len(FfsFileObj
.SectionList
) == 0:
2606 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2611 if self
.__GetAlignment
():
2612 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2613 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2614 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2615 AlignValue
= self
.__Token
2617 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2618 self
.SetFileBufferPos(OldPos
)
2623 ## __GetCapsule() method
2625 # Get capsule section contents and store its data into capsule list of self.Profile
2627 # @param self The object pointer
2628 # @retval True Successfully find a capsule
2629 # @retval False Not able to find a capsule
2631 def __GetCapsule(self
):
2633 if not self
.__GetNextToken
():
2636 S
= self
.__Token
.upper()
2637 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2638 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2639 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2644 if not self
.__IsToken
("[CAPSULE.", True):
2645 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2646 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2647 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2648 raise Warning("expected [Capsule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2650 CapsuleObj
= CommonDataClass
.FdfClass
.CapsuleClassObject()
2652 CapsuleName
= self
.__GetUiName
()
2654 raise Warning("expected capsule name At line ", self
.FileName
, self
.CurrentLineNumber
)
2656 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2658 if not self
.__IsToken
( "]"):
2659 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2661 if self
.__IsKeyword
("CREATE_FILE"):
2662 if not self
.__IsToken
( "="):
2663 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2665 if not self
.__GetNextToken
():
2666 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2668 CapsuleObj
.CreateFile
= self
.__Token
2670 self
.__GetCapsuleStatements
(CapsuleObj
)
2671 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2674 ## __GetCapsuleStatements() method
2676 # Get statements for capsule
2678 # @param self The object pointer
2679 # @param Obj for whom statements are got
2681 def __GetCapsuleStatements(self
, Obj
):
2682 self
.__GetCapsuleTokens
(Obj
)
2683 self
.__GetDefineStatements
(Obj
)
2684 self
.__GetSetStatements
(Obj
)
2686 self
.__GetCapsuleData
(Obj
)
2688 ## __GetCapsuleStatements() method
2690 # Get token statements for capsule
2692 # @param self The object pointer
2693 # @param Obj for whom token statements are got
2695 def __GetCapsuleTokens(self
, Obj
):
2697 if not self
.__IsKeyword
("CAPSULE_GUID"):
2698 raise Warning("expected 'CAPSULE_GUID' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2700 while self
.__CurrentLine
().find("=") != -1:
2701 NameValue
= self
.__CurrentLine
().split("=")
2702 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2703 self
.CurrentLineNumber
+= 1
2704 self
.CurrentOffsetWithinLine
= 0
2706 ## __GetCapsuleData() method
2708 # Get capsule data for capsule
2710 # @param self The object pointer
2711 # @param Obj for whom capsule data are got
2713 def __GetCapsuleData(self
, Obj
):
2716 IsInf
= self
.__GetInfStatement
(Obj
, True)
2717 IsFile
= self
.__GetFileStatement
(Obj
, True)
2718 IsFv
= self
.__GetFvStatement
(Obj
)
2719 if not IsInf
and not IsFile
and not IsFv
:
2722 ## __GetFvStatement() method
2724 # Get FV for capsule
2726 # @param self The object pointer
2727 # @param CapsuleObj for whom FV is got
2728 # @retval True Successfully find a FV statement
2729 # @retval False Not able to find a FV statement
2731 def __GetFvStatement(self
, CapsuleObj
):
2733 if not self
.__IsKeyword
("FV"):
2736 if not self
.__IsToken
("="):
2737 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2739 if not self
.__GetNextToken
():
2740 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2742 # CapsuleFv = CapsuleData.CapsuleFv()
2743 # CapsuleFv.FvName = self.__Token
2744 # CapsuleObj.CapsuleDataList.append(CapsuleFv)
2747 ## __GetRule() method
2749 # Get Rule section contents and store its data into rule list of self.Profile
2751 # @param self The object pointer
2752 # @retval True Successfully find a Rule
2753 # @retval False Not able to find a Rule
2755 def __GetRule(self
):
2757 if not self
.__GetNextToken
():
2760 S
= self
.__Token
.upper()
2761 if S
.startswith("[") and not S
.startswith("[RULE."):
2762 if not S
.startswith("[OPTIONROM."):
2763 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2767 if not self
.__IsToken
("[Rule.", True):
2768 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2769 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2770 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2771 raise Warning("expected [Rule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2773 if not self
.__SkipToToken
("."):
2774 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2776 Arch
= self
.__SkippedChars
.rstrip(".")
2777 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
2778 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2780 ModuleType
= self
.__GetModuleType
()
2783 if self
.__IsToken
("."):
2784 if not self
.__GetNextWord
():
2785 raise Warning("expected template name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2786 TemplateName
= self
.__Token
2788 if not self
.__IsToken
( "]"):
2789 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2791 RuleObj
= self
.__GetRuleFileStatements
()
2792 RuleObj
.Arch
= Arch
.upper()
2793 RuleObj
.ModuleType
= ModuleType
2794 RuleObj
.TemplateName
= TemplateName
2795 if TemplateName
== '' :
2796 self
.Profile
.RuleDict
['RULE' + \
2800 ModuleType
.upper() ] = RuleObj
2802 self
.Profile
.RuleDict
['RULE' + \
2806 ModuleType
.upper() + \
2808 TemplateName
.upper() ] = RuleObj
2809 # self.Profile.RuleList.append(rule)
2812 ## __GetModuleType() method
2814 # Return the module type
2816 # @param self The object pointer
2817 # @retval string module type
2819 def __GetModuleType(self
):
2821 if not self
.__GetNextWord
():
2822 raise Warning("expected Module type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2823 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2824 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2825 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2826 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2827 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2828 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
2829 raise Warning("Unknown Module type At line ", self
.FileName
, self
.CurrentLineNumber
)
2832 ## __GetFileExtension() method
2834 # Return the file extension
2836 # @param self The object pointer
2837 # @retval string file name extension
2839 def __GetFileExtension(self
):
2840 if not self
.__IsToken
("."):
2841 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2844 if self
.__GetNextToken
():
2845 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
2846 if Pattern
.match(self
.__Token
):
2850 raise Warning("Unknown file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2853 raise Warning("expected file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2855 ## __GetRuleFileStatement() method
2859 # @param self The object pointer
2860 # @retval Rule Rule object
2862 def __GetRuleFileStatements(self
):
2864 if not self
.__IsKeyword
("FILE"):
2865 raise Warning("expected FILE At Line ", self
.FileName
, self
.CurrentLineNumber
)
2867 if not self
.__GetNextWord
():
2868 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2870 Type
= self
.__Token
.strip().upper()
2871 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2872 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):
2873 raise Warning("Unknown FV type At line ", self
.FileName
, self
.CurrentLineNumber
)
2875 if not self
.__IsToken
("="):
2876 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2878 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2879 if not self
.__GetNextWord
():
2880 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2881 if self
.__Token
== 'PCD':
2882 if not self
.__IsToken
( "("):
2883 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2884 PcdPair
= self
.__GetNextPcdName
()
2885 if not self
.__IsToken
( ")"):
2886 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2887 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2889 NameGuid
= self
.__Token
2892 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2893 if self
.__FileCouldHaveRelocFlag
(Type
):
2894 if self
.__Token
== 'RELOCS_STRIPPED':
2899 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2902 if self
.__GetNextToken
():
2903 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2904 if Pattern
.match(self
.__Token
):
2905 KeyStringList
.append(self
.__Token
)
2906 if self
.__IsToken
(","):
2907 while self
.__GetNextToken
():
2908 if not Pattern
.match(self
.__Token
):
2909 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2910 KeyStringList
.append(self
.__Token
)
2912 if not self
.__IsToken
(","):
2920 if self
.__IsKeyword
("Fixed", True):
2924 if self
.__IsKeyword
("CheckSum", True):
2928 if self
.__GetAlignment
():
2929 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2930 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2931 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2932 AlignValue
= self
.__Token
2934 if self
.__IsToken
("{"):
2935 # Complex file rule expected
2936 Rule
= RuleComplexFile
.RuleComplexFile()
2937 Rule
.FvFileType
= Type
2938 Rule
.NameGuid
= NameGuid
2939 Rule
.Alignment
= AlignValue
2940 Rule
.CheckSum
= CheckSum
2942 Rule
.KeyStringList
= KeyStringList
2943 if KeepReloc
!= None:
2944 Rule
.KeepReloc
= KeepReloc
2947 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2948 IsLeaf
= self
.__GetEfiSection
(Rule
)
2949 if not IsEncapsulate
and not IsLeaf
:
2952 if not self
.__IsToken
("}"):
2953 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2957 elif self
.__IsToken
("|"):
2959 Ext
= self
.__GetFileExtension
()
2961 Rule
= RuleSimpleFile
.RuleSimpleFile()
2963 Rule
.FvFileType
= Type
2964 Rule
.NameGuid
= NameGuid
2965 Rule
.Alignment
= AlignValue
2966 Rule
.CheckSum
= CheckSum
2968 Rule
.FileExtension
= Ext
2969 Rule
.KeyStringList
= KeyStringList
2970 if KeepReloc
!= None:
2971 Rule
.KeepReloc
= KeepReloc
2976 # Simple file rule expected
2977 if not self
.__GetNextWord
():
2978 raise Warning("expected leaf section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2980 SectionName
= self
.__Token
2982 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2983 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2984 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2987 if self
.__IsKeyword
("Fixed", True):
2990 if self
.__IsKeyword
("CheckSum", True):
2993 if self
.__GetAlignment
():
2994 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2995 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2996 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2997 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
2998 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2999 AlignValue
= self
.__Token
3001 if not self
.__GetNextToken
():
3002 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3004 Rule
= RuleSimpleFile
.RuleSimpleFile()
3005 Rule
.SectionType
= SectionName
3006 Rule
.FvFileType
= Type
3007 Rule
.NameGuid
= NameGuid
3008 Rule
.Alignment
= AlignValue
3009 Rule
.CheckSum
= CheckSum
3011 Rule
.FileName
= self
.__Token
3012 Rule
.KeyStringList
= KeyStringList
3013 if KeepReloc
!= None:
3014 Rule
.KeepReloc
= KeepReloc
3017 ## __GetEfiSection() method
3019 # Get section list for Rule
3021 # @param self The object pointer
3022 # @param Obj for whom section is got
3023 # @retval True Successfully find section statement
3024 # @retval False Not able to find section statement
3026 def __GetEfiSection(self
, Obj
):
3028 OldPos
= self
.GetFileBufferPos()
3029 if not self
.__GetNextWord
():
3031 SectionName
= self
.__Token
3033 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3034 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3038 if SectionName
== "FV_IMAGE":
3039 FvImageSectionObj
= FvImageSection
.FvImageSection()
3040 if self
.__IsKeyword
("FV_IMAGE"):
3042 if self
.__IsToken
( "{"):
3044 self
.__GetDefineStatements
(FvObj
)
3045 self
.__GetBlockStatement
(FvObj
)
3046 self
.__GetSetStatements
(FvObj
)
3047 self
.__GetFvAlignment
(FvObj
)
3048 self
.__GetFvAttributes
(FvObj
)
3049 self
.__GetAprioriSection
(FvObj
)
3050 self
.__GetAprioriSection
(FvObj
)
3053 IsInf
= self
.__GetInfStatement
(FvObj
)
3054 IsFile
= self
.__GetFileStatement
(FvObj
)
3055 if not IsInf
and not IsFile
:
3058 if not self
.__IsToken
( "}"):
3059 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3060 FvImageSectionObj
.Fv
= FvObj
3061 FvImageSectionObj
.FvName
= None
3064 if not self
.__IsKeyword
("FV"):
3065 raise Warning("expected 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3066 FvImageSectionObj
.FvFileType
= self
.__Token
3068 if self
.__GetAlignment
():
3069 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3070 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3071 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3072 FvImageSectionObj
.Alignment
= self
.__Token
3074 if self
.__IsToken
('|'):
3075 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3076 elif self
.__GetNextToken
():
3077 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3078 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3079 FvImageSectionObj
.FvFileName
= self
.__Token
3083 raise Warning("expected FV file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3085 Obj
.SectionList
.append(FvImageSectionObj
)
3088 EfiSectionObj
= EfiSection
.EfiSection()
3089 EfiSectionObj
.SectionType
= SectionName
3091 if not self
.__GetNextToken
():
3092 raise Warning("expected file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3094 if self
.__Token
== "STRING":
3095 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3096 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3098 if not self
.__IsToken
('='):
3099 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3101 if not self
.__GetNextToken
():
3102 raise Warning("expected Quoted String At Line ", self
.FileName
, self
.CurrentLineNumber
)
3104 if self
.__GetStringData
():
3105 EfiSectionObj
.StringData
= self
.__Token
3107 if self
.__IsKeyword
("BUILD_NUM"):
3108 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3109 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3111 if not self
.__IsToken
("="):
3112 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3113 if not self
.__GetNextToken
():
3114 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3115 EfiSectionObj
.BuildNum
= self
.__Token
3118 EfiSectionObj
.FileType
= self
.__Token
3119 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3121 if self
.__IsKeyword
("Optional"):
3122 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3123 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3124 EfiSectionObj
.Optional
= True
3126 if self
.__IsKeyword
("BUILD_NUM"):
3127 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3128 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3130 if not self
.__IsToken
("="):
3131 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3132 if not self
.__GetNextToken
():
3133 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3134 EfiSectionObj
.BuildNum
= self
.__Token
3136 if self
.__GetAlignment
():
3137 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3138 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3139 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3140 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3141 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3142 EfiSectionObj
.Alignment
= self
.__Token
3144 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3145 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3146 if self
.__Token
== 'RELOCS_STRIPPED':
3147 EfiSectionObj
.KeepReloc
= False
3149 EfiSectionObj
.KeepReloc
= True
3150 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3151 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3153 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3156 if self
.__IsToken
('|'):
3157 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3158 elif self
.__GetNextToken
():
3159 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3160 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3162 if self
.__Token
.startswith('PCD'):
3164 self
.__GetNextWord
()
3166 if self
.__Token
== 'PCD':
3167 if not self
.__IsToken
( "("):
3168 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3169 PcdPair
= self
.__GetNextPcdName
()
3170 if not self
.__IsToken
( ")"):
3171 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3172 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3174 EfiSectionObj
.FileName
= self
.__Token
3179 raise Warning("expected section file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3181 Obj
.SectionList
.append(EfiSectionObj
)
3184 ## __RuleSectionCouldBeOptional() method
3186 # Get whether a section could be optional
3188 # @param self The object pointer
3189 # @param SectionType The section type to check
3190 # @retval True section could be optional
3191 # @retval False section never optional
3193 def __RuleSectionCouldBeOptional(self
, SectionType
):
3194 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3199 ## __RuleSectionCouldHaveBuildNum() method
3201 # Get whether a section could have build number information
3203 # @param self The object pointer
3204 # @param SectionType The section type to check
3205 # @retval True section could have build number information
3206 # @retval False section never have build number information
3208 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3209 if SectionType
in ("VERSION"):
3214 ## __RuleSectionCouldHaveString() method
3216 # Get whether a section could have string
3218 # @param self The object pointer
3219 # @param SectionType The section type to check
3220 # @retval True section could have string
3221 # @retval False section never have string
3223 def __RuleSectionCouldHaveString(self
, SectionType
):
3224 if SectionType
in ("UI", "VERSION"):
3229 ## __CheckRuleSectionFileType() method
3231 # Get whether a section matches a file type
3233 # @param self The object pointer
3234 # @param SectionType The section type to check
3235 # @param FileType The file type to check
3237 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3238 if SectionType
== "COMPAT16":
3239 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3240 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3241 elif SectionType
== "PE32":
3242 if FileType
not in ("PE32", "SEC_PE32"):
3243 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3244 elif SectionType
== "PIC":
3245 if FileType
not in ("PIC", "PIC"):
3246 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3247 elif SectionType
== "TE":
3248 if FileType
not in ("TE", "SEC_TE"):
3249 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3250 elif SectionType
== "RAW":
3251 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3252 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3253 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3254 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3255 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3256 elif SectionType
== "UI":
3257 if FileType
not in ("UI", "SEC_UI"):
3258 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3259 elif SectionType
== "VERSION":
3260 if FileType
not in ("VERSION", "SEC_VERSION"):
3261 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3262 elif SectionType
== "PEI_DEPEX":
3263 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3264 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3265 elif SectionType
== "GUID":
3266 if FileType
not in ("PE32", "SEC_GUID"):
3267 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3269 ## __GetRuleEncapsulationSection() method
3271 # Get encapsulation section for Rule
3273 # @param self The object pointer
3274 # @param Rule for whom section is got
3275 # @retval True Successfully find section statement
3276 # @retval False Not able to find section statement
3278 def __GetRuleEncapsulationSection(self
, Rule
):
3280 if self
.__IsKeyword
( "COMPRESS"):
3282 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3285 if not self
.__IsToken
("{"):
3286 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3288 CompressSectionObj
= CompressSection
.CompressSection()
3290 CompressSectionObj
.CompType
= Type
3291 # Recursive sections...
3293 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3294 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3295 if not IsEncapsulate
and not IsLeaf
:
3298 if not self
.__IsToken
( "}"):
3299 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3300 Rule
.SectionList
.append(CompressSectionObj
)
3304 elif self
.__IsKeyword
( "GUIDED"):
3306 if self
.__GetNextGuid
():
3307 GuidValue
= self
.__Token
3309 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3310 GuidValue
= self
.__Token
3312 AttribDict
= self
.__GetGuidAttrib
()
3314 if not self
.__IsToken
("{"):
3315 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3316 GuidSectionObj
= GuidSection
.GuidSection()
3317 GuidSectionObj
.NameGuid
= GuidValue
3318 GuidSectionObj
.SectionType
= "GUIDED"
3319 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3320 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3324 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3325 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3326 if not IsEncapsulate
and not IsLeaf
:
3329 if not self
.__IsToken
( "}"):
3330 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3331 Rule
.SectionList
.append(GuidSectionObj
)
3337 ## __GetVtf() method
3339 # Get VTF section contents and store its data into VTF list of self.Profile
3341 # @param self The object pointer
3342 # @retval True Successfully find a VTF
3343 # @retval False Not able to find a VTF
3347 if not self
.__GetNextToken
():
3350 S
= self
.__Token
.upper()
3351 if S
.startswith("[") and not S
.startswith("[VTF."):
3352 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3353 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3358 if not self
.__IsToken
("[VTF.", True):
3359 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3360 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3361 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
3362 raise Warning("expected [VTF.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
3364 if not self
.__SkipToToken
("."):
3365 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3367 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3368 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3369 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3371 if not self
.__GetNextWord
():
3372 raise Warning("expected VTF name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3373 Name
= self
.__Token
.upper()
3376 VtfObj
.UiName
= Name
3377 VtfObj
.KeyArch
= Arch
3379 if self
.__IsToken
(","):
3380 if not self
.__GetNextWord
():
3381 raise Warning("expected Arch list At Line ", self
.FileName
, self
.CurrentLineNumber
)
3382 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3383 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3384 VtfObj
.ArchList
= self
.__Token
.upper()
3386 if not self
.__IsToken
( "]"):
3387 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3389 if self
.__IsKeyword
("IA32_RST_BIN"):
3390 if not self
.__IsToken
("="):
3391 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3393 if not self
.__GetNextToken
():
3394 raise Warning("expected Reset file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3396 VtfObj
.ResetBin
= self
.__Token
3398 while self
.__GetComponentStatement
(VtfObj
):
3401 self
.Profile
.VtfList
.append(VtfObj
)
3404 ## __GetComponentStatement() method
3406 # Get components in VTF
3408 # @param self The object pointer
3409 # @param VtfObj for whom component is got
3410 # @retval True Successfully find a component
3411 # @retval False Not able to find a component
3413 def __GetComponentStatement(self
, VtfObj
):
3415 if not self
.__IsKeyword
("COMP_NAME"):
3418 if not self
.__IsToken
("="):
3419 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3421 if not self
.__GetNextWord
():
3422 raise Warning("expected Component Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3424 CompStatementObj
= ComponentStatement
.ComponentStatement()
3425 CompStatementObj
.CompName
= self
.__Token
3427 if not self
.__IsKeyword
("COMP_LOC"):
3428 raise Warning("expected COMP_LOC At Line ", self
.FileName
, self
.CurrentLineNumber
)
3430 if not self
.__IsToken
("="):
3431 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3433 CompStatementObj
.CompLoc
= ""
3434 if self
.__GetNextWord
():
3435 CompStatementObj
.CompLoc
= self
.__Token
3436 if self
.__IsToken
('|'):
3437 if not self
.__GetNextWord
():
3438 raise Warning("Expected Region Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3440 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3441 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3443 CompStatementObj
.FilePos
= self
.__Token
3445 self
.CurrentLineNumber
+= 1
3446 self
.CurrentOffsetWithinLine
= 0
3448 if not self
.__IsKeyword
("COMP_TYPE"):
3449 raise Warning("expected COMP_TYPE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3451 if not self
.__IsToken
("="):
3452 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3454 if not self
.__GetNextToken
():
3455 raise Warning("expected Component type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3456 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3457 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3458 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3459 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3460 CompStatementObj
.CompType
= self
.__Token
3462 if not self
.__IsKeyword
("COMP_VER"):
3463 raise Warning("expected COMP_VER At Line ", self
.FileName
, self
.CurrentLineNumber
)
3465 if not self
.__IsToken
("="):
3466 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3468 if not self
.__GetNextToken
():
3469 raise Warning("expected Component version At Line ", self
.FileName
, self
.CurrentLineNumber
)
3471 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3472 if Pattern
.match(self
.__Token
) == None:
3473 raise Warning("Unknown version format At line ", self
.FileName
, self
.CurrentLineNumber
)
3474 CompStatementObj
.CompVer
= self
.__Token
3476 if not self
.__IsKeyword
("COMP_CS"):
3477 raise Warning("expected COMP_CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3479 if not self
.__IsToken
("="):
3480 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3482 if not self
.__GetNextToken
():
3483 raise Warning("expected Component CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3484 if self
.__Token
not in ("1", "0"):
3485 raise Warning("Unknown Component CS At line ", self
.FileName
, self
.CurrentLineNumber
)
3486 CompStatementObj
.CompCs
= self
.__Token
3489 if not self
.__IsKeyword
("COMP_BIN"):
3490 raise Warning("expected COMP_BIN At Line ", self
.FileName
, self
.CurrentLineNumber
)
3492 if not self
.__IsToken
("="):
3493 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3495 if not self
.__GetNextToken
():
3496 raise Warning("expected Component file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3498 CompStatementObj
.CompBin
= self
.__Token
3500 if not self
.__IsKeyword
("COMP_SYM"):
3501 raise Warning("expected COMP_SYM At Line ", self
.FileName
, self
.CurrentLineNumber
)
3503 if not self
.__IsToken
("="):
3504 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3506 if not self
.__GetNextToken
():
3507 raise Warning("expected Component symbol file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3509 CompStatementObj
.CompSym
= self
.__Token
3511 if not self
.__IsKeyword
("COMP_SIZE"):
3512 raise Warning("expected COMP_SIZE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3514 if not self
.__IsToken
("="):
3515 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3517 if self
.__IsToken
("-"):
3518 CompStatementObj
.CompSize
= self
.__Token
3519 elif self
.__GetNextDecimalNumber
():
3520 CompStatementObj
.CompSize
= self
.__Token
3521 elif self
.__GetNextHexNumber
():
3522 CompStatementObj
.CompSize
= self
.__Token
3524 raise Warning("Unknown size At line ", self
.FileName
, self
.CurrentLineNumber
)
3526 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3529 ## __GetFvInFd() method
3531 # Get FV list contained in FD
3533 # @param self The object pointer
3534 # @param FdName FD name
3535 # @retval FvList list of FV in FD
3537 def __GetFvInFd (self
, FdName
):
3540 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3541 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3542 for elementRegion
in FdObj
.RegionList
:
3543 if elementRegion
.RegionType
== 'FV':
3544 for elementRegionData
in elementRegion
.RegionDataList
:
3545 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3546 FvList
.append(elementRegionData
.upper())
3549 ## __GetReferencedFdFvTuple() method
3551 # Get FD and FV list referenced by a FFS file
3553 # @param self The object pointer
3554 # @param FfsFile contains sections to be searched
3555 # @param RefFdList referenced FD by section
3556 # @param RefFvList referenced FV by section
3558 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3560 for FfsObj
in FvObj
.FfsList
:
3561 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3562 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3563 RefFvList
.append(FfsObj
.FvName
.upper())
3564 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3565 RefFdList
.append(FfsObj
.FdName
.upper())
3567 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3569 ## __GetReferencedFdFvTupleFromSection() method
3571 # Get FD and FV list referenced by a FFS section
3573 # @param self The object pointer
3574 # @param FfsFile contains sections to be searched
3575 # @param FdList referenced FD by section
3576 # @param FvList referenced FV by section
3578 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3581 SectionStack
.extend(FfsFile
.SectionList
)
3582 while SectionStack
!= []:
3583 SectionObj
= SectionStack
.pop()
3584 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3585 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
3586 FvList
.append(SectionObj
.FvName
.upper())
3587 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3588 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3589 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3591 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3592 SectionStack
.extend(SectionObj
.SectionList
)
3594 ## CycleReferenceCheck() method
3596 # Check whether cycle reference exists in FDF
3598 # @param self The object pointer
3599 # @retval True cycle reference exists
3600 # @retval False Not exists cycle reference
3602 def CycleReferenceCheck(self
):
3604 CycleRefExists
= False
3607 for FvName
in self
.Profile
.FvDict
.keys():
3608 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3610 RefFvStack
.append(FvName
)
3613 while RefFvStack
!= []:
3614 FvNameFromStack
= RefFvStack
.pop()
3615 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3616 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3622 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3624 for RefFdName
in RefFdList
:
3625 if RefFdName
in FdAnalyzedList
:
3628 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3629 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3630 if FvInFdList
!= []:
3631 LogStr
+= "FD %s contains FV: " % RefFdName
3632 for FvObj
in FvInFdList
:
3635 if FvObj
not in RefFvStack
:
3636 RefFvStack
.append(FvObj
)
3638 if FvName
in RefFvStack
:
3639 CycleRefExists
= True
3640 raise Warning(LogStr
)
3641 FdAnalyzedList
.append(RefFdName
)
3643 for RefFvName
in RefFvList
:
3644 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3645 if RefFvName
not in RefFvStack
:
3646 RefFvStack
.append(RefFvName
)
3648 if FvName
in RefFvStack
:
3649 CycleRefExists
= True
3650 raise Warning(LogStr
)
3656 return CycleRefExists
3658 if __name__
== "__main__":
3661 test_file
= sys
.argv
[1]
3662 except IndexError, v
:
3663 print "Usage: %s filename" % sys
.argv
[0]
3666 parser
= FdfParser(test_file
)
3669 parser
.CycleReferenceCheck()