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 *
27 ##define T_CHAR_SPACE ' '
28 ##define T_CHAR_NULL '\0'
29 ##define T_CHAR_CR '\r'
30 ##define T_CHAR_TAB '\t'
31 ##define T_CHAR_LF '\n'
32 ##define T_CHAR_SLASH '/'
33 ##define T_CHAR_BACKSLASH '\\'
34 ##define T_CHAR_DOUBLE_QUOTE '\"'
35 ##define T_CHAR_SINGLE_QUOTE '\''
36 ##define T_CHAR_STAR '*'
37 ##define T_CHAR_HASH '#'
39 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
40 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
41 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
43 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
46 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
48 # All Macro values when parsing file, not replace existing Macro
51 FileExtensionPattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
52 TokenFindPattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
54 def GetRealFileLine (File
, Line
):
57 for Profile
in IncludeFileList
:
58 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
59 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
60 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
61 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
63 return (File
, Line
- InsertedLines
)
65 ## The exception class that used to report error messages when parsing FDF
67 # Currently the "ToolName" is set to be "FDF Parser".
69 class Warning (Exception):
72 # @param self The object pointer
73 # @param Str The message to record
74 # @param File The FDF name
75 # @param Line The Line number that error occurs
77 def __init__(self
, Str
, File
=None, Line
=None):
79 FileLineTuple
= GetRealFileLine(File
, Line
)
80 self
.FileName
= FileLineTuple
[0]
81 self
.LineNumber
= FileLineTuple
[1]
82 self
.message
= Str
+ str(self
.LineNumber
)
83 self
.ToolName
= 'FDF Parser'
85 ## The MACRO class that used to record macro value data when parsing include file
91 # @param self The object pointer
92 # @param FileName The file that to be parsed
94 def __init__(self
, FileName
, Line
):
95 self
.FileName
= FileName
96 self
.DefinedAtLine
= Line
98 self
.MacroValue
= None
100 ## The Include file content class that used to record file data when parsing include file
102 # May raise Exception when opening file.
104 class IncludeFileProfile
:
107 # @param self The object pointer
108 # @param FileName The file that to be parsed
110 def __init__(self
, FileName
):
111 self
.FileName
= FileName
112 self
.FileLinesList
= []
114 fsock
= open(FileName
, "rb", 0)
116 self
.FileLinesList
= fsock
.readlines()
121 raise Warning("Error when opening file %s" % FileName
)
123 self
.InsertStartLineNumber
= None
124 self
.InsertAdjust
= 0
126 ## The FDF content class that used to record file data when parsing FDF
128 # May raise Exception when opening file.
133 # @param self The object pointer
134 # @param FileName The file that to be parsed
136 def __init__(self
, FileName
):
137 self
.FileLinesList
= []
139 fsock
= open(FileName
, "rb", 0)
141 self
.FileLinesList
= fsock
.readlines()
146 raise Warning("Error when opening file %s" % FileName
)
151 self
.PcdFileLineDict
= {}
152 self
.InfFileLineList
= []
156 self
.CapsuleList
= []
160 ## The syntax parser for FDF
162 # PreprocessFile method should be called prior to ParseFile
163 # CycleReferenceCheck method can detect cycles in FDF contents
165 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
166 # Get*** procedures mean these procedures will make judgement on current token only.
168 class FdfParser(object):
171 # @param self The object pointer
172 # @param FileName The file that to be parsed
174 def __init__(self
, FileName
):
175 self
.Profile
= FileProfile(FileName
)
176 self
.FileName
= FileName
177 self
.CurrentLineNumber
= 1
178 self
.CurrentOffsetWithinLine
= 0
179 self
.CurrentFdName
= None
180 self
.CurrentFvName
= None
182 self
.__SkippedChars
= ""
184 self
.__WipeOffArea
= []
186 ## __IsWhiteSpace() method
188 # Whether char at current FileBufferPos is whitespace
190 # @param self The object pointer
191 # @param Char The char to test
192 # @retval True The char is a kind of white space
193 # @retval False The char is NOT a kind of white space
195 def __IsWhiteSpace(self
, Char
):
196 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
201 ## __SkipWhiteSpace() method
203 # Skip white spaces from current char, return number of chars skipped
205 # @param self The object pointer
206 # @retval Count The number of chars skipped
208 def __SkipWhiteSpace(self
):
210 while not self
.__EndOfFile
():
212 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
213 self
.__SkippedChars
+= str(self
.__CurrentChar
())
220 ## __EndOfFile() method
222 # Judge current buffer pos is at file end
224 # @param self The object pointer
225 # @retval True Current File buffer position is at file end
226 # @retval False Current File buffer position is NOT at file end
228 def __EndOfFile(self
):
229 NumberOfLines
= len(self
.Profile
.FileLinesList
)
230 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
231 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
233 elif self
.CurrentLineNumber
> NumberOfLines
:
238 ## __EndOfLine() method
240 # Judge current buffer pos is at line end
242 # @param self The object pointer
243 # @retval True Current File buffer position is at line end
244 # @retval False Current File buffer position is NOT at line end
246 def __EndOfLine(self
):
247 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
249 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
250 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
257 # Reset file data buffer to the initial state
259 # @param self The object pointer
262 self
.CurrentLineNumber
= 1
263 self
.CurrentOffsetWithinLine
= 0
265 ## __UndoOneChar() method
267 # Go back one char in the file buffer
269 # @param self The object pointer
270 # @retval True Successfully go back one char
271 # @retval False Not able to go back one char as file beginning reached
273 def __UndoOneChar(self
):
275 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
277 elif self
.CurrentOffsetWithinLine
== 0:
278 self
.CurrentLineNumber
-= 1
279 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
281 self
.CurrentOffsetWithinLine
-= 1
284 ## __GetOneChar() method
286 # Move forward one char in the file buffer
288 # @param self The object pointer
290 def __GetOneChar(self
):
291 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
292 self
.CurrentLineNumber
+= 1
293 self
.CurrentOffsetWithinLine
= 0
295 self
.CurrentOffsetWithinLine
+= 1
297 ## __CurrentChar() method
299 # Get the char pointed to by the file buffer pointer
301 # @param self The object pointer
302 # @retval Char Current char
304 def __CurrentChar(self
):
305 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
307 ## __NextChar() method
309 # Get the one char pass the char pointed to by the file buffer pointer
311 # @param self The object pointer
312 # @retval Char Next char
314 def __NextChar(self
):
315 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
316 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
318 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
320 ## __SetCurrentCharValue() method
322 # Modify the value of current char
324 # @param self The object pointer
325 # @param Value The new value of current char
327 def __SetCurrentCharValue(self
, Value
):
328 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
330 ## __CurrentLine() method
332 # Get the list that contains current line contents
334 # @param self The object pointer
335 # @retval List current line contents
337 def __CurrentLine(self
):
338 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
340 def __StringToList(self
):
341 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
342 self
.Profile
.FileLinesList
[-1].append(' ')
344 def __ReplaceMacros(self
, Str
, File
, Line
):
346 while Str
.find('$(', MacroEnd
) >= 0:
347 MacroStart
= Str
.find('$(', MacroEnd
)
348 if Str
.find(')', MacroStart
) > 0:
349 MacroEnd
= Str
.find(')', MacroStart
)
350 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
352 if Name
in InputMacroDict
:
353 Value
= InputMacroDict
[Name
]
356 for Profile
in AllMacroList
:
357 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
358 Value
= Profile
.MacroValue
360 if Value
is not None:
361 Str
= Str
.replace('$(' + Name
+ ')', Value
)
362 MacroEnd
= MacroStart
+ len(Value
)
365 raise Warning("Macro not complete At Line ", self
.FileName
, self
.CurrentLineNumber
)
368 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
=' '):
369 if StartPos
[0] == EndPos
[0]:
371 while Offset
<= EndPos
[1]:
372 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
377 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
378 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
382 while Line
< EndPos
[0]:
384 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
385 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
390 while Offset
<= EndPos
[1]:
391 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
395 def __GetMacroName(self
):
396 if not self
.__GetNextToken
():
397 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
398 MacroName
= self
.__Token
400 if MacroName
.startswith('!'):
402 MacroName
= MacroName
[1:].strip()
404 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
405 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
406 self
.FileName
, self
.CurrentLineNumber
)
407 MacroName
= MacroName
[2:-1]
408 return MacroName
, NotFlag
410 ## PreprocessFile() method
412 # Preprocess file contents, replace comments with spaces.
413 # In the end, rewind the file buffer pointer to the beginning
414 # BUGBUG: No !include statement processing contained in this procedure
415 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
417 # @param self The object pointer
419 def PreprocessFile(self
):
423 DoubleSlashComment
= False
425 # HashComment in quoted string " " is ignored.
428 while not self
.__EndOfFile
():
430 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
431 InString
= not InString
432 # meet new line, then no longer in a comment for // and '#'
433 if self
.__CurrentChar
() == T_CHAR_LF
:
434 self
.CurrentLineNumber
+= 1
435 self
.CurrentOffsetWithinLine
= 0
436 if InComment
and DoubleSlashComment
:
438 DoubleSlashComment
= False
439 if InComment
and HashComment
:
442 # check for */ comment end
443 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
444 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
446 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
449 # set comments to spaces
451 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
453 # check for // comment
454 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
456 DoubleSlashComment
= True
457 # check for '#' comment
458 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
461 # check for /* comment start
462 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
463 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
465 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
471 # restore from ListOfList to ListOfString
472 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
475 ## PreprocessIncludeFile() method
477 # Preprocess file contents, replace !include statements with file contents.
478 # In the end, rewind the file buffer pointer to the beginning
480 # @param self The object pointer
482 def PreprocessIncludeFile(self
):
484 while self
.__GetNextToken
():
486 if self
.__Token
== '!include':
487 IncludeLine
= self
.CurrentLineNumber
488 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
489 if not self
.__GetNextToken
():
490 raise Warning("expected include file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
491 IncFileName
= self
.__Token
492 if not os
.path
.isabs(IncFileName
):
493 if IncFileName
.startswith('$(WORKSPACE)'):
494 Str
= mws
.handleWsMacro(IncFileName
)
495 Str
= Str
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
496 if os
.path
.exists(Str
):
497 if not os
.path
.isabs(Str
):
498 Str
= os
.path
.abspath(Str
)
501 # file is in the same dir with FDF file
502 FullFdf
= self
.FileName
503 if not os
.path
.isabs(self
.FileName
):
504 FullFdf
= mws
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
506 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
508 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
509 raise Warning("Include file not exists At Line ", self
.FileName
, self
.CurrentLineNumber
)
511 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
513 CurrentLine
= self
.CurrentLineNumber
514 CurrentOffset
= self
.CurrentOffsetWithinLine
515 # list index of the insertion, note that line number is 'CurrentLine + 1'
516 InsertAtLine
= CurrentLine
517 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
518 # deal with remaining portions after "!include filename", if exists.
519 if self
.__GetNextToken
():
520 if self
.CurrentLineNumber
== CurrentLine
:
521 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
522 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
523 IncFileProfile
.InsertAdjust
+= 1
524 self
.CurrentLineNumber
+= 1
525 self
.CurrentOffsetWithinLine
= 0
527 for Line
in IncFileProfile
.FileLinesList
:
528 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
529 self
.CurrentLineNumber
+= 1
532 IncludeFileList
.append(IncFileProfile
)
534 # comment out the processed include file statement
535 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
536 TempList
.insert(IncludeOffset
, '#')
537 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
541 ## PreprocessIncludeFile() method
543 # Preprocess file contents, replace !include statements with file contents.
544 # In the end, rewind the file buffer pointer to the beginning
546 # @param self The object pointer
548 def PreprocessConditionalStatement(self
):
549 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
551 while self
.__GetNextToken
():
552 if self
.__Token
== 'DEFINE':
553 DefineLine
= self
.CurrentLineNumber
- 1
554 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
555 if not self
.__GetNextToken
():
556 raise Warning("expected Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
558 if not self
.__IsToken
( "="):
559 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
561 if not self
.__GetNextToken
():
562 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
564 if self
.__GetStringData
():
567 if not Macro
in InputMacroDict
:
568 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
569 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
570 MacProfile
.MacroName
= Macro
571 MacProfile
.MacroValue
= Value
572 AllMacroList
.append(MacProfile
)
573 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
575 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
576 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
577 IfList
.append([IfStartPos
, None, None])
578 CondLabel
= self
.__Token
580 MacroName
, NotFlag
= self
.__GetMacroName
()
581 NotDefineFlag
= False
582 if CondLabel
== '!ifndef':
584 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
586 raise Warning("'NOT' operation not allowed for Macro name At Line ", self
.FileName
, self
.CurrentLineNumber
)
588 if CondLabel
== '!if':
590 if not self
.__GetNextOp
():
591 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
593 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
595 if not self
.__GetNextToken
():
596 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
597 if self
.__GetStringData
():
599 MacroValue
= self
.__Token
600 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
602 ConditionSatisfied
= not ConditionSatisfied
603 BranchDetermined
= ConditionSatisfied
605 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
606 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
608 ConditionSatisfied
= not ConditionSatisfied
609 BranchDetermined
= ConditionSatisfied
610 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
611 if ConditionSatisfied
:
612 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
615 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
617 ConditionSatisfied
= not ConditionSatisfied
618 BranchDetermined
= ConditionSatisfied
619 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
620 if ConditionSatisfied
:
621 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
623 elif self
.__Token
in ('!elseif', '!else'):
624 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
626 raise Warning("Missing !if statement At Line ", self
.FileName
, self
.CurrentLineNumber
)
628 IfList
[-1] = [ElseStartPos
, False, True]
629 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
631 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
632 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
633 if self
.__Token
== '!elseif':
634 MacroName
, NotFlag
= self
.__GetMacroName
()
635 if not self
.__GetNextOp
():
636 raise Warning("expected !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
638 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
640 if not self
.__GetNextToken
():
641 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
642 if self
.__GetStringData
():
644 MacroValue
= self
.__Token
645 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
647 ConditionSatisfied
= not ConditionSatisfied
650 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
651 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
653 ConditionSatisfied
= not ConditionSatisfied
655 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
659 IfList
[-1][1] = False
662 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
665 elif self
.__Token
== '!endif':
667 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
669 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
675 raise Warning("Missing !endif At Line ", self
.FileName
, self
.CurrentLineNumber
)
678 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
680 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
681 if Name
in InputMacroDict
:
682 MacroValue
= InputMacroDict
[Name
]
684 if Value
== 'Bool' and MacroValue
is None or MacroValue
.upper() == 'FALSE':
688 if Value
!= MacroValue
:
693 if Value
== MacroValue
:
698 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
is not None and MacroValue
.isdigit())):
699 InputVal
= long(Value
, 0)
700 MacroVal
= long(MacroValue
, 0)
702 if MacroVal
> InputVal
:
707 if MacroVal
>= InputVal
:
712 if MacroVal
< InputVal
:
717 if MacroVal
<= InputVal
:
724 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
726 for Profile
in AllMacroList
:
727 if Profile
.FileName
== FileLineTuple
[0] and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
729 if Value
== 'Bool' and Profile
.MacroValue
is None or Profile
.MacroValue
.upper() == 'FALSE':
733 if Value
!= Profile
.MacroValue
:
738 if Value
== Profile
.MacroValue
:
743 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
is not None and Profile
.MacroValue
.isdigit())):
744 InputVal
= long(Value
, 0)
745 MacroVal
= long(Profile
.MacroValue
, 0)
747 if MacroVal
> InputVal
:
752 if MacroVal
>= InputVal
:
757 if MacroVal
< InputVal
:
762 if MacroVal
<= InputVal
:
769 raise Warning("Value %s is not a number At Line ", self
.FileName
, Line
)
773 ## __IsToken() method
775 # Check whether input string is found from current char position along
776 # If found, the string value is put into self.__Token
778 # @param self The object pointer
779 # @param String The string to search
780 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
781 # @retval True Successfully find string, file buffer pointer moved forward
782 # @retval False Not able to find string, file buffer pointer not changed
784 def __IsToken(self
, String
, IgnoreCase
= False):
785 self
.__SkipWhiteSpace
()
787 # Only consider the same line, no multi-line token allowed
788 StartPos
= self
.CurrentOffsetWithinLine
791 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
793 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
795 self
.CurrentOffsetWithinLine
+= len(String
)
796 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
800 ## __IsKeyword() method
802 # Check whether input keyword is found from current char position along, whole word only!
803 # If found, the string value is put into self.__Token
805 # @param self The object pointer
806 # @param Keyword The string to search
807 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
808 # @retval True Successfully find string, file buffer pointer moved forward
809 # @retval False Not able to find string, file buffer pointer not changed
811 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
812 self
.__SkipWhiteSpace
()
814 # Only consider the same line, no multi-line token allowed
815 StartPos
= self
.CurrentOffsetWithinLine
818 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
820 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
822 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
823 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
825 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
826 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
830 ## __GetNextWord() method
832 # Get next C name from file lines
833 # If found, the string value is put into self.__Token
835 # @param self The object pointer
836 # @retval True Successfully find a C name string, file buffer pointer moved forward
837 # @retval False Not able to find a C name string, file buffer pointer not changed
839 def __GetNextWord(self
):
840 self
.__SkipWhiteSpace
()
841 if self
.__EndOfFile
():
844 TempChar
= self
.__CurrentChar
()
845 StartPos
= self
.CurrentOffsetWithinLine
846 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
848 while not self
.__EndOfLine
():
849 TempChar
= self
.__CurrentChar
()
850 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
851 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
857 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
862 ## __GetNextToken() method
864 # Get next token unit before a seperator
865 # If found, the string value is put into self.__Token
867 # @param self The object pointer
868 # @retval True Successfully find a token unit, file buffer pointer moved forward
869 # @retval False Not able to find a token unit, file buffer pointer not changed
871 def __GetNextToken(self
):
872 # Skip leading spaces, if exist.
873 self
.__SkipWhiteSpace
()
874 if self
.__EndOfFile
():
876 # Record the token start position, the position of the first non-space char.
877 StartPos
= self
.CurrentOffsetWithinLine
878 StartLine
= self
.CurrentLineNumber
879 while not self
.__EndOfLine
():
880 TempChar
= self
.__CurrentChar
()
881 # Try to find the end char that is not a space and not in seperator tuple.
882 # That is, when we got a space or any char in the tuple, we got the end of token.
883 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
885 # if we happen to meet a seperator as the first char, we must proceed to get it.
886 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
887 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
895 EndPos
= self
.CurrentOffsetWithinLine
896 if self
.CurrentLineNumber
!= StartLine
:
897 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
898 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
899 if StartPos
!= self
.CurrentOffsetWithinLine
:
904 def __GetNextOp(self
):
905 # Skip leading spaces, if exist.
906 self
.__SkipWhiteSpace
()
907 if self
.__EndOfFile
():
909 # Record the token start position, the position of the first non-space char.
910 StartPos
= self
.CurrentOffsetWithinLine
911 while not self
.__EndOfLine
():
912 TempChar
= self
.__CurrentChar
()
913 # Try to find the end char that is not a space
914 if not str(TempChar
).isspace():
921 if StartPos
!= self
.CurrentOffsetWithinLine
:
922 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
926 ## __GetNextGuid() method
928 # Get next token unit before a seperator
929 # If found, the GUID string is put into self.__Token
931 # @param self The object pointer
932 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
933 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
935 def __GetNextGuid(self
):
937 if not self
.__GetNextToken
():
939 if gGuidPattern
.match(self
.__Token
) is not None:
945 ## __UndoToken() method
947 # Go back one token unit in file buffer
949 # @param self The object pointer
951 def __UndoToken(self
):
953 while self
.__CurrentChar
().isspace():
954 if not self
.__UndoOneChar
():
959 StartPos
= self
.CurrentOffsetWithinLine
960 CurrentLine
= self
.CurrentLineNumber
961 while CurrentLine
== self
.CurrentLineNumber
:
963 TempChar
= self
.__CurrentChar
()
964 # Try to find the end char that is not a space and not in seperator tuple.
965 # That is, when we got a space or any char in the tuple, we got the end of token.
966 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
967 if not self
.__UndoOneChar
():
969 # if we happen to meet a seperator as the first char, we must proceed to get it.
970 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
971 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
978 ## __HexDigit() method
980 # Whether char input is a Hex data bit
982 # @param self The object pointer
983 # @param TempChar The char to test
984 # @retval True The char is a Hex data bit
985 # @retval False The char is NOT a Hex data bit
987 def __HexDigit(self
, TempChar
):
988 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
989 or (TempChar
>= '0' and TempChar
<= '9'):
994 def __IsHex(self
, HexStr
):
995 if not HexStr
.upper().startswith("0X"):
997 if len(self
.__Token
) <= 2:
999 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1000 if len(charList
) == 0:
1004 ## __GetNextHexNumber() method
1006 # Get next HEX data before a seperator
1007 # If found, the HEX data is put into self.__Token
1009 # @param self The object pointer
1010 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1011 # @retval False Not able to find a HEX data, file buffer pointer not changed
1013 def __GetNextHexNumber(self
):
1014 if not self
.__GetNextToken
():
1016 if self
.__IsHex
(self
.__Token
):
1022 ## __GetNextDecimalNumber() method
1024 # Get next decimal data before a seperator
1025 # If found, the decimal data is put into self.__Token
1027 # @param self The object pointer
1028 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1029 # @retval False Not able to find a decimal data, file buffer pointer not changed
1031 def __GetNextDecimalNumber(self
):
1032 if not self
.__GetNextToken
():
1034 if self
.__Token
.isdigit():
1040 ## __GetNextPcdName() method
1042 # Get next PCD token space C name and PCD C name pair before a seperator
1043 # If found, the decimal data is put into self.__Token
1045 # @param self The object pointer
1046 # @retval Tuple PCD C name and PCD token space C name pair
1048 def __GetNextPcdName(self
):
1049 if not self
.__GetNextWord
():
1050 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1051 pcdTokenSpaceCName
= self
.__Token
1053 if not self
.__IsToken
( "."):
1054 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1056 if not self
.__GetNextWord
():
1057 raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self
.FileName
, self
.CurrentLineNumber
)
1058 pcdCName
= self
.__Token
1060 return (pcdCName
, pcdTokenSpaceCName
)
1062 ## __GetStringData() method
1064 # Get string contents quoted in ""
1065 # If found, the decimal data is put into self.__Token
1067 # @param self The object pointer
1068 # @retval True Successfully find a string data, file buffer pointer moved forward
1069 # @retval False Not able to find a string data, file buffer pointer not changed
1071 def __GetStringData(self
):
1072 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1074 self
.__SkipToToken
("\"")
1075 currentLineNumber
= self
.CurrentLineNumber
1077 if not self
.__SkipToToken
("\""):
1078 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1079 if currentLineNumber
!= self
.CurrentLineNumber
:
1080 raise Warning("Missing Quote \" for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1081 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1084 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1086 self
.__SkipToToken
("\'")
1087 currentLineNumber
= self
.CurrentLineNumber
1089 if not self
.__SkipToToken
("\'"):
1090 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1091 if currentLineNumber
!= self
.CurrentLineNumber
:
1092 raise Warning("Missing Quote \' for String At Line ", self
.FileName
, self
.CurrentLineNumber
)
1093 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1099 ## __SkipToToken() method
1101 # Search forward in file buffer for the string
1102 # The skipped chars are put into self.__SkippedChars
1104 # @param self The object pointer
1105 # @param String The string to search
1106 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1107 # @retval True Successfully find the string, file buffer pointer moved forward
1108 # @retval False Not able to find the string, file buffer pointer not changed
1110 def __SkipToToken(self
, String
, IgnoreCase
= False):
1111 StartPos
= self
.GetFileBufferPos()
1113 self
.__SkippedChars
= ""
1114 while not self
.__EndOfFile
():
1117 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1119 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1121 self
.CurrentOffsetWithinLine
+= len(String
)
1122 self
.__SkippedChars
+= String
1124 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1127 self
.SetFileBufferPos( StartPos
)
1128 self
.__SkippedChars
= ""
1131 ## GetFileBufferPos() method
1133 # Return the tuple of current line and offset within the line
1135 # @param self The object pointer
1136 # @retval Tuple Line number and offset pair
1138 def GetFileBufferPos(self
):
1139 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1141 ## SetFileBufferPos() method
1143 # Restore the file buffer position
1145 # @param self The object pointer
1146 # @param Pos The new file buffer position
1148 def SetFileBufferPos(self
, Pos
):
1149 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1151 ## ParseFile() method
1153 # Parse the file profile buffer to extract fd, fv ... information
1154 # Exception will be raised if syntax error found
1156 # @param self The object pointer
1158 def ParseFile(self
):
1161 self
.__StringToList
()
1162 self
.PreprocessFile()
1163 self
.PreprocessIncludeFile()
1164 self
.__StringToList
()
1165 self
.PreprocessFile()
1166 self
.PreprocessConditionalStatement()
1167 self
.__StringToList
()
1168 for Pos
in self
.__WipeOffArea
:
1169 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1170 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1172 while self
.__GetDefines
():
1176 while Index
< len(self
.Profile
.FileLinesList
):
1177 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1178 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1181 while self
.__GetFd
():
1184 while self
.__GetFv
():
1187 while self
.__GetCapsule
():
1190 # while self.__GetVtf():
1193 # while self.__GetRule():
1199 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1200 X
.message
+= '\nGot Token: \"%s\" from File %s\n' % (self
.__Token
, FileLineTuple
[0]) + \
1201 'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \
1202 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'), FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1205 ## __GetDefines() method
1207 # Get Defines section contents and store its data into AllMacrosList
1209 # @param self The object pointer
1210 # @retval True Successfully find a Defines
1211 # @retval False Not able to find a Defines
1213 def __GetDefines(self
):
1215 if not self
.__GetNextToken
():
1218 S
= self
.__Token
.upper()
1219 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1220 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1221 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1222 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
)
1227 if not self
.__IsToken
("[DEFINES", True):
1228 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1229 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1230 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1231 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1233 if not self
.__IsToken
( "]"):
1234 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1236 while self
.__GetNextWord
():
1237 Macro
= self
.__Token
1239 if not self
.__IsToken
("="):
1240 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1241 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1242 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1243 Value
= self
.__Token
1244 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1245 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1246 MacProfile
.MacroName
= Macro
1247 MacProfile
.MacroValue
= Value
1248 AllMacroList
.append(MacProfile
)
1254 # Get FD section contents and store its data into FD dictionary of self.Profile
1256 # @param self The object pointer
1257 # @retval True Successfully find a FD
1258 # @retval False Not able to find a FD
1262 if not self
.__GetNextToken
():
1265 S
= self
.__Token
.upper()
1266 if S
.startswith("[") and not S
.startswith("[FD."):
1267 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1268 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1269 raise Warning("Unknown section At Line ", self
.FileName
, self
.CurrentLineNumber
)
1274 if not self
.__IsToken
("[FD.", True):
1275 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1276 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1277 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1278 raise Warning("expected [FD.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
1280 FdName
= self
.__GetUiName
()
1281 self
.CurrentFdName
= FdName
.upper()
1283 if not self
.__IsToken
( "]"):
1284 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1286 FdObj
= CommonDataClass
.FdfClass
.FDClassObject()
1287 FdObj
.FdUiName
= self
.CurrentFdName
1288 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1289 Status
= self
.__GetCreateFile
(FdObj
)
1291 raise Warning("FD name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1293 if not self
.__GetTokenStatements
(FdObj
):
1296 self
.__GetDefineStatements
(FdObj
)
1298 self
.__GetSetStatements
(FdObj
)
1300 if not self
.__GetRegionLayout
(FdObj
):
1301 raise Warning("expected region layout At Line ", self
.FileName
, self
.CurrentLineNumber
)
1303 while self
.__GetRegionLayout
(FdObj
):
1307 ## __GetUiName() method
1309 # Return the UI name of a section
1311 # @param self The object pointer
1312 # @retval FdName UI name
1314 def __GetUiName(self
):
1316 if self
.__GetNextWord
():
1317 FdName
= self
.__Token
1321 ## __GetCreateFile() method
1323 # Return the output file name of object
1325 # @param self The object pointer
1326 # @param Obj object whose data will be stored in file
1327 # @retval FdName UI name
1329 def __GetCreateFile(self
, Obj
):
1331 if self
.__IsKeyword
( "CREATE_FILE"):
1332 if not self
.__IsToken
( "="):
1333 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1335 if not self
.__GetNextToken
():
1336 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1338 FileName
= self
.__Token
1339 Obj
.CreateFileName
= FileName
1343 ## __GetTokenStatements() method
1345 # Get token statements
1347 # @param self The object pointer
1348 # @param Obj for whom token statement is got
1349 # @retval True Successfully find a token statement
1350 # @retval False Not able to find a token statement
1352 def __GetTokenStatements(self
, Obj
):
1353 if not self
.__IsKeyword
( "BaseAddress"):
1354 raise Warning("BaseAddress 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 base address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1362 Obj
.BaseAddress
= self
.__Token
1364 if self
.__IsToken
( "|"):
1365 pcdPair
= self
.__GetNextPcdName
()
1366 Obj
.BaseAddressPcd
= pcdPair
1367 self
.Profile
.PcdDict
[pcdPair
] = long(Obj
.BaseAddress
, 0)
1368 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1369 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1371 if not self
.__IsKeyword
( "Size"):
1372 raise Warning("Size missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1374 if not self
.__IsToken
( "="):
1375 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1377 if not self
.__GetNextHexNumber
():
1378 raise Warning("expected Hex size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1381 Obj
.Size
= long(self
.__Token
, 0)
1383 if self
.__IsToken
( "|"):
1384 pcdPair
= self
.__GetNextPcdName
()
1385 Obj
.SizePcd
= pcdPair
1386 self
.Profile
.PcdDict
[pcdPair
] = Obj
.Size
1387 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1388 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1390 if not self
.__IsKeyword
( "ErasePolarity"):
1391 raise Warning("ErasePolarity missing At Line ", self
.FileName
, self
.CurrentLineNumber
)
1393 if not self
.__IsToken
( "="):
1394 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1396 if not self
.__GetNextToken
():
1397 raise Warning("expected Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1399 if self
.__Token
!= "1" and self
.__Token
!= "0":
1400 raise Warning("expected 1 or 0 Erase Polarity At Line ", self
.FileName
, self
.CurrentLineNumber
)
1402 Obj
.ErasePolarity
= self
.__Token
1404 Status
= self
.__GetBlockStatements
(Obj
)
1407 ## __GetAddressStatements() method
1409 # Get address statements
1411 # @param self The object pointer
1412 # @param Obj for whom address statement is got
1413 # @retval True Successfully find
1414 # @retval False Not able to find
1416 def __GetAddressStatements(self
, Obj
):
1418 if self
.__IsKeyword
("BsBaseAddress"):
1419 if not self
.__IsToken
( "="):
1420 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1422 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1423 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1425 BsAddress
= long(self
.__Token
, 0)
1426 Obj
.BsBaseAddress
= BsAddress
1428 if self
.__IsKeyword
("RtBaseAddress"):
1429 if not self
.__IsToken
( "="):
1430 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1432 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1433 raise Warning("expected address At Line ", self
.FileName
, self
.CurrentLineNumber
)
1435 RtAddress
= long(self
.__Token
, 0)
1436 Obj
.RtBaseAddress
= RtAddress
1438 ## __GetBlockStatements() method
1440 # Get block statements
1442 # @param self The object pointer
1443 # @param Obj for whom block statement is got
1444 # @retval True Successfully find
1445 # @retval False Not able to find
1447 def __GetBlockStatements(self
, Obj
):
1449 if not self
.__GetBlockStatement
(Obj
):
1450 #set default block size is 1
1451 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1454 while self
.__GetBlockStatement
(Obj
):
1457 for Item
in Obj
.BlockSizeList
:
1458 if Item
[0] is None or Item
[1] is None:
1459 raise Warning("expected block statement for Fd Section", self
.FileName
, self
.CurrentLineNumber
)
1463 ## __GetBlockStatement() method
1465 # Get block statement
1467 # @param self The object pointer
1468 # @param Obj for whom block statement is got
1469 # @retval True Successfully find
1470 # @retval False Not able to find
1472 def __GetBlockStatement(self
, Obj
):
1473 if not self
.__IsKeyword
( "BlockSize"):
1476 if not self
.__IsToken
( "="):
1477 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1479 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1480 raise Warning("expected Hex block size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1482 BlockSize
= long(self
.__Token
, 0)
1484 if self
.__IsToken
( "|"):
1485 PcdPair
= self
.__GetNextPcdName
()
1486 BlockSizePcd
= PcdPair
1487 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1488 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1489 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1492 if self
.__IsKeyword
( "NumBlocks"):
1493 if not self
.__IsToken
( "="):
1494 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1496 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1497 raise Warning("expected block numbers At Line ", self
.FileName
, self
.CurrentLineNumber
)
1499 BlockNumber
= long(self
.__Token
, 0)
1501 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1504 ## __GetDefineStatements() method
1506 # Get define statements
1508 # @param self The object pointer
1509 # @param Obj for whom define statement is got
1510 # @retval True Successfully find
1511 # @retval False Not able to find
1513 def __GetDefineStatements(self
, Obj
):
1514 while self
.__GetDefineStatement
( Obj
):
1517 ## __GetDefineStatement() method
1519 # Get define statement
1521 # @param self The object pointer
1522 # @param Obj for whom define statement is got
1523 # @retval True Successfully find
1524 # @retval False Not able to find
1526 def __GetDefineStatement(self
, Obj
):
1527 if self
.__IsKeyword
("DEFINE"):
1528 self
.__GetNextToken
()
1529 Macro
= self
.__Token
1530 if not self
.__IsToken
( "="):
1531 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1533 if not self
.__GetNextToken
():
1534 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1536 Value
= self
.__Token
1537 Macro
= '$(' + Macro
+ ')'
1538 Obj
.DefineVarDict
[Macro
] = Value
1543 ## __GetSetStatements() method
1545 # Get set statements
1547 # @param self The object pointer
1548 # @param Obj for whom set statement is got
1549 # @retval True Successfully find
1550 # @retval False Not able to find
1552 def __GetSetStatements(self
, Obj
):
1553 while self
.__GetSetStatement
(Obj
):
1556 ## __GetSetStatement() method
1560 # @param self The object pointer
1561 # @param Obj for whom set statement is got
1562 # @retval True Successfully find
1563 # @retval False Not able to find
1565 def __GetSetStatement(self
, Obj
):
1566 if self
.__IsKeyword
("SET"):
1567 PcdPair
= self
.__GetNextPcdName
()
1569 if not self
.__IsToken
( "="):
1570 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1572 if not self
.__GetNextToken
():
1573 raise Warning("expected value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1575 Value
= self
.__Token
1576 if Value
.startswith("{"):
1577 # deal with value with {}
1578 if not self
.__SkipToToken
( "}"):
1579 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1580 Value
+= self
.__SkippedChars
1582 Obj
.SetVarDict
[PcdPair
] = Value
1583 self
.Profile
.PcdDict
[PcdPair
] = Value
1584 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1585 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1590 ## __GetRegionLayout() method
1592 # Get region layout for FD
1594 # @param self The object pointer
1595 # @param Fd for whom region is got
1596 # @retval True Successfully find
1597 # @retval False Not able to find
1599 def __GetRegionLayout(self
, Fd
):
1600 if not self
.__GetNextHexNumber
():
1603 RegionObj
= CommonDataClass
.FdfClass
.RegionClassObject()
1604 RegionObj
.Offset
= long(self
.__Token
, 0)
1605 Fd
.RegionList
.append(RegionObj
)
1607 if not self
.__IsToken
( "|"):
1608 raise Warning("expected '|' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1610 if not self
.__GetNextHexNumber
():
1611 raise Warning("expected Region Size At Line ", self
.FileName
, self
.CurrentLineNumber
)
1612 RegionObj
.Size
= long(self
.__Token
, 0)
1614 if not self
.__GetNextWord
():
1617 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1619 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1620 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0)
1621 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1622 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1623 if self
.__IsToken
( "|"):
1624 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1625 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = RegionObj
.Size
1626 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1627 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1629 if not self
.__GetNextWord
():
1632 if self
.__Token
== "SET":
1634 self
.__GetSetStatements
( RegionObj
)
1635 if not self
.__GetNextWord
():
1638 elif self
.__Token
== "FV":
1640 self
.__GetRegionFvType
( RegionObj
)
1642 elif self
.__Token
== "CAPSULE":
1644 self
.__GetRegionCapType
( RegionObj
)
1646 elif self
.__Token
== "FILE":
1648 self
.__GetRegionFileType
( RegionObj
)
1652 self
.__GetRegionDataType
( RegionObj
)
1656 ## __GetRegionFvType() method
1658 # Get region fv data for region
1660 # @param self The object pointer
1661 # @param RegionObj for whom region data is got
1663 def __GetRegionFvType(self
, RegionObj
):
1665 if not self
.__IsKeyword
( "FV"):
1666 raise Warning("expected Keyword 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1668 if not self
.__IsToken
( "="):
1669 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1671 if not self
.__GetNextToken
():
1672 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1674 RegionObj
.RegionType
= "FV"
1675 RegionObj
.RegionDataList
.append(self
.__Token
)
1677 while self
.__IsKeyword
( "FV"):
1679 if not self
.__IsToken
( "="):
1680 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1682 if not self
.__GetNextToken
():
1683 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1685 RegionObj
.RegionDataList
.append(self
.__Token
)
1687 ## __GetRegionCapType() method
1689 # Get region capsule data for region
1691 # @param self The object pointer
1692 # @param RegionObj for whom region data is got
1694 def __GetRegionCapType(self
, RegionObj
):
1696 if not self
.__IsKeyword
("CAPSULE"):
1697 raise Warning("expected Keyword 'CAPSULE' at line", self
.FileName
, self
.CurrentLineNumber
)
1699 if not self
.__IsToken
("="):
1700 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1702 if not self
.__GetNextToken
():
1703 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1705 RegionObj
.RegionType
= "CAPSULE"
1706 RegionObj
.RegionDataList
.append(self
.__Token
)
1708 while self
.__IsKeyword
("CAPSULE"):
1710 if not self
.__IsToken
("="):
1711 raise Warning("expected '=' at line", self
.FileName
, self
.CurrentLineNumber
)
1713 if not self
.__GetNextToken
():
1714 raise Warning("expected CAPSULE name at line", self
.FileName
, self
.CurrentLineNumber
)
1716 RegionObj
.RegionDataList
.append(self
.__Token
)
1718 ## __GetRegionFileType() method
1720 # Get region file data for region
1722 # @param self The object pointer
1723 # @param RegionObj for whom region data is got
1725 def __GetRegionFileType(self
, RegionObj
):
1727 if not self
.__IsKeyword
( "FILE"):
1728 raise Warning("expected Keyword 'FILE' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1730 if not self
.__IsToken
( "="):
1731 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1733 if not self
.__GetNextToken
():
1734 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1736 RegionObj
.RegionType
= "FILE"
1737 RegionObj
.RegionDataList
.append( self
.__Token
)
1739 while self
.__IsKeyword
( "FILE"):
1741 if not self
.__IsToken
( "="):
1742 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1744 if not self
.__GetNextToken
():
1745 raise Warning("expected FILE name At Line ", self
.FileName
, self
.CurrentLineNumber
)
1747 RegionObj
.RegionDataList
.append(self
.__Token
)
1749 ## __GetRegionDataType() method
1751 # Get region array data for region
1753 # @param self The object pointer
1754 # @param RegionObj for whom region data is got
1756 def __GetRegionDataType(self
, RegionObj
):
1758 if not self
.__IsKeyword
( "DATA"):
1759 raise Warning("expected Region Data type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1761 if not self
.__IsToken
( "="):
1762 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1764 if not self
.__IsToken
( "{"):
1765 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1767 if not self
.__GetNextHexNumber
():
1768 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1770 if len(self
.__Token
) > 18:
1771 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1773 DataString
= self
.__Token
1776 while self
.__IsToken
(","):
1777 if not self
.__GetNextHexNumber
():
1778 raise Warning("Invalid Hex number At Line ", self
.FileName
, self
.CurrentLineNumber
)
1779 if len(self
.__Token
) > 4:
1780 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1781 DataString
+= self
.__Token
1784 if not self
.__IsToken
( "}"):
1785 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1787 DataString
= DataString
.rstrip(",")
1788 RegionObj
.RegionType
= "DATA"
1789 RegionObj
.RegionDataList
.append( DataString
)
1791 while self
.__IsKeyword
( "DATA"):
1793 if not self
.__IsToken
( "="):
1794 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1796 if not self
.__IsToken
( "{"):
1797 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1799 if not self
.__GetNextHexNumber
():
1800 raise Warning("expected Hex byte At Line ", self
.FileName
, self
.CurrentLineNumber
)
1802 if len(self
.__Token
) > 18:
1803 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1805 DataString
= self
.__Token
1808 while self
.__IsToken
(","):
1809 self
.__GetNextHexNumber
()
1810 if len(self
.__Token
) > 4:
1811 raise Warning("Hex byte(must be 2 digits) too long At Line ", self
.FileName
, self
.CurrentLineNumber
)
1812 DataString
+= self
.__Token
1815 if not self
.__IsToken
( "}"):
1816 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1818 DataString
= DataString
.rstrip(",")
1819 RegionObj
.RegionDataList
.append( DataString
)
1823 # Get FV section contents and store its data into FV dictionary of self.Profile
1825 # @param self The object pointer
1826 # @retval True Successfully find a FV
1827 # @retval False Not able to find a FV
1830 if not self
.__GetNextToken
():
1833 S
= self
.__Token
.upper()
1834 if S
.startswith("[") and not S
.startswith("[FV."):
1835 if not S
.startswith("[CAPSULE.") \
1836 and not S
.startswith("[VTF.") and not S
.startswith("[RULE."):
1837 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
)
1842 if not self
.__IsToken
("[FV.", True):
1843 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1844 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1845 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
1846 raise Warning("Unknown Keyword At Line ", self
.FileName
, self
.CurrentLineNumber
)
1848 FvName
= self
.__GetUiName
()
1849 self
.CurrentFvName
= FvName
.upper()
1851 if not self
.__IsToken
( "]"):
1852 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1854 FvObj
= CommonDataClass
.FdfClass
.FvClassObject()
1855 FvObj
.UiFvName
= self
.CurrentFvName
1856 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1858 Status
= self
.__GetCreateFile
(FvObj
)
1860 raise Warning("FV name error At Line ", self
.FileName
, self
.CurrentLineNumber
)
1862 self
.__GetDefineStatements
(FvObj
)
1864 self
.__GetAddressStatements
(FvObj
)
1866 self
.__GetBlockStatement
(FvObj
)
1868 self
.__GetSetStatements
(FvObj
)
1870 self
.__GetFvAlignment
(FvObj
)
1872 self
.__GetFvAttributes
(FvObj
)
1874 self
.__GetFvNameGuid
(FvObj
)
1876 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1877 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1880 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1881 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1882 if not isInf
and not isFile
:
1887 ## __GetFvAlignment() method
1889 # Get alignment for FV
1891 # @param self The object pointer
1892 # @param Obj for whom alignment is got
1893 # @retval True Successfully find a alignment statement
1894 # @retval False Not able to find a alignment statement
1896 def __GetFvAlignment(self
, Obj
):
1898 if not self
.__IsKeyword
( "FvAlignment"):
1901 if not self
.__IsToken
( "="):
1902 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1904 if not self
.__GetNextToken
():
1905 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1907 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1908 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1909 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1911 raise Warning("Unknown alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
1912 Obj
.FvAlignment
= self
.__Token
1915 ## __GetFvAttributes() method
1917 # Get attributes for FV
1919 # @param self The object pointer
1920 # @param Obj for whom attribute is got
1923 def __GetFvAttributes(self
, FvObj
):
1925 while self
.__GetNextWord
():
1927 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1928 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1929 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1930 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1931 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
1932 "WRITE_POLICY_RELIABLE"):
1936 if not self
.__IsToken
( "="):
1937 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1939 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
1940 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
1942 FvObj
.FvAttributeDict
[name
] = self
.__Token
1946 ## __GetFvNameGuid() method
1948 # Get FV GUID for FV
1950 # @param self The object pointer
1951 # @param Obj for whom GUID is got
1954 def __GetFvNameGuid(self
, FvObj
):
1956 if not self
.__IsKeyword
( "FvNameGuid"):
1959 if not self
.__IsToken
( "="):
1960 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1962 if not self
.__GetNextGuid
():
1963 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
1965 FvObj
.FvNameGuid
= self
.__Token
1969 ## __GetAprioriSection() method
1971 # Get token statements
1973 # @param self The object pointer
1974 # @param FvObj for whom apriori is got
1975 # @param MacroDict dictionary used to replace macro
1976 # @retval True Successfully find apriori statement
1977 # @retval False Not able to find apriori statement
1979 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
1981 if not self
.__IsKeyword
( "APRIORI"):
1984 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
1985 raise Warning("expected Apriori file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
1986 AprType
= self
.__Token
1988 if not self
.__IsToken
( "{"):
1989 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
1991 AprSectionObj
= CommonDataClass
.FdfClass
.AprioriSectionClassObject()
1992 AprSectionObj
.AprioriType
= AprType
1994 self
.__GetDefineStatements
(AprSectionObj
)
1995 MacroDict
.update(AprSectionObj
.DefineVarDict
)
1998 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
1999 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2000 if not IsInf
and not IsFile
:
2003 if not self
.__IsToken
( "}"):
2004 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2006 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2009 ## __GetInfStatement() method
2011 # Get INF statements
2013 # @param self The object pointer
2014 # @param Obj for whom inf statement is got
2015 # @param MacroDict dictionary used to replace macro
2016 # @retval True Successfully find inf statement
2017 # @retval False Not able to find inf statement
2019 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2021 if not self
.__IsKeyword
( "INF"):
2024 ffsInf
= CommonDataClass
.FdfClass
.FfsInfStatementClassObject()
2025 self
.__GetInfOptions
( ffsInf
)
2027 if not self
.__GetNextToken
():
2028 raise Warning("expected INF file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2029 ffsInf
.InfFileName
= self
.__Token
2031 # if ffsInf.InfFileName.find('$') >= 0:
2032 # ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
2034 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2035 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2036 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2037 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2039 if self
.__IsToken
('|'):
2040 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2041 ffsInf
.KeepReloc
= False
2042 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2043 ffsInf
.KeepReloc
= True
2045 raise Warning("Unknown reloc strip flag At Line ", self
.FileName
, self
.CurrentLineNumber
)
2048 capsuleFfs
= CapsuleData
.CapsuleFfs()
2049 capsuleFfs
.Ffs
= ffsInf
2050 Obj
.CapsuleDataList
.append(capsuleFfs
)
2052 Obj
.FfsList
.append(ffsInf
)
2055 ## __GetInfOptions() method
2057 # Get options for INF
2059 # @param self The object pointer
2060 # @param FfsInfObj for whom option is got
2062 def __GetInfOptions(self
, FfsInfObj
):
2064 if self
.__IsKeyword
( "RuleOverride"):
2065 if not self
.__IsToken
( "="):
2066 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2067 if not self
.__GetNextToken
():
2068 raise Warning("expected Rule name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2069 FfsInfObj
.Rule
= self
.__Token
2071 if self
.__IsKeyword
( "VERSION"):
2072 if not self
.__IsToken
( "="):
2073 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2074 if not self
.__GetNextToken
():
2075 raise Warning("expected Version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2077 if self
.__GetStringData
():
2078 FfsInfObj
.Version
= self
.__Token
2080 if self
.__IsKeyword
( "UI"):
2081 if not self
.__IsToken
( "="):
2082 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2083 if not self
.__GetNextToken
():
2084 raise Warning("expected UI name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2086 if self
.__GetStringData
():
2087 FfsInfObj
.Ui
= self
.__Token
2089 if self
.__IsKeyword
( "USE"):
2090 if not self
.__IsToken
( "="):
2091 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2092 if not self
.__GetNextToken
():
2093 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2094 FfsInfObj
.UseArch
= self
.__Token
2097 if self
.__GetNextToken
():
2098 if TokenFindPattern
.match(self
.__Token
):
2099 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2100 if not self
.__IsToken
(","):
2106 while self
.__GetNextToken
():
2107 if not TokenFindPattern
.match(self
.__Token
):
2108 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2109 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2111 if not self
.__IsToken
(","):
2114 ## __GetFileStatement() method
2116 # Get FILE statements
2118 # @param self The object pointer
2119 # @param Obj for whom FILE statement is got
2120 # @param MacroDict dictionary used to replace macro
2121 # @retval True Successfully find FILE statement
2122 # @retval False Not able to find FILE statement
2124 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2126 if not self
.__IsKeyword
( "FILE"):
2129 FfsFileObj
= CommonDataClass
.FdfClass
.FileStatementClassObject()
2131 if not self
.__GetNextWord
():
2132 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2133 FfsFileObj
.FvFileType
= self
.__Token
2135 if not self
.__IsToken
( "="):
2136 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2138 if not self
.__GetNextGuid
():
2139 if not self
.__GetNextWord
():
2140 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2141 if self
.__Token
== 'PCD':
2142 if not self
.__IsToken
( "("):
2143 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2144 PcdPair
= self
.__GetNextPcdName
()
2145 if not self
.__IsToken
( ")"):
2146 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2147 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2149 FfsFileObj
.NameGuid
= self
.__Token
2151 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2154 capsuleFfs
= CapsuleData
.CapsuleFfs()
2155 capsuleFfs
.Ffs
= FfsFileObj
2156 Obj
.CapsuleDataList
.append(capsuleFfs
)
2158 Obj
.FfsList
.append(FfsFileObj
)
2162 ## __FileCouldHaveRelocFlag() method
2164 # Check whether reloc strip flag can be set for a file type.
2166 # @param self The object pointer
2167 # @param FileType The file type to check with
2168 # @retval True This type could have relocation strip flag
2169 # @retval False No way to have it
2172 def __FileCouldHaveRelocFlag (self
, FileType
):
2173 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2178 ## __SectionCouldHaveRelocFlag() method
2180 # Check whether reloc strip flag can be set for a section type.
2182 # @param self The object pointer
2183 # @param SectionType The section type to check with
2184 # @retval True This type could have relocation strip flag
2185 # @retval False No way to have it
2188 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2189 if SectionType
in ('TE', 'PE32'):
2194 ## __GetFilePart() method
2196 # Get components for FILE statement
2198 # @param self The object pointer
2199 # @param FfsFileObj for whom component is got
2200 # @param MacroDict dictionary used to replace macro
2202 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2204 self
.__GetFileOpts
( FfsFileObj
)
2206 if not self
.__IsToken
("{"):
2207 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2208 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2209 # if self.__Token == 'RELOCS_STRIPPED':
2210 # FfsFileObj.KeepReloc = False
2212 # FfsFileObj.KeepReloc = True
2214 # raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2216 # if not self.__IsToken("{"):
2217 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2219 if not self
.__GetNextToken
():
2220 raise Warning("expected File name or section data At Line ", self
.FileName
, self
.CurrentLineNumber
)
2222 if self
.__Token
== "FV":
2223 if not self
.__IsToken
( "="):
2224 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2225 if not self
.__GetNextToken
():
2226 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2227 FfsFileObj
.FvName
= self
.__Token
2229 elif self
.__Token
== "FD":
2230 if not self
.__IsToken
( "="):
2231 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2232 if not self
.__GetNextToken
():
2233 raise Warning("expected FD name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2234 FfsFileObj
.FdName
= self
.__Token
2236 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2238 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2240 FfsFileObj
.FileName
= self
.__Token
2242 if not self
.__IsToken
( "}"):
2243 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2245 ## __GetFileOpts() method
2247 # Get options for FILE statement
2249 # @param self The object pointer
2250 # @param FfsFileObj for whom options is got
2252 def __GetFileOpts(self
, FfsFileObj
):
2254 if self
.__GetNextToken
():
2255 if TokenFindPattern
.match(self
.__Token
):
2256 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2257 if self
.__IsToken
(","):
2258 while self
.__GetNextToken
():
2259 if not TokenFindPattern
.match(self
.__Token
):
2260 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2261 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2263 if not self
.__IsToken
(","):
2269 if self
.__IsKeyword
( "FIXED", True):
2270 FfsFileObj
.Fixed
= True
2272 if self
.__IsKeyword
( "CHECKSUM", True):
2273 FfsFileObj
.CheckSum
= True
2275 if self
.__GetAlignment
():
2276 FfsFileObj
.Alignment
= self
.__Token
2280 ## __GetAlignment() method
2282 # Return the alignment value
2284 # @param self The object pointer
2285 # @retval True Successfully find alignment
2286 # @retval False Not able to find alignment
2288 def __GetAlignment(self
):
2289 if self
.__IsKeyword
( "Align", True):
2290 if not self
.__IsToken
( "="):
2291 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2293 if not self
.__GetNextToken
():
2294 raise Warning("expected alignment value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2299 ## __GetFilePart() method
2301 # Get section data for FILE statement
2303 # @param self The object pointer
2304 # @param FfsFileObj for whom section is got
2305 # @param MacroDict dictionary used to replace macro
2307 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2309 Dict
.update(MacroDict
)
2311 self
.__GetDefineStatements
(FfsFileObj
)
2313 Dict
.update(FfsFileObj
.DefineVarDict
)
2314 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2315 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2318 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2319 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2320 if not IsLeafSection
and not IsEncapSection
:
2323 ## __GetLeafSection() method
2325 # Get leaf section for Obj
2327 # @param self The object pointer
2328 # @param Obj for whom leaf section is got
2329 # @param MacroDict dictionary used to replace macro
2330 # @retval True Successfully find section statement
2331 # @retval False Not able to find section statement
2333 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2335 OldPos
= self
.GetFileBufferPos()
2337 if not self
.__IsKeyword
( "SECTION"):
2338 if len(Obj
.SectionList
) == 0:
2339 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2344 if self
.__GetAlignment
():
2345 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2346 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2347 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2348 AlignValue
= self
.__Token
2351 if self
.__IsKeyword
( "BUILD_NUM"):
2352 if not self
.__IsToken
( "="):
2353 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2355 if not self
.__GetNextToken
():
2356 raise Warning("expected Build number value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2358 BuildNum
= self
.__Token
2360 if self
.__IsKeyword
( "VERSION"):
2361 if AlignValue
== 'Auto':
2362 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2363 if not self
.__IsToken
( "="):
2364 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2365 if not self
.__GetNextToken
():
2366 raise Warning("expected version At Line ", self
.FileName
, self
.CurrentLineNumber
)
2367 VerSectionObj
= CommonDataClass
.FdfClass
.VerSectionClassObject()
2368 VerSectionObj
.Alignment
= AlignValue
2369 VerSectionObj
.BuildNum
= BuildNum
2370 if self
.__GetStringData
():
2371 VerSectionObj
.StringData
= self
.__Token
2373 VerSectionObj
.FileName
= self
.__Token
2374 Obj
.SectionList
.append(VerSectionObj
)
2376 elif self
.__IsKeyword
( "UI"):
2377 if AlignValue
== 'Auto':
2378 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2379 if not self
.__IsToken
( "="):
2380 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2381 if not self
.__GetNextToken
():
2382 raise Warning("expected UI At Line ", self
.FileName
, self
.CurrentLineNumber
)
2383 UiSectionObj
= CommonDataClass
.FdfClass
.UiSectionClassObject()
2384 UiSectionObj
.Alignment
= AlignValue
2385 if self
.__GetStringData
():
2386 UiSectionObj
.StringData
= self
.__Token
2388 UiSectionObj
.FileName
= self
.__Token
2389 Obj
.SectionList
.append(UiSectionObj
)
2391 elif self
.__IsKeyword
( "FV_IMAGE"):
2392 if AlignValue
== 'Auto':
2393 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2394 if not self
.__IsToken
( "="):
2395 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2396 if not self
.__GetNextWord
():
2397 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2399 FvName
= self
.__Token
.upper()
2402 if self
.__IsToken
( "{"):
2404 FvObj
.UiFvName
= FvName
2405 self
.__GetDefineStatements
(FvObj
)
2406 MacroDict
.update(FvObj
.DefineVarDict
)
2407 self
.__GetBlockStatement
(FvObj
)
2408 self
.__GetSetStatements
(FvObj
)
2409 self
.__GetFvAlignment
(FvObj
)
2410 self
.__GetFvAttributes
(FvObj
)
2411 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2412 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2415 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2416 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2417 if not IsInf
and not IsFile
:
2420 if not self
.__IsToken
( "}"):
2421 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2423 FvImageSectionObj
= CommonDataClass
.FdfClass
.FvImageSectionClassObject()
2424 FvImageSectionObj
.Alignment
= AlignValue
2425 if FvObj
is not None:
2426 FvImageSectionObj
.Fv
= FvObj
2427 FvImageSectionObj
.FvName
= None
2429 FvImageSectionObj
.FvName
= FvName
2431 Obj
.SectionList
.append(FvImageSectionObj
)
2433 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2434 if AlignValue
== 'Auto':
2435 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2436 DepexSectionObj
= CommonDataClass
.FdfClass
.DepexSectionClassObject()
2437 DepexSectionObj
.Alignment
= AlignValue
2438 DepexSectionObj
.DepexType
= self
.__Token
2440 if not self
.__IsToken
( "="):
2441 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2442 if not self
.__IsToken
( "{"):
2443 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2444 if not self
.__SkipToToken
( "}"):
2445 raise Warning("expected Depex expression ending '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2447 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2448 Obj
.SectionList
.append(DepexSectionObj
)
2452 if not self
.__GetNextWord
():
2453 raise Warning("expected section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2455 # Encapsulation section appear, UndoToken and return
2456 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2457 self
.SetFileBufferPos(OldPos
)
2460 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2461 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2462 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2463 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2464 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2466 DataSectionObj
= CommonDataClass
.FdfClass
.DataSectionClassObject()
2467 DataSectionObj
.Alignment
= AlignValue
2468 DataSectionObj
.SecType
= self
.__Token
2470 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2471 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2472 if self
.__Token
== 'RELOCS_STRIPPED':
2473 DataSectionObj
.KeepReloc
= False
2475 DataSectionObj
.KeepReloc
= True
2477 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
)
2479 if self
.__IsToken
("="):
2480 if not self
.__GetNextToken
():
2481 raise Warning("expected section file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2482 DataSectionObj
.SectFileName
= self
.__Token
2484 if not self
.__GetCglSection
(DataSectionObj
):
2487 Obj
.SectionList
.append(DataSectionObj
)
2491 ## __GetCglSection() method
2493 # Get compressed or GUIDed section for Obj
2495 # @param self The object pointer
2496 # @param Obj for whom leaf section is got
2497 # @param AlignValue alignment value for complex section
2498 # @retval True Successfully find section statement
2499 # @retval False Not able to find section statement
2501 def __GetCglSection(self
, Obj
, AlignValue
= None):
2503 if self
.__IsKeyword
( "COMPRESS"):
2505 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2508 if not self
.__IsToken
("{"):
2509 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2511 CompressSectionObj
= CommonDataClass
.FdfClass
.CompressSectionClassObject()
2512 CompressSectionObj
.Alignment
= AlignValue
2513 CompressSectionObj
.CompType
= type
2514 # Recursive sections...
2516 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2517 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2518 if not IsLeafSection
and not IsEncapSection
:
2522 if not self
.__IsToken
( "}"):
2523 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2524 Obj
.SectionList
.append(CompressSectionObj
)
2527 # raise Warning("Compress type not known At Line ")
2531 elif self
.__IsKeyword
( "GUIDED"):
2533 if self
.__GetNextGuid
():
2534 GuidValue
= self
.__Token
2536 AttribDict
= self
.__GetGuidAttrib
()
2537 if not self
.__IsToken
("{"):
2538 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2539 GuidSectionObj
= CommonDataClass
.FdfClass
.GuidSectionClassObject()
2540 GuidSectionObj
.Alignment
= AlignValue
2541 GuidSectionObj
.NameGuid
= GuidValue
2542 GuidSectionObj
.SectionType
= "GUIDED"
2543 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2544 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2545 # Recursive sections...
2547 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2548 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2549 if not IsLeafSection
and not IsEncapSection
:
2552 if not self
.__IsToken
( "}"):
2553 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2554 Obj
.SectionList
.append(GuidSectionObj
)
2560 ## __GetGuidAttri() method
2562 # Get attributes for GUID section
2564 # @param self The object pointer
2565 # @retval AttribDict Dictionary of key-value pair of section attributes
2567 def __GetGuidAttrib(self
):
2570 AttribDict
["PROCESSING_REQUIRED"] = False
2571 AttribDict
["AUTH_STATUS_VALID"] = False
2572 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2573 AttribKey
= self
.__Token
2575 if not self
.__IsToken
("="):
2576 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2578 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2579 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2580 AttribDict
[AttribKey
] = self
.__Token
2582 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2583 AttribKey
= self
.__Token
2585 if not self
.__IsToken
("="):
2586 raise Warning("expected '=' At Line ")
2588 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2589 raise Warning("expected TRUE/FALSE (1/0) At Line ", self
.FileName
, self
.CurrentLineNumber
)
2590 AttribDict
[AttribKey
] = self
.__Token
2594 ## __GetEncapsulationSec() method
2596 # Get encapsulation section for FILE
2598 # @param self The object pointer
2599 # @param FfsFile for whom section is got
2600 # @retval True Successfully find section statement
2601 # @retval False Not able to find section statement
2603 def __GetEncapsulationSec(self
, FfsFileObj
):
2605 OldPos
= self
.GetFileBufferPos()
2606 if not self
.__IsKeyword
( "SECTION"):
2607 if len(FfsFileObj
.SectionList
) == 0:
2608 raise Warning("expected SECTION At Line ", self
.FileName
, self
.CurrentLineNumber
)
2613 if self
.__GetAlignment
():
2614 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2615 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2616 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2617 AlignValue
= self
.__Token
2619 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2620 self
.SetFileBufferPos(OldPos
)
2625 ## __GetCapsule() method
2627 # Get capsule section contents and store its data into capsule list of self.Profile
2629 # @param self The object pointer
2630 # @retval True Successfully find a capsule
2631 # @retval False Not able to find a capsule
2633 def __GetCapsule(self
):
2635 if not self
.__GetNextToken
():
2638 S
= self
.__Token
.upper()
2639 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2640 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2641 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2646 if not self
.__IsToken
("[CAPSULE.", True):
2647 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2648 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2649 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2650 raise Warning("expected [Capsule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2652 CapsuleObj
= CommonDataClass
.FdfClass
.CapsuleClassObject()
2654 CapsuleName
= self
.__GetUiName
()
2656 raise Warning("expected capsule name At line ", self
.FileName
, self
.CurrentLineNumber
)
2658 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2660 if not self
.__IsToken
( "]"):
2661 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2663 if self
.__IsKeyword
("CREATE_FILE"):
2664 if not self
.__IsToken
( "="):
2665 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2667 if not self
.__GetNextToken
():
2668 raise Warning("expected file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2670 CapsuleObj
.CreateFile
= self
.__Token
2672 self
.__GetCapsuleStatements
(CapsuleObj
)
2673 self
.Profile
.CapsuleList
.append(CapsuleObj
)
2676 ## __GetCapsuleStatements() method
2678 # Get statements for capsule
2680 # @param self The object pointer
2681 # @param Obj for whom statements are got
2683 def __GetCapsuleStatements(self
, Obj
):
2684 self
.__GetCapsuleTokens
(Obj
)
2685 self
.__GetDefineStatements
(Obj
)
2686 self
.__GetSetStatements
(Obj
)
2688 self
.__GetCapsuleData
(Obj
)
2690 ## __GetCapsuleStatements() method
2692 # Get token statements for capsule
2694 # @param self The object pointer
2695 # @param Obj for whom token statements are got
2697 def __GetCapsuleTokens(self
, Obj
):
2699 if not self
.__IsKeyword
("CAPSULE_GUID"):
2700 raise Warning("expected 'CAPSULE_GUID' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2702 while self
.__CurrentLine
().find("=") != -1:
2703 NameValue
= self
.__CurrentLine
().split("=")
2704 Obj
.TokensDict
[NameValue
[0].strip()] = NameValue
[1].strip()
2705 self
.CurrentLineNumber
+= 1
2706 self
.CurrentOffsetWithinLine
= 0
2708 ## __GetCapsuleData() method
2710 # Get capsule data for capsule
2712 # @param self The object pointer
2713 # @param Obj for whom capsule data are got
2715 def __GetCapsuleData(self
, Obj
):
2718 IsInf
= self
.__GetInfStatement
(Obj
, True)
2719 IsFile
= self
.__GetFileStatement
(Obj
, True)
2720 IsFv
= self
.__GetFvStatement
(Obj
)
2721 if not IsInf
and not IsFile
and not IsFv
:
2724 ## __GetFvStatement() method
2726 # Get FV for capsule
2728 # @param self The object pointer
2729 # @param CapsuleObj for whom FV is got
2730 # @retval True Successfully find a FV statement
2731 # @retval False Not able to find a FV statement
2733 def __GetFvStatement(self
, CapsuleObj
):
2735 if not self
.__IsKeyword
("FV"):
2738 if not self
.__IsToken
("="):
2739 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2741 if not self
.__GetNextToken
():
2742 raise Warning("expected FV name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2744 # CapsuleFv = CapsuleData.CapsuleFv()
2745 # CapsuleFv.FvName = self.__Token
2746 # CapsuleObj.CapsuleDataList.append(CapsuleFv)
2749 ## __GetRule() method
2751 # Get Rule section contents and store its data into rule list of self.Profile
2753 # @param self The object pointer
2754 # @retval True Successfully find a Rule
2755 # @retval False Not able to find a Rule
2757 def __GetRule(self
):
2759 if not self
.__GetNextToken
():
2762 S
= self
.__Token
.upper()
2763 if S
.startswith("[") and not S
.startswith("[RULE."):
2764 if not S
.startswith("[OPTIONROM."):
2765 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2769 if not self
.__IsToken
("[Rule.", True):
2770 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2771 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2772 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
2773 raise Warning("expected [Rule.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
2775 if not self
.__SkipToToken
("."):
2776 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2778 Arch
= self
.__SkippedChars
.rstrip(".")
2779 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
2780 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2782 ModuleType
= self
.__GetModuleType
()
2785 if self
.__IsToken
("."):
2786 if not self
.__GetNextWord
():
2787 raise Warning("expected template name At Line ", self
.FileName
, self
.CurrentLineNumber
)
2788 TemplateName
= self
.__Token
2790 if not self
.__IsToken
( "]"):
2791 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2793 RuleObj
= self
.__GetRuleFileStatements
()
2794 RuleObj
.Arch
= Arch
.upper()
2795 RuleObj
.ModuleType
= ModuleType
2796 RuleObj
.TemplateName
= TemplateName
2797 if TemplateName
== '' :
2798 self
.Profile
.RuleDict
['RULE' + \
2802 ModuleType
.upper() ] = RuleObj
2804 self
.Profile
.RuleDict
['RULE' + \
2808 ModuleType
.upper() + \
2810 TemplateName
.upper() ] = RuleObj
2811 # self.Profile.RuleList.append(rule)
2814 ## __GetModuleType() method
2816 # Return the module type
2818 # @param self The object pointer
2819 # @retval string module type
2821 def __GetModuleType(self
):
2823 if not self
.__GetNextWord
():
2824 raise Warning("expected Module type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2825 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2826 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2827 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2828 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2829 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2830 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
2831 raise Warning("Unknown Module type At line ", self
.FileName
, self
.CurrentLineNumber
)
2834 ## __GetFileExtension() method
2836 # Return the file extension
2838 # @param self The object pointer
2839 # @retval string file name extension
2841 def __GetFileExtension(self
):
2842 if not self
.__IsToken
("."):
2843 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2846 if self
.__GetNextToken
():
2847 if FileExtensionPattern
.match(self
.__Token
):
2851 raise Warning("Unknown file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2854 raise Warning("expected file extension At Line ", self
.FileName
, self
.CurrentLineNumber
)
2856 ## __GetRuleFileStatement() method
2860 # @param self The object pointer
2861 # @retval Rule Rule object
2863 def __GetRuleFileStatements(self
):
2865 if not self
.__IsKeyword
("FILE"):
2866 raise Warning("expected FILE At Line ", self
.FileName
, self
.CurrentLineNumber
)
2868 if not self
.__GetNextWord
():
2869 raise Warning("expected FFS type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2871 Type
= self
.__Token
.strip().upper()
2872 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
2873 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):
2874 raise Warning("Unknown FV type At line ", self
.FileName
, self
.CurrentLineNumber
)
2876 if not self
.__IsToken
("="):
2877 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2879 if not self
.__IsKeyword
("$(NAMED_GUID)"):
2880 if not self
.__GetNextWord
():
2881 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
2882 if self
.__Token
== 'PCD':
2883 if not self
.__IsToken
( "("):
2884 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2885 PcdPair
= self
.__GetNextPcdName
()
2886 if not self
.__IsToken
( ")"):
2887 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2888 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2890 NameGuid
= self
.__Token
2893 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2894 if self
.__FileCouldHaveRelocFlag
(Type
):
2895 if self
.__Token
== 'RELOCS_STRIPPED':
2900 raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2903 if self
.__GetNextToken
():
2904 if TokenFindPattern
.match(self
.__Token
):
2905 KeyStringList
.append(self
.__Token
)
2906 if self
.__IsToken
(","):
2907 while self
.__GetNextToken
():
2908 if not TokenFindPattern
.match(self
.__Token
):
2909 raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self
.FileName
, self
.CurrentLineNumber
)
2910 KeyStringList
.append(self
.__Token
)
2912 if not self
.__IsToken
(","):
2920 if self
.__IsKeyword
("Fixed", True):
2924 if self
.__IsKeyword
("CheckSum", True):
2928 if self
.__GetAlignment
():
2929 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2930 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2931 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2932 AlignValue
= self
.__Token
2934 if self
.__IsToken
("{"):
2935 # Complex file rule expected
2936 Rule
= RuleComplexFile
.RuleComplexFile()
2937 Rule
.FvFileType
= Type
2938 Rule
.NameGuid
= NameGuid
2939 Rule
.Alignment
= AlignValue
2940 Rule
.CheckSum
= CheckSum
2942 Rule
.KeyStringList
= KeyStringList
2943 if KeepReloc
is not None:
2944 Rule
.KeepReloc
= KeepReloc
2947 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
2948 IsLeaf
= self
.__GetEfiSection
(Rule
)
2949 if not IsEncapsulate
and not IsLeaf
:
2952 if not self
.__IsToken
("}"):
2953 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
2957 elif self
.__IsToken
("|"):
2959 Ext
= self
.__GetFileExtension
()
2961 Rule
= RuleSimpleFile
.RuleSimpleFile()
2963 Rule
.FvFileType
= Type
2964 Rule
.NameGuid
= NameGuid
2965 Rule
.Alignment
= AlignValue
2966 Rule
.CheckSum
= CheckSum
2968 Rule
.FileExtension
= Ext
2969 Rule
.KeyStringList
= KeyStringList
2970 if KeepReloc
is not None:
2971 Rule
.KeepReloc
= KeepReloc
2976 # Simple file rule expected
2977 if not self
.__GetNextWord
():
2978 raise Warning("expected leaf section type At Line ", self
.FileName
, self
.CurrentLineNumber
)
2980 SectionName
= self
.__Token
2982 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2983 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
2984 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
2987 if self
.__IsKeyword
("Fixed", True):
2990 if self
.__IsKeyword
("CheckSum", True):
2993 if self
.__GetAlignment
():
2994 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2995 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2996 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
2997 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
2998 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2999 AlignValue
= self
.__Token
3001 if not self
.__GetNextToken
():
3002 raise Warning("expected File name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3004 Rule
= RuleSimpleFile
.RuleSimpleFile()
3005 Rule
.SectionType
= SectionName
3006 Rule
.FvFileType
= Type
3007 Rule
.NameGuid
= NameGuid
3008 Rule
.Alignment
= AlignValue
3009 Rule
.CheckSum
= CheckSum
3011 Rule
.FileName
= self
.__Token
3012 Rule
.KeyStringList
= KeyStringList
3013 if KeepReloc
is not None:
3014 Rule
.KeepReloc
= KeepReloc
3017 ## __GetEfiSection() method
3019 # Get section list for Rule
3021 # @param self The object pointer
3022 # @param Obj for whom section is got
3023 # @retval True Successfully find section statement
3024 # @retval False Not able to find section statement
3026 def __GetEfiSection(self
, Obj
):
3028 OldPos
= self
.GetFileBufferPos()
3029 if not self
.__GetNextWord
():
3031 SectionName
= self
.__Token
3033 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3034 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3038 if SectionName
== "FV_IMAGE":
3039 FvImageSectionObj
= FvImageSection
.FvImageSection()
3040 if self
.__IsKeyword
("FV_IMAGE"):
3042 if self
.__IsToken
( "{"):
3044 self
.__GetDefineStatements
(FvObj
)
3045 self
.__GetBlockStatement
(FvObj
)
3046 self
.__GetSetStatements
(FvObj
)
3047 self
.__GetFvAlignment
(FvObj
)
3048 self
.__GetFvAttributes
(FvObj
)
3049 self
.__GetAprioriSection
(FvObj
)
3050 self
.__GetAprioriSection
(FvObj
)
3053 IsInf
= self
.__GetInfStatement
(FvObj
)
3054 IsFile
= self
.__GetFileStatement
(FvObj
)
3055 if not IsInf
and not IsFile
:
3058 if not self
.__IsToken
( "}"):
3059 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3060 FvImageSectionObj
.Fv
= FvObj
3061 FvImageSectionObj
.FvName
= None
3064 if not self
.__IsKeyword
("FV"):
3065 raise Warning("expected 'FV' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3066 FvImageSectionObj
.FvFileType
= self
.__Token
3068 if self
.__GetAlignment
():
3069 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3070 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3071 raise Warning("Incorrect alignment At Line ", self
.FileName
, self
.CurrentLineNumber
)
3072 FvImageSectionObj
.Alignment
= self
.__Token
3074 if self
.__IsToken
('|'):
3075 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3076 elif self
.__GetNextToken
():
3077 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3078 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3079 FvImageSectionObj
.FvFileName
= self
.__Token
3083 raise Warning("expected FV file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3085 Obj
.SectionList
.append(FvImageSectionObj
)
3088 EfiSectionObj
= EfiSection
.EfiSection()
3089 EfiSectionObj
.SectionType
= SectionName
3091 if not self
.__GetNextToken
():
3092 raise Warning("expected file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3094 if self
.__Token
== "STRING":
3095 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3096 raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3098 if not self
.__IsToken
('='):
3099 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3101 if not self
.__GetNextToken
():
3102 raise Warning("expected Quoted String At Line ", self
.FileName
, self
.CurrentLineNumber
)
3104 if self
.__GetStringData
():
3105 EfiSectionObj
.StringData
= self
.__Token
3107 if self
.__IsKeyword
("BUILD_NUM"):
3108 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3109 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3111 if not self
.__IsToken
("="):
3112 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3113 if not self
.__GetNextToken
():
3114 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3115 EfiSectionObj
.BuildNum
= self
.__Token
3118 EfiSectionObj
.FileType
= self
.__Token
3119 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3121 if self
.__IsKeyword
("Optional"):
3122 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3123 raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3124 EfiSectionObj
.Optional
= True
3126 if self
.__IsKeyword
("BUILD_NUM"):
3127 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3128 raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3130 if not self
.__IsToken
("="):
3131 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3132 if not self
.__GetNextToken
():
3133 raise Warning("expected Build number At Line ", self
.FileName
, self
.CurrentLineNumber
)
3134 EfiSectionObj
.BuildNum
= self
.__Token
3136 if self
.__GetAlignment
():
3137 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3138 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3139 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3140 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3141 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3142 EfiSectionObj
.Alignment
= self
.__Token
3144 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3145 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3146 if self
.__Token
== 'RELOCS_STRIPPED':
3147 EfiSectionObj
.KeepReloc
= False
3149 EfiSectionObj
.KeepReloc
= True
3150 if Obj
.KeepReloc
is not None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3151 raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3153 raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3156 if self
.__IsToken
('|'):
3157 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3158 elif self
.__GetNextToken
():
3159 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3160 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3162 if self
.__Token
.startswith('PCD'):
3164 self
.__GetNextWord
()
3166 if self
.__Token
== 'PCD':
3167 if not self
.__IsToken
( "("):
3168 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3169 PcdPair
= self
.__GetNextPcdName
()
3170 if not self
.__IsToken
( ")"):
3171 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3172 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3174 EfiSectionObj
.FileName
= self
.__Token
3179 raise Warning("expected section file name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3181 Obj
.SectionList
.append(EfiSectionObj
)
3184 ## __RuleSectionCouldBeOptional() method
3186 # Get whether a section could be optional
3188 # @param self The object pointer
3189 # @param SectionType The section type to check
3190 # @retval True section could be optional
3191 # @retval False section never optional
3193 def __RuleSectionCouldBeOptional(self
, SectionType
):
3194 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3199 ## __RuleSectionCouldHaveBuildNum() method
3201 # Get whether a section could have build number information
3203 # @param self The object pointer
3204 # @param SectionType The section type to check
3205 # @retval True section could have build number information
3206 # @retval False section never have build number information
3208 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3209 if SectionType
in ("VERSION"):
3214 ## __RuleSectionCouldHaveString() method
3216 # Get whether a section could have string
3218 # @param self The object pointer
3219 # @param SectionType The section type to check
3220 # @retval True section could have string
3221 # @retval False section never have string
3223 def __RuleSectionCouldHaveString(self
, SectionType
):
3224 if SectionType
in ("UI", "VERSION"):
3229 ## __CheckRuleSectionFileType() method
3231 # Get whether a section matches a file type
3233 # @param self The object pointer
3234 # @param SectionType The section type to check
3235 # @param FileType The file type to check
3237 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3238 if SectionType
== "COMPAT16":
3239 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3240 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3241 elif SectionType
== "PE32":
3242 if FileType
not in ("PE32", "SEC_PE32"):
3243 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3244 elif SectionType
== "PIC":
3245 if FileType
not in ("PIC", "PIC"):
3246 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3247 elif SectionType
== "TE":
3248 if FileType
not in ("TE", "SEC_TE"):
3249 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3250 elif SectionType
== "RAW":
3251 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3252 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3253 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3254 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3255 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3256 elif SectionType
== "UI":
3257 if FileType
not in ("UI", "SEC_UI"):
3258 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3259 elif SectionType
== "VERSION":
3260 if FileType
not in ("VERSION", "SEC_VERSION"):
3261 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3262 elif SectionType
== "PEI_DEPEX":
3263 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3264 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3265 elif SectionType
== "GUID":
3266 if FileType
not in ("PE32", "SEC_GUID"):
3267 raise Warning("Incorrect section file type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3269 ## __GetRuleEncapsulationSection() method
3271 # Get encapsulation section for Rule
3273 # @param self The object pointer
3274 # @param Rule for whom section is got
3275 # @retval True Successfully find section statement
3276 # @retval False Not able to find section statement
3278 def __GetRuleEncapsulationSection(self
, Rule
):
3280 if self
.__IsKeyword
( "COMPRESS"):
3282 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3285 if not self
.__IsToken
("{"):
3286 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3288 CompressSectionObj
= CompressSection
.CompressSection()
3290 CompressSectionObj
.CompType
= Type
3291 # Recursive sections...
3293 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3294 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3295 if not IsEncapsulate
and not IsLeaf
:
3298 if not self
.__IsToken
( "}"):
3299 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3300 Rule
.SectionList
.append(CompressSectionObj
)
3304 elif self
.__IsKeyword
( "GUIDED"):
3306 if self
.__GetNextGuid
():
3307 GuidValue
= self
.__Token
3309 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3310 GuidValue
= self
.__Token
3312 AttribDict
= self
.__GetGuidAttrib
()
3314 if not self
.__IsToken
("{"):
3315 raise Warning("expected '{' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3316 GuidSectionObj
= GuidSection
.GuidSection()
3317 GuidSectionObj
.NameGuid
= GuidValue
3318 GuidSectionObj
.SectionType
= "GUIDED"
3319 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3320 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3324 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3325 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3326 if not IsEncapsulate
and not IsLeaf
:
3329 if not self
.__IsToken
( "}"):
3330 raise Warning("expected '}' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3331 Rule
.SectionList
.append(GuidSectionObj
)
3337 ## __GetVtf() method
3339 # Get VTF section contents and store its data into VTF list of self.Profile
3341 # @param self The object pointer
3342 # @retval True Successfully find a VTF
3343 # @retval False Not able to find a VTF
3347 if not self
.__GetNextToken
():
3350 S
= self
.__Token
.upper()
3351 if S
.startswith("[") and not S
.startswith("[VTF."):
3352 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3353 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3358 if not self
.__IsToken
("[VTF.", True):
3359 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3360 print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3361 % (self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:], FileLineTuple
[0], FileLineTuple
[1], self
.CurrentOffsetWithinLine
)
3362 raise Warning("expected [VTF.] At Line ", self
.FileName
, self
.CurrentLineNumber
)
3364 if not self
.__SkipToToken
("."):
3365 raise Warning("expected '.' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3367 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3368 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3369 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3371 if not self
.__GetNextWord
():
3372 raise Warning("expected VTF name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3373 Name
= self
.__Token
.upper()
3376 VtfObj
.UiName
= Name
3377 VtfObj
.KeyArch
= Arch
3379 if self
.__IsToken
(","):
3380 if not self
.__GetNextWord
():
3381 raise Warning("expected Arch list At Line ", self
.FileName
, self
.CurrentLineNumber
)
3382 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
3383 raise Warning("Unknown Arch At line ", self
.FileName
, self
.CurrentLineNumber
)
3384 VtfObj
.ArchList
= self
.__Token
.upper()
3386 if not self
.__IsToken
( "]"):
3387 raise Warning("expected ']' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3389 if self
.__IsKeyword
("IA32_RST_BIN"):
3390 if not self
.__IsToken
("="):
3391 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3393 if not self
.__GetNextToken
():
3394 raise Warning("expected Reset file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3396 VtfObj
.ResetBin
= self
.__Token
3398 while self
.__GetComponentStatement
(VtfObj
):
3401 self
.Profile
.VtfList
.append(VtfObj
)
3404 ## __GetComponentStatement() method
3406 # Get components in VTF
3408 # @param self The object pointer
3409 # @param VtfObj for whom component is got
3410 # @retval True Successfully find a component
3411 # @retval False Not able to find a component
3413 def __GetComponentStatement(self
, VtfObj
):
3415 if not self
.__IsKeyword
("COMP_NAME"):
3418 if not self
.__IsToken
("="):
3419 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3421 if not self
.__GetNextWord
():
3422 raise Warning("expected Component Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3424 CompStatementObj
= ComponentStatement
.ComponentStatement()
3425 CompStatementObj
.CompName
= self
.__Token
3427 if not self
.__IsKeyword
("COMP_LOC"):
3428 raise Warning("expected COMP_LOC At Line ", self
.FileName
, self
.CurrentLineNumber
)
3430 if not self
.__IsToken
("="):
3431 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3433 CompStatementObj
.CompLoc
= ""
3434 if self
.__GetNextWord
():
3435 CompStatementObj
.CompLoc
= self
.__Token
3436 if self
.__IsToken
('|'):
3437 if not self
.__GetNextWord
():
3438 raise Warning("Expected Region Name At Line ", self
.FileName
, self
.CurrentLineNumber
)
3440 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3441 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3443 CompStatementObj
.FilePos
= self
.__Token
3445 self
.CurrentLineNumber
+= 1
3446 self
.CurrentOffsetWithinLine
= 0
3448 if not self
.__IsKeyword
("COMP_TYPE"):
3449 raise Warning("expected COMP_TYPE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3451 if not self
.__IsToken
("="):
3452 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3454 if not self
.__GetNextToken
():
3455 raise Warning("expected Component type At Line ", self
.FileName
, self
.CurrentLineNumber
)
3456 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3457 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3458 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3459 raise Warning("Unknown location type At line ", self
.FileName
, self
.CurrentLineNumber
)
3460 CompStatementObj
.CompType
= self
.__Token
3462 if not self
.__IsKeyword
("COMP_VER"):
3463 raise Warning("expected COMP_VER At Line ", self
.FileName
, self
.CurrentLineNumber
)
3465 if not self
.__IsToken
("="):
3466 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3468 if not self
.__GetNextToken
():
3469 raise Warning("expected Component version At Line ", self
.FileName
, self
.CurrentLineNumber
)
3471 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3472 if Pattern
.match(self
.__Token
) is None:
3473 raise Warning("Unknown version format At line ", self
.FileName
, self
.CurrentLineNumber
)
3474 CompStatementObj
.CompVer
= self
.__Token
3476 if not self
.__IsKeyword
("COMP_CS"):
3477 raise Warning("expected COMP_CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3479 if not self
.__IsToken
("="):
3480 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3482 if not self
.__GetNextToken
():
3483 raise Warning("expected Component CS At Line ", self
.FileName
, self
.CurrentLineNumber
)
3484 if self
.__Token
not in ("1", "0"):
3485 raise Warning("Unknown Component CS At line ", self
.FileName
, self
.CurrentLineNumber
)
3486 CompStatementObj
.CompCs
= self
.__Token
3489 if not self
.__IsKeyword
("COMP_BIN"):
3490 raise Warning("expected COMP_BIN At Line ", self
.FileName
, self
.CurrentLineNumber
)
3492 if not self
.__IsToken
("="):
3493 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3495 if not self
.__GetNextToken
():
3496 raise Warning("expected Component file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3498 CompStatementObj
.CompBin
= self
.__Token
3500 if not self
.__IsKeyword
("COMP_SYM"):
3501 raise Warning("expected COMP_SYM At Line ", self
.FileName
, self
.CurrentLineNumber
)
3503 if not self
.__IsToken
("="):
3504 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3506 if not self
.__GetNextToken
():
3507 raise Warning("expected Component symbol file At Line ", self
.FileName
, self
.CurrentLineNumber
)
3509 CompStatementObj
.CompSym
= self
.__Token
3511 if not self
.__IsKeyword
("COMP_SIZE"):
3512 raise Warning("expected COMP_SIZE At Line ", self
.FileName
, self
.CurrentLineNumber
)
3514 if not self
.__IsToken
("="):
3515 raise Warning("expected '=' At Line ", self
.FileName
, self
.CurrentLineNumber
)
3517 if self
.__IsToken
("-"):
3518 CompStatementObj
.CompSize
= self
.__Token
3519 elif self
.__GetNextDecimalNumber
():
3520 CompStatementObj
.CompSize
= self
.__Token
3521 elif self
.__GetNextHexNumber
():
3522 CompStatementObj
.CompSize
= self
.__Token
3524 raise Warning("Unknown size At line ", self
.FileName
, self
.CurrentLineNumber
)
3526 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3529 ## __GetFvInFd() method
3531 # Get FV list contained in FD
3533 # @param self The object pointer
3534 # @param FdName FD name
3535 # @retval FvList list of FV in FD
3537 def __GetFvInFd (self
, FdName
):
3540 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3541 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3542 for elementRegion
in FdObj
.RegionList
:
3543 if elementRegion
.RegionType
== 'FV':
3544 for elementRegionData
in elementRegion
.RegionDataList
:
3545 if elementRegionData
is not None and elementRegionData
.upper() not in FvList
:
3546 FvList
.append(elementRegionData
.upper())
3549 ## __GetReferencedFdFvTuple() method
3551 # Get FD and FV list referenced by a FFS file
3553 # @param self The object pointer
3554 # @param FfsFile contains sections to be searched
3555 # @param RefFdList referenced FD by section
3556 # @param RefFvList referenced FV by section
3558 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3560 for FfsObj
in FvObj
.FfsList
:
3561 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3562 if FfsObj
.FvName
is not None and FfsObj
.FvName
.upper() not in RefFvList
:
3563 RefFvList
.append(FfsObj
.FvName
.upper())
3564 elif FfsObj
.FdName
is not None and FfsObj
.FdName
.upper() not in RefFdList
:
3565 RefFdList
.append(FfsObj
.FdName
.upper())
3567 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3569 ## __GetReferencedFdFvTupleFromSection() method
3571 # Get FD and FV list referenced by a FFS section
3573 # @param self The object pointer
3574 # @param FfsFile contains sections to be searched
3575 # @param FdList referenced FD by section
3576 # @param FvList referenced FV by section
3578 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3581 SectionStack
.extend(FfsFile
.SectionList
)
3582 while SectionStack
!= []:
3583 SectionObj
= SectionStack
.pop()
3584 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3585 if SectionObj
.FvName
is not None and SectionObj
.FvName
.upper() not in FvList
:
3586 FvList
.append(SectionObj
.FvName
.upper())
3587 if SectionObj
.Fv
is not None and SectionObj
.Fv
.UiFvName
is not None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3588 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3589 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3591 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3592 SectionStack
.extend(SectionObj
.SectionList
)
3594 ## CycleReferenceCheck() method
3596 # Check whether cycle reference exists in FDF
3598 # @param self The object pointer
3599 # @retval True cycle reference exists
3600 # @retval False Not exists cycle reference
3602 def CycleReferenceCheck(self
):
3604 CycleRefExists
= False
3607 for FvName
in self
.Profile
.FvDict
.keys():
3608 LogStr
= "Cycle Reference Checking for FV: %s\n" % FvName
3610 RefFvStack
.append(FvName
)
3613 while RefFvStack
!= []:
3614 FvNameFromStack
= RefFvStack
.pop()
3615 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
3616 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
3622 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
3624 for RefFdName
in RefFdList
:
3625 if RefFdName
in FdAnalyzedList
:
3628 LogStr
+= "FD %s is referenced by FV %s\n" % (RefFdName
, FvNameFromStack
)
3629 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
3630 if FvInFdList
!= []:
3631 LogStr
+= "FD %s contains FV: " % RefFdName
3632 for FvObj
in FvInFdList
:
3635 if FvObj
not in RefFvStack
:
3636 RefFvStack
.append(FvObj
)
3638 if FvName
in RefFvStack
:
3639 CycleRefExists
= True
3640 raise Warning(LogStr
)
3641 FdAnalyzedList
.append(RefFdName
)
3643 for RefFvName
in RefFvList
:
3644 LogStr
+= "FV %s is referenced by FV %s\n" % (RefFvName
, FvNameFromStack
)
3645 if RefFvName
not in RefFvStack
:
3646 RefFvStack
.append(RefFvName
)
3648 if FvName
in RefFvStack
:
3649 CycleRefExists
= True
3650 raise Warning(LogStr
)
3656 return CycleRefExists
3658 if __name__
== "__main__":
3661 test_file
= sys
.argv
[1]
3662 except IndexError, v
:
3663 print "Usage: %s filename" % sys
.argv
[0]
3666 parser
= FdfParser(test_file
)
3669 parser
.CycleReferenceCheck()