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 raise Warning("expected block statement At Line ", self
.FileName
, self
.CurrentLineNumber
)
1444 while self
.__GetBlockStatement
(Obj
):
1448 ## __GetBlockStatement() method
1450 # Get block statement
1452 # @param self The object pointer
1453 # @param Obj for whom block statement is got
1454 # @retval True Successfully find
1455 # @retval False Not able to find
1457 def __GetBlockStatement(self
, Obj
):
1458 if not self
.__IsKeyword
( "BlockSize"):
1461 if not self
.__IsToken
( "="):
1462 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1464 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1465 raise Warning("expected Hex block size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1467 BlockSize
= long(self
.__Token
, 0)
1469 if self
.__IsToken
( "|"):
1470 PcdPair
= self
.__GetNextPcdName
()
1471 BlockSizePcd
= PcdPair
1472 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1473 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1474 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1477 if self
.__IsKeyword
( "NumBlocks"):
1478 if not self
.__IsToken
( "="):
1479 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1481 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1482 raise Warning("expected block numbers At Line ", self
.FileName
, self
.CurrentLineNumber
)
1484 BlockNumber
= long(self
.__Token
, 0)
1486 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1489 ## __GetDefineStatements() method
1491 # Get define statements
1493 # @param self The object pointer
1494 # @param Obj for whom define statement is got
1495 # @retval True Successfully find
1496 # @retval False Not able to find
1498 def __GetDefineStatements(self
, Obj
):
1499 while self
.__GetDefineStatement
( Obj
):
1502 ## __GetDefineStatement() method
1504 # Get define statement
1506 # @param self The object pointer
1507 # @param Obj for whom define statement is got
1508 # @retval True Successfully find
1509 # @retval False Not able to find
1511 def __GetDefineStatement(self
, Obj
):
1512 if self
.__IsKeyword
("DEFINE"):
1513 self
.__GetNextToken
()
1514 Macro
= self
.__Token
1515 if not self
.__IsToken
( "="):
1516 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1518 if not self
.__GetNextToken
():
1519 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1521 Value
= self
.__Token
1522 Macro
= '$(' + Macro
+ ')'
1523 Obj
.DefineVarDict
[Macro
] = Value
1528 ## __GetSetStatements() method
1530 # Get set statements
1532 # @param self The object pointer
1533 # @param Obj for whom set statement is got
1534 # @retval True Successfully find
1535 # @retval False Not able to find
1537 def __GetSetStatements(self
, Obj
):
1538 while self
.__GetSetStatement
(Obj
):
1541 ## __GetSetStatement() method
1545 # @param self The object pointer
1546 # @param Obj for whom set statement is got
1547 # @retval True Successfully find
1548 # @retval False Not able to find
1550 def __GetSetStatement(self
, Obj
):
1551 if self
.__IsKeyword
("SET"):
1552 PcdPair
= self
.__GetNextPcdName
()
1554 if not self
.__IsToken
( "="):
1555 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1557 if not self
.__GetNextToken
():
1558 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1560 Value
= self
.__Token
1561 if Value
.startswith("{"):
1562 # deal with value with {}
1563 if not self
.__SkipToToken
( "}"):
1564 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1565 Value
+= self
.__SkippedChars
1567 Obj
.SetVarDict
[PcdPair
] = Value
1568 self
.Profile
.PcdDict
[PcdPair
] = Value
1569 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1570 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1575 ## __GetRegionLayout() method
1577 # Get region layout for FD
1579 # @param self The object pointer
1580 # @param Fd for whom region is got
1581 # @retval True Successfully find
1582 # @retval False Not able to find
1584 def __GetRegionLayout(self
, Fd
):
1585 if not self
.__GetNextHexNumber
():
1588 RegionObj
= CommonDataClass
.FdfClass
.RegionClassObject()
1589 RegionObj
.Offset
= long(self
.__Token
, 0)
1590 Fd
.RegionList
.append(RegionObj
)
1592 if not self
.__IsToken
( "|"):
1593 raise Warning("expected '|' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1595 if not self
.__GetNextHexNumber
():
1596 raise Warning("expected Region Size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1597 RegionObj
.Size
= long(self
.__Token
, 0)
1599 if not self
.__GetNextWord
():
1602 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1604 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1605 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0)
1606 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1607 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1608 if self
.__IsToken
( "|"):
1609 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1610 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = RegionObj
.Size
1611 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1612 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1614 if not self
.__GetNextWord
():
1617 if self
.__Token
== "SET":
1619 self
.__GetSetStatements
( RegionObj
)
1620 if not self
.__GetNextWord
():
1623 elif self
.__Token
== "FV":
1625 self
.__GetRegionFvType
( RegionObj
)
1627 elif self
.__Token
== "CAPSULE":
1629 self
.__GetRegionCapType
( RegionObj
)
1631 elif self
.__Token
== "FILE":
1633 self
.__GetRegionFileType
( RegionObj
)
1637 self
.__GetRegionDataType
( RegionObj
)
1641 ## __GetRegionFvType() method
1643 # Get region fv data for region
1645 # @param self The object pointer
1646 # @param RegionObj for whom region data is got
1648 def __GetRegionFvType(self
, RegionObj
):
1650 if not self
.__IsKeyword
( "FV"):
1651 raise Warning("expected Keyword 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1653 if not self
.__IsToken
( "="):
1654 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1656 if not self
.__GetNextToken
():
1657 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1659 RegionObj
.RegionType
= "FV"
1660 RegionObj
.RegionDataList
.append(self
.__Token
)
1662 while self
.__IsKeyword
( "FV"):
1664 if not self
.__IsToken
( "="):
1665 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1667 if not self
.__GetNextToken
():
1668 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1670 RegionObj
.RegionDataList
.append(self
.__Token
)
1672 ## __GetRegionCapType() method
1674 # Get region capsule data for region
1676 # @param self The object pointer
1677 # @param RegionObj for whom region data is got
1679 def __GetRegionCapType(self
, RegionObj
):
1681 if not self
.__IsKeyword
("CAPSULE"):
1682 raise Warning("expected Keyword 'CAPSULE' at line", self
.FileName
, self
.CurrentLineNumber
)
1684 if not self
.__IsToken
("="):
1685 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1687 if not self
.__GetNextToken
():
1688 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1690 RegionObj
.RegionType
= "CAPSULE"
1691 RegionObj
.RegionDataList
.append(self
.__Token
)
1693 while self
.__IsKeyword
("CAPSULE"):
1695 if not self
.__IsToken
("="):
1696 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1698 if not self
.__GetNextToken
():
1699 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1701 RegionObj
.RegionDataList
.append(self
.__Token
)
1703 ## __GetRegionFileType() method
1705 # Get region file data for region
1707 # @param self The object pointer
1708 # @param RegionObj for whom region data is got
1710 def __GetRegionFileType(self
, RegionObj
):
1712 if not self
.__IsKeyword
( "FILE"):
1713 raise Warning("expected Keyword 'FILE' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1715 if not self
.__IsToken
( "="):
1716 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1718 if not self
.__GetNextToken
():
1719 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1721 RegionObj
.RegionType
= "FILE"
1722 RegionObj
.RegionDataList
.append( self
.__Token
)
1724 while self
.__IsKeyword
( "FILE"):
1726 if not self
.__IsToken
( "="):
1727 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1729 if not self
.__GetNextToken
():
1730 raise Warning("expected FILE name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1732 RegionObj
.RegionDataList
.append(self
.__Token
)
1734 ## __GetRegionDataType() method
1736 # Get region array data for region
1738 # @param self The object pointer
1739 # @param RegionObj for whom region data is got
1741 def __GetRegionDataType(self
, RegionObj
):
1743 if not self
.__IsKeyword
( "DATA"):
1744 raise Warning("expected Region Data type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1746 if not self
.__IsToken
( "="):
1747 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1749 if not self
.__IsToken
( "{"):
1750 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1752 if not self
.__GetNextHexNumber
():
1753 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1755 if len(self
.__Token
) > 4:
1756 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1758 DataString
= self
.__Token
1761 while self
.__IsToken
(","):
1762 if not self
.__GetNextHexNumber
():
1763 raise Warning("Invalid Hex number At Line ", self
.FileName
, self
.CurrentLineNumber
)
1764 if len(self
.__Token
) > 4:
1765 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1766 DataString
+= self
.__Token
1769 if not self
.__IsToken
( "}"):
1770 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1772 DataString
= DataString
.rstrip(",")
1773 RegionObj
.RegionType
= "DATA"
1774 RegionObj
.RegionDataList
.append( DataString
)
1776 while self
.__IsKeyword
( "DATA"):
1778 if not self
.__IsToken
( "="):
1779 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1781 if not self
.__IsToken
( "{"):
1782 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1784 if not self
.__GetNextHexNumber
():
1785 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1787 if len(self
.__Token
) > 4:
1788 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1790 DataString
= self
.__Token
1793 while self
.__IsToken
(","):
1794 self
.__GetNextHexNumber
()
1795 if len(self
.__Token
) > 4:
1796 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1797 DataString
+= self
.__Token
1800 if not self
.__IsToken
( "}"):
1801 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1803 DataString
= DataString
.rstrip(",")
1804 RegionObj
.RegionDataList
.append( DataString
)
1808 # Get FV section contents and store its data into FV dictionary of self.Profile
1810 # @param self The object pointer
1811 # @retval True Successfully find a FV
1812 # @retval False Not able to find a FV
1815 if not self
.__GetNextToken
():
1818 S
= self
.__Token
.upper()
1819 if S
.startswith("[") and not S
.startswith("[FV."):
1820 if not S
.startswith("[CAPSULE.") \
1821 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1822 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
)
1827 if not self
.__IsToken
("[FV.", True):
1828 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1829 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1830 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1831 raise Warning("Unknown Keyword At Line ", self
.FileName
, self
.CurrentLineNumber
)
1833 FvName
= self
.__GetUiName
()
1834 self
.CurrentFvName
= FvName
.upper()
1836 if not self
.__IsToken
( "]"):
1837 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1839 FvObj
= CommonDataClass
.FdfClass
.FvClassObject()
1840 FvObj
.UiFvName
= self
.CurrentFvName
1841 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1843 Status
= self
.__GetCreateFile
(FvObj
)
1845 raise Warning("FV name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1847 self
.__GetDefineStatements
(FvObj
)
1849 self
.__GetAddressStatements
(FvObj
)
1851 self
.__GetBlockStatement
(FvObj
)
1853 self
.__GetSetStatements
(FvObj
)
1855 self
.__GetFvAlignment
(FvObj
)
1857 self
.__GetFvAttributes
(FvObj
)
1859 self
.__GetFvNameGuid
(FvObj
)
1861 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1862 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1865 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1866 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1867 if not isInf
and not isFile
:
1872 ## __GetFvAlignment() method
1874 # Get alignment for FV
1876 # @param self The object pointer
1877 # @param Obj for whom alignment is got
1878 # @retval True Successfully find a alignment statement
1879 # @retval False Not able to find a alignment statement
1881 def __GetFvAlignment(self
, Obj
):
1883 if not self
.__IsKeyword
( "FvAlignment"):
1886 if not self
.__IsToken
( "="):
1887 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1889 if not self
.__GetNextToken
():
1890 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1892 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1893 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1894 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1896 raise Warning("Unknown alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1897 Obj
.FvAlignment
= self
.__Token
1900 ## __GetFvAttributes() method
1902 # Get attributes for FV
1904 # @param self The object pointer
1905 # @param Obj for whom attribute is got
1908 def __GetFvAttributes(self
, FvObj
):
1910 while self
.__GetNextWord
():
1912 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1913 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1914 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1915 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1916 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
1917 "WRITE_POLICY_RELIABLE"):
1921 if not self
.__IsToken
( "="):
1922 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1924 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
1925 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
1927 FvObj
.FvAttributeDict
[name
] = self
.__Token
1931 ## __GetFvNameGuid() method
1933 # Get FV GUID for FV
1935 # @param self The object pointer
1936 # @param Obj for whom GUID is got
1939 def __GetFvNameGuid(self
, FvObj
):
1941 if not self
.__IsKeyword
( "FvNameGuid"):
1944 if not self
.__IsToken
( "="):
1945 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1947 if not self
.__GetNextGuid
():
1948 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
1950 FvObj
.FvNameGuid
= self
.__Token
1954 ## __GetAprioriSection() method
1956 # Get token statements
1958 # @param self The object pointer
1959 # @param FvObj for whom apriori is got
1960 # @param MacroDict dictionary used to replace macro
1961 # @retval True Successfully find apriori statement
1962 # @retval False Not able to find apriori statement
1964 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
1966 if not self
.__IsKeyword
( "APRIORI"):
1969 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
1970 raise Warning("expected Apriori file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1971 AprType
= self
.__Token
1973 if not self
.__IsToken
( "{"):
1974 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1976 AprSectionObj
= CommonDataClass
.FdfClass
.AprioriSectionClassObject()
1977 AprSectionObj
.AprioriType
= AprType
1979 self
.__GetDefineStatements
(AprSectionObj
)
1980 MacroDict
.update(AprSectionObj
.DefineVarDict
)
1983 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
1984 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
1985 if not IsInf
and not IsFile
:
1988 if not self
.__IsToken
( "}"):
1989 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1991 FvObj
.AprioriSectionList
.append(AprSectionObj
)
1994 ## __GetInfStatement() method
1996 # Get INF statements
1998 # @param self The object pointer
1999 # @param Obj for whom inf statement is got
2000 # @param MacroDict dictionary used to replace macro
2001 # @retval True Successfully find inf statement
2002 # @retval False Not able to find inf statement
2004 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2006 if not self
.__IsKeyword
( "INF"):
2009 ffsInf
= CommonDataClass
.FdfClass
.FfsInfStatementClassObject()
2010 self
.__GetInfOptions
( ffsInf
)
2012 if not self
.__GetNextToken
():
2013 raise Warning("expected INF file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2014 ffsInf
.InfFileName
= self
.__Token
2016 # if ffsInf.InfFileName.find('$') >= 0:
2017 # ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
2019 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2020 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2021 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2022 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2024 if self
.__IsToken
('|'):
2025 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2026 ffsInf
.KeepReloc
= False
2027 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2028 ffsInf
.KeepReloc
= True
2030 raise Warning("Unknown reloc strip flag At Line ", self
.FileName
, self
.CurrentLineNumber
)
2033 capsuleFfs
= CapsuleData
.CapsuleFfs()
2034 capsuleFfs
.Ffs
= ffsInf
2035 Obj
.CapsuleDataList
.append(capsuleFfs
)
2037 Obj
.FfsList
.append(ffsInf
)
2040 ## __GetInfOptions() method
2042 # Get options for INF
2044 # @param self The object pointer
2045 # @param FfsInfObj for whom option is got
2047 def __GetInfOptions(self
, FfsInfObj
):
2049 if self
.__IsKeyword
( "RuleOverride"):
2050 if not self
.__IsToken
( "="):
2051 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2052 if not self
.__GetNextToken
():
2053 raise Warning("expected Rule name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2054 FfsInfObj
.Rule
= self
.__Token
2056 if self
.__IsKeyword
( "VERSION"):
2057 if not self
.__IsToken
( "="):
2058 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2059 if not self
.__GetNextToken
():
2060 raise Warning("expected Version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2062 if self
.__GetStringData
():
2063 FfsInfObj
.Version
= self
.__Token
2065 if self
.__IsKeyword
( "UI"):
2066 if not self
.__IsToken
( "="):
2067 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2068 if not self
.__GetNextToken
():
2069 raise Warning("expected UI name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2071 if self
.__GetStringData
():
2072 FfsInfObj
.Ui
= self
.__Token
2074 if self
.__IsKeyword
( "USE"):
2075 if not self
.__IsToken
( "="):
2076 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2077 if not self
.__GetNextToken
():
2078 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2079 FfsInfObj
.UseArch
= self
.__Token
2082 if self
.__GetNextToken
():
2083 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2084 if p
.match(self
.__Token
):
2085 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2086 if not self
.__IsToken
(","):
2092 while self
.__GetNextToken
():
2093 if not p
.match(self
.__Token
):
2094 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2095 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2097 if not self
.__IsToken
(","):
2100 ## __GetFileStatement() method
2102 # Get FILE statements
2104 # @param self The object pointer
2105 # @param Obj for whom FILE statement is got
2106 # @param MacroDict dictionary used to replace macro
2107 # @retval True Successfully find FILE statement
2108 # @retval False Not able to find FILE statement
2110 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2112 if not self
.__IsKeyword
( "FILE"):
2115 FfsFileObj
= CommonDataClass
.FdfClass
.FileStatementClassObject()
2117 if not self
.__GetNextWord
():
2118 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2119 FfsFileObj
.FvFileType
= self
.__Token
2121 if not self
.__IsToken
( "="):
2122 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2124 if not self
.__GetNextGuid
():
2125 if not self
.__GetNextWord
():
2126 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2127 if self
.__Token
== 'PCD':
2128 if not self
.__IsToken
( "("):
2129 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2130 PcdPair
= self
.__GetNextPcdName
()
2131 if not self
.__IsToken
( ")"):
2132 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2133 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2135 FfsFileObj
.NameGuid
= self
.__Token
2137 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2140 capsuleFfs
= CapsuleData
.CapsuleFfs()
2141 capsuleFfs
.Ffs
= FfsFileObj
2142 Obj
.CapsuleDataList
.append(capsuleFfs
)
2144 Obj
.FfsList
.append(FfsFileObj
)
2148 ## __FileCouldHaveRelocFlag() method
2150 # Check whether reloc strip flag can be set for a file type.
2152 # @param self The object pointer
2153 # @param FileType The file type to check with
2154 # @retval True This type could have relocation strip flag
2155 # @retval False No way to have it
2158 def __FileCouldHaveRelocFlag (self
, FileType
):
2159 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2164 ## __SectionCouldHaveRelocFlag() method
2166 # Check whether reloc strip flag can be set for a section type.
2168 # @param self The object pointer
2169 # @param SectionType The section type to check with
2170 # @retval True This type could have relocation strip flag
2171 # @retval False No way to have it
2174 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2175 if SectionType
in ('TE', 'PE32'):
2180 ## __GetFilePart() method
2182 # Get components for FILE statement
2184 # @param self The object pointer
2185 # @param FfsFileObj for whom component is got
2186 # @param MacroDict dictionary used to replace macro
2188 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2190 self
.__GetFileOpts
( FfsFileObj
)
2192 if not self
.__IsToken
("{"):
2193 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2194 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2195 # if self.__Token == 'RELOCS_STRIPPED':
2196 # FfsFileObj.KeepReloc = False
2198 # FfsFileObj.KeepReloc = True
2200 # raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2202 # if not self.__IsToken("{"):
2203 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2205 if not self
.__GetNextToken
():
2206 raise Warning("expected File name or section data At Line ", self
.FileName
, self
.CurrentLineNumber
)
2208 if self
.__Token
== "FV":
2209 if not self
.__IsToken
( "="):
2210 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2211 if not self
.__GetNextToken
():
2212 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2213 FfsFileObj
.FvName
= self
.__Token
2215 elif self
.__Token
== "FD":
2216 if not self
.__IsToken
( "="):
2217 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2218 if not self
.__GetNextToken
():
2219 raise Warning("expected FD name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2220 FfsFileObj
.FdName
= self
.__Token
2222 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2224 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2226 FfsFileObj
.FileName
= self
.__Token
2228 if not self
.__IsToken
( "}"):
2229 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2231 ## __GetFileOpts() method
2233 # Get options for FILE statement
2235 # @param self The object pointer
2236 # @param FfsFileObj for whom options is got
2238 def __GetFileOpts(self
, FfsFileObj
):
2240 if self
.__GetNextToken
():
2241 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2242 if Pattern
.match(self
.__Token
):
2243 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2244 if self
.__IsToken
(","):
2245 while self
.__GetNextToken
():
2246 if not Pattern
.match(self
.__Token
):
2247 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2248 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2250 if not self
.__IsToken
(","):
2256 if self
.__IsKeyword
( "FIXED", True):
2257 FfsFileObj
.Fixed
= True
2259 if self
.__IsKeyword
( "CHECKSUM", True):
2260 FfsFileObj
.CheckSum
= True
2262 if self
.__GetAlignment
():
2263 FfsFileObj
.Alignment
= self
.__Token
2267 ## __GetAlignment() method
2269 # Return the alignment value
2271 # @param self The object pointer
2272 # @retval True Successfully find alignment
2273 # @retval False Not able to find alignment
2275 def __GetAlignment(self
):
2276 if self
.__IsKeyword
( "Align", True):
2277 if not self
.__IsToken
( "="):
2278 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2280 if not self
.__GetNextToken
():
2281 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2286 ## __GetFilePart() method
2288 # Get section data for FILE statement
2290 # @param self The object pointer
2291 # @param FfsFileObj for whom section is got
2292 # @param MacroDict dictionary used to replace macro
2294 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2296 Dict
.update(MacroDict
)
2298 self
.__GetDefineStatements
(FfsFileObj
)
2300 Dict
.update(FfsFileObj
.DefineVarDict
)
2301 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2302 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2305 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2306 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2307 if not IsLeafSection
and not IsEncapSection
:
2310 ## __GetLeafSection() method
2312 # Get leaf section for Obj
2314 # @param self The object pointer
2315 # @param Obj for whom leaf section is got
2316 # @param MacroDict dictionary used to replace macro
2317 # @retval True Successfully find section statement
2318 # @retval False Not able to find section statement
2320 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2322 OldPos
= self
.GetFileBufferPos()
2324 if not self
.__IsKeyword
( "SECTION"):
2325 if len(Obj
.SectionList
) == 0:
2326 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2331 if self
.__GetAlignment
():
2332 AlignValue
= self
.__Token
2335 if self
.__IsKeyword
( "BUILD_NUM"):
2336 if not self
.__IsToken
( "="):
2337 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2339 if not self
.__GetNextToken
():
2340 raise Warning("expected Build number value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2342 BuildNum
= self
.__Token
2344 if self
.__IsKeyword
( "VERSION"):
2345 if not self
.__IsToken
( "="):
2346 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2347 if not self
.__GetNextToken
():
2348 raise Warning("expected version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2349 VerSectionObj
= CommonDataClass
.FdfClass
.VerSectionClassObject()
2350 VerSectionObj
.Alignment
= AlignValue
2351 VerSectionObj
.BuildNum
= BuildNum
2352 if self
.__GetStringData
():
2353 VerSectionObj
.StringData
= self
.__Token
2355 VerSectionObj
.FileName
= self
.__Token
2356 Obj
.SectionList
.append(VerSectionObj
)
2358 elif self
.__IsKeyword
( "UI"):
2359 if not self
.__IsToken
( "="):
2360 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2361 if not self
.__GetNextToken
():
2362 raise Warning("expected UI At Line ", self
.FileName
, self
.CurrentLineNumber
)
2363 UiSectionObj
= CommonDataClass
.FdfClass
.UiSectionClassObject()
2364 UiSectionObj
.Alignment
= AlignValue
2365 if self
.__GetStringData
():
2366 UiSectionObj
.StringData
= self
.__Token
2368 UiSectionObj
.FileName
= self
.__Token
2369 Obj
.SectionList
.append(UiSectionObj
)
2371 elif self
.__IsKeyword
( "FV_IMAGE"):
2372 if not self
.__IsToken
( "="):
2373 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2374 if not self
.__GetNextWord
():
2375 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2377 FvName
= self
.__Token
.upper()
2380 if self
.__IsToken
( "{"):
2382 FvObj
.UiFvName
= FvName
2383 self
.__GetDefineStatements
(FvObj
)
2384 MacroDict
.update(FvObj
.DefineVarDict
)
2385 self
.__GetBlockStatement
(FvObj
)
2386 self
.__GetSetStatements
(FvObj
)
2387 self
.__GetFvAlignment
(FvObj
)
2388 self
.__GetFvAttributes
(FvObj
)
2389 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2390 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2393 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2394 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2395 if not IsInf
and not IsFile
:
2398 if not self
.__IsToken
( "}"):
2399 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2401 FvImageSectionObj
= CommonDataClass
.FdfClass
.FvImageSectionClassObject()
2402 FvImageSectionObj
.Alignment
= AlignValue
2404 FvImageSectionObj
.Fv
= FvObj
2405 FvImageSectionObj
.FvName
= None
2407 FvImageSectionObj
.FvName
= FvName
2409 Obj
.SectionList
.append(FvImageSectionObj
)
2411 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP"):
2412 DepexSectionObj
= CommonDataClass
.FdfClass
.DepexSectionClassObject()
2413 DepexSectionObj
.Alignment
= AlignValue
2414 DepexSectionObj
.DepexType
= self
.__Token
2416 if not self
.__IsToken
( "="):
2417 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2418 if not self
.__IsToken
( "{"):
2419 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2420 if not self
.__SkipToToken
( "}"):
2421 raise Warning("expected Depex expression ending '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2423 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2424 Obj
.SectionList
.append(DepexSectionObj
)
2428 if not self
.__GetNextWord
():
2429 raise Warning("expected section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2431 # Encapsulation section appear, UndoToken and return
2432 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2433 self
.SetFileBufferPos(OldPos
)
2436 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2437 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2438 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2440 DataSectionObj
= CommonDataClass
.FdfClass
.DataSectionClassObject()
2441 DataSectionObj
.Alignment
= AlignValue
2442 DataSectionObj
.SecType
= self
.__Token
2444 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2445 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2446 if self
.__Token
== 'RELOCS_STRIPPED':
2447 DataSectionObj
.KeepReloc
= False
2449 DataSectionObj
.KeepReloc
= True
2451 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
)
2453 if self
.__IsToken
("="):
2454 if not self
.__GetNextToken
():
2455 raise Warning("expected section file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2456 DataSectionObj
.SectFileName
= self
.__Token
2458 if not self
.__GetCglSection
(DataSectionObj
):
2461 Obj
.SectionList
.append(DataSectionObj
)
2465 ## __GetCglSection() method
2467 # Get compressed or GUIDed section for Obj
2469 # @param self The object pointer
2470 # @param Obj for whom leaf section is got
2471 # @param AlignValue alignment value for complex section
2472 # @retval True Successfully find section statement
2473 # @retval False Not able to find section statement
2475 def __GetCglSection(self
, Obj
, AlignValue
= None):
2477 if self
.__IsKeyword
( "COMPRESS"):
2479 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2482 if not self
.__IsToken
("{"):
2483 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2485 CompressSectionObj
= CommonDataClass
.FdfClass
.CompressSectionClassObject()
2486 CompressSectionObj
.Alignment
= AlignValue
2487 CompressSectionObj
.CompType
= type
2488 # Recursive sections...
2490 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2491 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2492 if not IsLeafSection
and not IsEncapSection
:
2496 if not self
.__IsToken
( "}"):
2497 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2498 Obj
.SectionList
.append(CompressSectionObj
)
2501 # raise Warning("Compress type not known At Line ")
2505 elif self
.__IsKeyword
( "GUIDED"):
2507 if self
.__GetNextGuid
():
2508 GuidValue
= self
.__Token
2510 AttribDict
= self
.__GetGuidAttrib
()
2511 if not self
.__IsToken
("{"):
2512 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2513 GuidSectionObj
= CommonDataClass
.FdfClass
.GuidSectionClassObject()
2514 GuidSectionObj
.Alignment
= AlignValue
2515 GuidSectionObj
.NameGuid
= GuidValue
2516 GuidSectionObj
.SectionType
= "GUIDED"
2517 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2518 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2519 # Recursive sections...
2521 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2522 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2523 if not IsLeafSection
and not IsEncapSection
:
2526 if not self
.__IsToken
( "}"):
2527 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2528 Obj
.SectionList
.append(GuidSectionObj
)
2534 ## __GetGuidAttri() method
2536 # Get attributes for GUID section
2538 # @param self The object pointer
2539 # @retval AttribDict Dictionary of key-value pair of section attributes
2541 def __GetGuidAttrib(self
):
2544 AttribDict
["PROCESSING_REQUIRED"] = False
2545 AttribDict
["AUTH_STATUS_VALID"] = False
2546 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2547 AttribKey
= self
.__Token
2549 if not self
.__IsToken
("="):
2550 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2552 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2553 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2554 AttribDict
[AttribKey
] = self
.__Token
2556 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2557 AttribKey
= self
.__Token
2559 if not self
.__IsToken
("="):
2560 raise Warning("expected '=' At Line ")
2562 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2563 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2564 AttribDict
[AttribKey
] = self
.__Token
2568 ## __GetEncapsulationSec() method
2570 # Get encapsulation section for FILE
2572 # @param self The object pointer
2573 # @param FfsFile for whom section is got
2574 # @retval True Successfully find section statement
2575 # @retval False Not able to find section statement
2577 def __GetEncapsulationSec(self
, FfsFileObj
):
2579 OldPos
= self
.GetFileBufferPos()
2580 if not self
.__IsKeyword
( "SECTION"):
2581 if len(FfsFileObj
.SectionList
) == 0:
2582 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2587 if self
.__GetAlignment
():
2588 AlignValue
= self
.__Token
2590 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2591 self
.SetFileBufferPos(OldPos
)
2596 ## __GetCapsule() method
2598 # Get capsule section contents and store its data into capsule list of self.Profile
2600 # @param self The object pointer
2601 # @retval True Successfully find a capsule
2602 # @retval False Not able to find a capsule
2604 def __GetCapsule(self
):
2606 if not self
.__GetNextToken
():
2609 S
= self
.__Token
.upper()
2610 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2611 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2612 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2617 if not self
.__IsToken
("[CAPSULE.", True):
2618 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2619 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2620 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2621 raise Warning("expected [Capsule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2623 CapsuleObj
= CommonDataClass
.FdfClass
.CapsuleClassObject()
2625 CapsuleName
= self
.__GetUiName
()
2627 raise Warning("expected capsule name At line ", self
.FileName
, self
.CurrentLineNumber
)
2629 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2631 if not self
.__IsToken
( "]"):
2632 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2634 if self
.__IsKeyword
("CREATE_FILE"):
2635 if not self
.__IsToken
( "="):
2636 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2638 if not self
.__GetNextToken
():
2639 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2641 CapsuleObj
.CreateFile
= self
.__Token
2643 self
.__GetCapsuleStatements
(CapsuleObj
)
2644 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2647 ## __GetCapsuleStatements() method
2649 # Get statements for capsule
2651 # @param self The object pointer
2652 # @param Obj for whom statements are got
2654 def __GetCapsuleStatements(self
, Obj
):
2655 self
.__GetCapsuleTokens
(Obj
)
2656 self
.__GetDefineStatements
(Obj
)
2657 self
.__GetSetStatements
(Obj
)
2659 self
.__GetCapsuleData
(Obj
)
2661 ## __GetCapsuleStatements() method
2663 # Get token statements for capsule
2665 # @param self The object pointer
2666 # @param Obj for whom token statements are got
2668 def __GetCapsuleTokens(self
, Obj
):
2670 if not self
.__IsKeyword
("CAPSULE_GUID"):
2671 raise Warning("expected 'CAPSULE_GUID' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2673 while self
.__CurrentLine
().find("=") != -1:
2674 NameValue
= self
.__CurrentLine
().split("=")
2675 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2676 self
.CurrentLineNumber
+= 1
2677 self
.CurrentOffsetWithinLine
= 0
2679 ## __GetCapsuleData() method
2681 # Get capsule data for capsule
2683 # @param self The object pointer
2684 # @param Obj for whom capsule data are got
2686 def __GetCapsuleData(self
, Obj
):
2689 IsInf
= self
.__GetInfStatement
(Obj
, True)
2690 IsFile
= self
.__GetFileStatement
(Obj
, True)
2691 IsFv
= self
.__GetFvStatement
(Obj
)
2692 if not IsInf
and not IsFile
and not IsFv
:
2695 ## __GetFvStatement() method
2697 # Get FV for capsule
2699 # @param self The object pointer
2700 # @param CapsuleObj for whom FV is got
2701 # @retval True Successfully find a FV statement
2702 # @retval False Not able to find a FV statement
2704 def __GetFvStatement(self
, CapsuleObj
):
2706 if not self
.__IsKeyword
("FV"):
2709 if not self
.__IsToken
("="):
2710 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2712 if not self
.__GetNextToken
():
2713 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2715 # CapsuleFv = CapsuleData.CapsuleFv()
2716 # CapsuleFv.FvName = self.__Token
2717 # CapsuleObj.CapsuleDataList.append(CapsuleFv)
2720 ## __GetRule() method
2722 # Get Rule section contents and store its data into rule list of self.Profile
2724 # @param self The object pointer
2725 # @retval True Successfully find a Rule
2726 # @retval False Not able to find a Rule
2728 def __GetRule(self
):
2730 if not self
.__GetNextToken
():
2733 S
= self
.__Token
.upper()
2734 if S
.startswith("[") and not S
.startswith("[RULE."):
2735 if not S
.startswith("[OPTIONROM."):
2736 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2740 if not self
.__IsToken
("[Rule.", True):
2741 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2742 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2743 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2744 raise Warning("expected [Rule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2746 if not self
.__SkipToToken
("."):
2747 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2749 Arch
= self
.__SkippedChars
.rstrip(".")
2750 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
2751 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2753 ModuleType
= self
.__GetModuleType
()
2756 if self
.__IsToken
("."):
2757 if not self
.__GetNextWord
():
2758 raise Warning("expected template name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2759 TemplateName
= self
.__Token
2761 if not self
.__IsToken
( "]"):
2762 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2764 RuleObj
= self
.__GetRuleFileStatements
()
2765 RuleObj
.Arch
= Arch
.upper()
2766 RuleObj
.ModuleType
= ModuleType
2767 RuleObj
.TemplateName
= TemplateName
2768 if TemplateName
== '' :
2769 self
.Profile
.RuleDict
['RULE' + \
2773 ModuleType
.upper() ] = RuleObj
2775 self
.Profile
.RuleDict
['RULE' + \
2779 ModuleType
.upper() + \
2781 TemplateName
.upper() ] = RuleObj
2782 # self.Profile.RuleList.append(rule)
2785 ## __GetModuleType() method
2787 # Return the module type
2789 # @param self The object pointer
2790 # @retval string module type
2792 def __GetModuleType(self
):
2794 if not self
.__GetNextWord
():
2795 raise Warning("expected Module type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2796 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2797 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2798 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2799 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2800 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2801 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_DRIVER", "SMM_CORE"):
2802 raise Warning("Unknown Module type At line ", self
.FileName
, self
.CurrentLineNumber
)
2805 ## __GetFileExtension() method
2807 # Return the file extension
2809 # @param self The object pointer
2810 # @retval string file name extension
2812 def __GetFileExtension(self
):
2813 if not self
.__IsToken
("."):
2814 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2817 if self
.__GetNextToken
():
2818 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
2819 if Pattern
.match(self
.__Token
):
2823 raise Warning("Unknown file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2826 raise Warning("expected file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2828 ## __GetRuleFileStatement() method
2832 # @param self The object pointer
2833 # @retval Rule Rule object
2835 def __GetRuleFileStatements(self
):
2837 if not self
.__IsKeyword
("FILE"):
2838 raise Warning("expected FILE At Line ", self
.FileName
, self
.CurrentLineNumber
)
2840 if not self
.__GetNextWord
():
2841 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2843 Type
= self
.__Token
.strip().upper()
2844 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2845 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM_DXE_COMBO", "SMM", "SMM_CORE"):
2846 raise Warning("Unknown FV type At line ", self
.FileName
, self
.CurrentLineNumber
)
2848 if not self
.__IsToken
("="):
2849 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2851 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2852 if not self
.__GetNextWord
():
2853 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2854 if self
.__Token
== 'PCD':
2855 if not self
.__IsToken
( "("):
2856 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2857 PcdPair
= self
.__GetNextPcdName
()
2858 if not self
.__IsToken
( ")"):
2859 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2860 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2862 NameGuid
= self
.__Token
2865 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2866 if self
.__FileCouldHaveRelocFlag
(Type
):
2867 if self
.__Token
== 'RELOCS_STRIPPED':
2872 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2875 if self
.__GetNextToken
():
2876 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2877 if Pattern
.match(self
.__Token
):
2878 KeyStringList
.append(self
.__Token
)
2879 if self
.__IsToken
(","):
2880 while self
.__GetNextToken
():
2881 if not Pattern
.match(self
.__Token
):
2882 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2883 KeyStringList
.append(self
.__Token
)
2885 if not self
.__IsToken
(","):
2893 if self
.__IsKeyword
("Fixed", True):
2897 if self
.__IsKeyword
("CheckSum", True):
2901 if self
.__GetAlignment
():
2902 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2903 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2904 AlignValue
= self
.__Token
2906 if self
.__IsToken
("{"):
2907 # Complex file rule expected
2908 Rule
= RuleComplexFile
.RuleComplexFile()
2909 Rule
.FvFileType
= Type
2910 Rule
.NameGuid
= NameGuid
2911 Rule
.Alignment
= AlignValue
2912 Rule
.CheckSum
= CheckSum
2914 Rule
.KeyStringList
= KeyStringList
2915 if KeepReloc
!= None:
2916 Rule
.KeepReloc
= KeepReloc
2919 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2920 IsLeaf
= self
.__GetEfiSection
(Rule
)
2921 if not IsEncapsulate
and not IsLeaf
:
2924 if not self
.__IsToken
("}"):
2925 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2929 elif self
.__IsToken
("|"):
2931 Ext
= self
.__GetFileExtension
()
2933 Rule
= RuleSimpleFile
.RuleSimpleFile()
2935 Rule
.FvFileType
= Type
2936 Rule
.NameGuid
= NameGuid
2937 Rule
.Alignment
= AlignValue
2938 Rule
.CheckSum
= CheckSum
2940 Rule
.FileExtension
= Ext
2941 Rule
.KeyStringList
= KeyStringList
2942 if KeepReloc
!= None:
2943 Rule
.KeepReloc
= KeepReloc
2948 # Simple file rule expected
2949 if not self
.__GetNextWord
():
2950 raise Warning("expected leaf section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2952 SectionName
= self
.__Token
2954 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2955 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2956 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2959 if self
.__IsKeyword
("Fixed", True):
2962 if self
.__IsKeyword
("CheckSum", True):
2965 if self
.__GetAlignment
():
2966 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2967 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2968 AlignValue
= self
.__Token
2970 if not self
.__GetNextToken
():
2971 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2973 Rule
= RuleSimpleFile
.RuleSimpleFile()
2974 Rule
.SectionType
= SectionName
2975 Rule
.FvFileType
= Type
2976 Rule
.NameGuid
= NameGuid
2977 Rule
.Alignment
= AlignValue
2978 Rule
.CheckSum
= CheckSum
2980 Rule
.FileName
= self
.__Token
2981 Rule
.KeyStringList
= KeyStringList
2982 if KeepReloc
!= None:
2983 Rule
.KeepReloc
= KeepReloc
2986 ## __GetEfiSection() method
2988 # Get section list for Rule
2990 # @param self The object pointer
2991 # @param Obj for whom section is got
2992 # @retval True Successfully find section statement
2993 # @retval False Not able to find section statement
2995 def __GetEfiSection(self
, Obj
):
2997 OldPos
= self
.GetFileBufferPos()
2998 if not self
.__GetNextWord
():
3000 SectionName
= self
.__Token
3002 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3003 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3007 if SectionName
== "FV_IMAGE":
3008 FvImageSectionObj
= FvImageSection
.FvImageSection()
3009 if self
.__IsKeyword
("FV_IMAGE"):
3011 if self
.__IsToken
( "{"):
3013 self
.__GetDefineStatements
(FvObj
)
3014 self
.__GetBlockStatement
(FvObj
)
3015 self
.__GetSetStatements
(FvObj
)
3016 self
.__GetFvAlignment
(FvObj
)
3017 self
.__GetFvAttributes
(FvObj
)
3018 self
.__GetAprioriSection
(FvObj
)
3019 self
.__GetAprioriSection
(FvObj
)
3022 IsInf
= self
.__GetInfStatement
(FvObj
)
3023 IsFile
= self
.__GetFileStatement
(FvObj
)
3024 if not IsInf
and not IsFile
:
3027 if not self
.__IsToken
( "}"):
3028 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3029 FvImageSectionObj
.Fv
= FvObj
3030 FvImageSectionObj
.FvName
= None
3033 if not self
.__IsKeyword
("FV"):
3034 raise Warning("expected 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3035 FvImageSectionObj
.FvFileType
= self
.__Token
3037 if self
.__GetAlignment
():
3038 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3039 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3040 FvImageSectionObj
.Alignment
= self
.__Token
3042 if self
.__IsKeyword
("FV"):
3043 FvImageSectionObj
.FvFileType
= self
.__Token
3045 if self
.__GetAlignment
():
3046 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3047 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3048 FvImageSectionObj
.Alignment
= self
.__Token
3050 if self
.__IsToken
('|'):
3051 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3052 elif self
.__GetNextToken
():
3053 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3054 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3055 FvImageSectionObj
.FvFileName
= self
.__Token
3059 raise Warning("expected FV file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3061 Obj
.SectionList
.append(FvImageSectionObj
)
3064 EfiSectionObj
= EfiSection
.EfiSection()
3065 EfiSectionObj
.SectionType
= SectionName
3067 if not self
.__GetNextToken
():
3068 raise Warning("expected file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3070 if self
.__Token
== "STRING":
3071 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3072 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3074 if not self
.__IsToken
('='):
3075 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3077 if not self
.__GetNextToken
():
3078 raise Warning("expected Quoted String At Line ", self
.FileName
, self
.CurrentLineNumber
)
3080 if self
.__GetStringData
():
3081 EfiSectionObj
.StringData
= self
.__Token
3083 if self
.__IsKeyword
("BUILD_NUM"):
3084 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3085 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3087 if not self
.__IsToken
("="):
3088 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3089 if not self
.__GetNextToken
():
3090 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3091 EfiSectionObj
.BuildNum
= self
.__Token
3094 EfiSectionObj
.FileType
= self
.__Token
3095 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3097 if self
.__IsKeyword
("Optional"):
3098 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3099 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3100 EfiSectionObj
.Optional
= True
3102 if self
.__IsKeyword
("BUILD_NUM"):
3103 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3104 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3106 if not self
.__IsToken
("="):
3107 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3108 if not self
.__GetNextToken
():
3109 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3110 EfiSectionObj
.BuildNum
= self
.__Token
3112 if self
.__GetAlignment
():
3113 EfiSectionObj
.Alignment
= self
.__Token
3115 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3116 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3117 if self
.__Token
== 'RELOCS_STRIPPED':
3118 EfiSectionObj
.KeepReloc
= False
3120 EfiSectionObj
.KeepReloc
= True
3121 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3122 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3124 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3127 if self
.__IsToken
('|'):
3128 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3129 elif self
.__GetNextToken
():
3130 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3131 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3133 if self
.__Token
.startswith('PCD'):
3135 self
.__GetNextWord
()
3137 if self
.__Token
== 'PCD':
3138 if not self
.__IsToken
( "("):
3139 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3140 PcdPair
= self
.__GetNextPcdName
()
3141 if not self
.__IsToken
( ")"):
3142 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3143 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3145 EfiSectionObj
.FileName
= self
.__Token
3150 raise Warning("expected section file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3152 Obj
.SectionList
.append(EfiSectionObj
)
3155 ## __RuleSectionCouldBeOptional() method
3157 # Get whether a section could be optional
3159 # @param self The object pointer
3160 # @param SectionType The section type to check
3161 # @retval True section could be optional
3162 # @retval False section never optional
3164 def __RuleSectionCouldBeOptional(self
, SectionType
):
3165 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3170 ## __RuleSectionCouldHaveBuildNum() method
3172 # Get whether a section could have build number information
3174 # @param self The object pointer
3175 # @param SectionType The section type to check
3176 # @retval True section could have build number information
3177 # @retval False section never have build number information
3179 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3180 if SectionType
in ("VERSION"):
3185 ## __RuleSectionCouldHaveString() method
3187 # Get whether a section could have string
3189 # @param self The object pointer
3190 # @param SectionType The section type to check
3191 # @retval True section could have string
3192 # @retval False section never have string
3194 def __RuleSectionCouldHaveString(self
, SectionType
):
3195 if SectionType
in ("UI", "VERSION"):
3200 ## __CheckRuleSectionFileType() method
3202 # Get whether a section matches a file type
3204 # @param self The object pointer
3205 # @param SectionType The section type to check
3206 # @param FileType The file type to check
3208 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3209 if SectionType
== "COMPAT16":
3210 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3211 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3212 elif SectionType
== "PE32":
3213 if FileType
not in ("PE32", "SEC_PE32"):
3214 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3215 elif SectionType
== "PIC":
3216 if FileType
not in ("PIC", "PIC"):
3217 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3218 elif SectionType
== "TE":
3219 if FileType
not in ("TE", "SEC_TE"):
3220 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3221 elif SectionType
== "RAW":
3222 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3223 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3224 elif SectionType
== "DXE_DEPEX":
3225 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX"):
3226 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3227 elif SectionType
== "UI":
3228 if FileType
not in ("UI", "SEC_UI"):
3229 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3230 elif SectionType
== "VERSION":
3231 if FileType
not in ("VERSION", "SEC_VERSION"):
3232 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3233 elif SectionType
== "PEI_DEPEX":
3234 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3235 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3236 elif SectionType
== "GUID":
3237 if FileType
not in ("PE32", "SEC_GUID"):
3238 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3240 ## __GetRuleEncapsulationSection() method
3242 # Get encapsulation section for Rule
3244 # @param self The object pointer
3245 # @param Rule for whom section is got
3246 # @retval True Successfully find section statement
3247 # @retval False Not able to find section statement
3249 def __GetRuleEncapsulationSection(self
, Rule
):
3251 if self
.__IsKeyword
( "COMPRESS"):
3253 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3256 if not self
.__IsToken
("{"):
3257 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3259 CompressSectionObj
= CompressSection
.CompressSection()
3261 CompressSectionObj
.CompType
= Type
3262 # Recursive sections...
3264 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3265 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3266 if not IsEncapsulate
and not IsLeaf
:
3269 if not self
.__IsToken
( "}"):
3270 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3271 Rule
.SectionList
.append(CompressSectionObj
)
3275 elif self
.__IsKeyword
( "GUIDED"):
3277 if self
.__GetNextGuid
():
3278 GuidValue
= self
.__Token
3280 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3281 GuidValue
= self
.__Token
3283 AttribDict
= self
.__GetGuidAttrib
()
3285 if not self
.__IsToken
("{"):
3286 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3287 GuidSectionObj
= GuidSection
.GuidSection()
3288 GuidSectionObj
.NameGuid
= GuidValue
3289 GuidSectionObj
.SectionType
= "GUIDED"
3290 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3291 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3295 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3296 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3297 if not IsEncapsulate
and not IsLeaf
:
3300 if not self
.__IsToken
( "}"):
3301 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3302 Rule
.SectionList
.append(GuidSectionObj
)
3308 ## __GetVtf() method
3310 # Get VTF section contents and store its data into VTF list of self.Profile
3312 # @param self The object pointer
3313 # @retval True Successfully find a VTF
3314 # @retval False Not able to find a VTF
3318 if not self
.__GetNextToken
():
3321 S
= self
.__Token
.upper()
3322 if S
.startswith("[") and not S
.startswith("[VTF."):
3323 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3324 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3329 if not self
.__IsToken
("[VTF.", True):
3330 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3331 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3332 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
3333 raise Warning("expected [VTF.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
3335 if not self
.__SkipToToken
("."):
3336 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3338 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3339 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3340 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3342 if not self
.__GetNextWord
():
3343 raise Warning("expected VTF name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3344 Name
= self
.__Token
.upper()
3347 VtfObj
.UiName
= Name
3348 VtfObj
.KeyArch
= Arch
3350 if self
.__IsToken
(","):
3351 if not self
.__GetNextWord
():
3352 raise Warning("expected Arch list At Line ", self
.FileName
, self
.CurrentLineNumber
)
3353 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3354 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3355 VtfObj
.ArchList
= self
.__Token
.upper()
3357 if not self
.__IsToken
( "]"):
3358 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3360 if self
.__IsKeyword
("IA32_RST_BIN"):
3361 if not self
.__IsToken
("="):
3362 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3364 if not self
.__GetNextToken
():
3365 raise Warning("expected Reset file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3367 VtfObj
.ResetBin
= self
.__Token
3369 while self
.__GetComponentStatement
(VtfObj
):
3372 self
.Profile
.VtfList
.append(VtfObj
)
3375 ## __GetComponentStatement() method
3377 # Get components in VTF
3379 # @param self The object pointer
3380 # @param VtfObj for whom component is got
3381 # @retval True Successfully find a component
3382 # @retval False Not able to find a component
3384 def __GetComponentStatement(self
, VtfObj
):
3386 if not self
.__IsKeyword
("COMP_NAME"):
3389 if not self
.__IsToken
("="):
3390 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3392 if not self
.__GetNextWord
():
3393 raise Warning("expected Component Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3395 CompStatementObj
= ComponentStatement
.ComponentStatement()
3396 CompStatementObj
.CompName
= self
.__Token
3398 if not self
.__IsKeyword
("COMP_LOC"):
3399 raise Warning("expected COMP_LOC At Line ", self
.FileName
, self
.CurrentLineNumber
)
3401 if not self
.__IsToken
("="):
3402 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3404 CompStatementObj
.CompLoc
= ""
3405 if self
.__GetNextWord
():
3406 CompStatementObj
.CompLoc
= self
.__Token
3407 if self
.__IsToken
('|'):
3408 if not self
.__GetNextWord
():
3409 raise Warning("Expected Region Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3411 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3412 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3414 CompStatementObj
.FilePos
= self
.__Token
3416 self
.CurrentLineNumber
+= 1
3417 self
.CurrentOffsetWithinLine
= 0
3419 if not self
.__IsKeyword
("COMP_TYPE"):
3420 raise Warning("expected COMP_TYPE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3422 if not self
.__IsToken
("="):
3423 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3425 if not self
.__GetNextToken
():
3426 raise Warning("expected Component type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3427 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3428 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3429 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3430 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3431 CompStatementObj
.CompType
= self
.__Token
3433 if not self
.__IsKeyword
("COMP_VER"):
3434 raise Warning("expected COMP_VER At Line ", self
.FileName
, self
.CurrentLineNumber
)
3436 if not self
.__IsToken
("="):
3437 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3439 if not self
.__GetNextToken
():
3440 raise Warning("expected Component version At Line ", self
.FileName
, self
.CurrentLineNumber
)
3442 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3443 if Pattern
.match(self
.__Token
) == None:
3444 raise Warning("Unknown version format At line ", self
.FileName
, self
.CurrentLineNumber
)
3445 CompStatementObj
.CompVer
= self
.__Token
3447 if not self
.__IsKeyword
("COMP_CS"):
3448 raise Warning("expected COMP_CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3450 if not self
.__IsToken
("="):
3451 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3453 if not self
.__GetNextToken
():
3454 raise Warning("expected Component CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3455 if self
.__Token
not in ("1", "0"):
3456 raise Warning("Unknown Component CS At line ", self
.FileName
, self
.CurrentLineNumber
)
3457 CompStatementObj
.CompCs
= self
.__Token
3460 if not self
.__IsKeyword
("COMP_BIN"):
3461 raise Warning("expected COMP_BIN At Line ", self
.FileName
, self
.CurrentLineNumber
)
3463 if not self
.__IsToken
("="):
3464 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3466 if not self
.__GetNextToken
():
3467 raise Warning("expected Component file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3469 CompStatementObj
.CompBin
= self
.__Token
3471 if not self
.__IsKeyword
("COMP_SYM"):
3472 raise Warning("expected COMP_SYM At Line ", self
.FileName
, self
.CurrentLineNumber
)
3474 if not self
.__IsToken
("="):
3475 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3477 if not self
.__GetNextToken
():
3478 raise Warning("expected Component symbol file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3480 CompStatementObj
.CompSym
= self
.__Token
3482 if not self
.__IsKeyword
("COMP_SIZE"):
3483 raise Warning("expected COMP_SIZE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3485 if not self
.__IsToken
("="):
3486 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3488 if self
.__IsToken
("-"):
3489 CompStatementObj
.CompSize
= self
.__Token
3490 elif self
.__GetNextDecimalNumber
():
3491 CompStatementObj
.CompSize
= self
.__Token
3492 elif self
.__GetNextHexNumber
():
3493 CompStatementObj
.CompSize
= self
.__Token
3495 raise Warning("Unknown size At line ", self
.FileName
, self
.CurrentLineNumber
)
3497 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3500 ## __GetFvInFd() method
3502 # Get FV list contained in FD
3504 # @param self The object pointer
3505 # @param FdName FD name
3506 # @retval FvList list of FV in FD
3508 def __GetFvInFd (self
, FdName
):
3511 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3512 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3513 for elementRegion
in FdObj
.RegionList
:
3514 if elementRegion
.RegionType
== 'FV':
3515 for elementRegionData
in elementRegion
.RegionDataList
:
3516 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3517 FvList
.append(elementRegionData
.upper())
3520 ## __GetReferencedFdFvTuple() method
3522 # Get FD and FV list referenced by a FFS file
3524 # @param self The object pointer
3525 # @param FfsFile contains sections to be searched
3526 # @param RefFdList referenced FD by section
3527 # @param RefFvList referenced FV by section
3529 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3531 for FfsObj
in FvObj
.FfsList
:
3532 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3533 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3534 RefFvList
.append(FfsObj
.FvName
.upper())
3535 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3536 RefFdList
.append(FfsObj
.FdName
.upper())
3538 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3540 ## __GetReferencedFdFvTupleFromSection() method
3542 # Get FD and FV list referenced by a FFS section
3544 # @param self The object pointer
3545 # @param FfsFile contains sections to be searched
3546 # @param FdList referenced FD by section
3547 # @param FvList referenced FV by section
3549 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3552 SectionStack
.extend(FfsFile
.SectionList
)
3553 while SectionStack
!= []:
3554 SectionObj
= SectionStack
.pop()
3555 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3556 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
3557 FvList
.append(SectionObj
.FvName
.upper())
3558 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3559 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3560 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3562 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3563 SectionStack
.extend(SectionObj
.SectionList
)
3565 ## CycleReferenceCheck() method
3567 # Check whether cycle reference exists in FDF
3569 # @param self The object pointer
3570 # @retval True cycle reference exists
3571 # @retval False Not exists cycle reference
3573 def CycleReferenceCheck(self
):
3575 CycleRefExists
= False
3578 for FvName
in self
.Profile
.FvDict
.keys():
3579 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3581 RefFvStack
.append(FvName
)
3584 while RefFvStack
!= []:
3585 FvNameFromStack
= RefFvStack
.pop()
3586 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3587 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3593 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3595 for RefFdName
in RefFdList
:
3596 if RefFdName
in FdAnalyzedList
:
3599 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3600 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3601 if FvInFdList
!= []:
3602 LogStr
+= "FD %s contains FV: " % RefFdName
3603 for FvObj
in FvInFdList
:
3606 if FvObj
not in RefFvStack
:
3607 RefFvStack
.append(FvObj
)
3609 if FvName
in RefFvStack
:
3610 CycleRefExists
= True
3611 raise Warning(LogStr
)
3612 FdAnalyzedList
.append(RefFdName
)
3614 for RefFvName
in RefFvList
:
3615 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3616 if RefFvName
not in RefFvStack
:
3617 RefFvStack
.append(RefFvName
)
3619 if FvName
in RefFvStack
:
3620 CycleRefExists
= True
3621 raise Warning(LogStr
)
3627 return CycleRefExists
3629 if __name__
== "__main__":
3630 parser
= FdfParser("..\LakeportX64Pkg.fdf")
3633 parser
.CycleReferenceCheck()