4 # Copyright (c) 2007, Intel Corporation
6 # All rights reserved. This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21 import CommonDataClass
.FdfClass
23 ##define T_CHAR_SPACE ' '
24 ##define T_CHAR_NULL '\0'
25 ##define T_CHAR_CR '\r'
26 ##define T_CHAR_TAB '\t'
27 ##define T_CHAR_LF '\n'
28 ##define T_CHAR_SLASH '/'
29 ##define T_CHAR_BACKSLASH '\\'
30 ##define T_CHAR_DOUBLE_QUOTE '\"'
31 ##define T_CHAR_SINGLE_QUOTE '\''
32 ##define T_CHAR_STAR '*'
33 ##define T_CHAR_HASH '#'
35 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
36 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
37 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
39 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
42 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
44 # All Macro values when parsing file, not replace existing Macro
47 def GetRealFileLine (File
, Line
):
50 for Profile
in IncludeFileList
:
51 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
52 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
53 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
54 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
56 return (File
, Line
- InsertedLines
)
58 ## The exception class that used to report error messages when parsing FDF
60 # Currently the "ToolName" is set to be "FDF Parser".
62 class Warning (Exception):
65 # @param self The object pointer
66 # @param Str The message to record
67 # @param File The FDF name
68 # @param Line The Line number that error occurs
70 def __init__(self
, Str
, File
= None, Line
= None):
72 FileLineTuple
= GetRealFileLine(File
, Line
)
73 self
.FileName
= FileLineTuple
[0]
74 self
.LineNumber
= FileLineTuple
[1]
75 self
.message
= Str
+ str(self
.LineNumber
)
76 self
.ToolName
= 'FDF Parser'
78 ## The MACRO class that used to record macro value data when parsing include file
84 # @param self The object pointer
85 # @param FileName The file that to be parsed
87 def __init__(self
, FileName
, Line
):
88 self
.FileName
= FileName
89 self
.DefinedAtLine
= Line
91 self
.MacroValue
= None
93 ## The Include file content class that used to record file data when parsing include file
95 # May raise Exception when opening file.
97 class IncludeFileProfile
:
100 # @param self The object pointer
101 # @param FileName The file that to be parsed
103 def __init__(self
, FileName
):
104 self
.FileName
= FileName
105 self
.FileLinesList
= []
107 fsock
= open(FileName
, "rb", 0)
109 self
.FileLinesList
= fsock
.readlines()
114 raise Warning("Error when opening file %s" % FileName
)
116 self
.InsertStartLineNumber
= None
117 self
.InsertAdjust
= 0
119 ## The FDF content class that used to record file data when parsing FDF
121 # May raise Exception when opening file.
126 # @param self The object pointer
127 # @param FileName The file that to be parsed
129 def __init__(self
, FileName
):
130 self
.FileLinesList
= []
132 fsock
= open(FileName
, "rb", 0)
134 self
.FileLinesList
= fsock
.readlines()
139 raise Warning("Error when opening file %s" % FileName
)
144 self
.PcdFileLineDict
= {}
145 self
.InfFileLineList
= []
149 self
.CapsuleList
= []
153 ## The syntax parser for FDF
155 # PreprocessFile method should be called prior to ParseFile
156 # CycleReferenceCheck method can detect cycles in FDF contents
158 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
159 # Get*** procedures mean these procedures will make judgement on current token only.
161 class FdfParser(object):
164 # @param self The object pointer
165 # @param FileName The file that to be parsed
167 def __init__(self
, FileName
):
168 self
.Profile
= FileProfile(FileName
)
169 self
.FileName
= FileName
170 self
.CurrentLineNumber
= 1
171 self
.CurrentOffsetWithinLine
= 0
172 self
.CurrentFdName
= None
173 self
.CurrentFvName
= None
175 self
.__SkippedChars
= ""
177 self
.__WipeOffArea
= []
179 ## __IsWhiteSpace() method
181 # Whether char at current FileBufferPos is whitespace
183 # @param self The object pointer
184 # @param Char The char to test
185 # @retval True The char is a kind of white space
186 # @retval False The char is NOT a kind of white space
188 def __IsWhiteSpace(self
, Char
):
189 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
194 ## __SkipWhiteSpace() method
196 # Skip white spaces from current char, return number of chars skipped
198 # @param self The object pointer
199 # @retval Count The number of chars skipped
201 def __SkipWhiteSpace(self
):
203 while not self
.__EndOfFile
():
205 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
206 self
.__SkippedChars
+= str(self
.__CurrentChar
())
213 ## __EndOfFile() method
215 # Judge current buffer pos is at file end
217 # @param self The object pointer
218 # @retval True Current File buffer position is at file end
219 # @retval False Current File buffer position is NOT at file end
221 def __EndOfFile(self
):
222 NumberOfLines
= len(self
.Profile
.FileLinesList
)
223 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
224 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
226 elif self
.CurrentLineNumber
> NumberOfLines
:
231 ## __EndOfLine() method
233 # Judge current buffer pos is at line end
235 # @param self The object pointer
236 # @retval True Current File buffer position is at line end
237 # @retval False Current File buffer position is NOT at line end
239 def __EndOfLine(self
):
240 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
242 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
243 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
250 # Reset file data buffer to the initial state
252 # @param self The object pointer
255 self
.CurrentLineNumber
= 1
256 self
.CurrentOffsetWithinLine
= 0
258 ## __UndoOneChar() method
260 # Go back one char in the file buffer
262 # @param self The object pointer
263 # @retval True Successfully go back one char
264 # @retval False Not able to go back one char as file beginning reached
266 def __UndoOneChar(self
):
268 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
270 elif self
.CurrentOffsetWithinLine
== 0:
271 self
.CurrentLineNumber
-= 1
272 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
274 self
.CurrentOffsetWithinLine
-= 1
277 ## __GetOneChar() method
279 # Move forward one char in the file buffer
281 # @param self The object pointer
283 def __GetOneChar(self
):
284 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
285 self
.CurrentLineNumber
+= 1
286 self
.CurrentOffsetWithinLine
= 0
288 self
.CurrentOffsetWithinLine
+= 1
290 ## __CurrentChar() method
292 # Get the char pointed to by the file buffer pointer
294 # @param self The object pointer
295 # @retval Char Current char
297 def __CurrentChar(self
):
298 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
300 ## __NextChar() method
302 # Get the one char pass the char pointed to by the file buffer pointer
304 # @param self The object pointer
305 # @retval Char Next char
307 def __NextChar(self
):
308 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
309 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
311 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
313 ## __SetCurrentCharValue() method
315 # Modify the value of current char
317 # @param self The object pointer
318 # @param Value The new value of current char
320 def __SetCurrentCharValue(self
, Value
):
321 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
323 ## __CurrentLine() method
325 # Get the list that contains current line contents
327 # @param self The object pointer
328 # @retval List current line contents
330 def __CurrentLine(self
):
331 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
333 def __StringToList(self
):
334 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
335 self
.Profile
.FileLinesList
[-1].append(' ')
337 def __ReplaceMacros(self
, Str
, File
, Line
):
339 while Str
.find('$(', MacroEnd
) >= 0:
340 MacroStart
= Str
.find('$(', MacroEnd
)
341 if Str
.find(')', MacroStart
) > 0:
342 MacroEnd
= Str
.find(')', MacroStart
)
343 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
345 if Name
in InputMacroDict
:
346 Value
= InputMacroDict
[Name
]
349 for Profile
in AllMacroList
:
350 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
351 Value
= Profile
.MacroValue
354 Str
= Str
.replace('$(' + Name
+ ')', Value
)
355 MacroEnd
= MacroStart
+ len(Value
)
358 raise Warning("Macro not complete At Line ", self
.FileName
, self
.CurrentLineNumber
)
361 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
362 if StartPos
[0] == EndPos
[0]:
364 while Offset
<= EndPos
[1]:
365 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
370 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
371 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
375 while Line
< EndPos
[0]:
377 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
378 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
383 while Offset
<= EndPos
[1]:
384 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
388 ## PreprocessFile() method
390 # Preprocess file contents, replace comments with spaces.
391 # In the end, rewind the file buffer pointer to the beginning
392 # BUGBUG: No !include statement processing contained in this procedure
393 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
395 # @param self The object pointer
397 def PreprocessFile(self
):
401 DoubleSlashComment
= False
403 # HashComment in quoted string " " is ignored.
406 while not self
.__EndOfFile
():
408 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
409 InString
= not InString
410 # meet new line, then no longer in a comment for // and '#'
411 if self
.__CurrentChar
() == T_CHAR_LF
:
412 self
.CurrentLineNumber
+= 1
413 self
.CurrentOffsetWithinLine
= 0
414 if InComment
and DoubleSlashComment
:
416 DoubleSlashComment
= False
417 if InComment
and HashComment
:
420 # check for */ comment end
421 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
422 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
424 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
427 # set comments to spaces
429 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
431 # check for // comment
432 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
434 DoubleSlashComment
= True
435 # check for '#' comment
436 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
439 # check for /* comment start
440 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
441 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
443 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
449 # restore from ListOfList to ListOfString
450 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
453 ## PreprocessIncludeFile() method
455 # Preprocess file contents, replace !include statements with file contents.
456 # In the end, rewind the file buffer pointer to the beginning
458 # @param self The object pointer
460 def PreprocessIncludeFile(self
):
462 while self
.__GetNextToken
():
464 if self
.__Token
== '!include':
465 IncludeLine
= self
.CurrentLineNumber
466 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
467 if not self
.__GetNextToken
():
468 raise Warning("expected include file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
469 IncFileName
= self
.__Token
470 if not os
.path
.isabs(IncFileName
):
471 if IncFileName
.startswith('$(WORKSPACE)'):
472 Str
= IncFileName
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
473 if os
.path
.exists(Str
):
474 if not os
.path
.isabs(Str
):
475 Str
= os
.path
.abspath(Str
)
478 # file is in the same dir with FDF file
479 FullFdf
= self
.FileName
480 if not os
.path
.isabs(self
.FileName
):
481 FullFdf
= os
.path
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
483 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
485 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
486 raise Warning("Include file not exists At Line ", self
.FileName
, self
.CurrentLineNumber
)
488 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
490 CurrentLine
= self
.CurrentLineNumber
491 CurrentOffset
= self
.CurrentOffsetWithinLine
492 # list index of the insertion, note that line number is 'CurrentLine + 1'
493 InsertAtLine
= CurrentLine
494 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
495 # deal with remaining portions after "!include filename", if exists.
496 if self
.__GetNextToken
():
497 if self
.CurrentLineNumber
== CurrentLine
:
498 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
499 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
500 IncFileProfile
.InsertAdjust
+= 1
501 self
.CurrentLineNumber
+= 1
502 self
.CurrentOffsetWithinLine
= 0
504 for Line
in IncFileProfile
.FileLinesList
:
505 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
506 self
.CurrentLineNumber
+= 1
509 IncludeFileList
.append(IncFileProfile
)
511 # comment out the processed include file statement
512 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
513 TempList
.insert(IncludeOffset
, '#')
514 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
518 ## PreprocessIncludeFile() method
520 # Preprocess file contents, replace !include statements with file contents.
521 # In the end, rewind the file buffer pointer to the beginning
523 # @param self The object pointer
525 def PreprocessConditionalStatement(self
):
526 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
528 while self
.__GetNextToken
():
529 if self
.__Token
== 'DEFINE':
530 DefineLine
= self
.CurrentLineNumber
- 1
531 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
532 if not self
.__GetNextToken
():
533 raise Warning("expected Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
535 if not self
.__IsToken
( "="):
536 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
538 if not self
.__GetNextToken
():
539 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
541 if self
.__GetStringData
():
544 if not Macro
in InputMacroDict
:
545 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
546 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
547 MacProfile
.MacroName
= Macro
548 MacProfile
.MacroValue
= Value
549 AllMacroList
.append(MacProfile
)
550 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
552 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
553 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
554 IfList
.append([IfStartPos
, None, None])
555 CondLabel
= self
.__Token
557 if not self
.__GetNextToken
():
558 raise Warning("expected Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
559 MacroName
= self
.__Token
561 if MacroName
.startswith('!'):
563 MacroName
= MacroName
[1:]
565 NotDefineFlag
= False
566 if CondLabel
== '!ifndef':
568 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
570 raise Warning("'NOT' operation not allowed for Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
572 if CondLabel
== '!if':
574 if not self
.__GetNextOp
():
575 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
577 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
579 if not self
.__GetNextToken
():
580 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
581 if self
.__GetStringData
():
583 MacroValue
= self
.__Token
584 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
586 ConditionSatisfied
= not ConditionSatisfied
587 BranchDetermined
= ConditionSatisfied
589 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
590 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
592 ConditionSatisfied
= not ConditionSatisfied
593 BranchDetermined
= ConditionSatisfied
594 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
595 if ConditionSatisfied
:
596 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
599 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
601 ConditionSatisfied
= not ConditionSatisfied
602 BranchDetermined
= ConditionSatisfied
603 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
604 if ConditionSatisfied
:
605 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
607 elif self
.__Token
in ('!elseif', '!else'):
608 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
610 raise Warning("Missing !if statement At Line ", self
.FileName
, self
.CurrentLineNumber
)
612 IfList
[-1] = [ElseStartPos
, False, True]
613 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
615 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
616 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
617 if self
.__Token
== '!elseif':
618 if not self
.__GetNextToken
():
619 raise Warning("expected Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
620 MacroName
= self
.__Token
622 if MacroName
.startswith('!'):
624 MacroName
= MacroName
[1:]
626 if not self
.__GetNextOp
():
627 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
629 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
631 if not self
.__GetNextToken
():
632 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
633 if self
.__GetStringData
():
635 MacroValue
= self
.__Token
636 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
638 ConditionSatisfied
= not ConditionSatisfied
641 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
642 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
644 ConditionSatisfied
= not ConditionSatisfied
646 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
650 IfList
[-1][1] = False
653 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
656 elif self
.__Token
== '!endif':
658 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
660 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
666 raise Warning("Missing !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
669 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
671 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
672 if Name
in InputMacroDict
:
673 MacroValue
= InputMacroDict
[Name
]
675 if Value
== 'Bool' and MacroValue
== None or MacroValue
.upper() == 'FALSE':
679 if Value
!= MacroValue
:
684 if Value
== MacroValue
:
689 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
!= None and MacroValue
.isdigit())):
690 InputVal
= long(Value
, 0)
691 MacroVal
= long(MacroValue
, 0)
693 if MacroVal
> InputVal
:
698 if MacroVal
>= InputVal
:
703 if MacroVal
< InputVal
:
708 if MacroVal
<= InputVal
:
715 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
717 for Profile
in AllMacroList
:
718 if Profile
.FileName
== FileLineTuple
[0] and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
720 if Value
== 'Bool' and Profile
.MacroValue
== None or Profile
.MacroValue
.upper() == 'FALSE':
724 if Value
!= Profile
.MacroValue
:
729 if Value
== Profile
.MacroValue
:
734 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
!= None and Profile
.MacroValue
.isdigit())):
735 InputVal
= long(Value
, 0)
736 MacroVal
= long(Profile
.MacroValue
, 0)
738 if MacroVal
> InputVal
:
743 if MacroVal
>= InputVal
:
748 if MacroVal
< InputVal
:
753 if MacroVal
<= InputVal
:
760 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
764 ## __IsToken() method
766 # Check whether input string is found from current char position along
767 # If found, the string value is put into self.__Token
769 # @param self The object pointer
770 # @param String The string to search
771 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
772 # @retval True Successfully find string, file buffer pointer moved forward
773 # @retval False Not able to find string, file buffer pointer not changed
775 def __IsToken(self
, String
, IgnoreCase
= False):
776 self
.__SkipWhiteSpace
()
778 # Only consider the same line, no multi-line token allowed
779 StartPos
= self
.CurrentOffsetWithinLine
782 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
784 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
786 self
.CurrentOffsetWithinLine
+= len(String
)
787 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
791 ## __IsKeyword() method
793 # Check whether input keyword is found from current char position along, whole word only!
794 # If found, the string value is put into self.__Token
796 # @param self The object pointer
797 # @param Keyword The string to search
798 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
799 # @retval True Successfully find string, file buffer pointer moved forward
800 # @retval False Not able to find string, file buffer pointer not changed
802 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
803 self
.__SkipWhiteSpace
()
805 # Only consider the same line, no multi-line token allowed
806 StartPos
= self
.CurrentOffsetWithinLine
809 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
811 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
813 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
814 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
816 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
817 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
821 ## __GetNextWord() method
823 # Get next C name from file lines
824 # If found, the string value is put into self.__Token
826 # @param self The object pointer
827 # @retval True Successfully find a C name string, file buffer pointer moved forward
828 # @retval False Not able to find a C name string, file buffer pointer not changed
830 def __GetNextWord(self
):
831 self
.__SkipWhiteSpace
()
832 if self
.__EndOfFile
():
835 TempChar
= self
.__CurrentChar
()
836 StartPos
= self
.CurrentOffsetWithinLine
837 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
839 while not self
.__EndOfLine
():
840 TempChar
= self
.__CurrentChar
()
841 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
842 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
848 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
853 ## __GetNextToken() method
855 # Get next token unit before a seperator
856 # If found, the string value is put into self.__Token
858 # @param self The object pointer
859 # @retval True Successfully find a token unit, file buffer pointer moved forward
860 # @retval False Not able to find a token unit, file buffer pointer not changed
862 def __GetNextToken(self
):
863 # Skip leading spaces, if exist.
864 self
.__SkipWhiteSpace
()
865 if self
.__EndOfFile
():
867 # Record the token start position, the position of the first non-space char.
868 StartPos
= self
.CurrentOffsetWithinLine
869 StartLine
= self
.CurrentLineNumber
870 while not self
.__EndOfLine
():
871 TempChar
= self
.__CurrentChar
()
872 # Try to find the end char that is not a space and not in seperator tuple.
873 # That is, when we got a space or any char in the tuple, we got the end of token.
874 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
876 # if we happen to meet a seperator as the first char, we must proceed to get it.
877 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
878 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
886 EndPos
= self
.CurrentOffsetWithinLine
887 if self
.CurrentLineNumber
!= StartLine
:
888 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
889 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
890 if StartPos
!= self
.CurrentOffsetWithinLine
:
895 def __GetNextOp(self
):
896 # Skip leading spaces, if exist.
897 self
.__SkipWhiteSpace
()
898 if self
.__EndOfFile
():
900 # Record the token start position, the position of the first non-space char.
901 StartPos
= self
.CurrentOffsetWithinLine
902 while not self
.__EndOfLine
():
903 TempChar
= self
.__CurrentChar
()
904 # Try to find the end char that is not a space
905 if not str(TempChar
).isspace():
912 if StartPos
!= self
.CurrentOffsetWithinLine
:
913 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
917 ## __GetNextGuid() method
919 # Get next token unit before a seperator
920 # If found, the GUID string is put into self.__Token
922 # @param self The object pointer
923 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
924 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
926 def __GetNextGuid(self
):
928 if not self
.__GetNextToken
():
930 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}')
931 if p
.match(self
.__Token
) != None:
937 ## __UndoToken() method
939 # Go back one token unit in file buffer
941 # @param self The object pointer
943 def __UndoToken(self
):
945 while self
.__CurrentChar
().isspace():
946 if not self
.__UndoOneChar
():
951 StartPos
= self
.CurrentOffsetWithinLine
952 CurrentLine
= self
.CurrentLineNumber
953 while CurrentLine
== self
.CurrentLineNumber
:
955 TempChar
= self
.__CurrentChar
()
956 # Try to find the end char that is not a space and not in seperator tuple.
957 # That is, when we got a space or any char in the tuple, we got the end of token.
958 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
959 if not self
.__UndoOneChar
():
961 # if we happen to meet a seperator as the first char, we must proceed to get it.
962 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
963 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
970 ## __HexDigit() method
972 # Whether char input is a Hex data bit
974 # @param self The object pointer
975 # @param TempChar The char to test
976 # @retval True The char is a Hex data bit
977 # @retval False The char is NOT a Hex data bit
979 def __HexDigit(self
, TempChar
):
980 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
981 or (TempChar
>= '0' and TempChar
<= '9'):
986 def __IsHex(self
, HexStr
):
987 if not HexStr
.upper().startswith("0X"):
989 if len(self
.__Token
) <= 2:
991 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
992 if len(charList
) == 0:
996 ## __GetNextHexNumber() method
998 # Get next HEX data before a seperator
999 # If found, the HEX data is put into self.__Token
1001 # @param self The object pointer
1002 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1003 # @retval False Not able to find a HEX data, file buffer pointer not changed
1005 def __GetNextHexNumber(self
):
1006 if not self
.__GetNextToken
():
1008 if self
.__IsHex
(self
.__Token
):
1014 ## __GetNextDecimalNumber() method
1016 # Get next decimal data before a seperator
1017 # If found, the decimal data is put into self.__Token
1019 # @param self The object pointer
1020 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1021 # @retval False Not able to find a decimal data, file buffer pointer not changed
1023 def __GetNextDecimalNumber(self
):
1024 if not self
.__GetNextToken
():
1026 if self
.__Token
.isdigit():
1032 ## __GetNextPcdName() method
1034 # Get next PCD token space C name and PCD C name pair before a seperator
1035 # If found, the decimal data is put into self.__Token
1037 # @param self The object pointer
1038 # @retval Tuple PCD C name and PCD token space C name pair
1040 def __GetNextPcdName(self
):
1041 if not self
.__GetNextWord
():
1042 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1043 pcdTokenSpaceCName
= self
.__Token
1045 if not self
.__IsToken
( "."):
1046 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1048 if not self
.__GetNextWord
():
1049 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1050 pcdCName
= self
.__Token
1052 return (pcdCName
, pcdTokenSpaceCName
)
1054 ## __GetStringData() method
1056 # Get string contents quoted in ""
1057 # If found, the decimal data is put into self.__Token
1059 # @param self The object pointer
1060 # @retval True Successfully find a string data, file buffer pointer moved forward
1061 # @retval False Not able to find a string data, file buffer pointer not changed
1063 def __GetStringData(self
):
1064 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1066 self
.__SkipToToken
("\"")
1067 currentLineNumber
= self
.CurrentLineNumber
1069 if not self
.__SkipToToken
("\""):
1070 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1071 if currentLineNumber
!= self
.CurrentLineNumber
:
1072 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1073 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1076 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1078 self
.__SkipToToken
("\'")
1079 currentLineNumber
= self
.CurrentLineNumber
1081 if not self
.__SkipToToken
("\'"):
1082 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1083 if currentLineNumber
!= self
.CurrentLineNumber
:
1084 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1085 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1091 ## __SkipToToken() method
1093 # Search forward in file buffer for the string
1094 # The skipped chars are put into self.__SkippedChars
1096 # @param self The object pointer
1097 # @param String The string to search
1098 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1099 # @retval True Successfully find the string, file buffer pointer moved forward
1100 # @retval False Not able to find the string, file buffer pointer not changed
1102 def __SkipToToken(self
, String
, IgnoreCase
= False):
1103 StartPos
= self
.GetFileBufferPos()
1105 self
.__SkippedChars
= ""
1106 while not self
.__EndOfFile
():
1109 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1111 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1113 self
.CurrentOffsetWithinLine
+= len(String
)
1114 self
.__SkippedChars
+= String
1116 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1119 self
.SetFileBufferPos( StartPos
)
1120 self
.__SkippedChars
= ""
1123 ## GetFileBufferPos() method
1125 # Return the tuple of current line and offset within the line
1127 # @param self The object pointer
1128 # @retval Tuple Line number and offset pair
1130 def GetFileBufferPos(self
):
1131 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1133 ## SetFileBufferPos() method
1135 # Restore the file buffer position
1137 # @param self The object pointer
1138 # @param Pos The new file buffer position
1140 def SetFileBufferPos(self
, Pos
):
1141 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1143 ## ParseFile() method
1145 # Parse the file profile buffer to extract fd, fv ... information
1146 # Exception will be raised if syntax error found
1148 # @param self The object pointer
1150 def ParseFile(self
):
1153 self
.__StringToList
()
1154 self
.PreprocessFile()
1155 self
.PreprocessIncludeFile()
1156 self
.__StringToList
()
1157 self
.PreprocessFile()
1158 self
.PreprocessConditionalStatement()
1159 self
.__StringToList
()
1160 for Pos
in self
.__WipeOffArea
:
1161 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1162 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1164 while self
.__GetDefines
():
1168 while Index
< len(self
.Profile
.FileLinesList
):
1169 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1170 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1173 while self
.__GetFd
():
1176 while self
.__GetFv
():
1179 while self
.__GetCapsule
():
1182 # while self.__GetVtf():
1185 # while self.__GetRule():
1191 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1192 X
.message
+= '\nGot Token: \"%s\" from File %s\n' % (self
.__Token
, FileLineTuple
[0]) + \
1193 'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \
1194 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'), FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1197 ## __GetDefines() method
1199 # Get Defines section contents and store its data into AllMacrosList
1201 # @param self The object pointer
1202 # @retval True Successfully find a Defines
1203 # @retval False Not able to find a Defines
1205 def __GetDefines(self
):
1207 if not self
.__GetNextToken
():
1210 S
= self
.__Token
.upper()
1211 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1212 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1213 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1214 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
)
1219 if not self
.__IsToken
("[DEFINES", True):
1220 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1221 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1222 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1223 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1225 if not self
.__IsToken
( "]"):
1226 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1228 while self
.__GetNextWord
():
1229 Macro
= self
.__Token
1231 if not self
.__IsToken
("="):
1232 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1233 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1234 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1235 Value
= self
.__Token
1236 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1237 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1238 MacProfile
.MacroName
= Macro
1239 MacProfile
.MacroValue
= Value
1240 AllMacroList
.append(MacProfile
)
1246 # Get FD section contents and store its data into FD dictionary of self.Profile
1248 # @param self The object pointer
1249 # @retval True Successfully find a FD
1250 # @retval False Not able to find a FD
1254 if not self
.__GetNextToken
():
1257 S
= self
.__Token
.upper()
1258 if S
.startswith("[") and not S
.startswith("[FD."):
1259 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1260 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1261 raise Warning("Unknown section At Line ", self
.FileName
, self
.CurrentLineNumber
)
1266 if not self
.__IsToken
("[FD.", True):
1267 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1268 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1269 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1270 raise Warning("expected [FD.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
1272 FdName
= self
.__GetUiName
()
1273 self
.CurrentFdName
= FdName
.upper()
1275 if not self
.__IsToken
( "]"):
1276 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1278 FdObj
= CommonDataClass
.FdfClass
.FDClassObject()
1279 FdObj
.FdUiName
= self
.CurrentFdName
1280 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1281 Status
= self
.__GetCreateFile
(FdObj
)
1283 raise Warning("FD name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1285 if not self
.__GetTokenStatements
(FdObj
):
1288 self
.__GetDefineStatements
(FdObj
)
1290 self
.__GetSetStatements
(FdObj
)
1292 if not self
.__GetRegionLayout
(FdObj
):
1293 raise Warning("expected region layout At Line ", self
.FileName
, self
.CurrentLineNumber
)
1295 while self
.__GetRegionLayout
(FdObj
):
1299 ## __GetUiName() method
1301 # Return the UI name of a section
1303 # @param self The object pointer
1304 # @retval FdName UI name
1306 def __GetUiName(self
):
1308 if self
.__GetNextWord
():
1309 FdName
= self
.__Token
1313 ## __GetCreateFile() method
1315 # Return the output file name of object
1317 # @param self The object pointer
1318 # @param Obj object whose data will be stored in file
1319 # @retval FdName UI name
1321 def __GetCreateFile(self
, Obj
):
1323 if self
.__IsKeyword
( "CREATE_FILE"):
1324 if not self
.__IsToken
( "="):
1325 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1327 if not self
.__GetNextToken
():
1328 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1330 FileName
= self
.__Token
1331 Obj
.CreateFileName
= FileName
1335 ## __GetTokenStatements() method
1337 # Get token statements
1339 # @param self The object pointer
1340 # @param Obj for whom token statement is got
1341 # @retval True Successfully find a token statement
1342 # @retval False Not able to find a token statement
1344 def __GetTokenStatements(self
, Obj
):
1345 if not self
.__IsKeyword
( "BaseAddress"):
1346 raise Warning("BaseAddress missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1348 if not self
.__IsToken
( "="):
1349 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1351 if not self
.__GetNextHexNumber
():
1352 raise Warning("expected Hex base address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1354 Obj
.BaseAddress
= self
.__Token
1356 if self
.__IsToken
( "|"):
1357 pcdPair
= self
.__GetNextPcdName
()
1358 Obj
.BaseAddressPcd
= pcdPair
1359 self
.Profile
.PcdDict
[pcdPair
] = long(Obj
.BaseAddress
, 0)
1360 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1361 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1363 if not self
.__IsKeyword
( "Size"):
1364 raise Warning("Size missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1366 if not self
.__IsToken
( "="):
1367 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1369 if not self
.__GetNextHexNumber
():
1370 raise Warning("expected Hex size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1373 Obj
.Size
= long(self
.__Token
, 0)
1375 if self
.__IsToken
( "|"):
1376 pcdPair
= self
.__GetNextPcdName
()
1377 Obj
.SizePcd
= pcdPair
1378 self
.Profile
.PcdDict
[pcdPair
] = Obj
.Size
1379 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1380 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1382 if not self
.__IsKeyword
( "ErasePolarity"):
1383 raise Warning("ErasePolarity missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1385 if not self
.__IsToken
( "="):
1386 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1388 if not self
.__GetNextToken
():
1389 raise Warning("expected Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1391 if self
.__Token
!= "1" and self
.__Token
!= "0":
1392 raise Warning("expected 1 or 0 Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1394 Obj
.ErasePolarity
= self
.__Token
1396 Status
= self
.__GetBlockStatements
(Obj
)
1399 ## __GetAddressStatements() method
1401 # Get address statements
1403 # @param self The object pointer
1404 # @param Obj for whom address statement is got
1405 # @retval True Successfully find
1406 # @retval False Not able to find
1408 def __GetAddressStatements(self
, Obj
):
1410 if self
.__IsKeyword
("BsBaseAddress"):
1411 if not self
.__IsToken
( "="):
1412 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1414 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1415 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1417 BsAddress
= long(self
.__Token
, 0)
1418 Obj
.BsBaseAddress
= BsAddress
1420 if self
.__IsKeyword
("RtBaseAddress"):
1421 if not self
.__IsToken
( "="):
1422 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1424 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1425 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1427 RtAddress
= long(self
.__Token
, 0)
1428 Obj
.RtBaseAddress
= RtAddress
1430 ## __GetBlockStatements() method
1432 # Get block statements
1434 # @param self The object pointer
1435 # @param Obj for whom block statement is got
1436 # @retval True Successfully find
1437 # @retval False Not able to find
1439 def __GetBlockStatements(self
, Obj
):
1441 if not self
.__GetBlockStatement
(Obj
):
1442 #set default block size is 1
1443 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1446 while self
.__GetBlockStatement
(Obj
):
1449 for Item
in Obj
.BlockSizeList
:
1450 if Item
[0] == None or Item
[1] == None:
1451 raise Warning("expected block statement for Fd Section", self
.FileName
, self
.CurrentLineNumber
)
1455 ## __GetBlockStatement() method
1457 # Get block statement
1459 # @param self The object pointer
1460 # @param Obj for whom block statement is got
1461 # @retval True Successfully find
1462 # @retval False Not able to find
1464 def __GetBlockStatement(self
, Obj
):
1465 if not self
.__IsKeyword
( "BlockSize"):
1468 if not self
.__IsToken
( "="):
1469 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1471 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1472 raise Warning("expected Hex block size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1474 BlockSize
= long(self
.__Token
, 0)
1476 if self
.__IsToken
( "|"):
1477 PcdPair
= self
.__GetNextPcdName
()
1478 BlockSizePcd
= PcdPair
1479 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1480 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1481 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1484 if self
.__IsKeyword
( "NumBlocks"):
1485 if not self
.__IsToken
( "="):
1486 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1488 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1489 raise Warning("expected block numbers At Line ", self
.FileName
, self
.CurrentLineNumber
)
1491 BlockNumber
= long(self
.__Token
, 0)
1493 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1496 ## __GetDefineStatements() method
1498 # Get define statements
1500 # @param self The object pointer
1501 # @param Obj for whom define statement is got
1502 # @retval True Successfully find
1503 # @retval False Not able to find
1505 def __GetDefineStatements(self
, Obj
):
1506 while self
.__GetDefineStatement
( Obj
):
1509 ## __GetDefineStatement() method
1511 # Get define statement
1513 # @param self The object pointer
1514 # @param Obj for whom define statement is got
1515 # @retval True Successfully find
1516 # @retval False Not able to find
1518 def __GetDefineStatement(self
, Obj
):
1519 if self
.__IsKeyword
("DEFINE"):
1520 self
.__GetNextToken
()
1521 Macro
= self
.__Token
1522 if not self
.__IsToken
( "="):
1523 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1525 if not self
.__GetNextToken
():
1526 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1528 Value
= self
.__Token
1529 Macro
= '$(' + Macro
+ ')'
1530 Obj
.DefineVarDict
[Macro
] = Value
1535 ## __GetSetStatements() method
1537 # Get set statements
1539 # @param self The object pointer
1540 # @param Obj for whom set statement is got
1541 # @retval True Successfully find
1542 # @retval False Not able to find
1544 def __GetSetStatements(self
, Obj
):
1545 while self
.__GetSetStatement
(Obj
):
1548 ## __GetSetStatement() method
1552 # @param self The object pointer
1553 # @param Obj for whom set statement is got
1554 # @retval True Successfully find
1555 # @retval False Not able to find
1557 def __GetSetStatement(self
, Obj
):
1558 if self
.__IsKeyword
("SET"):
1559 PcdPair
= self
.__GetNextPcdName
()
1561 if not self
.__IsToken
( "="):
1562 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1564 if not self
.__GetNextToken
():
1565 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1567 Value
= self
.__Token
1568 if Value
.startswith("{"):
1569 # deal with value with {}
1570 if not self
.__SkipToToken
( "}"):
1571 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1572 Value
+= self
.__SkippedChars
1574 Obj
.SetVarDict
[PcdPair
] = Value
1575 self
.Profile
.PcdDict
[PcdPair
] = Value
1576 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1577 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1582 ## __GetRegionLayout() method
1584 # Get region layout for FD
1586 # @param self The object pointer
1587 # @param Fd for whom region is got
1588 # @retval True Successfully find
1589 # @retval False Not able to find
1591 def __GetRegionLayout(self
, Fd
):
1592 if not self
.__GetNextHexNumber
():
1595 RegionObj
= CommonDataClass
.FdfClass
.RegionClassObject()
1596 RegionObj
.Offset
= long(self
.__Token
, 0)
1597 Fd
.RegionList
.append(RegionObj
)
1599 if not self
.__IsToken
( "|"):
1600 raise Warning("expected '|' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1602 if not self
.__GetNextHexNumber
():
1603 raise Warning("expected Region Size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1604 RegionObj
.Size
= long(self
.__Token
, 0)
1606 if not self
.__GetNextWord
():
1609 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1611 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1612 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0)
1613 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1614 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1615 if self
.__IsToken
( "|"):
1616 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1617 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = RegionObj
.Size
1618 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1619 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1621 if not self
.__GetNextWord
():
1624 if self
.__Token
== "SET":
1626 self
.__GetSetStatements
( RegionObj
)
1627 if not self
.__GetNextWord
():
1630 elif self
.__Token
== "FV":
1632 self
.__GetRegionFvType
( RegionObj
)
1634 elif self
.__Token
== "CAPSULE":
1636 self
.__GetRegionCapType
( RegionObj
)
1638 elif self
.__Token
== "FILE":
1640 self
.__GetRegionFileType
( RegionObj
)
1644 self
.__GetRegionDataType
( RegionObj
)
1648 ## __GetRegionFvType() method
1650 # Get region fv data for region
1652 # @param self The object pointer
1653 # @param RegionObj for whom region data is got
1655 def __GetRegionFvType(self
, RegionObj
):
1657 if not self
.__IsKeyword
( "FV"):
1658 raise Warning("expected Keyword 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1660 if not self
.__IsToken
( "="):
1661 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1663 if not self
.__GetNextToken
():
1664 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1666 RegionObj
.RegionType
= "FV"
1667 RegionObj
.RegionDataList
.append(self
.__Token
)
1669 while self
.__IsKeyword
( "FV"):
1671 if not self
.__IsToken
( "="):
1672 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1674 if not self
.__GetNextToken
():
1675 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1677 RegionObj
.RegionDataList
.append(self
.__Token
)
1679 ## __GetRegionCapType() method
1681 # Get region capsule data for region
1683 # @param self The object pointer
1684 # @param RegionObj for whom region data is got
1686 def __GetRegionCapType(self
, RegionObj
):
1688 if not self
.__IsKeyword
("CAPSULE"):
1689 raise Warning("expected Keyword 'CAPSULE' at line", self
.FileName
, self
.CurrentLineNumber
)
1691 if not self
.__IsToken
("="):
1692 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1694 if not self
.__GetNextToken
():
1695 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1697 RegionObj
.RegionType
= "CAPSULE"
1698 RegionObj
.RegionDataList
.append(self
.__Token
)
1700 while self
.__IsKeyword
("CAPSULE"):
1702 if not self
.__IsToken
("="):
1703 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1705 if not self
.__GetNextToken
():
1706 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1708 RegionObj
.RegionDataList
.append(self
.__Token
)
1710 ## __GetRegionFileType() method
1712 # Get region file data for region
1714 # @param self The object pointer
1715 # @param RegionObj for whom region data is got
1717 def __GetRegionFileType(self
, RegionObj
):
1719 if not self
.__IsKeyword
( "FILE"):
1720 raise Warning("expected Keyword 'FILE' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1722 if not self
.__IsToken
( "="):
1723 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1725 if not self
.__GetNextToken
():
1726 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1728 RegionObj
.RegionType
= "FILE"
1729 RegionObj
.RegionDataList
.append( self
.__Token
)
1731 while self
.__IsKeyword
( "FILE"):
1733 if not self
.__IsToken
( "="):
1734 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1736 if not self
.__GetNextToken
():
1737 raise Warning("expected FILE name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1739 RegionObj
.RegionDataList
.append(self
.__Token
)
1741 ## __GetRegionDataType() method
1743 # Get region array data for region
1745 # @param self The object pointer
1746 # @param RegionObj for whom region data is got
1748 def __GetRegionDataType(self
, RegionObj
):
1750 if not self
.__IsKeyword
( "DATA"):
1751 raise Warning("expected Region Data type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1753 if not self
.__IsToken
( "="):
1754 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1756 if not self
.__IsToken
( "{"):
1757 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1759 if not self
.__GetNextHexNumber
():
1760 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1762 if len(self
.__Token
) > 4:
1763 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1765 DataString
= self
.__Token
1768 while self
.__IsToken
(","):
1769 if not self
.__GetNextHexNumber
():
1770 raise Warning("Invalid Hex number At Line ", self
.FileName
, self
.CurrentLineNumber
)
1771 if len(self
.__Token
) > 4:
1772 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1773 DataString
+= self
.__Token
1776 if not self
.__IsToken
( "}"):
1777 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1779 DataString
= DataString
.rstrip(",")
1780 RegionObj
.RegionType
= "DATA"
1781 RegionObj
.RegionDataList
.append( DataString
)
1783 while self
.__IsKeyword
( "DATA"):
1785 if not self
.__IsToken
( "="):
1786 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1788 if not self
.__IsToken
( "{"):
1789 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1791 if not self
.__GetNextHexNumber
():
1792 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1794 if len(self
.__Token
) > 4:
1795 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1797 DataString
= self
.__Token
1800 while self
.__IsToken
(","):
1801 self
.__GetNextHexNumber
()
1802 if len(self
.__Token
) > 4:
1803 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1804 DataString
+= self
.__Token
1807 if not self
.__IsToken
( "}"):
1808 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1810 DataString
= DataString
.rstrip(",")
1811 RegionObj
.RegionDataList
.append( DataString
)
1815 # Get FV section contents and store its data into FV dictionary of self.Profile
1817 # @param self The object pointer
1818 # @retval True Successfully find a FV
1819 # @retval False Not able to find a FV
1822 if not self
.__GetNextToken
():
1825 S
= self
.__Token
.upper()
1826 if S
.startswith("[") and not S
.startswith("[FV."):
1827 if not S
.startswith("[CAPSULE.") \
1828 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1829 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
)
1834 if not self
.__IsToken
("[FV.", True):
1835 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1836 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1837 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1838 raise Warning("Unknown Keyword At Line ", self
.FileName
, self
.CurrentLineNumber
)
1840 FvName
= self
.__GetUiName
()
1841 self
.CurrentFvName
= FvName
.upper()
1843 if not self
.__IsToken
( "]"):
1844 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1846 FvObj
= CommonDataClass
.FdfClass
.FvClassObject()
1847 FvObj
.UiFvName
= self
.CurrentFvName
1848 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1850 Status
= self
.__GetCreateFile
(FvObj
)
1852 raise Warning("FV name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1854 self
.__GetDefineStatements
(FvObj
)
1856 self
.__GetAddressStatements
(FvObj
)
1858 self
.__GetBlockStatement
(FvObj
)
1860 self
.__GetSetStatements
(FvObj
)
1862 self
.__GetFvAlignment
(FvObj
)
1864 self
.__GetFvAttributes
(FvObj
)
1866 self
.__GetFvNameGuid
(FvObj
)
1868 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1869 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1872 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1873 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1874 if not isInf
and not isFile
:
1879 ## __GetFvAlignment() method
1881 # Get alignment for FV
1883 # @param self The object pointer
1884 # @param Obj for whom alignment is got
1885 # @retval True Successfully find a alignment statement
1886 # @retval False Not able to find a alignment statement
1888 def __GetFvAlignment(self
, Obj
):
1890 if not self
.__IsKeyword
( "FvAlignment"):
1893 if not self
.__IsToken
( "="):
1894 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1896 if not self
.__GetNextToken
():
1897 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1899 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1900 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1901 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1903 raise Warning("Unknown alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1904 Obj
.FvAlignment
= self
.__Token
1907 ## __GetFvAttributes() method
1909 # Get attributes for FV
1911 # @param self The object pointer
1912 # @param Obj for whom attribute is got
1915 def __GetFvAttributes(self
, FvObj
):
1917 while self
.__GetNextWord
():
1919 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1920 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1921 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1922 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1923 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
1924 "WRITE_POLICY_RELIABLE"):
1928 if not self
.__IsToken
( "="):
1929 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1931 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
1932 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
1934 FvObj
.FvAttributeDict
[name
] = self
.__Token
1938 ## __GetFvNameGuid() method
1940 # Get FV GUID for FV
1942 # @param self The object pointer
1943 # @param Obj for whom GUID is got
1946 def __GetFvNameGuid(self
, FvObj
):
1948 if not self
.__IsKeyword
( "FvNameGuid"):
1951 if not self
.__IsToken
( "="):
1952 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1954 if not self
.__GetNextGuid
():
1955 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
1957 FvObj
.FvNameGuid
= self
.__Token
1961 ## __GetAprioriSection() method
1963 # Get token statements
1965 # @param self The object pointer
1966 # @param FvObj for whom apriori is got
1967 # @param MacroDict dictionary used to replace macro
1968 # @retval True Successfully find apriori statement
1969 # @retval False Not able to find apriori statement
1971 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
1973 if not self
.__IsKeyword
( "APRIORI"):
1976 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
1977 raise Warning("expected Apriori file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1978 AprType
= self
.__Token
1980 if not self
.__IsToken
( "{"):
1981 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1983 AprSectionObj
= CommonDataClass
.FdfClass
.AprioriSectionClassObject()
1984 AprSectionObj
.AprioriType
= AprType
1986 self
.__GetDefineStatements
(AprSectionObj
)
1987 MacroDict
.update(AprSectionObj
.DefineVarDict
)
1990 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
1991 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
1992 if not IsInf
and not IsFile
:
1995 if not self
.__IsToken
( "}"):
1996 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1998 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2001 ## __GetInfStatement() method
2003 # Get INF statements
2005 # @param self The object pointer
2006 # @param Obj for whom inf statement is got
2007 # @param MacroDict dictionary used to replace macro
2008 # @retval True Successfully find inf statement
2009 # @retval False Not able to find inf statement
2011 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2013 if not self
.__IsKeyword
( "INF"):
2016 ffsInf
= CommonDataClass
.FdfClass
.FfsInfStatementClassObject()
2017 self
.__GetInfOptions
( ffsInf
)
2019 if not self
.__GetNextToken
():
2020 raise Warning("expected INF file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2021 ffsInf
.InfFileName
= self
.__Token
2023 # if ffsInf.InfFileName.find('$') >= 0:
2024 # ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
2026 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2027 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2028 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2029 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2031 if self
.__IsToken
('|'):
2032 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2033 ffsInf
.KeepReloc
= False
2034 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2035 ffsInf
.KeepReloc
= True
2037 raise Warning("Unknown reloc strip flag At Line ", self
.FileName
, self
.CurrentLineNumber
)
2040 capsuleFfs
= CapsuleData
.CapsuleFfs()
2041 capsuleFfs
.Ffs
= ffsInf
2042 Obj
.CapsuleDataList
.append(capsuleFfs
)
2044 Obj
.FfsList
.append(ffsInf
)
2047 ## __GetInfOptions() method
2049 # Get options for INF
2051 # @param self The object pointer
2052 # @param FfsInfObj for whom option is got
2054 def __GetInfOptions(self
, FfsInfObj
):
2056 if self
.__IsKeyword
( "RuleOverride"):
2057 if not self
.__IsToken
( "="):
2058 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2059 if not self
.__GetNextToken
():
2060 raise Warning("expected Rule name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2061 FfsInfObj
.Rule
= self
.__Token
2063 if self
.__IsKeyword
( "VERSION"):
2064 if not self
.__IsToken
( "="):
2065 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2066 if not self
.__GetNextToken
():
2067 raise Warning("expected Version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2069 if self
.__GetStringData
():
2070 FfsInfObj
.Version
= self
.__Token
2072 if self
.__IsKeyword
( "UI"):
2073 if not self
.__IsToken
( "="):
2074 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2075 if not self
.__GetNextToken
():
2076 raise Warning("expected UI name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2078 if self
.__GetStringData
():
2079 FfsInfObj
.Ui
= self
.__Token
2081 if self
.__IsKeyword
( "USE"):
2082 if not self
.__IsToken
( "="):
2083 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2084 if not self
.__GetNextToken
():
2085 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2086 FfsInfObj
.UseArch
= self
.__Token
2089 if self
.__GetNextToken
():
2090 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2091 if p
.match(self
.__Token
):
2092 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2093 if not self
.__IsToken
(","):
2099 while self
.__GetNextToken
():
2100 if not p
.match(self
.__Token
):
2101 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2102 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2104 if not self
.__IsToken
(","):
2107 ## __GetFileStatement() method
2109 # Get FILE statements
2111 # @param self The object pointer
2112 # @param Obj for whom FILE statement is got
2113 # @param MacroDict dictionary used to replace macro
2114 # @retval True Successfully find FILE statement
2115 # @retval False Not able to find FILE statement
2117 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2119 if not self
.__IsKeyword
( "FILE"):
2122 FfsFileObj
= CommonDataClass
.FdfClass
.FileStatementClassObject()
2124 if not self
.__GetNextWord
():
2125 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2126 FfsFileObj
.FvFileType
= self
.__Token
2128 if not self
.__IsToken
( "="):
2129 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2131 if not self
.__GetNextGuid
():
2132 if not self
.__GetNextWord
():
2133 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2134 if self
.__Token
== 'PCD':
2135 if not self
.__IsToken
( "("):
2136 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2137 PcdPair
= self
.__GetNextPcdName
()
2138 if not self
.__IsToken
( ")"):
2139 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2140 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2142 FfsFileObj
.NameGuid
= self
.__Token
2144 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2147 capsuleFfs
= CapsuleData
.CapsuleFfs()
2148 capsuleFfs
.Ffs
= FfsFileObj
2149 Obj
.CapsuleDataList
.append(capsuleFfs
)
2151 Obj
.FfsList
.append(FfsFileObj
)
2155 ## __FileCouldHaveRelocFlag() method
2157 # Check whether reloc strip flag can be set for a file type.
2159 # @param self The object pointer
2160 # @param FileType The file type to check with
2161 # @retval True This type could have relocation strip flag
2162 # @retval False No way to have it
2165 def __FileCouldHaveRelocFlag (self
, FileType
):
2166 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2171 ## __SectionCouldHaveRelocFlag() method
2173 # Check whether reloc strip flag can be set for a section type.
2175 # @param self The object pointer
2176 # @param SectionType The section type to check with
2177 # @retval True This type could have relocation strip flag
2178 # @retval False No way to have it
2181 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2182 if SectionType
in ('TE', 'PE32'):
2187 ## __GetFilePart() method
2189 # Get components for FILE statement
2191 # @param self The object pointer
2192 # @param FfsFileObj for whom component is got
2193 # @param MacroDict dictionary used to replace macro
2195 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2197 self
.__GetFileOpts
( FfsFileObj
)
2199 if not self
.__IsToken
("{"):
2200 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2201 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2202 # if self.__Token == 'RELOCS_STRIPPED':
2203 # FfsFileObj.KeepReloc = False
2205 # FfsFileObj.KeepReloc = True
2207 # raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2209 # if not self.__IsToken("{"):
2210 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2212 if not self
.__GetNextToken
():
2213 raise Warning("expected File name or section data At Line ", self
.FileName
, self
.CurrentLineNumber
)
2215 if self
.__Token
== "FV":
2216 if not self
.__IsToken
( "="):
2217 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2218 if not self
.__GetNextToken
():
2219 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2220 FfsFileObj
.FvName
= self
.__Token
2222 elif self
.__Token
== "FD":
2223 if not self
.__IsToken
( "="):
2224 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2225 if not self
.__GetNextToken
():
2226 raise Warning("expected FD name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2227 FfsFileObj
.FdName
= self
.__Token
2229 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2231 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2233 FfsFileObj
.FileName
= self
.__Token
2235 if not self
.__IsToken
( "}"):
2236 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2238 ## __GetFileOpts() method
2240 # Get options for FILE statement
2242 # @param self The object pointer
2243 # @param FfsFileObj for whom options is got
2245 def __GetFileOpts(self
, FfsFileObj
):
2247 if self
.__GetNextToken
():
2248 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2249 if Pattern
.match(self
.__Token
):
2250 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2251 if self
.__IsToken
(","):
2252 while self
.__GetNextToken
():
2253 if not Pattern
.match(self
.__Token
):
2254 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2255 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2257 if not self
.__IsToken
(","):
2263 if self
.__IsKeyword
( "FIXED", True):
2264 FfsFileObj
.Fixed
= True
2266 if self
.__IsKeyword
( "CHECKSUM", True):
2267 FfsFileObj
.CheckSum
= True
2269 if self
.__GetAlignment
():
2270 FfsFileObj
.Alignment
= self
.__Token
2274 ## __GetAlignment() method
2276 # Return the alignment value
2278 # @param self The object pointer
2279 # @retval True Successfully find alignment
2280 # @retval False Not able to find alignment
2282 def __GetAlignment(self
):
2283 if self
.__IsKeyword
( "Align", True):
2284 if not self
.__IsToken
( "="):
2285 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2287 if not self
.__GetNextToken
():
2288 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2293 ## __GetFilePart() method
2295 # Get section data for FILE statement
2297 # @param self The object pointer
2298 # @param FfsFileObj for whom section is got
2299 # @param MacroDict dictionary used to replace macro
2301 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2303 Dict
.update(MacroDict
)
2305 self
.__GetDefineStatements
(FfsFileObj
)
2307 Dict
.update(FfsFileObj
.DefineVarDict
)
2308 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2309 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2312 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2313 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2314 if not IsLeafSection
and not IsEncapSection
:
2317 ## __GetLeafSection() method
2319 # Get leaf section for Obj
2321 # @param self The object pointer
2322 # @param Obj for whom leaf section is got
2323 # @param MacroDict dictionary used to replace macro
2324 # @retval True Successfully find section statement
2325 # @retval False Not able to find section statement
2327 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2329 OldPos
= self
.GetFileBufferPos()
2331 if not self
.__IsKeyword
( "SECTION"):
2332 if len(Obj
.SectionList
) == 0:
2333 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2338 if self
.__GetAlignment
():
2339 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2340 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2341 AlignValue
= self
.__Token
2344 if self
.__IsKeyword
( "BUILD_NUM"):
2345 if not self
.__IsToken
( "="):
2346 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2348 if not self
.__GetNextToken
():
2349 raise Warning("expected Build number value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2351 BuildNum
= self
.__Token
2353 if self
.__IsKeyword
( "VERSION"):
2354 if AlignValue
== 'Auto':
2355 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2356 if not self
.__IsToken
( "="):
2357 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2358 if not self
.__GetNextToken
():
2359 raise Warning("expected version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2360 VerSectionObj
= CommonDataClass
.FdfClass
.VerSectionClassObject()
2361 VerSectionObj
.Alignment
= AlignValue
2362 VerSectionObj
.BuildNum
= BuildNum
2363 if self
.__GetStringData
():
2364 VerSectionObj
.StringData
= self
.__Token
2366 VerSectionObj
.FileName
= self
.__Token
2367 Obj
.SectionList
.append(VerSectionObj
)
2369 elif self
.__IsKeyword
( "UI"):
2370 if AlignValue
== 'Auto':
2371 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2372 if not self
.__IsToken
( "="):
2373 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2374 if not self
.__GetNextToken
():
2375 raise Warning("expected UI At Line ", self
.FileName
, self
.CurrentLineNumber
)
2376 UiSectionObj
= CommonDataClass
.FdfClass
.UiSectionClassObject()
2377 UiSectionObj
.Alignment
= AlignValue
2378 if self
.__GetStringData
():
2379 UiSectionObj
.StringData
= self
.__Token
2381 UiSectionObj
.FileName
= self
.__Token
2382 Obj
.SectionList
.append(UiSectionObj
)
2384 elif self
.__IsKeyword
( "FV_IMAGE"):
2385 if AlignValue
== 'Auto':
2386 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2387 if not self
.__IsToken
( "="):
2388 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2389 if not self
.__GetNextWord
():
2390 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2392 FvName
= self
.__Token
.upper()
2395 if self
.__IsToken
( "{"):
2397 FvObj
.UiFvName
= FvName
2398 self
.__GetDefineStatements
(FvObj
)
2399 MacroDict
.update(FvObj
.DefineVarDict
)
2400 self
.__GetBlockStatement
(FvObj
)
2401 self
.__GetSetStatements
(FvObj
)
2402 self
.__GetFvAlignment
(FvObj
)
2403 self
.__GetFvAttributes
(FvObj
)
2404 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2405 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2408 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2409 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2410 if not IsInf
and not IsFile
:
2413 if not self
.__IsToken
( "}"):
2414 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2416 FvImageSectionObj
= CommonDataClass
.FdfClass
.FvImageSectionClassObject()
2417 FvImageSectionObj
.Alignment
= AlignValue
2419 FvImageSectionObj
.Fv
= FvObj
2420 FvImageSectionObj
.FvName
= None
2422 FvImageSectionObj
.FvName
= FvName
2424 Obj
.SectionList
.append(FvImageSectionObj
)
2426 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2427 if AlignValue
== 'Auto':
2428 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2429 DepexSectionObj
= CommonDataClass
.FdfClass
.DepexSectionClassObject()
2430 DepexSectionObj
.Alignment
= AlignValue
2431 DepexSectionObj
.DepexType
= self
.__Token
2433 if not self
.__IsToken
( "="):
2434 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2435 if not self
.__IsToken
( "{"):
2436 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2437 if not self
.__SkipToToken
( "}"):
2438 raise Warning("expected Depex expression ending '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2440 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2441 Obj
.SectionList
.append(DepexSectionObj
)
2445 if not self
.__GetNextWord
():
2446 raise Warning("expected section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2448 # Encapsulation section appear, UndoToken and return
2449 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2450 self
.SetFileBufferPos(OldPos
)
2453 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2454 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2455 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2456 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2457 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2459 DataSectionObj
= CommonDataClass
.FdfClass
.DataSectionClassObject()
2460 DataSectionObj
.Alignment
= AlignValue
2461 DataSectionObj
.SecType
= self
.__Token
2463 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2464 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2465 if self
.__Token
== 'RELOCS_STRIPPED':
2466 DataSectionObj
.KeepReloc
= False
2468 DataSectionObj
.KeepReloc
= True
2470 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
)
2472 if self
.__IsToken
("="):
2473 if not self
.__GetNextToken
():
2474 raise Warning("expected section file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2475 DataSectionObj
.SectFileName
= self
.__Token
2477 if not self
.__GetCglSection
(DataSectionObj
):
2480 Obj
.SectionList
.append(DataSectionObj
)
2484 ## __GetCglSection() method
2486 # Get compressed or GUIDed section for Obj
2488 # @param self The object pointer
2489 # @param Obj for whom leaf section is got
2490 # @param AlignValue alignment value for complex section
2491 # @retval True Successfully find section statement
2492 # @retval False Not able to find section statement
2494 def __GetCglSection(self
, Obj
, AlignValue
= None):
2496 if self
.__IsKeyword
( "COMPRESS"):
2498 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2501 if not self
.__IsToken
("{"):
2502 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2504 CompressSectionObj
= CommonDataClass
.FdfClass
.CompressSectionClassObject()
2505 CompressSectionObj
.Alignment
= AlignValue
2506 CompressSectionObj
.CompType
= type
2507 # Recursive sections...
2509 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2510 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2511 if not IsLeafSection
and not IsEncapSection
:
2515 if not self
.__IsToken
( "}"):
2516 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2517 Obj
.SectionList
.append(CompressSectionObj
)
2520 # raise Warning("Compress type not known At Line ")
2524 elif self
.__IsKeyword
( "GUIDED"):
2526 if self
.__GetNextGuid
():
2527 GuidValue
= self
.__Token
2529 AttribDict
= self
.__GetGuidAttrib
()
2530 if not self
.__IsToken
("{"):
2531 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2532 GuidSectionObj
= CommonDataClass
.FdfClass
.GuidSectionClassObject()
2533 GuidSectionObj
.Alignment
= AlignValue
2534 GuidSectionObj
.NameGuid
= GuidValue
2535 GuidSectionObj
.SectionType
= "GUIDED"
2536 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2537 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2538 # Recursive sections...
2540 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2541 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2542 if not IsLeafSection
and not IsEncapSection
:
2545 if not self
.__IsToken
( "}"):
2546 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2547 Obj
.SectionList
.append(GuidSectionObj
)
2553 ## __GetGuidAttri() method
2555 # Get attributes for GUID section
2557 # @param self The object pointer
2558 # @retval AttribDict Dictionary of key-value pair of section attributes
2560 def __GetGuidAttrib(self
):
2563 AttribDict
["PROCESSING_REQUIRED"] = False
2564 AttribDict
["AUTH_STATUS_VALID"] = False
2565 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2566 AttribKey
= self
.__Token
2568 if not self
.__IsToken
("="):
2569 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2571 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2572 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2573 AttribDict
[AttribKey
] = self
.__Token
2575 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2576 AttribKey
= self
.__Token
2578 if not self
.__IsToken
("="):
2579 raise Warning("expected '=' At Line ")
2581 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2582 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2583 AttribDict
[AttribKey
] = self
.__Token
2587 ## __GetEncapsulationSec() method
2589 # Get encapsulation section for FILE
2591 # @param self The object pointer
2592 # @param FfsFile for whom section is got
2593 # @retval True Successfully find section statement
2594 # @retval False Not able to find section statement
2596 def __GetEncapsulationSec(self
, FfsFileObj
):
2598 OldPos
= self
.GetFileBufferPos()
2599 if not self
.__IsKeyword
( "SECTION"):
2600 if len(FfsFileObj
.SectionList
) == 0:
2601 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2606 if self
.__GetAlignment
():
2607 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2608 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2609 AlignValue
= self
.__Token
2611 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2612 self
.SetFileBufferPos(OldPos
)
2617 ## __GetCapsule() method
2619 # Get capsule section contents and store its data into capsule list of self.Profile
2621 # @param self The object pointer
2622 # @retval True Successfully find a capsule
2623 # @retval False Not able to find a capsule
2625 def __GetCapsule(self
):
2627 if not self
.__GetNextToken
():
2630 S
= self
.__Token
.upper()
2631 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2632 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2633 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2638 if not self
.__IsToken
("[CAPSULE.", True):
2639 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2640 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2641 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2642 raise Warning("expected [Capsule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2644 CapsuleObj
= CommonDataClass
.FdfClass
.CapsuleClassObject()
2646 CapsuleName
= self
.__GetUiName
()
2648 raise Warning("expected capsule name At line ", self
.FileName
, self
.CurrentLineNumber
)
2650 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2652 if not self
.__IsToken
( "]"):
2653 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2655 if self
.__IsKeyword
("CREATE_FILE"):
2656 if not self
.__IsToken
( "="):
2657 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2659 if not self
.__GetNextToken
():
2660 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2662 CapsuleObj
.CreateFile
= self
.__Token
2664 self
.__GetCapsuleStatements
(CapsuleObj
)
2665 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2668 ## __GetCapsuleStatements() method
2670 # Get statements for capsule
2672 # @param self The object pointer
2673 # @param Obj for whom statements are got
2675 def __GetCapsuleStatements(self
, Obj
):
2676 self
.__GetCapsuleTokens
(Obj
)
2677 self
.__GetDefineStatements
(Obj
)
2678 self
.__GetSetStatements
(Obj
)
2680 self
.__GetCapsuleData
(Obj
)
2682 ## __GetCapsuleStatements() method
2684 # Get token statements for capsule
2686 # @param self The object pointer
2687 # @param Obj for whom token statements are got
2689 def __GetCapsuleTokens(self
, Obj
):
2691 if not self
.__IsKeyword
("CAPSULE_GUID"):
2692 raise Warning("expected 'CAPSULE_GUID' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2694 while self
.__CurrentLine
().find("=") != -1:
2695 NameValue
= self
.__CurrentLine
().split("=")
2696 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2697 self
.CurrentLineNumber
+= 1
2698 self
.CurrentOffsetWithinLine
= 0
2700 ## __GetCapsuleData() method
2702 # Get capsule data for capsule
2704 # @param self The object pointer
2705 # @param Obj for whom capsule data are got
2707 def __GetCapsuleData(self
, Obj
):
2710 IsInf
= self
.__GetInfStatement
(Obj
, True)
2711 IsFile
= self
.__GetFileStatement
(Obj
, True)
2712 IsFv
= self
.__GetFvStatement
(Obj
)
2713 if not IsInf
and not IsFile
and not IsFv
:
2716 ## __GetFvStatement() method
2718 # Get FV for capsule
2720 # @param self The object pointer
2721 # @param CapsuleObj for whom FV is got
2722 # @retval True Successfully find a FV statement
2723 # @retval False Not able to find a FV statement
2725 def __GetFvStatement(self
, CapsuleObj
):
2727 if not self
.__IsKeyword
("FV"):
2730 if not self
.__IsToken
("="):
2731 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2733 if not self
.__GetNextToken
():
2734 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2736 # CapsuleFv = CapsuleData.CapsuleFv()
2737 # CapsuleFv.FvName = self.__Token
2738 # CapsuleObj.CapsuleDataList.append(CapsuleFv)
2741 ## __GetRule() method
2743 # Get Rule section contents and store its data into rule list of self.Profile
2745 # @param self The object pointer
2746 # @retval True Successfully find a Rule
2747 # @retval False Not able to find a Rule
2749 def __GetRule(self
):
2751 if not self
.__GetNextToken
():
2754 S
= self
.__Token
.upper()
2755 if S
.startswith("[") and not S
.startswith("[RULE."):
2756 if not S
.startswith("[OPTIONROM."):
2757 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2761 if not self
.__IsToken
("[Rule.", True):
2762 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2763 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2764 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2765 raise Warning("expected [Rule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2767 if not self
.__SkipToToken
("."):
2768 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2770 Arch
= self
.__SkippedChars
.rstrip(".")
2771 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
2772 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2774 ModuleType
= self
.__GetModuleType
()
2777 if self
.__IsToken
("."):
2778 if not self
.__GetNextWord
():
2779 raise Warning("expected template name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2780 TemplateName
= self
.__Token
2782 if not self
.__IsToken
( "]"):
2783 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2785 RuleObj
= self
.__GetRuleFileStatements
()
2786 RuleObj
.Arch
= Arch
.upper()
2787 RuleObj
.ModuleType
= ModuleType
2788 RuleObj
.TemplateName
= TemplateName
2789 if TemplateName
== '' :
2790 self
.Profile
.RuleDict
['RULE' + \
2794 ModuleType
.upper() ] = RuleObj
2796 self
.Profile
.RuleDict
['RULE' + \
2800 ModuleType
.upper() + \
2802 TemplateName
.upper() ] = RuleObj
2803 # self.Profile.RuleList.append(rule)
2806 ## __GetModuleType() method
2808 # Return the module type
2810 # @param self The object pointer
2811 # @retval string module type
2813 def __GetModuleType(self
):
2815 if not self
.__GetNextWord
():
2816 raise Warning("expected Module type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2817 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2818 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2819 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2820 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2821 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2822 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
2823 raise Warning("Unknown Module type At line ", self
.FileName
, self
.CurrentLineNumber
)
2826 ## __GetFileExtension() method
2828 # Return the file extension
2830 # @param self The object pointer
2831 # @retval string file name extension
2833 def __GetFileExtension(self
):
2834 if not self
.__IsToken
("."):
2835 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2838 if self
.__GetNextToken
():
2839 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
2840 if Pattern
.match(self
.__Token
):
2844 raise Warning("Unknown file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2847 raise Warning("expected file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2849 ## __GetRuleFileStatement() method
2853 # @param self The object pointer
2854 # @retval Rule Rule object
2856 def __GetRuleFileStatements(self
):
2858 if not self
.__IsKeyword
("FILE"):
2859 raise Warning("expected FILE At Line ", self
.FileName
, self
.CurrentLineNumber
)
2861 if not self
.__GetNextWord
():
2862 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2864 Type
= self
.__Token
.strip().upper()
2865 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2866 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
2867 raise Warning("Unknown FV type At line ", self
.FileName
, self
.CurrentLineNumber
)
2869 if not self
.__IsToken
("="):
2870 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2872 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2873 if not self
.__GetNextWord
():
2874 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2875 if self
.__Token
== 'PCD':
2876 if not self
.__IsToken
( "("):
2877 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2878 PcdPair
= self
.__GetNextPcdName
()
2879 if not self
.__IsToken
( ")"):
2880 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2881 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2883 NameGuid
= self
.__Token
2886 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2887 if self
.__FileCouldHaveRelocFlag
(Type
):
2888 if self
.__Token
== 'RELOCS_STRIPPED':
2893 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2896 if self
.__GetNextToken
():
2897 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2898 if Pattern
.match(self
.__Token
):
2899 KeyStringList
.append(self
.__Token
)
2900 if self
.__IsToken
(","):
2901 while self
.__GetNextToken
():
2902 if not Pattern
.match(self
.__Token
):
2903 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2904 KeyStringList
.append(self
.__Token
)
2906 if not self
.__IsToken
(","):
2914 if self
.__IsKeyword
("Fixed", True):
2918 if self
.__IsKeyword
("CheckSum", True):
2922 if self
.__GetAlignment
():
2923 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2924 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2925 AlignValue
= self
.__Token
2927 if self
.__IsToken
("{"):
2928 # Complex file rule expected
2929 Rule
= RuleComplexFile
.RuleComplexFile()
2930 Rule
.FvFileType
= Type
2931 Rule
.NameGuid
= NameGuid
2932 Rule
.Alignment
= AlignValue
2933 Rule
.CheckSum
= CheckSum
2935 Rule
.KeyStringList
= KeyStringList
2936 if KeepReloc
!= None:
2937 Rule
.KeepReloc
= KeepReloc
2940 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2941 IsLeaf
= self
.__GetEfiSection
(Rule
)
2942 if not IsEncapsulate
and not IsLeaf
:
2945 if not self
.__IsToken
("}"):
2946 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2950 elif self
.__IsToken
("|"):
2952 Ext
= self
.__GetFileExtension
()
2954 Rule
= RuleSimpleFile
.RuleSimpleFile()
2956 Rule
.FvFileType
= Type
2957 Rule
.NameGuid
= NameGuid
2958 Rule
.Alignment
= AlignValue
2959 Rule
.CheckSum
= CheckSum
2961 Rule
.FileExtension
= Ext
2962 Rule
.KeyStringList
= KeyStringList
2963 if KeepReloc
!= None:
2964 Rule
.KeepReloc
= KeepReloc
2969 # Simple file rule expected
2970 if not self
.__GetNextWord
():
2971 raise Warning("expected leaf section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2973 SectionName
= self
.__Token
2975 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2976 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2977 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2980 if self
.__IsKeyword
("Fixed", True):
2983 if self
.__IsKeyword
("CheckSum", True):
2986 if self
.__GetAlignment
():
2987 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2988 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2989 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
2990 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2991 AlignValue
= self
.__Token
2993 if not self
.__GetNextToken
():
2994 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2996 Rule
= RuleSimpleFile
.RuleSimpleFile()
2997 Rule
.SectionType
= SectionName
2998 Rule
.FvFileType
= Type
2999 Rule
.NameGuid
= NameGuid
3000 Rule
.Alignment
= AlignValue
3001 Rule
.CheckSum
= CheckSum
3003 Rule
.FileName
= self
.__Token
3004 Rule
.KeyStringList
= KeyStringList
3005 if KeepReloc
!= None:
3006 Rule
.KeepReloc
= KeepReloc
3009 ## __GetEfiSection() method
3011 # Get section list for Rule
3013 # @param self The object pointer
3014 # @param Obj for whom section is got
3015 # @retval True Successfully find section statement
3016 # @retval False Not able to find section statement
3018 def __GetEfiSection(self
, Obj
):
3020 OldPos
= self
.GetFileBufferPos()
3021 if not self
.__GetNextWord
():
3023 SectionName
= self
.__Token
3025 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3026 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3030 if SectionName
== "FV_IMAGE":
3031 FvImageSectionObj
= FvImageSection
.FvImageSection()
3032 if self
.__IsKeyword
("FV_IMAGE"):
3034 if self
.__IsToken
( "{"):
3036 self
.__GetDefineStatements
(FvObj
)
3037 self
.__GetBlockStatement
(FvObj
)
3038 self
.__GetSetStatements
(FvObj
)
3039 self
.__GetFvAlignment
(FvObj
)
3040 self
.__GetFvAttributes
(FvObj
)
3041 self
.__GetAprioriSection
(FvObj
)
3042 self
.__GetAprioriSection
(FvObj
)
3045 IsInf
= self
.__GetInfStatement
(FvObj
)
3046 IsFile
= self
.__GetFileStatement
(FvObj
)
3047 if not IsInf
and not IsFile
:
3050 if not self
.__IsToken
( "}"):
3051 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3052 FvImageSectionObj
.Fv
= FvObj
3053 FvImageSectionObj
.FvName
= None
3056 if not self
.__IsKeyword
("FV"):
3057 raise Warning("expected 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3058 FvImageSectionObj
.FvFileType
= self
.__Token
3060 if self
.__GetAlignment
():
3061 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3062 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3063 FvImageSectionObj
.Alignment
= self
.__Token
3065 if self
.__IsToken
('|'):
3066 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3067 elif self
.__GetNextToken
():
3068 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3069 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3070 FvImageSectionObj
.FvFileName
= self
.__Token
3074 raise Warning("expected FV file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3076 Obj
.SectionList
.append(FvImageSectionObj
)
3079 EfiSectionObj
= EfiSection
.EfiSection()
3080 EfiSectionObj
.SectionType
= SectionName
3082 if not self
.__GetNextToken
():
3083 raise Warning("expected file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3085 if self
.__Token
== "STRING":
3086 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3087 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3089 if not self
.__IsToken
('='):
3090 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3092 if not self
.__GetNextToken
():
3093 raise Warning("expected Quoted String At Line ", self
.FileName
, self
.CurrentLineNumber
)
3095 if self
.__GetStringData
():
3096 EfiSectionObj
.StringData
= self
.__Token
3098 if self
.__IsKeyword
("BUILD_NUM"):
3099 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3100 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3102 if not self
.__IsToken
("="):
3103 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3104 if not self
.__GetNextToken
():
3105 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3106 EfiSectionObj
.BuildNum
= self
.__Token
3109 EfiSectionObj
.FileType
= self
.__Token
3110 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3112 if self
.__IsKeyword
("Optional"):
3113 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3114 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3115 EfiSectionObj
.Optional
= True
3117 if self
.__IsKeyword
("BUILD_NUM"):
3118 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3119 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3121 if not self
.__IsToken
("="):
3122 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3123 if not self
.__GetNextToken
():
3124 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3125 EfiSectionObj
.BuildNum
= self
.__Token
3127 if self
.__GetAlignment
():
3128 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3129 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3130 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3131 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3132 EfiSectionObj
.Alignment
= self
.__Token
3134 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3135 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3136 if self
.__Token
== 'RELOCS_STRIPPED':
3137 EfiSectionObj
.KeepReloc
= False
3139 EfiSectionObj
.KeepReloc
= True
3140 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3141 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3143 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3146 if self
.__IsToken
('|'):
3147 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3148 elif self
.__GetNextToken
():
3149 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3150 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3152 if self
.__Token
.startswith('PCD'):
3154 self
.__GetNextWord
()
3156 if self
.__Token
== 'PCD':
3157 if not self
.__IsToken
( "("):
3158 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3159 PcdPair
= self
.__GetNextPcdName
()
3160 if not self
.__IsToken
( ")"):
3161 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3162 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3164 EfiSectionObj
.FileName
= self
.__Token
3169 raise Warning("expected section file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3171 Obj
.SectionList
.append(EfiSectionObj
)
3174 ## __RuleSectionCouldBeOptional() method
3176 # Get whether a section could be optional
3178 # @param self The object pointer
3179 # @param SectionType The section type to check
3180 # @retval True section could be optional
3181 # @retval False section never optional
3183 def __RuleSectionCouldBeOptional(self
, SectionType
):
3184 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3189 ## __RuleSectionCouldHaveBuildNum() method
3191 # Get whether a section could have build number information
3193 # @param self The object pointer
3194 # @param SectionType The section type to check
3195 # @retval True section could have build number information
3196 # @retval False section never have build number information
3198 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3199 if SectionType
in ("VERSION"):
3204 ## __RuleSectionCouldHaveString() method
3206 # Get whether a section could have string
3208 # @param self The object pointer
3209 # @param SectionType The section type to check
3210 # @retval True section could have string
3211 # @retval False section never have string
3213 def __RuleSectionCouldHaveString(self
, SectionType
):
3214 if SectionType
in ("UI", "VERSION"):
3219 ## __CheckRuleSectionFileType() method
3221 # Get whether a section matches a file type
3223 # @param self The object pointer
3224 # @param SectionType The section type to check
3225 # @param FileType The file type to check
3227 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3228 if SectionType
== "COMPAT16":
3229 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3230 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3231 elif SectionType
== "PE32":
3232 if FileType
not in ("PE32", "SEC_PE32"):
3233 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3234 elif SectionType
== "PIC":
3235 if FileType
not in ("PIC", "PIC"):
3236 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3237 elif SectionType
== "TE":
3238 if FileType
not in ("TE", "SEC_TE"):
3239 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3240 elif SectionType
== "RAW":
3241 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3242 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3243 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3244 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3245 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3246 elif SectionType
== "UI":
3247 if FileType
not in ("UI", "SEC_UI"):
3248 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3249 elif SectionType
== "VERSION":
3250 if FileType
not in ("VERSION", "SEC_VERSION"):
3251 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3252 elif SectionType
== "PEI_DEPEX":
3253 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3254 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3255 elif SectionType
== "GUID":
3256 if FileType
not in ("PE32", "SEC_GUID"):
3257 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3259 ## __GetRuleEncapsulationSection() method
3261 # Get encapsulation section for Rule
3263 # @param self The object pointer
3264 # @param Rule for whom section is got
3265 # @retval True Successfully find section statement
3266 # @retval False Not able to find section statement
3268 def __GetRuleEncapsulationSection(self
, Rule
):
3270 if self
.__IsKeyword
( "COMPRESS"):
3272 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3275 if not self
.__IsToken
("{"):
3276 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3278 CompressSectionObj
= CompressSection
.CompressSection()
3280 CompressSectionObj
.CompType
= Type
3281 # Recursive sections...
3283 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3284 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3285 if not IsEncapsulate
and not IsLeaf
:
3288 if not self
.__IsToken
( "}"):
3289 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3290 Rule
.SectionList
.append(CompressSectionObj
)
3294 elif self
.__IsKeyword
( "GUIDED"):
3296 if self
.__GetNextGuid
():
3297 GuidValue
= self
.__Token
3299 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3300 GuidValue
= self
.__Token
3302 AttribDict
= self
.__GetGuidAttrib
()
3304 if not self
.__IsToken
("{"):
3305 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3306 GuidSectionObj
= GuidSection
.GuidSection()
3307 GuidSectionObj
.NameGuid
= GuidValue
3308 GuidSectionObj
.SectionType
= "GUIDED"
3309 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3310 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3314 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3315 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3316 if not IsEncapsulate
and not IsLeaf
:
3319 if not self
.__IsToken
( "}"):
3320 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3321 Rule
.SectionList
.append(GuidSectionObj
)
3327 ## __GetVtf() method
3329 # Get VTF section contents and store its data into VTF list of self.Profile
3331 # @param self The object pointer
3332 # @retval True Successfully find a VTF
3333 # @retval False Not able to find a VTF
3337 if not self
.__GetNextToken
():
3340 S
= self
.__Token
.upper()
3341 if S
.startswith("[") and not S
.startswith("[VTF."):
3342 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3343 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3348 if not self
.__IsToken
("[VTF.", True):
3349 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3350 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3351 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
3352 raise Warning("expected [VTF.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
3354 if not self
.__SkipToToken
("."):
3355 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3357 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3358 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3359 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3361 if not self
.__GetNextWord
():
3362 raise Warning("expected VTF name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3363 Name
= self
.__Token
.upper()
3366 VtfObj
.UiName
= Name
3367 VtfObj
.KeyArch
= Arch
3369 if self
.__IsToken
(","):
3370 if not self
.__GetNextWord
():
3371 raise Warning("expected Arch list At Line ", self
.FileName
, self
.CurrentLineNumber
)
3372 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3373 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3374 VtfObj
.ArchList
= self
.__Token
.upper()
3376 if not self
.__IsToken
( "]"):
3377 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3379 if self
.__IsKeyword
("IA32_RST_BIN"):
3380 if not self
.__IsToken
("="):
3381 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3383 if not self
.__GetNextToken
():
3384 raise Warning("expected Reset file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3386 VtfObj
.ResetBin
= self
.__Token
3388 while self
.__GetComponentStatement
(VtfObj
):
3391 self
.Profile
.VtfList
.append(VtfObj
)
3394 ## __GetComponentStatement() method
3396 # Get components in VTF
3398 # @param self The object pointer
3399 # @param VtfObj for whom component is got
3400 # @retval True Successfully find a component
3401 # @retval False Not able to find a component
3403 def __GetComponentStatement(self
, VtfObj
):
3405 if not self
.__IsKeyword
("COMP_NAME"):
3408 if not self
.__IsToken
("="):
3409 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3411 if not self
.__GetNextWord
():
3412 raise Warning("expected Component Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3414 CompStatementObj
= ComponentStatement
.ComponentStatement()
3415 CompStatementObj
.CompName
= self
.__Token
3417 if not self
.__IsKeyword
("COMP_LOC"):
3418 raise Warning("expected COMP_LOC At Line ", self
.FileName
, self
.CurrentLineNumber
)
3420 if not self
.__IsToken
("="):
3421 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3423 CompStatementObj
.CompLoc
= ""
3424 if self
.__GetNextWord
():
3425 CompStatementObj
.CompLoc
= self
.__Token
3426 if self
.__IsToken
('|'):
3427 if not self
.__GetNextWord
():
3428 raise Warning("Expected Region Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3430 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3431 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3433 CompStatementObj
.FilePos
= self
.__Token
3435 self
.CurrentLineNumber
+= 1
3436 self
.CurrentOffsetWithinLine
= 0
3438 if not self
.__IsKeyword
("COMP_TYPE"):
3439 raise Warning("expected COMP_TYPE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3441 if not self
.__IsToken
("="):
3442 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3444 if not self
.__GetNextToken
():
3445 raise Warning("expected Component type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3446 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3447 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3448 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3449 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3450 CompStatementObj
.CompType
= self
.__Token
3452 if not self
.__IsKeyword
("COMP_VER"):
3453 raise Warning("expected COMP_VER At Line ", self
.FileName
, self
.CurrentLineNumber
)
3455 if not self
.__IsToken
("="):
3456 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3458 if not self
.__GetNextToken
():
3459 raise Warning("expected Component version At Line ", self
.FileName
, self
.CurrentLineNumber
)
3461 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3462 if Pattern
.match(self
.__Token
) == None:
3463 raise Warning("Unknown version format At line ", self
.FileName
, self
.CurrentLineNumber
)
3464 CompStatementObj
.CompVer
= self
.__Token
3466 if not self
.__IsKeyword
("COMP_CS"):
3467 raise Warning("expected COMP_CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3469 if not self
.__IsToken
("="):
3470 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3472 if not self
.__GetNextToken
():
3473 raise Warning("expected Component CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3474 if self
.__Token
not in ("1", "0"):
3475 raise Warning("Unknown Component CS At line ", self
.FileName
, self
.CurrentLineNumber
)
3476 CompStatementObj
.CompCs
= self
.__Token
3479 if not self
.__IsKeyword
("COMP_BIN"):
3480 raise Warning("expected COMP_BIN At Line ", self
.FileName
, self
.CurrentLineNumber
)
3482 if not self
.__IsToken
("="):
3483 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3485 if not self
.__GetNextToken
():
3486 raise Warning("expected Component file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3488 CompStatementObj
.CompBin
= self
.__Token
3490 if not self
.__IsKeyword
("COMP_SYM"):
3491 raise Warning("expected COMP_SYM At Line ", self
.FileName
, self
.CurrentLineNumber
)
3493 if not self
.__IsToken
("="):
3494 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3496 if not self
.__GetNextToken
():
3497 raise Warning("expected Component symbol file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3499 CompStatementObj
.CompSym
= self
.__Token
3501 if not self
.__IsKeyword
("COMP_SIZE"):
3502 raise Warning("expected COMP_SIZE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3504 if not self
.__IsToken
("="):
3505 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3507 if self
.__IsToken
("-"):
3508 CompStatementObj
.CompSize
= self
.__Token
3509 elif self
.__GetNextDecimalNumber
():
3510 CompStatementObj
.CompSize
= self
.__Token
3511 elif self
.__GetNextHexNumber
():
3512 CompStatementObj
.CompSize
= self
.__Token
3514 raise Warning("Unknown size At line ", self
.FileName
, self
.CurrentLineNumber
)
3516 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3519 ## __GetFvInFd() method
3521 # Get FV list contained in FD
3523 # @param self The object pointer
3524 # @param FdName FD name
3525 # @retval FvList list of FV in FD
3527 def __GetFvInFd (self
, FdName
):
3530 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3531 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3532 for elementRegion
in FdObj
.RegionList
:
3533 if elementRegion
.RegionType
== 'FV':
3534 for elementRegionData
in elementRegion
.RegionDataList
:
3535 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3536 FvList
.append(elementRegionData
.upper())
3539 ## __GetReferencedFdFvTuple() method
3541 # Get FD and FV list referenced by a FFS file
3543 # @param self The object pointer
3544 # @param FfsFile contains sections to be searched
3545 # @param RefFdList referenced FD by section
3546 # @param RefFvList referenced FV by section
3548 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3550 for FfsObj
in FvObj
.FfsList
:
3551 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3552 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3553 RefFvList
.append(FfsObj
.FvName
.upper())
3554 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3555 RefFdList
.append(FfsObj
.FdName
.upper())
3557 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3559 ## __GetReferencedFdFvTupleFromSection() method
3561 # Get FD and FV list referenced by a FFS section
3563 # @param self The object pointer
3564 # @param FfsFile contains sections to be searched
3565 # @param FdList referenced FD by section
3566 # @param FvList referenced FV by section
3568 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3571 SectionStack
.extend(FfsFile
.SectionList
)
3572 while SectionStack
!= []:
3573 SectionObj
= SectionStack
.pop()
3574 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3575 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
3576 FvList
.append(SectionObj
.FvName
.upper())
3577 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3578 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3579 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3581 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3582 SectionStack
.extend(SectionObj
.SectionList
)
3584 ## CycleReferenceCheck() method
3586 # Check whether cycle reference exists in FDF
3588 # @param self The object pointer
3589 # @retval True cycle reference exists
3590 # @retval False Not exists cycle reference
3592 def CycleReferenceCheck(self
):
3594 CycleRefExists
= False
3597 for FvName
in self
.Profile
.FvDict
.keys():
3598 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3600 RefFvStack
.append(FvName
)
3603 while RefFvStack
!= []:
3604 FvNameFromStack
= RefFvStack
.pop()
3605 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3606 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3612 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3614 for RefFdName
in RefFdList
:
3615 if RefFdName
in FdAnalyzedList
:
3618 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3619 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3620 if FvInFdList
!= []:
3621 LogStr
+= "FD %s contains FV: " % RefFdName
3622 for FvObj
in FvInFdList
:
3625 if FvObj
not in RefFvStack
:
3626 RefFvStack
.append(FvObj
)
3628 if FvName
in RefFvStack
:
3629 CycleRefExists
= True
3630 raise Warning(LogStr
)
3631 FdAnalyzedList
.append(RefFdName
)
3633 for RefFvName
in RefFvList
:
3634 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3635 if RefFvName
not in RefFvStack
:
3636 RefFvStack
.append(RefFvName
)
3638 if FvName
in RefFvStack
:
3639 CycleRefExists
= True
3640 raise Warning(LogStr
)
3646 return CycleRefExists
3648 if __name__
== "__main__":
3649 parser
= FdfParser("..\LakeportX64Pkg.fdf")
3652 parser
.CycleReferenceCheck()