4 # Copyright (c) 2007 - 2014, 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"):
2344 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2345 AlignValue
= self
.__Token
2348 if self
.__IsKeyword
( "BUILD_NUM"):
2349 if not self
.__IsToken
( "="):
2350 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2352 if not self
.__GetNextToken
():
2353 raise Warning("expected Build number value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2355 BuildNum
= self
.__Token
2357 if self
.__IsKeyword
( "VERSION"):
2358 if AlignValue
== 'Auto':
2359 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2360 if not self
.__IsToken
( "="):
2361 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2362 if not self
.__GetNextToken
():
2363 raise Warning("expected version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2364 VerSectionObj
= CommonDataClass
.FdfClass
.VerSectionClassObject()
2365 VerSectionObj
.Alignment
= AlignValue
2366 VerSectionObj
.BuildNum
= BuildNum
2367 if self
.__GetStringData
():
2368 VerSectionObj
.StringData
= self
.__Token
2370 VerSectionObj
.FileName
= self
.__Token
2371 Obj
.SectionList
.append(VerSectionObj
)
2373 elif self
.__IsKeyword
( "UI"):
2374 if AlignValue
== 'Auto':
2375 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2376 if not self
.__IsToken
( "="):
2377 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2378 if not self
.__GetNextToken
():
2379 raise Warning("expected UI At Line ", self
.FileName
, self
.CurrentLineNumber
)
2380 UiSectionObj
= CommonDataClass
.FdfClass
.UiSectionClassObject()
2381 UiSectionObj
.Alignment
= AlignValue
2382 if self
.__GetStringData
():
2383 UiSectionObj
.StringData
= self
.__Token
2385 UiSectionObj
.FileName
= self
.__Token
2386 Obj
.SectionList
.append(UiSectionObj
)
2388 elif self
.__IsKeyword
( "FV_IMAGE"):
2389 if AlignValue
== 'Auto':
2390 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2391 if not self
.__IsToken
( "="):
2392 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2393 if not self
.__GetNextWord
():
2394 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2396 FvName
= self
.__Token
.upper()
2399 if self
.__IsToken
( "{"):
2401 FvObj
.UiFvName
= FvName
2402 self
.__GetDefineStatements
(FvObj
)
2403 MacroDict
.update(FvObj
.DefineVarDict
)
2404 self
.__GetBlockStatement
(FvObj
)
2405 self
.__GetSetStatements
(FvObj
)
2406 self
.__GetFvAlignment
(FvObj
)
2407 self
.__GetFvAttributes
(FvObj
)
2408 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2409 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2412 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2413 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2414 if not IsInf
and not IsFile
:
2417 if not self
.__IsToken
( "}"):
2418 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2420 FvImageSectionObj
= CommonDataClass
.FdfClass
.FvImageSectionClassObject()
2421 FvImageSectionObj
.Alignment
= AlignValue
2423 FvImageSectionObj
.Fv
= FvObj
2424 FvImageSectionObj
.FvName
= None
2426 FvImageSectionObj
.FvName
= FvName
2428 Obj
.SectionList
.append(FvImageSectionObj
)
2430 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2431 if AlignValue
== 'Auto':
2432 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2433 DepexSectionObj
= CommonDataClass
.FdfClass
.DepexSectionClassObject()
2434 DepexSectionObj
.Alignment
= AlignValue
2435 DepexSectionObj
.DepexType
= self
.__Token
2437 if not self
.__IsToken
( "="):
2438 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2439 if not self
.__IsToken
( "{"):
2440 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2441 if not self
.__SkipToToken
( "}"):
2442 raise Warning("expected Depex expression ending '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2444 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2445 Obj
.SectionList
.append(DepexSectionObj
)
2449 if not self
.__GetNextWord
():
2450 raise Warning("expected section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2452 # Encapsulation section appear, UndoToken and return
2453 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2454 self
.SetFileBufferPos(OldPos
)
2457 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2458 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2459 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2460 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2461 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2463 DataSectionObj
= CommonDataClass
.FdfClass
.DataSectionClassObject()
2464 DataSectionObj
.Alignment
= AlignValue
2465 DataSectionObj
.SecType
= self
.__Token
2467 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2468 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2469 if self
.__Token
== 'RELOCS_STRIPPED':
2470 DataSectionObj
.KeepReloc
= False
2472 DataSectionObj
.KeepReloc
= True
2474 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
)
2476 if self
.__IsToken
("="):
2477 if not self
.__GetNextToken
():
2478 raise Warning("expected section file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2479 DataSectionObj
.SectFileName
= self
.__Token
2481 if not self
.__GetCglSection
(DataSectionObj
):
2484 Obj
.SectionList
.append(DataSectionObj
)
2488 ## __GetCglSection() method
2490 # Get compressed or GUIDed section for Obj
2492 # @param self The object pointer
2493 # @param Obj for whom leaf section is got
2494 # @param AlignValue alignment value for complex section
2495 # @retval True Successfully find section statement
2496 # @retval False Not able to find section statement
2498 def __GetCglSection(self
, Obj
, AlignValue
= None):
2500 if self
.__IsKeyword
( "COMPRESS"):
2502 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2505 if not self
.__IsToken
("{"):
2506 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2508 CompressSectionObj
= CommonDataClass
.FdfClass
.CompressSectionClassObject()
2509 CompressSectionObj
.Alignment
= AlignValue
2510 CompressSectionObj
.CompType
= type
2511 # Recursive sections...
2513 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2514 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2515 if not IsLeafSection
and not IsEncapSection
:
2519 if not self
.__IsToken
( "}"):
2520 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2521 Obj
.SectionList
.append(CompressSectionObj
)
2524 # raise Warning("Compress type not known At Line ")
2528 elif self
.__IsKeyword
( "GUIDED"):
2530 if self
.__GetNextGuid
():
2531 GuidValue
= self
.__Token
2533 AttribDict
= self
.__GetGuidAttrib
()
2534 if not self
.__IsToken
("{"):
2535 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2536 GuidSectionObj
= CommonDataClass
.FdfClass
.GuidSectionClassObject()
2537 GuidSectionObj
.Alignment
= AlignValue
2538 GuidSectionObj
.NameGuid
= GuidValue
2539 GuidSectionObj
.SectionType
= "GUIDED"
2540 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2541 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2542 # Recursive sections...
2544 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2545 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2546 if not IsLeafSection
and not IsEncapSection
:
2549 if not self
.__IsToken
( "}"):
2550 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2551 Obj
.SectionList
.append(GuidSectionObj
)
2557 ## __GetGuidAttri() method
2559 # Get attributes for GUID section
2561 # @param self The object pointer
2562 # @retval AttribDict Dictionary of key-value pair of section attributes
2564 def __GetGuidAttrib(self
):
2567 AttribDict
["PROCESSING_REQUIRED"] = False
2568 AttribDict
["AUTH_STATUS_VALID"] = False
2569 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2570 AttribKey
= self
.__Token
2572 if not self
.__IsToken
("="):
2573 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2575 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2576 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2577 AttribDict
[AttribKey
] = self
.__Token
2579 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2580 AttribKey
= self
.__Token
2582 if not self
.__IsToken
("="):
2583 raise Warning("expected '=' At Line ")
2585 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2586 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2587 AttribDict
[AttribKey
] = self
.__Token
2591 ## __GetEncapsulationSec() method
2593 # Get encapsulation section for FILE
2595 # @param self The object pointer
2596 # @param FfsFile for whom section is got
2597 # @retval True Successfully find section statement
2598 # @retval False Not able to find section statement
2600 def __GetEncapsulationSec(self
, FfsFileObj
):
2602 OldPos
= self
.GetFileBufferPos()
2603 if not self
.__IsKeyword
( "SECTION"):
2604 if len(FfsFileObj
.SectionList
) == 0:
2605 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2610 if self
.__GetAlignment
():
2611 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2612 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2613 AlignValue
= self
.__Token
2615 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2616 self
.SetFileBufferPos(OldPos
)
2621 ## __GetCapsule() method
2623 # Get capsule section contents and store its data into capsule list of self.Profile
2625 # @param self The object pointer
2626 # @retval True Successfully find a capsule
2627 # @retval False Not able to find a capsule
2629 def __GetCapsule(self
):
2631 if not self
.__GetNextToken
():
2634 S
= self
.__Token
.upper()
2635 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2636 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2637 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2642 if not self
.__IsToken
("[CAPSULE.", True):
2643 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2644 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2645 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2646 raise Warning("expected [Capsule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2648 CapsuleObj
= CommonDataClass
.FdfClass
.CapsuleClassObject()
2650 CapsuleName
= self
.__GetUiName
()
2652 raise Warning("expected capsule name At line ", self
.FileName
, self
.CurrentLineNumber
)
2654 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2656 if not self
.__IsToken
( "]"):
2657 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2659 if self
.__IsKeyword
("CREATE_FILE"):
2660 if not self
.__IsToken
( "="):
2661 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2663 if not self
.__GetNextToken
():
2664 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2666 CapsuleObj
.CreateFile
= self
.__Token
2668 self
.__GetCapsuleStatements
(CapsuleObj
)
2669 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2672 ## __GetCapsuleStatements() method
2674 # Get statements for capsule
2676 # @param self The object pointer
2677 # @param Obj for whom statements are got
2679 def __GetCapsuleStatements(self
, Obj
):
2680 self
.__GetCapsuleTokens
(Obj
)
2681 self
.__GetDefineStatements
(Obj
)
2682 self
.__GetSetStatements
(Obj
)
2684 self
.__GetCapsuleData
(Obj
)
2686 ## __GetCapsuleStatements() method
2688 # Get token statements for capsule
2690 # @param self The object pointer
2691 # @param Obj for whom token statements are got
2693 def __GetCapsuleTokens(self
, Obj
):
2695 if not self
.__IsKeyword
("CAPSULE_GUID"):
2696 raise Warning("expected 'CAPSULE_GUID' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2698 while self
.__CurrentLine
().find("=") != -1:
2699 NameValue
= self
.__CurrentLine
().split("=")
2700 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2701 self
.CurrentLineNumber
+= 1
2702 self
.CurrentOffsetWithinLine
= 0
2704 ## __GetCapsuleData() method
2706 # Get capsule data for capsule
2708 # @param self The object pointer
2709 # @param Obj for whom capsule data are got
2711 def __GetCapsuleData(self
, Obj
):
2714 IsInf
= self
.__GetInfStatement
(Obj
, True)
2715 IsFile
= self
.__GetFileStatement
(Obj
, True)
2716 IsFv
= self
.__GetFvStatement
(Obj
)
2717 if not IsInf
and not IsFile
and not IsFv
:
2720 ## __GetFvStatement() method
2722 # Get FV for capsule
2724 # @param self The object pointer
2725 # @param CapsuleObj for whom FV is got
2726 # @retval True Successfully find a FV statement
2727 # @retval False Not able to find a FV statement
2729 def __GetFvStatement(self
, CapsuleObj
):
2731 if not self
.__IsKeyword
("FV"):
2734 if not self
.__IsToken
("="):
2735 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2737 if not self
.__GetNextToken
():
2738 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2740 # CapsuleFv = CapsuleData.CapsuleFv()
2741 # CapsuleFv.FvName = self.__Token
2742 # CapsuleObj.CapsuleDataList.append(CapsuleFv)
2745 ## __GetRule() method
2747 # Get Rule section contents and store its data into rule list of self.Profile
2749 # @param self The object pointer
2750 # @retval True Successfully find a Rule
2751 # @retval False Not able to find a Rule
2753 def __GetRule(self
):
2755 if not self
.__GetNextToken
():
2758 S
= self
.__Token
.upper()
2759 if S
.startswith("[") and not S
.startswith("[RULE."):
2760 if not S
.startswith("[OPTIONROM."):
2761 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2765 if not self
.__IsToken
("[Rule.", True):
2766 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2767 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2768 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2769 raise Warning("expected [Rule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2771 if not self
.__SkipToToken
("."):
2772 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2774 Arch
= self
.__SkippedChars
.rstrip(".")
2775 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
2776 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2778 ModuleType
= self
.__GetModuleType
()
2781 if self
.__IsToken
("."):
2782 if not self
.__GetNextWord
():
2783 raise Warning("expected template name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2784 TemplateName
= self
.__Token
2786 if not self
.__IsToken
( "]"):
2787 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2789 RuleObj
= self
.__GetRuleFileStatements
()
2790 RuleObj
.Arch
= Arch
.upper()
2791 RuleObj
.ModuleType
= ModuleType
2792 RuleObj
.TemplateName
= TemplateName
2793 if TemplateName
== '' :
2794 self
.Profile
.RuleDict
['RULE' + \
2798 ModuleType
.upper() ] = RuleObj
2800 self
.Profile
.RuleDict
['RULE' + \
2804 ModuleType
.upper() + \
2806 TemplateName
.upper() ] = RuleObj
2807 # self.Profile.RuleList.append(rule)
2810 ## __GetModuleType() method
2812 # Return the module type
2814 # @param self The object pointer
2815 # @retval string module type
2817 def __GetModuleType(self
):
2819 if not self
.__GetNextWord
():
2820 raise Warning("expected Module type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2821 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2822 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2823 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2824 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2825 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2826 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
2827 raise Warning("Unknown Module type At line ", self
.FileName
, self
.CurrentLineNumber
)
2830 ## __GetFileExtension() method
2832 # Return the file extension
2834 # @param self The object pointer
2835 # @retval string file name extension
2837 def __GetFileExtension(self
):
2838 if not self
.__IsToken
("."):
2839 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2842 if self
.__GetNextToken
():
2843 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
2844 if Pattern
.match(self
.__Token
):
2848 raise Warning("Unknown file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2851 raise Warning("expected file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2853 ## __GetRuleFileStatement() method
2857 # @param self The object pointer
2858 # @retval Rule Rule object
2860 def __GetRuleFileStatements(self
):
2862 if not self
.__IsKeyword
("FILE"):
2863 raise Warning("expected FILE At Line ", self
.FileName
, self
.CurrentLineNumber
)
2865 if not self
.__GetNextWord
():
2866 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2868 Type
= self
.__Token
.strip().upper()
2869 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2870 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
2871 raise Warning("Unknown FV type At line ", self
.FileName
, self
.CurrentLineNumber
)
2873 if not self
.__IsToken
("="):
2874 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2876 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2877 if not self
.__GetNextWord
():
2878 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2879 if self
.__Token
== 'PCD':
2880 if not self
.__IsToken
( "("):
2881 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2882 PcdPair
= self
.__GetNextPcdName
()
2883 if not self
.__IsToken
( ")"):
2884 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2885 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2887 NameGuid
= self
.__Token
2890 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2891 if self
.__FileCouldHaveRelocFlag
(Type
):
2892 if self
.__Token
== 'RELOCS_STRIPPED':
2897 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2900 if self
.__GetNextToken
():
2901 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2902 if Pattern
.match(self
.__Token
):
2903 KeyStringList
.append(self
.__Token
)
2904 if self
.__IsToken
(","):
2905 while self
.__GetNextToken
():
2906 if not Pattern
.match(self
.__Token
):
2907 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2908 KeyStringList
.append(self
.__Token
)
2910 if not self
.__IsToken
(","):
2918 if self
.__IsKeyword
("Fixed", True):
2922 if self
.__IsKeyword
("CheckSum", True):
2926 if self
.__GetAlignment
():
2927 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2928 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2929 AlignValue
= self
.__Token
2931 if self
.__IsToken
("{"):
2932 # Complex file rule expected
2933 Rule
= RuleComplexFile
.RuleComplexFile()
2934 Rule
.FvFileType
= Type
2935 Rule
.NameGuid
= NameGuid
2936 Rule
.Alignment
= AlignValue
2937 Rule
.CheckSum
= CheckSum
2939 Rule
.KeyStringList
= KeyStringList
2940 if KeepReloc
!= None:
2941 Rule
.KeepReloc
= KeepReloc
2944 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2945 IsLeaf
= self
.__GetEfiSection
(Rule
)
2946 if not IsEncapsulate
and not IsLeaf
:
2949 if not self
.__IsToken
("}"):
2950 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2954 elif self
.__IsToken
("|"):
2956 Ext
= self
.__GetFileExtension
()
2958 Rule
= RuleSimpleFile
.RuleSimpleFile()
2960 Rule
.FvFileType
= Type
2961 Rule
.NameGuid
= NameGuid
2962 Rule
.Alignment
= AlignValue
2963 Rule
.CheckSum
= CheckSum
2965 Rule
.FileExtension
= Ext
2966 Rule
.KeyStringList
= KeyStringList
2967 if KeepReloc
!= None:
2968 Rule
.KeepReloc
= KeepReloc
2973 # Simple file rule expected
2974 if not self
.__GetNextWord
():
2975 raise Warning("expected leaf section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2977 SectionName
= self
.__Token
2979 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2980 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2981 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2984 if self
.__IsKeyword
("Fixed", True):
2987 if self
.__IsKeyword
("CheckSum", True):
2990 if self
.__GetAlignment
():
2991 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2992 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2993 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
2994 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2995 AlignValue
= self
.__Token
2997 if not self
.__GetNextToken
():
2998 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3000 Rule
= RuleSimpleFile
.RuleSimpleFile()
3001 Rule
.SectionType
= SectionName
3002 Rule
.FvFileType
= Type
3003 Rule
.NameGuid
= NameGuid
3004 Rule
.Alignment
= AlignValue
3005 Rule
.CheckSum
= CheckSum
3007 Rule
.FileName
= self
.__Token
3008 Rule
.KeyStringList
= KeyStringList
3009 if KeepReloc
!= None:
3010 Rule
.KeepReloc
= KeepReloc
3013 ## __GetEfiSection() method
3015 # Get section list for Rule
3017 # @param self The object pointer
3018 # @param Obj for whom section is got
3019 # @retval True Successfully find section statement
3020 # @retval False Not able to find section statement
3022 def __GetEfiSection(self
, Obj
):
3024 OldPos
= self
.GetFileBufferPos()
3025 if not self
.__GetNextWord
():
3027 SectionName
= self
.__Token
3029 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3030 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3034 if SectionName
== "FV_IMAGE":
3035 FvImageSectionObj
= FvImageSection
.FvImageSection()
3036 if self
.__IsKeyword
("FV_IMAGE"):
3038 if self
.__IsToken
( "{"):
3040 self
.__GetDefineStatements
(FvObj
)
3041 self
.__GetBlockStatement
(FvObj
)
3042 self
.__GetSetStatements
(FvObj
)
3043 self
.__GetFvAlignment
(FvObj
)
3044 self
.__GetFvAttributes
(FvObj
)
3045 self
.__GetAprioriSection
(FvObj
)
3046 self
.__GetAprioriSection
(FvObj
)
3049 IsInf
= self
.__GetInfStatement
(FvObj
)
3050 IsFile
= self
.__GetFileStatement
(FvObj
)
3051 if not IsInf
and not IsFile
:
3054 if not self
.__IsToken
( "}"):
3055 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3056 FvImageSectionObj
.Fv
= FvObj
3057 FvImageSectionObj
.FvName
= None
3060 if not self
.__IsKeyword
("FV"):
3061 raise Warning("expected 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3062 FvImageSectionObj
.FvFileType
= self
.__Token
3064 if self
.__GetAlignment
():
3065 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3066 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3067 FvImageSectionObj
.Alignment
= self
.__Token
3069 if self
.__IsToken
('|'):
3070 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3071 elif self
.__GetNextToken
():
3072 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3073 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3074 FvImageSectionObj
.FvFileName
= self
.__Token
3078 raise Warning("expected FV file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3080 Obj
.SectionList
.append(FvImageSectionObj
)
3083 EfiSectionObj
= EfiSection
.EfiSection()
3084 EfiSectionObj
.SectionType
= SectionName
3086 if not self
.__GetNextToken
():
3087 raise Warning("expected file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3089 if self
.__Token
== "STRING":
3090 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3091 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3093 if not self
.__IsToken
('='):
3094 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3096 if not self
.__GetNextToken
():
3097 raise Warning("expected Quoted String At Line ", self
.FileName
, self
.CurrentLineNumber
)
3099 if self
.__GetStringData
():
3100 EfiSectionObj
.StringData
= self
.__Token
3102 if self
.__IsKeyword
("BUILD_NUM"):
3103 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3104 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3106 if not self
.__IsToken
("="):
3107 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3108 if not self
.__GetNextToken
():
3109 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3110 EfiSectionObj
.BuildNum
= self
.__Token
3113 EfiSectionObj
.FileType
= self
.__Token
3114 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3116 if self
.__IsKeyword
("Optional"):
3117 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3118 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3119 EfiSectionObj
.Optional
= True
3121 if self
.__IsKeyword
("BUILD_NUM"):
3122 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3123 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3125 if not self
.__IsToken
("="):
3126 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3127 if not self
.__GetNextToken
():
3128 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3129 EfiSectionObj
.BuildNum
= self
.__Token
3131 if self
.__GetAlignment
():
3132 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3133 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3134 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3135 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3136 EfiSectionObj
.Alignment
= self
.__Token
3138 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3139 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3140 if self
.__Token
== 'RELOCS_STRIPPED':
3141 EfiSectionObj
.KeepReloc
= False
3143 EfiSectionObj
.KeepReloc
= True
3144 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3145 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3147 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3150 if self
.__IsToken
('|'):
3151 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3152 elif self
.__GetNextToken
():
3153 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3154 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3156 if self
.__Token
.startswith('PCD'):
3158 self
.__GetNextWord
()
3160 if self
.__Token
== 'PCD':
3161 if not self
.__IsToken
( "("):
3162 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3163 PcdPair
= self
.__GetNextPcdName
()
3164 if not self
.__IsToken
( ")"):
3165 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3166 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3168 EfiSectionObj
.FileName
= self
.__Token
3173 raise Warning("expected section file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3175 Obj
.SectionList
.append(EfiSectionObj
)
3178 ## __RuleSectionCouldBeOptional() method
3180 # Get whether a section could be optional
3182 # @param self The object pointer
3183 # @param SectionType The section type to check
3184 # @retval True section could be optional
3185 # @retval False section never optional
3187 def __RuleSectionCouldBeOptional(self
, SectionType
):
3188 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3193 ## __RuleSectionCouldHaveBuildNum() method
3195 # Get whether a section could have build number information
3197 # @param self The object pointer
3198 # @param SectionType The section type to check
3199 # @retval True section could have build number information
3200 # @retval False section never have build number information
3202 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3203 if SectionType
in ("VERSION"):
3208 ## __RuleSectionCouldHaveString() method
3210 # Get whether a section could have string
3212 # @param self The object pointer
3213 # @param SectionType The section type to check
3214 # @retval True section could have string
3215 # @retval False section never have string
3217 def __RuleSectionCouldHaveString(self
, SectionType
):
3218 if SectionType
in ("UI", "VERSION"):
3223 ## __CheckRuleSectionFileType() method
3225 # Get whether a section matches a file type
3227 # @param self The object pointer
3228 # @param SectionType The section type to check
3229 # @param FileType The file type to check
3231 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3232 if SectionType
== "COMPAT16":
3233 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3234 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3235 elif SectionType
== "PE32":
3236 if FileType
not in ("PE32", "SEC_PE32"):
3237 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3238 elif SectionType
== "PIC":
3239 if FileType
not in ("PIC", "PIC"):
3240 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3241 elif SectionType
== "TE":
3242 if FileType
not in ("TE", "SEC_TE"):
3243 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3244 elif SectionType
== "RAW":
3245 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3246 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3247 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3248 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3249 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3250 elif SectionType
== "UI":
3251 if FileType
not in ("UI", "SEC_UI"):
3252 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3253 elif SectionType
== "VERSION":
3254 if FileType
not in ("VERSION", "SEC_VERSION"):
3255 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3256 elif SectionType
== "PEI_DEPEX":
3257 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3258 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3259 elif SectionType
== "GUID":
3260 if FileType
not in ("PE32", "SEC_GUID"):
3261 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3263 ## __GetRuleEncapsulationSection() method
3265 # Get encapsulation section for Rule
3267 # @param self The object pointer
3268 # @param Rule for whom section is got
3269 # @retval True Successfully find section statement
3270 # @retval False Not able to find section statement
3272 def __GetRuleEncapsulationSection(self
, Rule
):
3274 if self
.__IsKeyword
( "COMPRESS"):
3276 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3279 if not self
.__IsToken
("{"):
3280 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3282 CompressSectionObj
= CompressSection
.CompressSection()
3284 CompressSectionObj
.CompType
= Type
3285 # Recursive sections...
3287 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3288 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3289 if not IsEncapsulate
and not IsLeaf
:
3292 if not self
.__IsToken
( "}"):
3293 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3294 Rule
.SectionList
.append(CompressSectionObj
)
3298 elif self
.__IsKeyword
( "GUIDED"):
3300 if self
.__GetNextGuid
():
3301 GuidValue
= self
.__Token
3303 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3304 GuidValue
= self
.__Token
3306 AttribDict
= self
.__GetGuidAttrib
()
3308 if not self
.__IsToken
("{"):
3309 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3310 GuidSectionObj
= GuidSection
.GuidSection()
3311 GuidSectionObj
.NameGuid
= GuidValue
3312 GuidSectionObj
.SectionType
= "GUIDED"
3313 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3314 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3318 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3319 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3320 if not IsEncapsulate
and not IsLeaf
:
3323 if not self
.__IsToken
( "}"):
3324 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3325 Rule
.SectionList
.append(GuidSectionObj
)
3331 ## __GetVtf() method
3333 # Get VTF section contents and store its data into VTF list of self.Profile
3335 # @param self The object pointer
3336 # @retval True Successfully find a VTF
3337 # @retval False Not able to find a VTF
3341 if not self
.__GetNextToken
():
3344 S
= self
.__Token
.upper()
3345 if S
.startswith("[") and not S
.startswith("[VTF."):
3346 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3347 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3352 if not self
.__IsToken
("[VTF.", True):
3353 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3354 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3355 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
3356 raise Warning("expected [VTF.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
3358 if not self
.__SkipToToken
("."):
3359 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3361 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3362 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3363 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3365 if not self
.__GetNextWord
():
3366 raise Warning("expected VTF name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3367 Name
= self
.__Token
.upper()
3370 VtfObj
.UiName
= Name
3371 VtfObj
.KeyArch
= Arch
3373 if self
.__IsToken
(","):
3374 if not self
.__GetNextWord
():
3375 raise Warning("expected Arch list At Line ", self
.FileName
, self
.CurrentLineNumber
)
3376 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3377 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3378 VtfObj
.ArchList
= self
.__Token
.upper()
3380 if not self
.__IsToken
( "]"):
3381 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3383 if self
.__IsKeyword
("IA32_RST_BIN"):
3384 if not self
.__IsToken
("="):
3385 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3387 if not self
.__GetNextToken
():
3388 raise Warning("expected Reset file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3390 VtfObj
.ResetBin
= self
.__Token
3392 while self
.__GetComponentStatement
(VtfObj
):
3395 self
.Profile
.VtfList
.append(VtfObj
)
3398 ## __GetComponentStatement() method
3400 # Get components in VTF
3402 # @param self The object pointer
3403 # @param VtfObj for whom component is got
3404 # @retval True Successfully find a component
3405 # @retval False Not able to find a component
3407 def __GetComponentStatement(self
, VtfObj
):
3409 if not self
.__IsKeyword
("COMP_NAME"):
3412 if not self
.__IsToken
("="):
3413 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3415 if not self
.__GetNextWord
():
3416 raise Warning("expected Component Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3418 CompStatementObj
= ComponentStatement
.ComponentStatement()
3419 CompStatementObj
.CompName
= self
.__Token
3421 if not self
.__IsKeyword
("COMP_LOC"):
3422 raise Warning("expected COMP_LOC At Line ", self
.FileName
, self
.CurrentLineNumber
)
3424 if not self
.__IsToken
("="):
3425 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3427 CompStatementObj
.CompLoc
= ""
3428 if self
.__GetNextWord
():
3429 CompStatementObj
.CompLoc
= self
.__Token
3430 if self
.__IsToken
('|'):
3431 if not self
.__GetNextWord
():
3432 raise Warning("Expected Region Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3434 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3435 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3437 CompStatementObj
.FilePos
= self
.__Token
3439 self
.CurrentLineNumber
+= 1
3440 self
.CurrentOffsetWithinLine
= 0
3442 if not self
.__IsKeyword
("COMP_TYPE"):
3443 raise Warning("expected COMP_TYPE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3445 if not self
.__IsToken
("="):
3446 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3448 if not self
.__GetNextToken
():
3449 raise Warning("expected Component type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3450 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3451 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3452 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3453 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3454 CompStatementObj
.CompType
= self
.__Token
3456 if not self
.__IsKeyword
("COMP_VER"):
3457 raise Warning("expected COMP_VER At Line ", self
.FileName
, self
.CurrentLineNumber
)
3459 if not self
.__IsToken
("="):
3460 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3462 if not self
.__GetNextToken
():
3463 raise Warning("expected Component version At Line ", self
.FileName
, self
.CurrentLineNumber
)
3465 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3466 if Pattern
.match(self
.__Token
) == None:
3467 raise Warning("Unknown version format At line ", self
.FileName
, self
.CurrentLineNumber
)
3468 CompStatementObj
.CompVer
= self
.__Token
3470 if not self
.__IsKeyword
("COMP_CS"):
3471 raise Warning("expected COMP_CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3473 if not self
.__IsToken
("="):
3474 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3476 if not self
.__GetNextToken
():
3477 raise Warning("expected Component CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3478 if self
.__Token
not in ("1", "0"):
3479 raise Warning("Unknown Component CS At line ", self
.FileName
, self
.CurrentLineNumber
)
3480 CompStatementObj
.CompCs
= self
.__Token
3483 if not self
.__IsKeyword
("COMP_BIN"):
3484 raise Warning("expected COMP_BIN At Line ", self
.FileName
, self
.CurrentLineNumber
)
3486 if not self
.__IsToken
("="):
3487 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3489 if not self
.__GetNextToken
():
3490 raise Warning("expected Component file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3492 CompStatementObj
.CompBin
= self
.__Token
3494 if not self
.__IsKeyword
("COMP_SYM"):
3495 raise Warning("expected COMP_SYM At Line ", self
.FileName
, self
.CurrentLineNumber
)
3497 if not self
.__IsToken
("="):
3498 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3500 if not self
.__GetNextToken
():
3501 raise Warning("expected Component symbol file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3503 CompStatementObj
.CompSym
= self
.__Token
3505 if not self
.__IsKeyword
("COMP_SIZE"):
3506 raise Warning("expected COMP_SIZE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3508 if not self
.__IsToken
("="):
3509 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3511 if self
.__IsToken
("-"):
3512 CompStatementObj
.CompSize
= self
.__Token
3513 elif self
.__GetNextDecimalNumber
():
3514 CompStatementObj
.CompSize
= self
.__Token
3515 elif self
.__GetNextHexNumber
():
3516 CompStatementObj
.CompSize
= self
.__Token
3518 raise Warning("Unknown size At line ", self
.FileName
, self
.CurrentLineNumber
)
3520 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3523 ## __GetFvInFd() method
3525 # Get FV list contained in FD
3527 # @param self The object pointer
3528 # @param FdName FD name
3529 # @retval FvList list of FV in FD
3531 def __GetFvInFd (self
, FdName
):
3534 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3535 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3536 for elementRegion
in FdObj
.RegionList
:
3537 if elementRegion
.RegionType
== 'FV':
3538 for elementRegionData
in elementRegion
.RegionDataList
:
3539 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3540 FvList
.append(elementRegionData
.upper())
3543 ## __GetReferencedFdFvTuple() method
3545 # Get FD and FV list referenced by a FFS file
3547 # @param self The object pointer
3548 # @param FfsFile contains sections to be searched
3549 # @param RefFdList referenced FD by section
3550 # @param RefFvList referenced FV by section
3552 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3554 for FfsObj
in FvObj
.FfsList
:
3555 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3556 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3557 RefFvList
.append(FfsObj
.FvName
.upper())
3558 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3559 RefFdList
.append(FfsObj
.FdName
.upper())
3561 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3563 ## __GetReferencedFdFvTupleFromSection() method
3565 # Get FD and FV list referenced by a FFS section
3567 # @param self The object pointer
3568 # @param FfsFile contains sections to be searched
3569 # @param FdList referenced FD by section
3570 # @param FvList referenced FV by section
3572 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3575 SectionStack
.extend(FfsFile
.SectionList
)
3576 while SectionStack
!= []:
3577 SectionObj
= SectionStack
.pop()
3578 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3579 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
3580 FvList
.append(SectionObj
.FvName
.upper())
3581 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3582 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3583 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3585 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3586 SectionStack
.extend(SectionObj
.SectionList
)
3588 ## CycleReferenceCheck() method
3590 # Check whether cycle reference exists in FDF
3592 # @param self The object pointer
3593 # @retval True cycle reference exists
3594 # @retval False Not exists cycle reference
3596 def CycleReferenceCheck(self
):
3598 CycleRefExists
= False
3601 for FvName
in self
.Profile
.FvDict
.keys():
3602 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3604 RefFvStack
.append(FvName
)
3607 while RefFvStack
!= []:
3608 FvNameFromStack
= RefFvStack
.pop()
3609 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3610 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3616 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3618 for RefFdName
in RefFdList
:
3619 if RefFdName
in FdAnalyzedList
:
3622 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3623 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3624 if FvInFdList
!= []:
3625 LogStr
+= "FD %s contains FV: " % RefFdName
3626 for FvObj
in FvInFdList
:
3629 if FvObj
not in RefFvStack
:
3630 RefFvStack
.append(FvObj
)
3632 if FvName
in RefFvStack
:
3633 CycleRefExists
= True
3634 raise Warning(LogStr
)
3635 FdAnalyzedList
.append(RefFdName
)
3637 for RefFvName
in RefFvList
:
3638 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3639 if RefFvName
not in RefFvStack
:
3640 RefFvStack
.append(RefFvName
)
3642 if FvName
in RefFvStack
:
3643 CycleRefExists
= True
3644 raise Warning(LogStr
)
3650 return CycleRefExists
3652 if __name__
== "__main__":
3655 test_file
= sys
.argv
[1]
3656 except IndexError, v
:
3657 print "Usage: %s filename" % sys
.argv
[0]
3660 parser
= FdfParser(test_file
)
3663 parser
.CycleReferenceCheck()