4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
19 import Common
.LongFilePathOs
as os
21 import CommonDataClass
.FdfClass
22 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
23 from Common
.MultipleWorkspace
import MultipleWorkspace
as mws
24 from Common
.RangeExpression
import RangeExpression
25 from Common
.GlobalData
import *
28 ##define T_CHAR_SPACE ' '
29 ##define T_CHAR_NULL '\0'
30 ##define T_CHAR_CR '\r'
31 ##define T_CHAR_TAB '\t'
32 ##define T_CHAR_LF '\n'
33 ##define T_CHAR_SLASH '/'
34 ##define T_CHAR_BACKSLASH '\\'
35 ##define T_CHAR_DOUBLE_QUOTE '\"'
36 ##define T_CHAR_SINGLE_QUOTE '\''
37 ##define T_CHAR_STAR '*'
38 ##define T_CHAR_HASH '#'
40 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
41 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
42 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
44 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
47 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
49 # All Macro values when parsing file, not replace existing Macro
52 FileExtensionPattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
53 TokenFindPattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
55 def GetRealFileLine (File
, Line
):
58 for Profile
in IncludeFileList
:
59 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
60 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
61 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
62 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
64 return (File
, Line
- InsertedLines
)
66 ## The exception class that used to report error messages when parsing FDF
68 # Currently the "ToolName" is set to be "FDF Parser".
70 class Warning (Exception):
73 # @param self The object pointer
74 # @param Str The message to record
75 # @param File The FDF name
76 # @param Line The Line number that error occurs
78 def __init__(self
, Str
, File
=None, Line
=None):
80 FileLineTuple
= GetRealFileLine(File
, Line
)
81 self
.FileName
= FileLineTuple
[0]
82 self
.LineNumber
= FileLineTuple
[1]
83 self
.message
= Str
+ str(self
.LineNumber
)
84 self
.ToolName
= 'FDF Parser'
86 ## The MACRO class that used to record macro value data when parsing include file
92 # @param self The object pointer
93 # @param FileName The file that to be parsed
95 def __init__(self
, FileName
, Line
):
96 self
.FileName
= FileName
97 self
.DefinedAtLine
= Line
99 self
.MacroValue
= None
101 ## The Include file content class that used to record file data when parsing include file
103 # May raise Exception when opening file.
105 class IncludeFileProfile
:
108 # @param self The object pointer
109 # @param FileName The file that to be parsed
111 def __init__(self
, FileName
):
112 self
.FileName
= FileName
113 self
.FileLinesList
= []
115 fsock
= open(FileName
, "rb", 0)
117 self
.FileLinesList
= fsock
.readlines()
122 raise Warning("Error when opening file %s" % FileName
)
124 self
.InsertStartLineNumber
= None
125 self
.InsertAdjust
= 0
127 ## The FDF content class that used to record file data when parsing FDF
129 # May raise Exception when opening file.
134 # @param self The object pointer
135 # @param FileName The file that to be parsed
137 def __init__(self
, FileName
):
138 self
.FileLinesList
= []
140 fsock
= open(FileName
, "rb", 0)
142 self
.FileLinesList
= fsock
.readlines()
147 raise Warning("Error when opening file %s" % FileName
)
152 self
.PcdFileLineDict
= {}
153 self
.InfFileLineList
= []
157 self
.CapsuleList
= []
161 ## The syntax parser for FDF
163 # PreprocessFile method should be called prior to ParseFile
164 # CycleReferenceCheck method can detect cycles in FDF contents
166 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
167 # Get*** procedures mean these procedures will make judgement on current token only.
169 class FdfParser(object):
172 # @param self The object pointer
173 # @param FileName The file that to be parsed
175 def __init__(self
, FileName
):
176 self
.Profile
= FileProfile(FileName
)
177 self
.FileName
= FileName
178 self
.CurrentLineNumber
= 1
179 self
.CurrentOffsetWithinLine
= 0
180 self
.CurrentFdName
= None
181 self
.CurrentFvName
= None
183 self
.__SkippedChars
= ""
185 self
.__WipeOffArea
= []
187 ## __IsWhiteSpace() method
189 # Whether char at current FileBufferPos is whitespace
191 # @param self The object pointer
192 # @param Char The char to test
193 # @retval True The char is a kind of white space
194 # @retval False The char is NOT a kind of white space
196 def __IsWhiteSpace(self
, Char
):
197 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
202 ## __SkipWhiteSpace() method
204 # Skip white spaces from current char, return number of chars skipped
206 # @param self The object pointer
207 # @retval Count The number of chars skipped
209 def __SkipWhiteSpace(self
):
211 while not self
.__EndOfFile
():
213 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
214 self
.__SkippedChars
+= str(self
.__CurrentChar
())
221 ## __EndOfFile() method
223 # Judge current buffer pos is at file end
225 # @param self The object pointer
226 # @retval True Current File buffer position is at file end
227 # @retval False Current File buffer position is NOT at file end
229 def __EndOfFile(self
):
230 NumberOfLines
= len(self
.Profile
.FileLinesList
)
231 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
232 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
234 elif self
.CurrentLineNumber
> NumberOfLines
:
239 ## __EndOfLine() method
241 # Judge current buffer pos is at line end
243 # @param self The object pointer
244 # @retval True Current File buffer position is at line end
245 # @retval False Current File buffer position is NOT at line end
247 def __EndOfLine(self
):
248 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
250 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
251 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
258 # Reset file data buffer to the initial state
260 # @param self The object pointer
263 self
.CurrentLineNumber
= 1
264 self
.CurrentOffsetWithinLine
= 0
266 ## __UndoOneChar() method
268 # Go back one char in the file buffer
270 # @param self The object pointer
271 # @retval True Successfully go back one char
272 # @retval False Not able to go back one char as file beginning reached
274 def __UndoOneChar(self
):
276 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
278 elif self
.CurrentOffsetWithinLine
== 0:
279 self
.CurrentLineNumber
-= 1
280 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
282 self
.CurrentOffsetWithinLine
-= 1
285 ## __GetOneChar() method
287 # Move forward one char in the file buffer
289 # @param self The object pointer
291 def __GetOneChar(self
):
292 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
293 self
.CurrentLineNumber
+= 1
294 self
.CurrentOffsetWithinLine
= 0
296 self
.CurrentOffsetWithinLine
+= 1
298 ## __CurrentChar() method
300 # Get the char pointed to by the file buffer pointer
302 # @param self The object pointer
303 # @retval Char Current char
305 def __CurrentChar(self
):
306 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
308 ## __NextChar() method
310 # Get the one char pass the char pointed to by the file buffer pointer
312 # @param self The object pointer
313 # @retval Char Next char
315 def __NextChar(self
):
316 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
317 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
319 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
321 ## __SetCurrentCharValue() method
323 # Modify the value of current char
325 # @param self The object pointer
326 # @param Value The new value of current char
328 def __SetCurrentCharValue(self
, Value
):
329 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
331 ## __CurrentLine() method
333 # Get the list that contains current line contents
335 # @param self The object pointer
336 # @retval List current line contents
338 def __CurrentLine(self
):
339 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
341 def __StringToList(self
):
342 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
343 self
.Profile
.FileLinesList
[-1].append(' ')
345 def __ReplaceMacros(self
, Str
, File
, Line
):
347 while Str
.find('$(', MacroEnd
) >= 0:
348 MacroStart
= Str
.find('$(', MacroEnd
)
349 if Str
.find(')', MacroStart
) > 0:
350 MacroEnd
= Str
.find(')', MacroStart
)
351 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
353 if Name
in InputMacroDict
:
354 Value
= InputMacroDict
[Name
]
357 for Profile
in AllMacroList
:
358 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
359 Value
= Profile
.MacroValue
361 if Value
is not None:
362 Str
= Str
.replace('$(' + Name
+ ')', Value
)
363 MacroEnd
= MacroStart
+ len(Value
)
366 raise Warning("Macro not complete At Line ", self
.FileName
, self
.CurrentLineNumber
)
369 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
=' '):
370 if StartPos
[0] == EndPos
[0]:
372 while Offset
<= EndPos
[1]:
373 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
378 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
379 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
383 while Line
< EndPos
[0]:
385 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
386 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
391 while Offset
<= EndPos
[1]:
392 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
396 def __GetMacroName(self
):
397 if not self
.__GetNextToken
():
398 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
399 MacroName
= self
.__Token
401 if MacroName
.startswith('!'):
403 MacroName
= MacroName
[1:].strip()
405 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
406 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
407 self
.FileName
, self
.CurrentLineNumber
)
408 MacroName
= MacroName
[2:-1]
409 return MacroName
, NotFlag
411 ## PreprocessFile() method
413 # Preprocess file contents, replace comments with spaces.
414 # In the end, rewind the file buffer pointer to the beginning
415 # BUGBUG: No !include statement processing contained in this procedure
416 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
418 # @param self The object pointer
420 def PreprocessFile(self
):
424 DoubleSlashComment
= False
426 # HashComment in quoted string " " is ignored.
429 while not self
.__EndOfFile
():
431 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
432 InString
= not InString
433 # meet new line, then no longer in a comment for // and '#'
434 if self
.__CurrentChar
() == T_CHAR_LF
:
435 self
.CurrentLineNumber
+= 1
436 self
.CurrentOffsetWithinLine
= 0
437 if InComment
and DoubleSlashComment
:
439 DoubleSlashComment
= False
440 if InComment
and HashComment
:
443 # check for */ comment end
444 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
445 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
447 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
450 # set comments to spaces
452 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
454 # check for // comment
455 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
457 DoubleSlashComment
= True
458 # check for '#' comment
459 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
462 # check for /* comment start
463 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
464 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
466 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
472 # restore from ListOfList to ListOfString
473 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
476 ## PreprocessIncludeFile() method
478 # Preprocess file contents, replace !include statements with file contents.
479 # In the end, rewind the file buffer pointer to the beginning
481 # @param self The object pointer
483 def PreprocessIncludeFile(self
):
485 while self
.__GetNextToken
():
487 if self
.__Token
== '!include':
488 IncludeLine
= self
.CurrentLineNumber
489 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
490 if not self
.__GetNextToken
():
491 raise Warning("expected include file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
492 IncFileName
= self
.__Token
493 if not os
.path
.isabs(IncFileName
):
494 if IncFileName
.startswith('$(WORKSPACE)'):
495 Str
= mws
.handleWsMacro(IncFileName
)
496 Str
= Str
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
497 if os
.path
.exists(Str
):
498 if not os
.path
.isabs(Str
):
499 Str
= os
.path
.abspath(Str
)
502 # file is in the same dir with FDF file
503 FullFdf
= self
.FileName
504 if not os
.path
.isabs(self
.FileName
):
505 FullFdf
= mws
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
507 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
509 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
510 raise Warning("Include file not exists At Line ", self
.FileName
, self
.CurrentLineNumber
)
512 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
514 CurrentLine
= self
.CurrentLineNumber
515 CurrentOffset
= self
.CurrentOffsetWithinLine
516 # list index of the insertion, note that line number is 'CurrentLine + 1'
517 InsertAtLine
= CurrentLine
518 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
519 # deal with remaining portions after "!include filename", if exists.
520 if self
.__GetNextToken
():
521 if self
.CurrentLineNumber
== CurrentLine
:
522 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
523 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
524 IncFileProfile
.InsertAdjust
+= 1
525 self
.CurrentLineNumber
+= 1
526 self
.CurrentOffsetWithinLine
= 0
528 for Line
in IncFileProfile
.FileLinesList
:
529 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
530 self
.CurrentLineNumber
+= 1
533 IncludeFileList
.append(IncFileProfile
)
535 # comment out the processed include file statement
536 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
537 TempList
.insert(IncludeOffset
, '#')
538 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
542 ## PreprocessIncludeFile() method
544 # Preprocess file contents, replace !include statements with file contents.
545 # In the end, rewind the file buffer pointer to the beginning
547 # @param self The object pointer
549 def PreprocessConditionalStatement(self
):
550 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
552 while self
.__GetNextToken
():
553 if self
.__Token
== 'DEFINE':
554 DefineLine
= self
.CurrentLineNumber
- 1
555 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
556 if not self
.__GetNextToken
():
557 raise Warning("expected Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
559 if not self
.__IsToken
( "="):
560 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
562 if not self
.__GetNextToken
():
563 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
565 if self
.__GetStringData
():
568 if not Macro
in InputMacroDict
:
569 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
570 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
571 MacProfile
.MacroName
= Macro
572 MacProfile
.MacroValue
= Value
573 AllMacroList
.append(MacProfile
)
574 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
576 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
577 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
578 IfList
.append([IfStartPos
, None, None])
579 CondLabel
= self
.__Token
581 MacroName
, NotFlag
= self
.__GetMacroName
()
582 NotDefineFlag
= False
583 if CondLabel
== '!ifndef':
585 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
587 raise Warning("'NOT' operation not allowed for Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
589 if CondLabel
== '!if':
591 if not self
.__GetNextOp
():
592 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
594 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
596 if not self
.__GetNextToken
():
597 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
598 if self
.__GetStringData
():
600 MacroValue
= self
.__Token
601 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
603 ConditionSatisfied
= not ConditionSatisfied
604 BranchDetermined
= ConditionSatisfied
606 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
607 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
609 ConditionSatisfied
= not ConditionSatisfied
610 BranchDetermined
= ConditionSatisfied
611 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
612 if ConditionSatisfied
:
613 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
616 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
618 ConditionSatisfied
= not ConditionSatisfied
619 BranchDetermined
= ConditionSatisfied
620 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
621 if ConditionSatisfied
:
622 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
624 elif self
.__Token
in ('!elseif', '!else'):
625 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
627 raise Warning("Missing !if statement At Line ", self
.FileName
, self
.CurrentLineNumber
)
629 IfList
[-1] = [ElseStartPos
, False, True]
630 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
632 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
633 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
634 if self
.__Token
== '!elseif':
635 MacroName
, NotFlag
= self
.__GetMacroName
()
636 if not self
.__GetNextOp
():
637 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
639 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
641 if not self
.__GetNextToken
():
642 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
643 if self
.__GetStringData
():
645 MacroValue
= self
.__Token
646 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
648 ConditionSatisfied
= not ConditionSatisfied
651 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
652 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
654 ConditionSatisfied
= not ConditionSatisfied
656 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
660 IfList
[-1][1] = False
663 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
666 elif self
.__Token
== '!endif':
668 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
670 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
676 raise Warning("Missing !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
679 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
681 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
682 if Name
in InputMacroDict
:
683 MacroValue
= InputMacroDict
[Name
]
685 if Value
== 'Bool' and MacroValue
is None or MacroValue
.upper() == 'FALSE':
689 if Value
!= MacroValue
:
694 if Value
== MacroValue
:
699 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
is not None and MacroValue
.isdigit())):
700 InputVal
= long(Value
, 0)
701 MacroVal
= long(MacroValue
, 0)
703 if MacroVal
> InputVal
:
708 if MacroVal
>= InputVal
:
713 if MacroVal
< InputVal
:
718 if MacroVal
<= InputVal
:
725 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
727 for Profile
in AllMacroList
:
728 if Profile
.FileName
== FileLineTuple
[0] and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
730 if Value
== 'Bool' and Profile
.MacroValue
is None or Profile
.MacroValue
.upper() == 'FALSE':
734 if Value
!= Profile
.MacroValue
:
739 if Value
== Profile
.MacroValue
:
744 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
is not None and Profile
.MacroValue
.isdigit())):
745 InputVal
= long(Value
, 0)
746 MacroVal
= long(Profile
.MacroValue
, 0)
748 if MacroVal
> InputVal
:
753 if MacroVal
>= InputVal
:
758 if MacroVal
< InputVal
:
763 if MacroVal
<= InputVal
:
770 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
774 ## __IsToken() method
776 # Check whether input string is found from current char position along
777 # If found, the string value is put into self.__Token
779 # @param self The object pointer
780 # @param String The string to search
781 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
782 # @retval True Successfully find string, file buffer pointer moved forward
783 # @retval False Not able to find string, file buffer pointer not changed
785 def __IsToken(self
, String
, IgnoreCase
= False):
786 self
.__SkipWhiteSpace
()
788 # Only consider the same line, no multi-line token allowed
789 StartPos
= self
.CurrentOffsetWithinLine
792 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
794 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
796 self
.CurrentOffsetWithinLine
+= len(String
)
797 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
801 ## __IsKeyword() method
803 # Check whether input keyword is found from current char position along, whole word only!
804 # If found, the string value is put into self.__Token
806 # @param self The object pointer
807 # @param Keyword The string to search
808 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
809 # @retval True Successfully find string, file buffer pointer moved forward
810 # @retval False Not able to find string, file buffer pointer not changed
812 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
813 self
.__SkipWhiteSpace
()
815 # Only consider the same line, no multi-line token allowed
816 StartPos
= self
.CurrentOffsetWithinLine
819 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
821 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
823 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
824 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
826 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
827 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
831 ## __GetNextWord() method
833 # Get next C name from file lines
834 # If found, the string value is put into self.__Token
836 # @param self The object pointer
837 # @retval True Successfully find a C name string, file buffer pointer moved forward
838 # @retval False Not able to find a C name string, file buffer pointer not changed
840 def __GetNextWord(self
):
841 self
.__SkipWhiteSpace
()
842 if self
.__EndOfFile
():
845 TempChar
= self
.__CurrentChar
()
846 StartPos
= self
.CurrentOffsetWithinLine
847 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
849 while not self
.__EndOfLine
():
850 TempChar
= self
.__CurrentChar
()
851 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
852 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
858 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
863 ## __GetNextToken() method
865 # Get next token unit before a seperator
866 # If found, the string value is put into self.__Token
868 # @param self The object pointer
869 # @retval True Successfully find a token unit, file buffer pointer moved forward
870 # @retval False Not able to find a token unit, file buffer pointer not changed
872 def __GetNextToken(self
):
873 # Skip leading spaces, if exist.
874 self
.__SkipWhiteSpace
()
875 if self
.__EndOfFile
():
877 # Record the token start position, the position of the first non-space char.
878 StartPos
= self
.CurrentOffsetWithinLine
879 StartLine
= self
.CurrentLineNumber
880 while not self
.__EndOfLine
():
881 TempChar
= self
.__CurrentChar
()
882 # Try to find the end char that is not a space and not in seperator tuple.
883 # That is, when we got a space or any char in the tuple, we got the end of token.
884 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
886 # if we happen to meet a seperator as the first char, we must proceed to get it.
887 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
888 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
896 EndPos
= self
.CurrentOffsetWithinLine
897 if self
.CurrentLineNumber
!= StartLine
:
898 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
899 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
900 if StartPos
!= self
.CurrentOffsetWithinLine
:
905 def __GetNextOp(self
):
906 # Skip leading spaces, if exist.
907 self
.__SkipWhiteSpace
()
908 if self
.__EndOfFile
():
910 # Record the token start position, the position of the first non-space char.
911 StartPos
= self
.CurrentOffsetWithinLine
912 while not self
.__EndOfLine
():
913 TempChar
= self
.__CurrentChar
()
914 # Try to find the end char that is not a space
915 if not str(TempChar
).isspace():
922 if StartPos
!= self
.CurrentOffsetWithinLine
:
923 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
927 ## __GetNextGuid() method
929 # Get next token unit before a seperator
930 # If found, the GUID string is put into self.__Token
932 # @param self The object pointer
933 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
934 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
936 def __GetNextGuid(self
):
938 if not self
.__GetNextToken
():
940 if gGuidPattern
.match(self
.__Token
) is not None:
946 ## __UndoToken() method
948 # Go back one token unit in file buffer
950 # @param self The object pointer
952 def __UndoToken(self
):
954 while self
.__CurrentChar
().isspace():
955 if not self
.__UndoOneChar
():
960 StartPos
= self
.CurrentOffsetWithinLine
961 CurrentLine
= self
.CurrentLineNumber
962 while CurrentLine
== self
.CurrentLineNumber
:
964 TempChar
= self
.__CurrentChar
()
965 # Try to find the end char that is not a space and not in seperator tuple.
966 # That is, when we got a space or any char in the tuple, we got the end of token.
967 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
968 if not self
.__UndoOneChar
():
970 # if we happen to meet a seperator as the first char, we must proceed to get it.
971 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
972 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
979 def __IsHex(self
, HexStr
):
980 if not HexStr
.upper().startswith("0X"):
982 if len(self
.__Token
) <= 2:
984 return True if all(x
in string
.hexdigits
for x
in HexStr
[2:]) else False
986 ## __GetNextHexNumber() method
988 # Get next HEX data before a seperator
989 # If found, the HEX data is put into self.__Token
991 # @param self The object pointer
992 # @retval True Successfully find a HEX data, file buffer pointer moved forward
993 # @retval False Not able to find a HEX data, file buffer pointer not changed
995 def __GetNextHexNumber(self
):
996 if not self
.__GetNextToken
():
998 if self
.__IsHex
(self
.__Token
):
1004 ## __GetNextDecimalNumber() method
1006 # Get next decimal data before a seperator
1007 # If found, the decimal data is put into self.__Token
1009 # @param self The object pointer
1010 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1011 # @retval False Not able to find a decimal data, file buffer pointer not changed
1013 def __GetNextDecimalNumber(self
):
1014 if not self
.__GetNextToken
():
1016 if self
.__Token
.isdigit():
1022 ## __GetNextPcdName() method
1024 # Get next PCD token space C name and PCD C name pair before a seperator
1025 # If found, the decimal data is put into self.__Token
1027 # @param self The object pointer
1028 # @retval Tuple PCD C name and PCD token space C name pair
1030 def __GetNextPcdName(self
):
1031 if not self
.__GetNextWord
():
1032 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1033 pcdTokenSpaceCName
= self
.__Token
1035 if not self
.__IsToken
( "."):
1036 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1038 if not self
.__GetNextWord
():
1039 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1040 pcdCName
= self
.__Token
1042 return (pcdCName
, pcdTokenSpaceCName
)
1044 ## __GetStringData() method
1046 # Get string contents quoted in ""
1047 # If found, the decimal data is put into self.__Token
1049 # @param self The object pointer
1050 # @retval True Successfully find a string data, file buffer pointer moved forward
1051 # @retval False Not able to find a string data, file buffer pointer not changed
1053 def __GetStringData(self
):
1054 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1056 self
.__SkipToToken
("\"")
1057 currentLineNumber
= self
.CurrentLineNumber
1059 if not self
.__SkipToToken
("\""):
1060 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1061 if currentLineNumber
!= self
.CurrentLineNumber
:
1062 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1063 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1066 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1068 self
.__SkipToToken
("\'")
1069 currentLineNumber
= self
.CurrentLineNumber
1071 if not self
.__SkipToToken
("\'"):
1072 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1073 if currentLineNumber
!= self
.CurrentLineNumber
:
1074 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1075 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1081 ## __SkipToToken() method
1083 # Search forward in file buffer for the string
1084 # The skipped chars are put into self.__SkippedChars
1086 # @param self The object pointer
1087 # @param String The string to search
1088 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1089 # @retval True Successfully find the string, file buffer pointer moved forward
1090 # @retval False Not able to find the string, file buffer pointer not changed
1092 def __SkipToToken(self
, String
, IgnoreCase
= False):
1093 StartPos
= self
.GetFileBufferPos()
1095 self
.__SkippedChars
= ""
1096 while not self
.__EndOfFile
():
1099 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1101 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1103 self
.CurrentOffsetWithinLine
+= len(String
)
1104 self
.__SkippedChars
+= String
1106 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1109 self
.SetFileBufferPos( StartPos
)
1110 self
.__SkippedChars
= ""
1113 ## GetFileBufferPos() method
1115 # Return the tuple of current line and offset within the line
1117 # @param self The object pointer
1118 # @retval Tuple Line number and offset pair
1120 def GetFileBufferPos(self
):
1121 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1123 ## SetFileBufferPos() method
1125 # Restore the file buffer position
1127 # @param self The object pointer
1128 # @param Pos The new file buffer position
1130 def SetFileBufferPos(self
, Pos
):
1131 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1133 ## ParseFile() method
1135 # Parse the file profile buffer to extract fd, fv ... information
1136 # Exception will be raised if syntax error found
1138 # @param self The object pointer
1140 def ParseFile(self
):
1143 self
.__StringToList
()
1144 self
.PreprocessFile()
1145 self
.PreprocessIncludeFile()
1146 self
.__StringToList
()
1147 self
.PreprocessFile()
1148 self
.PreprocessConditionalStatement()
1149 self
.__StringToList
()
1150 for Pos
in self
.__WipeOffArea
:
1151 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1152 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1154 while self
.__GetDefines
():
1158 while Index
< len(self
.Profile
.FileLinesList
):
1159 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1160 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1163 while self
.__GetFd
():
1166 while self
.__GetFv
():
1169 while self
.__GetCapsule
():
1172 # while self.__GetVtf():
1175 # while self.__GetRule():
1181 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1182 X
.message
+= '\nGot Token: \"%s\" from File %s\n' % (self
.__Token
, FileLineTuple
[0]) + \
1183 'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \
1184 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'), FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1187 ## __GetDefines() method
1189 # Get Defines section contents and store its data into AllMacrosList
1191 # @param self The object pointer
1192 # @retval True Successfully find a Defines
1193 # @retval False Not able to find a Defines
1195 def __GetDefines(self
):
1197 if not self
.__GetNextToken
():
1200 S
= self
.__Token
.upper()
1201 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1202 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1203 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1204 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
)
1209 if not self
.__IsToken
("[DEFINES", True):
1210 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1211 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1212 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1213 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1215 if not self
.__IsToken
( "]"):
1216 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1218 while self
.__GetNextWord
():
1219 Macro
= self
.__Token
1221 if not self
.__IsToken
("="):
1222 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1223 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1224 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1225 Value
= self
.__Token
1226 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1227 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1228 MacProfile
.MacroName
= Macro
1229 MacProfile
.MacroValue
= Value
1230 AllMacroList
.append(MacProfile
)
1236 # Get FD section contents and store its data into FD dictionary of self.Profile
1238 # @param self The object pointer
1239 # @retval True Successfully find a FD
1240 # @retval False Not able to find a FD
1244 if not self
.__GetNextToken
():
1247 S
= self
.__Token
.upper()
1248 if S
.startswith("[") and not S
.startswith("[FD."):
1249 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1250 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1251 raise Warning("Unknown section At Line ", self
.FileName
, self
.CurrentLineNumber
)
1256 if not self
.__IsToken
("[FD.", True):
1257 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1258 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1259 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1260 raise Warning("expected [FD.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
1262 FdName
= self
.__GetUiName
()
1263 self
.CurrentFdName
= FdName
.upper()
1265 if not self
.__IsToken
( "]"):
1266 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1268 FdObj
= CommonDataClass
.FdfClass
.FDClassObject()
1269 FdObj
.FdUiName
= self
.CurrentFdName
1270 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1271 Status
= self
.__GetCreateFile
(FdObj
)
1273 raise Warning("FD name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1275 if not self
.__GetTokenStatements
(FdObj
):
1278 self
.__GetDefineStatements
(FdObj
)
1280 self
.__GetSetStatements
(FdObj
)
1282 if not self
.__GetRegionLayout
(FdObj
):
1283 raise Warning("expected region layout At Line ", self
.FileName
, self
.CurrentLineNumber
)
1285 while self
.__GetRegionLayout
(FdObj
):
1289 ## __GetUiName() method
1291 # Return the UI name of a section
1293 # @param self The object pointer
1294 # @retval FdName UI name
1296 def __GetUiName(self
):
1298 if self
.__GetNextWord
():
1299 FdName
= self
.__Token
1303 ## __GetCreateFile() method
1305 # Return the output file name of object
1307 # @param self The object pointer
1308 # @param Obj object whose data will be stored in file
1309 # @retval FdName UI name
1311 def __GetCreateFile(self
, Obj
):
1313 if self
.__IsKeyword
( "CREATE_FILE"):
1314 if not self
.__IsToken
( "="):
1315 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1317 if not self
.__GetNextToken
():
1318 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1320 FileName
= self
.__Token
1321 Obj
.CreateFileName
= FileName
1325 ## __GetTokenStatements() method
1327 # Get token statements
1329 # @param self The object pointer
1330 # @param Obj for whom token statement is got
1331 # @retval True Successfully find a token statement
1332 # @retval False Not able to find a token statement
1334 def __GetTokenStatements(self
, Obj
):
1335 if not self
.__IsKeyword
( "BaseAddress"):
1336 raise Warning("BaseAddress missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1338 if not self
.__IsToken
( "="):
1339 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1341 if not self
.__GetNextHexNumber
():
1342 raise Warning("expected Hex base address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1344 Obj
.BaseAddress
= self
.__Token
1346 if self
.__IsToken
( "|"):
1347 pcdPair
= self
.__GetNextPcdName
()
1348 Obj
.BaseAddressPcd
= pcdPair
1349 self
.Profile
.PcdDict
[pcdPair
] = long(Obj
.BaseAddress
, 0)
1350 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1351 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1353 if not self
.__IsKeyword
( "Size"):
1354 raise Warning("Size missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1356 if not self
.__IsToken
( "="):
1357 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1359 if not self
.__GetNextHexNumber
():
1360 raise Warning("expected Hex size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1363 Obj
.Size
= long(self
.__Token
, 0)
1365 if self
.__IsToken
( "|"):
1366 pcdPair
= self
.__GetNextPcdName
()
1367 Obj
.SizePcd
= pcdPair
1368 self
.Profile
.PcdDict
[pcdPair
] = Obj
.Size
1369 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1370 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1372 if not self
.__IsKeyword
( "ErasePolarity"):
1373 raise Warning("ErasePolarity missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1375 if not self
.__IsToken
( "="):
1376 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1378 if not self
.__GetNextToken
():
1379 raise Warning("expected Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1381 if self
.__Token
!= "1" and self
.__Token
!= "0":
1382 raise Warning("expected 1 or 0 Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1384 Obj
.ErasePolarity
= self
.__Token
1386 Status
= self
.__GetBlockStatements
(Obj
)
1389 ## __GetAddressStatements() method
1391 # Get address statements
1393 # @param self The object pointer
1394 # @param Obj for whom address statement is got
1395 # @retval True Successfully find
1396 # @retval False Not able to find
1398 def __GetAddressStatements(self
, Obj
):
1400 if self
.__IsKeyword
("BsBaseAddress"):
1401 if not self
.__IsToken
( "="):
1402 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1404 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1405 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1407 BsAddress
= long(self
.__Token
, 0)
1408 Obj
.BsBaseAddress
= BsAddress
1410 if self
.__IsKeyword
("RtBaseAddress"):
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 RtAddress
= long(self
.__Token
, 0)
1418 Obj
.RtBaseAddress
= RtAddress
1420 ## __GetBlockStatements() method
1422 # Get block statements
1424 # @param self The object pointer
1425 # @param Obj for whom block statement is got
1426 # @retval True Successfully find
1427 # @retval False Not able to find
1429 def __GetBlockStatements(self
, Obj
):
1431 if not self
.__GetBlockStatement
(Obj
):
1432 #set default block size is 1
1433 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1436 while self
.__GetBlockStatement
(Obj
):
1439 for Item
in Obj
.BlockSizeList
:
1440 if Item
[0] is None or Item
[1] is None:
1441 raise Warning("expected block statement for Fd Section", self
.FileName
, self
.CurrentLineNumber
)
1445 ## __GetBlockStatement() method
1447 # Get block statement
1449 # @param self The object pointer
1450 # @param Obj for whom block statement is got
1451 # @retval True Successfully find
1452 # @retval False Not able to find
1454 def __GetBlockStatement(self
, Obj
):
1455 if not self
.__IsKeyword
( "BlockSize"):
1458 if not self
.__IsToken
( "="):
1459 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1461 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1462 raise Warning("expected Hex block size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1464 BlockSize
= long(self
.__Token
, 0)
1466 if self
.__IsToken
( "|"):
1467 PcdPair
= self
.__GetNextPcdName
()
1468 BlockSizePcd
= PcdPair
1469 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1470 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1471 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1474 if self
.__IsKeyword
( "NumBlocks"):
1475 if not self
.__IsToken
( "="):
1476 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1478 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1479 raise Warning("expected block numbers At Line ", self
.FileName
, self
.CurrentLineNumber
)
1481 BlockNumber
= long(self
.__Token
, 0)
1483 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1486 ## __GetDefineStatements() method
1488 # Get define statements
1490 # @param self The object pointer
1491 # @param Obj for whom define statement is got
1492 # @retval True Successfully find
1493 # @retval False Not able to find
1495 def __GetDefineStatements(self
, Obj
):
1496 while self
.__GetDefineStatement
( Obj
):
1499 ## __GetDefineStatement() method
1501 # Get define statement
1503 # @param self The object pointer
1504 # @param Obj for whom define statement is got
1505 # @retval True Successfully find
1506 # @retval False Not able to find
1508 def __GetDefineStatement(self
, Obj
):
1509 if self
.__IsKeyword
("DEFINE"):
1510 self
.__GetNextToken
()
1511 Macro
= self
.__Token
1512 if not self
.__IsToken
( "="):
1513 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1515 if not self
.__GetNextToken
():
1516 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1518 Value
= self
.__Token
1519 Macro
= '$(' + Macro
+ ')'
1520 Obj
.DefineVarDict
[Macro
] = Value
1525 ## __GetSetStatements() method
1527 # Get set statements
1529 # @param self The object pointer
1530 # @param Obj for whom set statement is got
1531 # @retval True Successfully find
1532 # @retval False Not able to find
1534 def __GetSetStatements(self
, Obj
):
1535 while self
.__GetSetStatement
(Obj
):
1538 ## __GetSetStatement() method
1542 # @param self The object pointer
1543 # @param Obj for whom set statement is got
1544 # @retval True Successfully find
1545 # @retval False Not able to find
1547 def __GetSetStatement(self
, Obj
):
1548 if self
.__IsKeyword
("SET"):
1549 PcdPair
= self
.__GetNextPcdName
()
1551 if not self
.__IsToken
( "="):
1552 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1554 if not self
.__GetNextToken
():
1555 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1557 Value
= self
.__Token
1558 if Value
.startswith("{"):
1559 # deal with value with {}
1560 if not self
.__SkipToToken
( "}"):
1561 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1562 Value
+= self
.__SkippedChars
1564 Obj
.SetVarDict
[PcdPair
] = Value
1565 self
.Profile
.PcdDict
[PcdPair
] = Value
1566 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1567 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1572 ## __GetRegionLayout() method
1574 # Get region layout for FD
1576 # @param self The object pointer
1577 # @param Fd for whom region is got
1578 # @retval True Successfully find
1579 # @retval False Not able to find
1581 def __GetRegionLayout(self
, Fd
):
1582 if not self
.__GetNextHexNumber
():
1585 RegionObj
= CommonDataClass
.FdfClass
.RegionClassObject()
1586 RegionObj
.Offset
= long(self
.__Token
, 0)
1587 Fd
.RegionList
.append(RegionObj
)
1589 if not self
.__IsToken
( "|"):
1590 raise Warning("expected '|' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1592 if not self
.__GetNextHexNumber
():
1593 raise Warning("expected Region Size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1594 RegionObj
.Size
= long(self
.__Token
, 0)
1596 if not self
.__GetNextWord
():
1599 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1601 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1602 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0)
1603 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1604 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1605 if self
.__IsToken
( "|"):
1606 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1607 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = RegionObj
.Size
1608 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1609 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1611 if not self
.__GetNextWord
():
1614 if self
.__Token
== "SET":
1616 self
.__GetSetStatements
( RegionObj
)
1617 if not self
.__GetNextWord
():
1620 elif self
.__Token
== "FV":
1622 self
.__GetRegionFvType
( RegionObj
)
1624 elif self
.__Token
== "CAPSULE":
1626 self
.__GetRegionCapType
( RegionObj
)
1628 elif self
.__Token
== "FILE":
1630 self
.__GetRegionFileType
( RegionObj
)
1634 self
.__GetRegionDataType
( RegionObj
)
1638 ## __GetRegionFvType() method
1640 # Get region fv data for region
1642 # @param self The object pointer
1643 # @param RegionObj for whom region data is got
1645 def __GetRegionFvType(self
, RegionObj
):
1647 if not self
.__IsKeyword
( "FV"):
1648 raise Warning("expected Keyword 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1650 if not self
.__IsToken
( "="):
1651 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1653 if not self
.__GetNextToken
():
1654 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1656 RegionObj
.RegionType
= "FV"
1657 RegionObj
.RegionDataList
.append(self
.__Token
)
1659 while self
.__IsKeyword
( "FV"):
1661 if not self
.__IsToken
( "="):
1662 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1664 if not self
.__GetNextToken
():
1665 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1667 RegionObj
.RegionDataList
.append(self
.__Token
)
1669 ## __GetRegionCapType() method
1671 # Get region capsule data for region
1673 # @param self The object pointer
1674 # @param RegionObj for whom region data is got
1676 def __GetRegionCapType(self
, RegionObj
):
1678 if not self
.__IsKeyword
("CAPSULE"):
1679 raise Warning("expected Keyword 'CAPSULE' at line", self
.FileName
, self
.CurrentLineNumber
)
1681 if not self
.__IsToken
("="):
1682 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1684 if not self
.__GetNextToken
():
1685 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1687 RegionObj
.RegionType
= "CAPSULE"
1688 RegionObj
.RegionDataList
.append(self
.__Token
)
1690 while self
.__IsKeyword
("CAPSULE"):
1692 if not self
.__IsToken
("="):
1693 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1695 if not self
.__GetNextToken
():
1696 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1698 RegionObj
.RegionDataList
.append(self
.__Token
)
1700 ## __GetRegionFileType() method
1702 # Get region file data for region
1704 # @param self The object pointer
1705 # @param RegionObj for whom region data is got
1707 def __GetRegionFileType(self
, RegionObj
):
1709 if not self
.__IsKeyword
( "FILE"):
1710 raise Warning("expected Keyword 'FILE' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1712 if not self
.__IsToken
( "="):
1713 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1715 if not self
.__GetNextToken
():
1716 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1718 RegionObj
.RegionType
= "FILE"
1719 RegionObj
.RegionDataList
.append( self
.__Token
)
1721 while self
.__IsKeyword
( "FILE"):
1723 if not self
.__IsToken
( "="):
1724 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1726 if not self
.__GetNextToken
():
1727 raise Warning("expected FILE name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1729 RegionObj
.RegionDataList
.append(self
.__Token
)
1731 ## __GetRegionDataType() method
1733 # Get region array data for region
1735 # @param self The object pointer
1736 # @param RegionObj for whom region data is got
1738 def __GetRegionDataType(self
, RegionObj
):
1740 if not self
.__IsKeyword
( "DATA"):
1741 raise Warning("expected Region Data type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1743 if not self
.__IsToken
( "="):
1744 raise Warning("expected '=' 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
.__GetNextHexNumber
():
1750 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1752 if len(self
.__Token
) > 18:
1753 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1755 DataString
= self
.__Token
1758 while self
.__IsToken
(","):
1759 if not self
.__GetNextHexNumber
():
1760 raise Warning("Invalid Hex number At Line ", self
.FileName
, self
.CurrentLineNumber
)
1761 if len(self
.__Token
) > 4:
1762 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1763 DataString
+= self
.__Token
1766 if not self
.__IsToken
( "}"):
1767 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1769 DataString
= DataString
.rstrip(",")
1770 RegionObj
.RegionType
= "DATA"
1771 RegionObj
.RegionDataList
.append( DataString
)
1773 while self
.__IsKeyword
( "DATA"):
1775 if not self
.__IsToken
( "="):
1776 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1778 if not self
.__IsToken
( "{"):
1779 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1781 if not self
.__GetNextHexNumber
():
1782 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1784 if len(self
.__Token
) > 18:
1785 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1787 DataString
= self
.__Token
1790 while self
.__IsToken
(","):
1791 self
.__GetNextHexNumber
()
1792 if len(self
.__Token
) > 4:
1793 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1794 DataString
+= self
.__Token
1797 if not self
.__IsToken
( "}"):
1798 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1800 DataString
= DataString
.rstrip(",")
1801 RegionObj
.RegionDataList
.append( DataString
)
1805 # Get FV section contents and store its data into FV dictionary of self.Profile
1807 # @param self The object pointer
1808 # @retval True Successfully find a FV
1809 # @retval False Not able to find a FV
1812 if not self
.__GetNextToken
():
1815 S
= self
.__Token
.upper()
1816 if S
.startswith("[") and not S
.startswith("[FV."):
1817 if not S
.startswith("[CAPSULE.") \
1818 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1819 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
)
1824 if not self
.__IsToken
("[FV.", True):
1825 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1826 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1827 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1828 raise Warning("Unknown Keyword At Line ", self
.FileName
, self
.CurrentLineNumber
)
1830 FvName
= self
.__GetUiName
()
1831 self
.CurrentFvName
= FvName
.upper()
1833 if not self
.__IsToken
( "]"):
1834 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1836 FvObj
= CommonDataClass
.FdfClass
.FvClassObject()
1837 FvObj
.UiFvName
= self
.CurrentFvName
1838 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1840 Status
= self
.__GetCreateFile
(FvObj
)
1842 raise Warning("FV name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1844 self
.__GetDefineStatements
(FvObj
)
1846 self
.__GetAddressStatements
(FvObj
)
1848 self
.__GetBlockStatement
(FvObj
)
1850 self
.__GetSetStatements
(FvObj
)
1852 self
.__GetFvAlignment
(FvObj
)
1854 self
.__GetFvAttributes
(FvObj
)
1856 self
.__GetFvNameGuid
(FvObj
)
1858 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1859 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1862 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1863 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1864 if not isInf
and not isFile
:
1869 ## __GetFvAlignment() method
1871 # Get alignment for FV
1873 # @param self The object pointer
1874 # @param Obj for whom alignment is got
1875 # @retval True Successfully find a alignment statement
1876 # @retval False Not able to find a alignment statement
1878 def __GetFvAlignment(self
, Obj
):
1880 if not self
.__IsKeyword
( "FvAlignment"):
1883 if not self
.__IsToken
( "="):
1884 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1886 if not self
.__GetNextToken
():
1887 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1889 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1890 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1891 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1893 raise Warning("Unknown alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1894 Obj
.FvAlignment
= self
.__Token
1897 ## __GetFvAttributes() method
1899 # Get attributes for FV
1901 # @param self The object pointer
1902 # @param Obj for whom attribute is got
1905 def __GetFvAttributes(self
, FvObj
):
1907 while self
.__GetNextWord
():
1909 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1910 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1911 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1912 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1913 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
1914 "WRITE_POLICY_RELIABLE"):
1918 if not self
.__IsToken
( "="):
1919 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1921 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
1922 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
1924 FvObj
.FvAttributeDict
[name
] = self
.__Token
1928 ## __GetFvNameGuid() method
1930 # Get FV GUID for FV
1932 # @param self The object pointer
1933 # @param Obj for whom GUID is got
1936 def __GetFvNameGuid(self
, FvObj
):
1938 if not self
.__IsKeyword
( "FvNameGuid"):
1941 if not self
.__IsToken
( "="):
1942 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1944 if not self
.__GetNextGuid
():
1945 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
1947 FvObj
.FvNameGuid
= self
.__Token
1951 ## __GetAprioriSection() method
1953 # Get token statements
1955 # @param self The object pointer
1956 # @param FvObj for whom apriori is got
1957 # @param MacroDict dictionary used to replace macro
1958 # @retval True Successfully find apriori statement
1959 # @retval False Not able to find apriori statement
1961 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
1963 if not self
.__IsKeyword
( "APRIORI"):
1966 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
1967 raise Warning("expected Apriori file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1968 AprType
= self
.__Token
1970 if not self
.__IsToken
( "{"):
1971 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1973 AprSectionObj
= CommonDataClass
.FdfClass
.AprioriSectionClassObject()
1974 AprSectionObj
.AprioriType
= AprType
1976 self
.__GetDefineStatements
(AprSectionObj
)
1977 MacroDict
.update(AprSectionObj
.DefineVarDict
)
1980 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
1981 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
1982 if not IsInf
and not IsFile
:
1985 if not self
.__IsToken
( "}"):
1986 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1988 FvObj
.AprioriSectionList
.append(AprSectionObj
)
1991 ## __GetInfStatement() method
1993 # Get INF statements
1995 # @param self The object pointer
1996 # @param Obj for whom inf statement is got
1997 # @param MacroDict dictionary used to replace macro
1998 # @retval True Successfully find inf statement
1999 # @retval False Not able to find inf statement
2001 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2003 if not self
.__IsKeyword
( "INF"):
2006 ffsInf
= CommonDataClass
.FdfClass
.FfsInfStatementClassObject()
2007 self
.__GetInfOptions
( ffsInf
)
2009 if not self
.__GetNextToken
():
2010 raise Warning("expected INF file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2011 ffsInf
.InfFileName
= self
.__Token
2013 # if ffsInf.InfFileName.find('$') >= 0:
2014 # ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
2016 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2017 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2018 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2019 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2021 if self
.__IsToken
('|'):
2022 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2023 ffsInf
.KeepReloc
= False
2024 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2025 ffsInf
.KeepReloc
= True
2027 raise Warning("Unknown reloc strip flag At Line ", self
.FileName
, self
.CurrentLineNumber
)
2030 capsuleFfs
= CapsuleData
.CapsuleFfs()
2031 capsuleFfs
.Ffs
= ffsInf
2032 Obj
.CapsuleDataList
.append(capsuleFfs
)
2034 Obj
.FfsList
.append(ffsInf
)
2037 ## __GetInfOptions() method
2039 # Get options for INF
2041 # @param self The object pointer
2042 # @param FfsInfObj for whom option is got
2044 def __GetInfOptions(self
, FfsInfObj
):
2046 if self
.__IsKeyword
( "RuleOverride"):
2047 if not self
.__IsToken
( "="):
2048 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2049 if not self
.__GetNextToken
():
2050 raise Warning("expected Rule name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2051 FfsInfObj
.Rule
= self
.__Token
2053 if self
.__IsKeyword
( "VERSION"):
2054 if not self
.__IsToken
( "="):
2055 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2056 if not self
.__GetNextToken
():
2057 raise Warning("expected Version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2059 if self
.__GetStringData
():
2060 FfsInfObj
.Version
= self
.__Token
2062 if self
.__IsKeyword
( "UI"):
2063 if not self
.__IsToken
( "="):
2064 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2065 if not self
.__GetNextToken
():
2066 raise Warning("expected UI name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2068 if self
.__GetStringData
():
2069 FfsInfObj
.Ui
= self
.__Token
2071 if self
.__IsKeyword
( "USE"):
2072 if not self
.__IsToken
( "="):
2073 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2074 if not self
.__GetNextToken
():
2075 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2076 FfsInfObj
.UseArch
= self
.__Token
2079 if self
.__GetNextToken
():
2080 if TokenFindPattern
.match(self
.__Token
):
2081 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2082 if not self
.__IsToken
(","):
2088 while self
.__GetNextToken
():
2089 if not TokenFindPattern
.match(self
.__Token
):
2090 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2091 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2093 if not self
.__IsToken
(","):
2096 ## __GetFileStatement() method
2098 # Get FILE statements
2100 # @param self The object pointer
2101 # @param Obj for whom FILE statement is got
2102 # @param MacroDict dictionary used to replace macro
2103 # @retval True Successfully find FILE statement
2104 # @retval False Not able to find FILE statement
2106 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2108 if not self
.__IsKeyword
( "FILE"):
2111 FfsFileObj
= CommonDataClass
.FdfClass
.FileStatementClassObject()
2113 if not self
.__GetNextWord
():
2114 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2115 FfsFileObj
.FvFileType
= self
.__Token
2117 if not self
.__IsToken
( "="):
2118 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2120 if not self
.__GetNextGuid
():
2121 if not self
.__GetNextWord
():
2122 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2123 if self
.__Token
== 'PCD':
2124 if not self
.__IsToken
( "("):
2125 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2126 PcdPair
= self
.__GetNextPcdName
()
2127 if not self
.__IsToken
( ")"):
2128 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2129 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2131 FfsFileObj
.NameGuid
= self
.__Token
2133 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2136 capsuleFfs
= CapsuleData
.CapsuleFfs()
2137 capsuleFfs
.Ffs
= FfsFileObj
2138 Obj
.CapsuleDataList
.append(capsuleFfs
)
2140 Obj
.FfsList
.append(FfsFileObj
)
2144 ## __FileCouldHaveRelocFlag() method
2146 # Check whether reloc strip flag can be set for a file type.
2148 # @param self The object pointer
2149 # @param FileType The file type to check with
2150 # @retval True This type could have relocation strip flag
2151 # @retval False No way to have it
2154 def __FileCouldHaveRelocFlag (self
, FileType
):
2155 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2160 ## __SectionCouldHaveRelocFlag() method
2162 # Check whether reloc strip flag can be set for a section type.
2164 # @param self The object pointer
2165 # @param SectionType The section type to check with
2166 # @retval True This type could have relocation strip flag
2167 # @retval False No way to have it
2170 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2171 if SectionType
in ('TE', 'PE32'):
2176 ## __GetFilePart() method
2178 # Get components for FILE statement
2180 # @param self The object pointer
2181 # @param FfsFileObj for whom component is got
2182 # @param MacroDict dictionary used to replace macro
2184 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2186 self
.__GetFileOpts
( FfsFileObj
)
2188 if not self
.__IsToken
("{"):
2189 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2190 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2191 # if self.__Token == 'RELOCS_STRIPPED':
2192 # FfsFileObj.KeepReloc = False
2194 # FfsFileObj.KeepReloc = True
2196 # raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2198 # if not self.__IsToken("{"):
2199 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2201 if not self
.__GetNextToken
():
2202 raise Warning("expected File name or section data At Line ", self
.FileName
, self
.CurrentLineNumber
)
2204 if self
.__Token
== "FV":
2205 if not self
.__IsToken
( "="):
2206 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2207 if not self
.__GetNextToken
():
2208 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2209 FfsFileObj
.FvName
= self
.__Token
2211 elif self
.__Token
== "FD":
2212 if not self
.__IsToken
( "="):
2213 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2214 if not self
.__GetNextToken
():
2215 raise Warning("expected FD name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2216 FfsFileObj
.FdName
= self
.__Token
2218 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2220 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2222 FfsFileObj
.FileName
= self
.__Token
2224 if not self
.__IsToken
( "}"):
2225 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2227 ## __GetFileOpts() method
2229 # Get options for FILE statement
2231 # @param self The object pointer
2232 # @param FfsFileObj for whom options is got
2234 def __GetFileOpts(self
, FfsFileObj
):
2236 if self
.__GetNextToken
():
2237 if TokenFindPattern
.match(self
.__Token
):
2238 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2239 if self
.__IsToken
(","):
2240 while self
.__GetNextToken
():
2241 if not TokenFindPattern
.match(self
.__Token
):
2242 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2243 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2245 if not self
.__IsToken
(","):
2251 if self
.__IsKeyword
( "FIXED", True):
2252 FfsFileObj
.Fixed
= True
2254 if self
.__IsKeyword
( "CHECKSUM", True):
2255 FfsFileObj
.CheckSum
= True
2257 if self
.__GetAlignment
():
2258 FfsFileObj
.Alignment
= self
.__Token
2262 ## __GetAlignment() method
2264 # Return the alignment value
2266 # @param self The object pointer
2267 # @retval True Successfully find alignment
2268 # @retval False Not able to find alignment
2270 def __GetAlignment(self
):
2271 if self
.__IsKeyword
( "Align", True):
2272 if not self
.__IsToken
( "="):
2273 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2275 if not self
.__GetNextToken
():
2276 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2281 ## __GetFilePart() method
2283 # Get section data for FILE statement
2285 # @param self The object pointer
2286 # @param FfsFileObj for whom section is got
2287 # @param MacroDict dictionary used to replace macro
2289 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2291 Dict
.update(MacroDict
)
2293 self
.__GetDefineStatements
(FfsFileObj
)
2295 Dict
.update(FfsFileObj
.DefineVarDict
)
2296 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2297 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2300 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2301 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2302 if not IsLeafSection
and not IsEncapSection
:
2305 ## __GetLeafSection() method
2307 # Get leaf section for Obj
2309 # @param self The object pointer
2310 # @param Obj for whom leaf section is got
2311 # @param MacroDict dictionary used to replace macro
2312 # @retval True Successfully find section statement
2313 # @retval False Not able to find section statement
2315 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2317 OldPos
= self
.GetFileBufferPos()
2319 if not self
.__IsKeyword
( "SECTION"):
2320 if len(Obj
.SectionList
) == 0:
2321 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2326 if self
.__GetAlignment
():
2327 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2328 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2329 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2330 AlignValue
= self
.__Token
2333 if self
.__IsKeyword
( "BUILD_NUM"):
2334 if not self
.__IsToken
( "="):
2335 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2337 if not self
.__GetNextToken
():
2338 raise Warning("expected Build number value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2340 BuildNum
= self
.__Token
2342 if self
.__IsKeyword
( "VERSION"):
2343 if AlignValue
== 'Auto':
2344 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
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 AlignValue
== 'Auto':
2360 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2361 if not self
.__IsToken
( "="):
2362 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2363 if not self
.__GetNextToken
():
2364 raise Warning("expected UI At Line ", self
.FileName
, self
.CurrentLineNumber
)
2365 UiSectionObj
= CommonDataClass
.FdfClass
.UiSectionClassObject()
2366 UiSectionObj
.Alignment
= AlignValue
2367 if self
.__GetStringData
():
2368 UiSectionObj
.StringData
= self
.__Token
2370 UiSectionObj
.FileName
= self
.__Token
2371 Obj
.SectionList
.append(UiSectionObj
)
2373 elif self
.__IsKeyword
( "FV_IMAGE"):
2374 if AlignValue
== 'Auto':
2375 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2376 if not self
.__IsToken
( "="):
2377 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2378 if not self
.__GetNextWord
():
2379 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2381 FvName
= self
.__Token
.upper()
2384 if self
.__IsToken
( "{"):
2386 FvObj
.UiFvName
= FvName
2387 self
.__GetDefineStatements
(FvObj
)
2388 MacroDict
.update(FvObj
.DefineVarDict
)
2389 self
.__GetBlockStatement
(FvObj
)
2390 self
.__GetSetStatements
(FvObj
)
2391 self
.__GetFvAlignment
(FvObj
)
2392 self
.__GetFvAttributes
(FvObj
)
2393 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2394 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2397 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2398 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2399 if not IsInf
and not IsFile
:
2402 if not self
.__IsToken
( "}"):
2403 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2405 FvImageSectionObj
= CommonDataClass
.FdfClass
.FvImageSectionClassObject()
2406 FvImageSectionObj
.Alignment
= AlignValue
2407 if FvObj
is not None:
2408 FvImageSectionObj
.Fv
= FvObj
2409 FvImageSectionObj
.FvName
= None
2411 FvImageSectionObj
.FvName
= FvName
2413 Obj
.SectionList
.append(FvImageSectionObj
)
2415 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2416 if AlignValue
== 'Auto':
2417 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2418 DepexSectionObj
= CommonDataClass
.FdfClass
.DepexSectionClassObject()
2419 DepexSectionObj
.Alignment
= AlignValue
2420 DepexSectionObj
.DepexType
= self
.__Token
2422 if not self
.__IsToken
( "="):
2423 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2424 if not self
.__IsToken
( "{"):
2425 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2426 if not self
.__SkipToToken
( "}"):
2427 raise Warning("expected Depex expression ending '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2429 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2430 Obj
.SectionList
.append(DepexSectionObj
)
2434 if not self
.__GetNextWord
():
2435 raise Warning("expected section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2437 # Encapsulation section appear, UndoToken and return
2438 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2439 self
.SetFileBufferPos(OldPos
)
2442 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2443 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2444 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2445 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2446 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2448 DataSectionObj
= CommonDataClass
.FdfClass
.DataSectionClassObject()
2449 DataSectionObj
.Alignment
= AlignValue
2450 DataSectionObj
.SecType
= self
.__Token
2452 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2453 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2454 if self
.__Token
== 'RELOCS_STRIPPED':
2455 DataSectionObj
.KeepReloc
= False
2457 DataSectionObj
.KeepReloc
= True
2459 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
)
2461 if self
.__IsToken
("="):
2462 if not self
.__GetNextToken
():
2463 raise Warning("expected section file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2464 DataSectionObj
.SectFileName
= self
.__Token
2466 if not self
.__GetCglSection
(DataSectionObj
):
2469 Obj
.SectionList
.append(DataSectionObj
)
2473 ## __GetCglSection() method
2475 # Get compressed or GUIDed section for Obj
2477 # @param self The object pointer
2478 # @param Obj for whom leaf section is got
2479 # @param AlignValue alignment value for complex section
2480 # @retval True Successfully find section statement
2481 # @retval False Not able to find section statement
2483 def __GetCglSection(self
, Obj
, AlignValue
= None):
2485 if self
.__IsKeyword
( "COMPRESS"):
2487 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2490 if not self
.__IsToken
("{"):
2491 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2493 CompressSectionObj
= CommonDataClass
.FdfClass
.CompressSectionClassObject()
2494 CompressSectionObj
.Alignment
= AlignValue
2495 CompressSectionObj
.CompType
= type
2496 # Recursive sections...
2498 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2499 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2500 if not IsLeafSection
and not IsEncapSection
:
2504 if not self
.__IsToken
( "}"):
2505 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2506 Obj
.SectionList
.append(CompressSectionObj
)
2509 # raise Warning("Compress type not known At Line ")
2513 elif self
.__IsKeyword
( "GUIDED"):
2515 if self
.__GetNextGuid
():
2516 GuidValue
= self
.__Token
2518 AttribDict
= self
.__GetGuidAttrib
()
2519 if not self
.__IsToken
("{"):
2520 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2521 GuidSectionObj
= CommonDataClass
.FdfClass
.GuidSectionClassObject()
2522 GuidSectionObj
.Alignment
= AlignValue
2523 GuidSectionObj
.NameGuid
= GuidValue
2524 GuidSectionObj
.SectionType
= "GUIDED"
2525 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2526 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2527 # Recursive sections...
2529 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2530 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2531 if not IsLeafSection
and not IsEncapSection
:
2534 if not self
.__IsToken
( "}"):
2535 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2536 Obj
.SectionList
.append(GuidSectionObj
)
2542 ## __GetGuidAttri() method
2544 # Get attributes for GUID section
2546 # @param self The object pointer
2547 # @retval AttribDict Dictionary of key-value pair of section attributes
2549 def __GetGuidAttrib(self
):
2552 AttribDict
["PROCESSING_REQUIRED"] = False
2553 AttribDict
["AUTH_STATUS_VALID"] = False
2554 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2555 AttribKey
= self
.__Token
2557 if not self
.__IsToken
("="):
2558 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2560 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2561 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2562 AttribDict
[AttribKey
] = self
.__Token
2564 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2565 AttribKey
= self
.__Token
2567 if not self
.__IsToken
("="):
2568 raise Warning("expected '=' At Line ")
2570 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2571 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2572 AttribDict
[AttribKey
] = self
.__Token
2576 ## __GetEncapsulationSec() method
2578 # Get encapsulation section for FILE
2580 # @param self The object pointer
2581 # @param FfsFile for whom section is got
2582 # @retval True Successfully find section statement
2583 # @retval False Not able to find section statement
2585 def __GetEncapsulationSec(self
, FfsFileObj
):
2587 OldPos
= self
.GetFileBufferPos()
2588 if not self
.__IsKeyword
( "SECTION"):
2589 if len(FfsFileObj
.SectionList
) == 0:
2590 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2595 if self
.__GetAlignment
():
2596 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2597 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2598 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2599 AlignValue
= self
.__Token
2601 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2602 self
.SetFileBufferPos(OldPos
)
2607 ## __GetCapsule() method
2609 # Get capsule section contents and store its data into capsule list of self.Profile
2611 # @param self The object pointer
2612 # @retval True Successfully find a capsule
2613 # @retval False Not able to find a capsule
2615 def __GetCapsule(self
):
2617 if not self
.__GetNextToken
():
2620 S
= self
.__Token
.upper()
2621 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2622 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2623 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2628 if not self
.__IsToken
("[CAPSULE.", True):
2629 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2630 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2631 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2632 raise Warning("expected [Capsule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2634 CapsuleObj
= CommonDataClass
.FdfClass
.CapsuleClassObject()
2636 CapsuleName
= self
.__GetUiName
()
2638 raise Warning("expected capsule name At line ", self
.FileName
, self
.CurrentLineNumber
)
2640 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2642 if not self
.__IsToken
( "]"):
2643 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2645 if self
.__IsKeyword
("CREATE_FILE"):
2646 if not self
.__IsToken
( "="):
2647 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2649 if not self
.__GetNextToken
():
2650 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2652 CapsuleObj
.CreateFile
= self
.__Token
2654 self
.__GetCapsuleStatements
(CapsuleObj
)
2655 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2658 ## __GetCapsuleStatements() method
2660 # Get statements for capsule
2662 # @param self The object pointer
2663 # @param Obj for whom statements are got
2665 def __GetCapsuleStatements(self
, Obj
):
2666 self
.__GetCapsuleTokens
(Obj
)
2667 self
.__GetDefineStatements
(Obj
)
2668 self
.__GetSetStatements
(Obj
)
2670 self
.__GetCapsuleData
(Obj
)
2672 ## __GetCapsuleStatements() method
2674 # Get token statements for capsule
2676 # @param self The object pointer
2677 # @param Obj for whom token statements are got
2679 def __GetCapsuleTokens(self
, Obj
):
2681 if not self
.__IsKeyword
("CAPSULE_GUID"):
2682 raise Warning("expected 'CAPSULE_GUID' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2684 while self
.__CurrentLine
().find("=") != -1:
2685 NameValue
= self
.__CurrentLine
().split("=")
2686 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2687 self
.CurrentLineNumber
+= 1
2688 self
.CurrentOffsetWithinLine
= 0
2690 ## __GetCapsuleData() method
2692 # Get capsule data for capsule
2694 # @param self The object pointer
2695 # @param Obj for whom capsule data are got
2697 def __GetCapsuleData(self
, Obj
):
2700 IsInf
= self
.__GetInfStatement
(Obj
, True)
2701 IsFile
= self
.__GetFileStatement
(Obj
, True)
2702 IsFv
= self
.__GetFvStatement
(Obj
)
2703 if not IsInf
and not IsFile
and not IsFv
:
2706 ## __GetFvStatement() method
2708 # Get FV for capsule
2710 # @param self The object pointer
2711 # @param CapsuleObj for whom FV is got
2712 # @retval True Successfully find a FV statement
2713 # @retval False Not able to find a FV statement
2715 def __GetFvStatement(self
, CapsuleObj
):
2717 if not self
.__IsKeyword
("FV"):
2720 if not self
.__IsToken
("="):
2721 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2723 if not self
.__GetNextToken
():
2724 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2726 # CapsuleFv = CapsuleData.CapsuleFv()
2727 # CapsuleFv.FvName = self.__Token
2728 # CapsuleObj.CapsuleDataList.append(CapsuleFv)
2731 ## __GetRule() method
2733 # Get Rule section contents and store its data into rule list of self.Profile
2735 # @param self The object pointer
2736 # @retval True Successfully find a Rule
2737 # @retval False Not able to find a Rule
2739 def __GetRule(self
):
2741 if not self
.__GetNextToken
():
2744 S
= self
.__Token
.upper()
2745 if S
.startswith("[") and not S
.startswith("[RULE."):
2746 if not S
.startswith("[OPTIONROM."):
2747 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2751 if not self
.__IsToken
("[Rule.", True):
2752 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2753 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2754 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2755 raise Warning("expected [Rule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2757 if not self
.__SkipToToken
("."):
2758 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2760 Arch
= self
.__SkippedChars
.rstrip(".")
2761 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
2762 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2764 ModuleType
= self
.__GetModuleType
()
2767 if self
.__IsToken
("."):
2768 if not self
.__GetNextWord
():
2769 raise Warning("expected template name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2770 TemplateName
= self
.__Token
2772 if not self
.__IsToken
( "]"):
2773 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2775 RuleObj
= self
.__GetRuleFileStatements
()
2776 RuleObj
.Arch
= Arch
.upper()
2777 RuleObj
.ModuleType
= ModuleType
2778 RuleObj
.TemplateName
= TemplateName
2779 if TemplateName
== '' :
2780 self
.Profile
.RuleDict
['RULE' + \
2784 ModuleType
.upper() ] = RuleObj
2786 self
.Profile
.RuleDict
['RULE' + \
2790 ModuleType
.upper() + \
2792 TemplateName
.upper() ] = RuleObj
2793 # self.Profile.RuleList.append(rule)
2796 ## __GetModuleType() method
2798 # Return the module type
2800 # @param self The object pointer
2801 # @retval string module type
2803 def __GetModuleType(self
):
2805 if not self
.__GetNextWord
():
2806 raise Warning("expected Module type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2807 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2808 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2809 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2810 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2811 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2812 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
2813 raise Warning("Unknown Module type At line ", self
.FileName
, self
.CurrentLineNumber
)
2816 ## __GetFileExtension() method
2818 # Return the file extension
2820 # @param self The object pointer
2821 # @retval string file name extension
2823 def __GetFileExtension(self
):
2824 if not self
.__IsToken
("."):
2825 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2828 if self
.__GetNextToken
():
2829 if FileExtensionPattern
.match(self
.__Token
):
2833 raise Warning("Unknown file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2836 raise Warning("expected file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2838 ## __GetRuleFileStatement() method
2842 # @param self The object pointer
2843 # @retval Rule Rule object
2845 def __GetRuleFileStatements(self
):
2847 if not self
.__IsKeyword
("FILE"):
2848 raise Warning("expected FILE At Line ", self
.FileName
, self
.CurrentLineNumber
)
2850 if not self
.__GetNextWord
():
2851 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2853 Type
= self
.__Token
.strip().upper()
2854 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2855 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):
2856 raise Warning("Unknown FV type At line ", self
.FileName
, self
.CurrentLineNumber
)
2858 if not self
.__IsToken
("="):
2859 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2861 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2862 if not self
.__GetNextWord
():
2863 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2864 if self
.__Token
== 'PCD':
2865 if not self
.__IsToken
( "("):
2866 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2867 PcdPair
= self
.__GetNextPcdName
()
2868 if not self
.__IsToken
( ")"):
2869 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2870 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2872 NameGuid
= self
.__Token
2875 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2876 if self
.__FileCouldHaveRelocFlag
(Type
):
2877 if self
.__Token
== 'RELOCS_STRIPPED':
2882 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2885 if self
.__GetNextToken
():
2886 if TokenFindPattern
.match(self
.__Token
):
2887 KeyStringList
.append(self
.__Token
)
2888 if self
.__IsToken
(","):
2889 while self
.__GetNextToken
():
2890 if not TokenFindPattern
.match(self
.__Token
):
2891 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2892 KeyStringList
.append(self
.__Token
)
2894 if not self
.__IsToken
(","):
2902 if self
.__IsKeyword
("Fixed", True):
2906 if self
.__IsKeyword
("CheckSum", True):
2910 if self
.__GetAlignment
():
2911 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2912 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2913 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2914 AlignValue
= self
.__Token
2916 if self
.__IsToken
("{"):
2917 # Complex file rule expected
2918 Rule
= RuleComplexFile
.RuleComplexFile()
2919 Rule
.FvFileType
= Type
2920 Rule
.NameGuid
= NameGuid
2921 Rule
.Alignment
= AlignValue
2922 Rule
.CheckSum
= CheckSum
2924 Rule
.KeyStringList
= KeyStringList
2925 if KeepReloc
is not None:
2926 Rule
.KeepReloc
= KeepReloc
2929 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2930 IsLeaf
= self
.__GetEfiSection
(Rule
)
2931 if not IsEncapsulate
and not IsLeaf
:
2934 if not self
.__IsToken
("}"):
2935 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2939 elif self
.__IsToken
("|"):
2941 Ext
= self
.__GetFileExtension
()
2943 Rule
= RuleSimpleFile
.RuleSimpleFile()
2945 Rule
.FvFileType
= Type
2946 Rule
.NameGuid
= NameGuid
2947 Rule
.Alignment
= AlignValue
2948 Rule
.CheckSum
= CheckSum
2950 Rule
.FileExtension
= Ext
2951 Rule
.KeyStringList
= KeyStringList
2952 if KeepReloc
is not None:
2953 Rule
.KeepReloc
= KeepReloc
2958 # Simple file rule expected
2959 if not self
.__GetNextWord
():
2960 raise Warning("expected leaf section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2962 SectionName
= self
.__Token
2964 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2965 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2966 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2969 if self
.__IsKeyword
("Fixed", True):
2972 if self
.__IsKeyword
("CheckSum", True):
2975 if self
.__GetAlignment
():
2976 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2977 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2978 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2979 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
2980 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2981 AlignValue
= self
.__Token
2983 if not self
.__GetNextToken
():
2984 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2986 Rule
= RuleSimpleFile
.RuleSimpleFile()
2987 Rule
.SectionType
= SectionName
2988 Rule
.FvFileType
= Type
2989 Rule
.NameGuid
= NameGuid
2990 Rule
.Alignment
= AlignValue
2991 Rule
.CheckSum
= CheckSum
2993 Rule
.FileName
= self
.__Token
2994 Rule
.KeyStringList
= KeyStringList
2995 if KeepReloc
is not None:
2996 Rule
.KeepReloc
= KeepReloc
2999 ## __GetEfiSection() method
3001 # Get section list for Rule
3003 # @param self The object pointer
3004 # @param Obj for whom section is got
3005 # @retval True Successfully find section statement
3006 # @retval False Not able to find section statement
3008 def __GetEfiSection(self
, Obj
):
3010 OldPos
= self
.GetFileBufferPos()
3011 if not self
.__GetNextWord
():
3013 SectionName
= self
.__Token
3015 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3016 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3020 if SectionName
== "FV_IMAGE":
3021 FvImageSectionObj
= FvImageSection
.FvImageSection()
3022 if self
.__IsKeyword
("FV_IMAGE"):
3024 if self
.__IsToken
( "{"):
3026 self
.__GetDefineStatements
(FvObj
)
3027 self
.__GetBlockStatement
(FvObj
)
3028 self
.__GetSetStatements
(FvObj
)
3029 self
.__GetFvAlignment
(FvObj
)
3030 self
.__GetFvAttributes
(FvObj
)
3031 self
.__GetAprioriSection
(FvObj
)
3032 self
.__GetAprioriSection
(FvObj
)
3035 IsInf
= self
.__GetInfStatement
(FvObj
)
3036 IsFile
= self
.__GetFileStatement
(FvObj
)
3037 if not IsInf
and not IsFile
:
3040 if not self
.__IsToken
( "}"):
3041 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3042 FvImageSectionObj
.Fv
= FvObj
3043 FvImageSectionObj
.FvName
= None
3046 if not self
.__IsKeyword
("FV"):
3047 raise Warning("expected 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3048 FvImageSectionObj
.FvFileType
= self
.__Token
3050 if self
.__GetAlignment
():
3051 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3052 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3053 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3054 FvImageSectionObj
.Alignment
= self
.__Token
3056 if self
.__IsToken
('|'):
3057 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3058 elif self
.__GetNextToken
():
3059 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3060 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3061 FvImageSectionObj
.FvFileName
= self
.__Token
3065 raise Warning("expected FV file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3067 Obj
.SectionList
.append(FvImageSectionObj
)
3070 EfiSectionObj
= EfiSection
.EfiSection()
3071 EfiSectionObj
.SectionType
= SectionName
3073 if not self
.__GetNextToken
():
3074 raise Warning("expected file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3076 if self
.__Token
== "STRING":
3077 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3078 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3080 if not self
.__IsToken
('='):
3081 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3083 if not self
.__GetNextToken
():
3084 raise Warning("expected Quoted String At Line ", self
.FileName
, self
.CurrentLineNumber
)
3086 if self
.__GetStringData
():
3087 EfiSectionObj
.StringData
= self
.__Token
3089 if self
.__IsKeyword
("BUILD_NUM"):
3090 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3091 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3093 if not self
.__IsToken
("="):
3094 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3095 if not self
.__GetNextToken
():
3096 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3097 EfiSectionObj
.BuildNum
= self
.__Token
3100 EfiSectionObj
.FileType
= self
.__Token
3101 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3103 if self
.__IsKeyword
("Optional"):
3104 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3105 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3106 EfiSectionObj
.Optional
= True
3108 if self
.__IsKeyword
("BUILD_NUM"):
3109 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3110 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3112 if not self
.__IsToken
("="):
3113 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3114 if not self
.__GetNextToken
():
3115 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3116 EfiSectionObj
.BuildNum
= self
.__Token
3118 if self
.__GetAlignment
():
3119 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3120 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3121 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3122 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3123 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3124 EfiSectionObj
.Alignment
= self
.__Token
3126 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3127 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3128 if self
.__Token
== 'RELOCS_STRIPPED':
3129 EfiSectionObj
.KeepReloc
= False
3131 EfiSectionObj
.KeepReloc
= True
3132 if Obj
.KeepReloc
is not None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3133 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3135 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3138 if self
.__IsToken
('|'):
3139 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3140 elif self
.__GetNextToken
():
3141 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3142 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3144 if self
.__Token
.startswith('PCD'):
3146 self
.__GetNextWord
()
3148 if self
.__Token
== 'PCD':
3149 if not self
.__IsToken
( "("):
3150 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3151 PcdPair
= self
.__GetNextPcdName
()
3152 if not self
.__IsToken
( ")"):
3153 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3154 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3156 EfiSectionObj
.FileName
= self
.__Token
3161 raise Warning("expected section file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3163 Obj
.SectionList
.append(EfiSectionObj
)
3166 ## __RuleSectionCouldBeOptional() method
3168 # Get whether a section could be optional
3170 # @param self The object pointer
3171 # @param SectionType The section type to check
3172 # @retval True section could be optional
3173 # @retval False section never optional
3175 def __RuleSectionCouldBeOptional(self
, SectionType
):
3176 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3181 ## __RuleSectionCouldHaveBuildNum() method
3183 # Get whether a section could have build number information
3185 # @param self The object pointer
3186 # @param SectionType The section type to check
3187 # @retval True section could have build number information
3188 # @retval False section never have build number information
3190 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3191 if SectionType
in ("VERSION"):
3196 ## __RuleSectionCouldHaveString() method
3198 # Get whether a section could have string
3200 # @param self The object pointer
3201 # @param SectionType The section type to check
3202 # @retval True section could have string
3203 # @retval False section never have string
3205 def __RuleSectionCouldHaveString(self
, SectionType
):
3206 if SectionType
in ("UI", "VERSION"):
3211 ## __CheckRuleSectionFileType() method
3213 # Get whether a section matches a file type
3215 # @param self The object pointer
3216 # @param SectionType The section type to check
3217 # @param FileType The file type to check
3219 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3220 if SectionType
== "COMPAT16":
3221 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3222 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3223 elif SectionType
== "PE32":
3224 if FileType
not in ("PE32", "SEC_PE32"):
3225 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3226 elif SectionType
== "PIC":
3227 if FileType
not in ("PIC", "PIC"):
3228 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3229 elif SectionType
== "TE":
3230 if FileType
not in ("TE", "SEC_TE"):
3231 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3232 elif SectionType
== "RAW":
3233 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3234 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3235 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3236 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3237 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3238 elif SectionType
== "UI":
3239 if FileType
not in ("UI", "SEC_UI"):
3240 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3241 elif SectionType
== "VERSION":
3242 if FileType
not in ("VERSION", "SEC_VERSION"):
3243 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3244 elif SectionType
== "PEI_DEPEX":
3245 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3246 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3247 elif SectionType
== "GUID":
3248 if FileType
not in ("PE32", "SEC_GUID"):
3249 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3251 ## __GetRuleEncapsulationSection() method
3253 # Get encapsulation section for Rule
3255 # @param self The object pointer
3256 # @param Rule for whom section is got
3257 # @retval True Successfully find section statement
3258 # @retval False Not able to find section statement
3260 def __GetRuleEncapsulationSection(self
, Rule
):
3262 if self
.__IsKeyword
( "COMPRESS"):
3264 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3267 if not self
.__IsToken
("{"):
3268 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3270 CompressSectionObj
= CompressSection
.CompressSection()
3272 CompressSectionObj
.CompType
= Type
3273 # Recursive sections...
3275 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3276 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3277 if not IsEncapsulate
and not IsLeaf
:
3280 if not self
.__IsToken
( "}"):
3281 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3282 Rule
.SectionList
.append(CompressSectionObj
)
3286 elif self
.__IsKeyword
( "GUIDED"):
3288 if self
.__GetNextGuid
():
3289 GuidValue
= self
.__Token
3291 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3292 GuidValue
= self
.__Token
3294 AttribDict
= self
.__GetGuidAttrib
()
3296 if not self
.__IsToken
("{"):
3297 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3298 GuidSectionObj
= GuidSection
.GuidSection()
3299 GuidSectionObj
.NameGuid
= GuidValue
3300 GuidSectionObj
.SectionType
= "GUIDED"
3301 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3302 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3306 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3307 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3308 if not IsEncapsulate
and not IsLeaf
:
3311 if not self
.__IsToken
( "}"):
3312 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3313 Rule
.SectionList
.append(GuidSectionObj
)
3319 ## __GetVtf() method
3321 # Get VTF section contents and store its data into VTF list of self.Profile
3323 # @param self The object pointer
3324 # @retval True Successfully find a VTF
3325 # @retval False Not able to find a VTF
3329 if not self
.__GetNextToken
():
3332 S
= self
.__Token
.upper()
3333 if S
.startswith("[") and not S
.startswith("[VTF."):
3334 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3335 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3340 if not self
.__IsToken
("[VTF.", True):
3341 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3342 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3343 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
3344 raise Warning("expected [VTF.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
3346 if not self
.__SkipToToken
("."):
3347 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3349 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3350 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3351 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3353 if not self
.__GetNextWord
():
3354 raise Warning("expected VTF name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3355 Name
= self
.__Token
.upper()
3358 VtfObj
.UiName
= Name
3359 VtfObj
.KeyArch
= Arch
3361 if self
.__IsToken
(","):
3362 if not self
.__GetNextWord
():
3363 raise Warning("expected Arch list At Line ", self
.FileName
, self
.CurrentLineNumber
)
3364 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3365 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3366 VtfObj
.ArchList
= self
.__Token
.upper()
3368 if not self
.__IsToken
( "]"):
3369 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3371 if self
.__IsKeyword
("IA32_RST_BIN"):
3372 if not self
.__IsToken
("="):
3373 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3375 if not self
.__GetNextToken
():
3376 raise Warning("expected Reset file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3378 VtfObj
.ResetBin
= self
.__Token
3380 while self
.__GetComponentStatement
(VtfObj
):
3383 self
.Profile
.VtfList
.append(VtfObj
)
3386 ## __GetComponentStatement() method
3388 # Get components in VTF
3390 # @param self The object pointer
3391 # @param VtfObj for whom component is got
3392 # @retval True Successfully find a component
3393 # @retval False Not able to find a component
3395 def __GetComponentStatement(self
, VtfObj
):
3397 if not self
.__IsKeyword
("COMP_NAME"):
3400 if not self
.__IsToken
("="):
3401 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3403 if not self
.__GetNextWord
():
3404 raise Warning("expected Component Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3406 CompStatementObj
= ComponentStatement
.ComponentStatement()
3407 CompStatementObj
.CompName
= self
.__Token
3409 if not self
.__IsKeyword
("COMP_LOC"):
3410 raise Warning("expected COMP_LOC At Line ", self
.FileName
, self
.CurrentLineNumber
)
3412 if not self
.__IsToken
("="):
3413 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3415 CompStatementObj
.CompLoc
= ""
3416 if self
.__GetNextWord
():
3417 CompStatementObj
.CompLoc
= self
.__Token
3418 if self
.__IsToken
('|'):
3419 if not self
.__GetNextWord
():
3420 raise Warning("Expected Region Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3422 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3423 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3425 CompStatementObj
.FilePos
= self
.__Token
3427 self
.CurrentLineNumber
+= 1
3428 self
.CurrentOffsetWithinLine
= 0
3430 if not self
.__IsKeyword
("COMP_TYPE"):
3431 raise Warning("expected COMP_TYPE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3433 if not self
.__IsToken
("="):
3434 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3436 if not self
.__GetNextToken
():
3437 raise Warning("expected Component type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3438 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3439 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3440 not self
.__Token
[2] in string
.hexdigits
or not self
.__Token
[-1] in string
.hexdigits
:
3441 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3442 CompStatementObj
.CompType
= self
.__Token
3444 if not self
.__IsKeyword
("COMP_VER"):
3445 raise Warning("expected COMP_VER At Line ", self
.FileName
, self
.CurrentLineNumber
)
3447 if not self
.__IsToken
("="):
3448 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3450 if not self
.__GetNextToken
():
3451 raise Warning("expected Component version At Line ", self
.FileName
, self
.CurrentLineNumber
)
3453 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3454 if Pattern
.match(self
.__Token
) is None:
3455 raise Warning("Unknown version format At line ", self
.FileName
, self
.CurrentLineNumber
)
3456 CompStatementObj
.CompVer
= self
.__Token
3458 if not self
.__IsKeyword
("COMP_CS"):
3459 raise Warning("expected COMP_CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3461 if not self
.__IsToken
("="):
3462 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3464 if not self
.__GetNextToken
():
3465 raise Warning("expected Component CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3466 if self
.__Token
not in ("1", "0"):
3467 raise Warning("Unknown Component CS At line ", self
.FileName
, self
.CurrentLineNumber
)
3468 CompStatementObj
.CompCs
= self
.__Token
3471 if not self
.__IsKeyword
("COMP_BIN"):
3472 raise Warning("expected COMP_BIN 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 file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3480 CompStatementObj
.CompBin
= self
.__Token
3482 if not self
.__IsKeyword
("COMP_SYM"):
3483 raise Warning("expected COMP_SYM At Line ", self
.FileName
, self
.CurrentLineNumber
)
3485 if not self
.__IsToken
("="):
3486 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3488 if not self
.__GetNextToken
():
3489 raise Warning("expected Component symbol file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3491 CompStatementObj
.CompSym
= self
.__Token
3493 if not self
.__IsKeyword
("COMP_SIZE"):
3494 raise Warning("expected COMP_SIZE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3496 if not self
.__IsToken
("="):
3497 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3499 if self
.__IsToken
("-"):
3500 CompStatementObj
.CompSize
= self
.__Token
3501 elif self
.__GetNextDecimalNumber
():
3502 CompStatementObj
.CompSize
= self
.__Token
3503 elif self
.__GetNextHexNumber
():
3504 CompStatementObj
.CompSize
= self
.__Token
3506 raise Warning("Unknown size At line ", self
.FileName
, self
.CurrentLineNumber
)
3508 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3511 ## __GetFvInFd() method
3513 # Get FV list contained in FD
3515 # @param self The object pointer
3516 # @param FdName FD name
3517 # @retval FvList list of FV in FD
3519 def __GetFvInFd (self
, FdName
):
3522 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3523 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3524 for elementRegion
in FdObj
.RegionList
:
3525 if elementRegion
.RegionType
== 'FV':
3526 for elementRegionData
in elementRegion
.RegionDataList
:
3527 if elementRegionData
is not None and elementRegionData
.upper() not in FvList
:
3528 FvList
.append(elementRegionData
.upper())
3531 ## __GetReferencedFdFvTuple() method
3533 # Get FD and FV list referenced by a FFS file
3535 # @param self The object pointer
3536 # @param FfsFile contains sections to be searched
3537 # @param RefFdList referenced FD by section
3538 # @param RefFvList referenced FV by section
3540 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3542 for FfsObj
in FvObj
.FfsList
:
3543 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3544 if FfsObj
.FvName
is not None and FfsObj
.FvName
.upper() not in RefFvList
:
3545 RefFvList
.append(FfsObj
.FvName
.upper())
3546 elif FfsObj
.FdName
is not None and FfsObj
.FdName
.upper() not in RefFdList
:
3547 RefFdList
.append(FfsObj
.FdName
.upper())
3549 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3551 ## __GetReferencedFdFvTupleFromSection() method
3553 # Get FD and FV list referenced by a FFS section
3555 # @param self The object pointer
3556 # @param FfsFile contains sections to be searched
3557 # @param FdList referenced FD by section
3558 # @param FvList referenced FV by section
3560 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3563 SectionStack
.extend(FfsFile
.SectionList
)
3564 while SectionStack
!= []:
3565 SectionObj
= SectionStack
.pop()
3566 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3567 if SectionObj
.FvName
is not None and SectionObj
.FvName
.upper() not in FvList
:
3568 FvList
.append(SectionObj
.FvName
.upper())
3569 if SectionObj
.Fv
is not None and SectionObj
.Fv
.UiFvName
is not None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3570 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3571 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3573 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3574 SectionStack
.extend(SectionObj
.SectionList
)
3576 ## CycleReferenceCheck() method
3578 # Check whether cycle reference exists in FDF
3580 # @param self The object pointer
3581 # @retval True cycle reference exists
3582 # @retval False Not exists cycle reference
3584 def CycleReferenceCheck(self
):
3586 CycleRefExists
= False
3589 for FvName
in self
.Profile
.FvDict
.keys():
3590 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3592 RefFvStack
.append(FvName
)
3595 while RefFvStack
!= []:
3596 FvNameFromStack
= RefFvStack
.pop()
3597 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3598 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3604 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3606 for RefFdName
in RefFdList
:
3607 if RefFdName
in FdAnalyzedList
:
3610 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3611 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3612 if FvInFdList
!= []:
3613 LogStr
+= "FD %s contains FV: " % RefFdName
3614 for FvObj
in FvInFdList
:
3617 if FvObj
not in RefFvStack
:
3618 RefFvStack
.append(FvObj
)
3620 if FvName
in RefFvStack
:
3621 CycleRefExists
= True
3622 raise Warning(LogStr
)
3623 FdAnalyzedList
.append(RefFdName
)
3625 for RefFvName
in RefFvList
:
3626 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3627 if RefFvName
not in RefFvStack
:
3628 RefFvStack
.append(RefFvName
)
3630 if FvName
in RefFvStack
:
3631 CycleRefExists
= True
3632 raise Warning(LogStr
)
3638 return CycleRefExists
3640 if __name__
== "__main__":
3643 test_file
= sys
.argv
[1]
3644 except IndexError, v
:
3645 print "Usage: %s filename" % sys
.argv
[0]
3648 parser
= FdfParser(test_file
)
3651 parser
.CycleReferenceCheck()