4 # Copyright (c) 2007 - 2010, 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.
22 import FfsInfStatement
23 import FfsFileStatement
29 import CompressSection
34 import RuleComplexFile
38 import ComponentStatement
40 import OptRomInfStatement
41 import OptRomFileStatement
43 from GenFdsGlobalVariable
import GenFdsGlobalVariable
44 from Common
.BuildToolError
import *
45 from Common
import EdkLogger
46 from Common
.Misc
import PathClass
47 from Common
.String
import NormPath
48 from Common
import GlobalData
53 ##define T_CHAR_SPACE ' '
54 ##define T_CHAR_NULL '\0'
55 ##define T_CHAR_CR '\r'
56 ##define T_CHAR_TAB '\t'
57 ##define T_CHAR_LF '\n'
58 ##define T_CHAR_SLASH '/'
59 ##define T_CHAR_BACKSLASH '\\'
60 ##define T_CHAR_DOUBLE_QUOTE '\"'
61 ##define T_CHAR_SINGLE_QUOTE '\''
62 ##define T_CHAR_STAR '*'
63 ##define T_CHAR_HASH '#'
65 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
66 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
67 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
69 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
72 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
74 # All Macro values when parsing file, not replace existing Macro
77 def GetRealFileLine (File
, Line
):
80 for Profile
in IncludeFileList
:
81 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
82 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
83 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
84 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
86 return (File
, Line
- InsertedLines
)
88 ## The exception class that used to report error messages when parsing FDF
90 # Currently the "ToolName" is set to be "FDF Parser".
92 class Warning (Exception):
95 # @param self The object pointer
96 # @param Str The message to record
97 # @param File The FDF name
98 # @param Line The Line number that error occurs
100 def __init__(self
, Str
, File
= None, Line
= None):
102 FileLineTuple
= GetRealFileLine(File
, Line
)
103 self
.FileName
= FileLineTuple
[0]
104 self
.LineNumber
= FileLineTuple
[1]
106 self
.ToolName
= 'FdfParser'
111 ## The MACRO class that used to record macro value data when parsing include file
117 # @param self The object pointer
118 # @param FileName The file that to be parsed
120 def __init__(self
, FileName
, Line
):
121 self
.FileName
= FileName
122 self
.DefinedAtLine
= Line
123 self
.MacroName
= None
124 self
.MacroValue
= None
126 ## The Include file content class that used to record file data when parsing include file
128 # May raise Exception when opening file.
130 class IncludeFileProfile
:
133 # @param self The object pointer
134 # @param FileName The file that to be parsed
136 def __init__(self
, FileName
):
137 self
.FileName
= FileName
138 self
.FileLinesList
= []
140 fsock
= open(FileName
, "rb", 0)
142 self
.FileLinesList
= fsock
.readlines()
147 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
149 self
.InsertStartLineNumber
= None
150 self
.InsertAdjust
= 0
152 ## The FDF content class that used to record file data when parsing FDF
154 # May raise Exception when opening file.
159 # @param self The object pointer
160 # @param FileName The file that to be parsed
162 def __init__(self
, FileName
):
163 self
.FileLinesList
= []
165 fsock
= open(FileName
, "rb", 0)
167 self
.FileLinesList
= fsock
.readlines()
172 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
179 self
.FdNameNotSet
= False
181 self
.CapsuleDict
= {}
186 ## The syntax parser for FDF
188 # PreprocessFile method should be called prior to ParseFile
189 # CycleReferenceCheck method can detect cycles in FDF contents
191 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
192 # Get*** procedures mean these procedures will make judgement on current token only.
197 # @param self The object pointer
198 # @param FileName The file that to be parsed
200 def __init__(self
, FileName
):
201 self
.Profile
= FileProfile(FileName
)
202 self
.FileName
= FileName
203 self
.CurrentLineNumber
= 1
204 self
.CurrentOffsetWithinLine
= 0
205 self
.CurrentFdName
= None
206 self
.CurrentFvName
= None
208 self
.__SkippedChars
= ""
210 self
.__WipeOffArea
= []
211 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
212 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
214 ## __IsWhiteSpace() method
216 # Whether char at current FileBufferPos is whitespace
218 # @param self The object pointer
219 # @param Char The char to test
220 # @retval True The char is a kind of white space
221 # @retval False The char is NOT a kind of white space
223 def __IsWhiteSpace(self
, Char
):
224 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
229 ## __SkipWhiteSpace() method
231 # Skip white spaces from current char, return number of chars skipped
233 # @param self The object pointer
234 # @retval Count The number of chars skipped
236 def __SkipWhiteSpace(self
):
238 while not self
.__EndOfFile
():
240 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
241 self
.__SkippedChars
+= str(self
.__CurrentChar
())
248 ## __EndOfFile() method
250 # Judge current buffer pos is at file end
252 # @param self The object pointer
253 # @retval True Current File buffer position is at file end
254 # @retval False Current File buffer position is NOT at file end
256 def __EndOfFile(self
):
257 NumberOfLines
= len(self
.Profile
.FileLinesList
)
258 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
259 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
261 elif self
.CurrentLineNumber
> NumberOfLines
:
266 ## __EndOfLine() method
268 # Judge current buffer pos is at line end
270 # @param self The object pointer
271 # @retval True Current File buffer position is at line end
272 # @retval False Current File buffer position is NOT at line end
274 def __EndOfLine(self
):
275 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
277 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
278 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
285 # Reset file data buffer to the initial state
287 # @param self The object pointer
290 self
.CurrentLineNumber
= 1
291 self
.CurrentOffsetWithinLine
= 0
293 ## __UndoOneChar() method
295 # Go back one char in the file buffer
297 # @param self The object pointer
298 # @retval True Successfully go back one char
299 # @retval False Not able to go back one char as file beginning reached
301 def __UndoOneChar(self
):
303 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
305 elif self
.CurrentOffsetWithinLine
== 0:
306 self
.CurrentLineNumber
-= 1
307 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
309 self
.CurrentOffsetWithinLine
-= 1
312 ## __GetOneChar() method
314 # Move forward one char in the file buffer
316 # @param self The object pointer
318 def __GetOneChar(self
):
319 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
320 self
.CurrentLineNumber
+= 1
321 self
.CurrentOffsetWithinLine
= 0
323 self
.CurrentOffsetWithinLine
+= 1
325 ## __CurrentChar() method
327 # Get the char pointed to by the file buffer pointer
329 # @param self The object pointer
330 # @retval Char Current char
332 def __CurrentChar(self
):
333 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
335 ## __NextChar() method
337 # Get the one char pass the char pointed to by the file buffer pointer
339 # @param self The object pointer
340 # @retval Char Next char
342 def __NextChar(self
):
343 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
344 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
346 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
348 ## __SetCurrentCharValue() method
350 # Modify the value of current char
352 # @param self The object pointer
353 # @param Value The new value of current char
355 def __SetCurrentCharValue(self
, Value
):
356 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
358 ## __CurrentLine() method
360 # Get the list that contains current line contents
362 # @param self The object pointer
363 # @retval List current line contents
365 def __CurrentLine(self
):
366 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
368 def __StringToList(self
):
369 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
370 self
.Profile
.FileLinesList
[-1].append(' ')
372 def __ReplaceMacros(self
, Str
, File
, Line
):
374 while Str
.find('$(', MacroEnd
) >= 0:
375 MacroStart
= Str
.find('$(', MacroEnd
)
376 if Str
.find(')', MacroStart
) > 0:
377 MacroEnd
= Str
.find(')', MacroStart
)
378 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
380 if Name
in InputMacroDict
:
381 Value
= InputMacroDict
[Name
]
384 for Profile
in AllMacroList
:
385 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
386 Value
= Profile
.MacroValue
389 Str
= Str
.replace('$(' + Name
+ ')', Value
)
390 MacroEnd
= MacroStart
+ len(Value
)
393 raise Warning("Macro not complete", self
.FileName
, self
.CurrentLineNumber
)
396 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
397 if StartPos
[0] == EndPos
[0]:
399 while Offset
<= EndPos
[1]:
400 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
405 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
406 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
410 while Line
< EndPos
[0]:
412 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
413 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
418 while Offset
<= EndPos
[1]:
419 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
423 def __GetMacroName(self
):
424 if not self
.__GetNextToken
():
425 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
426 MacroName
= self
.__Token
428 if MacroName
.startswith('!'):
430 MacroName
= MacroName
[1:].strip()
432 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
433 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
434 self
.FileName
, self
.CurrentLineNumber
)
435 MacroName
= MacroName
[2:-1]
436 return MacroName
, NotFlag
438 ## PreprocessFile() method
440 # Preprocess file contents, replace comments with spaces.
441 # In the end, rewind the file buffer pointer to the beginning
442 # BUGBUG: No !include statement processing contained in this procedure
443 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
445 # @param self The object pointer
447 def PreprocessFile(self
):
451 DoubleSlashComment
= False
453 # HashComment in quoted string " " is ignored.
456 while not self
.__EndOfFile
():
458 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
459 InString
= not InString
460 # meet new line, then no longer in a comment for // and '#'
461 if self
.__CurrentChar
() == T_CHAR_LF
:
462 self
.CurrentLineNumber
+= 1
463 self
.CurrentOffsetWithinLine
= 0
464 if InComment
and DoubleSlashComment
:
466 DoubleSlashComment
= False
467 if InComment
and HashComment
:
470 # check for */ comment end
471 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
472 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
474 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
477 # set comments to spaces
479 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
481 # check for // comment
482 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
484 DoubleSlashComment
= True
485 # check for '#' comment
486 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
489 # check for /* comment start
490 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
491 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
493 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
499 # restore from ListOfList to ListOfString
500 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
503 ## PreprocessIncludeFile() method
505 # Preprocess file contents, replace !include statements with file contents.
506 # In the end, rewind the file buffer pointer to the beginning
508 # @param self The object pointer
510 def PreprocessIncludeFile(self
):
512 while self
.__GetNextToken
():
514 if self
.__Token
== '!include':
515 IncludeLine
= self
.CurrentLineNumber
516 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
517 if not self
.__GetNextToken
():
518 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
519 IncFileName
= self
.__Token
520 if not os
.path
.isabs(IncFileName
):
521 if IncFileName
.startswith('$(WORKSPACE)'):
522 Str
= IncFileName
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
523 if os
.path
.exists(Str
):
524 if not os
.path
.isabs(Str
):
525 Str
= os
.path
.abspath(Str
)
528 # file is in the same dir with FDF file
529 FullFdf
= self
.FileName
530 if not os
.path
.isabs(self
.FileName
):
531 FullFdf
= os
.path
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
533 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
535 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
536 raise Warning("Include file not exists", self
.FileName
, self
.CurrentLineNumber
)
538 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
540 CurrentLine
= self
.CurrentLineNumber
541 CurrentOffset
= self
.CurrentOffsetWithinLine
542 # list index of the insertion, note that line number is 'CurrentLine + 1'
543 InsertAtLine
= CurrentLine
544 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
545 # deal with remaining portions after "!include filename", if exists.
546 if self
.__GetNextToken
():
547 if self
.CurrentLineNumber
== CurrentLine
:
548 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
549 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
550 IncFileProfile
.InsertAdjust
+= 1
551 self
.CurrentLineNumber
+= 1
552 self
.CurrentOffsetWithinLine
= 0
554 for Line
in IncFileProfile
.FileLinesList
:
555 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
556 self
.CurrentLineNumber
+= 1
559 IncludeFileList
.append(IncFileProfile
)
561 # comment out the processed include file statement
562 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
563 TempList
.insert(IncludeOffset
, '#')
564 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
568 def __GetIfListCurrentItemStat(self
, IfList
):
579 ## PreprocessConditionalStatement() method
581 # Preprocess conditional statement.
582 # In the end, rewind the file buffer pointer to the beginning
584 # @param self The object pointer
586 def PreprocessConditionalStatement(self
):
587 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
589 while self
.__GetNextToken
():
590 if self
.__Token
== 'DEFINE':
591 if self
.__GetIfListCurrentItemStat
(IfList
):
592 DefineLine
= self
.CurrentLineNumber
- 1
593 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
594 if not self
.__GetNextToken
():
595 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
597 if not self
.__IsToken
( "="):
598 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
600 if not self
.__GetNextToken
():
601 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
603 if self
.__GetStringData
():
606 if not Macro
in InputMacroDict
:
607 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
608 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
609 MacProfile
.MacroName
= Macro
610 MacProfile
.MacroValue
= Value
611 AllMacroList
.append(MacProfile
)
612 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
614 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
615 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
616 IfList
.append([IfStartPos
, None, None])
617 CondLabel
= self
.__Token
619 MacroName
, NotFlag
= self
.__GetMacroName
()
620 NotDefineFlag
= False
621 if CondLabel
== '!ifndef':
623 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
625 raise Warning("'NOT' operation not allowed for Macro name", self
.FileName
, self
.CurrentLineNumber
)
627 if CondLabel
== '!if':
629 if not self
.__GetNextOp
():
630 raise Warning("expected !endif", self
.FileName
, self
.CurrentLineNumber
)
632 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
634 if not self
.__GetNextToken
():
635 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
636 if self
.__GetStringData
():
638 MacroValue
= self
.__Token
639 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
641 ConditionSatisfied
= not ConditionSatisfied
642 BranchDetermined
= ConditionSatisfied
644 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
645 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
647 ConditionSatisfied
= not ConditionSatisfied
648 BranchDetermined
= ConditionSatisfied
649 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
650 if ConditionSatisfied
:
651 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
654 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
656 ConditionSatisfied
= not ConditionSatisfied
657 BranchDetermined
= ConditionSatisfied
658 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
659 if ConditionSatisfied
:
660 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
662 elif self
.__Token
in ('!elseif', '!else'):
663 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
665 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
667 IfList
[-1] = [ElseStartPos
, False, True]
668 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
670 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
671 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
672 if self
.__Token
== '!elseif':
673 MacroName
, NotFlag
= self
.__GetMacroName
()
674 if not self
.__GetNextOp
():
675 raise Warning("expected !endif", self
.FileName
, self
.CurrentLineNumber
)
677 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
679 if not self
.__GetNextToken
():
680 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
681 if self
.__GetStringData
():
683 MacroValue
= self
.__Token
684 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
686 ConditionSatisfied
= not ConditionSatisfied
689 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
690 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
692 ConditionSatisfied
= not ConditionSatisfied
694 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
698 IfList
[-1][1] = False
701 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
704 elif self
.__Token
== '!endif':
706 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
708 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
714 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
717 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
719 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
720 if Name
in InputMacroDict
:
721 MacroValue
= InputMacroDict
[Name
]
723 if Value
== 'Bool' and MacroValue
== None or MacroValue
.upper() == 'FALSE':
727 if Value
!= MacroValue
:
732 if Value
== MacroValue
:
737 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
!= None and MacroValue
.isdigit())):
738 InputVal
= long(Value
, 0)
739 MacroVal
= long(MacroValue
, 0)
741 if MacroVal
> InputVal
:
746 if MacroVal
>= InputVal
:
751 if MacroVal
< InputVal
:
756 if MacroVal
<= InputVal
:
763 raise Warning("Value %s is not a number", self
.FileName
, Line
)
765 for Profile
in AllMacroList
:
766 if Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
768 if Value
== 'Bool' and Profile
.MacroValue
== None or Profile
.MacroValue
.upper() == 'FALSE':
772 if Value
!= Profile
.MacroValue
:
777 if Value
== Profile
.MacroValue
:
782 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
!= None and Profile
.MacroValue
.isdigit())):
783 InputVal
= long(Value
, 0)
784 MacroVal
= long(Profile
.MacroValue
, 0)
786 if MacroVal
> InputVal
:
791 if MacroVal
>= InputVal
:
796 if MacroVal
< InputVal
:
801 if MacroVal
<= InputVal
:
808 raise Warning("Value %s is not a number", self
.FileName
, Line
)
812 ## __IsToken() method
814 # Check whether input string is found from current char position along
815 # If found, the string value is put into self.__Token
817 # @param self The object pointer
818 # @param String The string to search
819 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
820 # @retval True Successfully find string, file buffer pointer moved forward
821 # @retval False Not able to find string, file buffer pointer not changed
823 def __IsToken(self
, String
, IgnoreCase
= False):
824 self
.__SkipWhiteSpace
()
826 # Only consider the same line, no multi-line token allowed
827 StartPos
= self
.CurrentOffsetWithinLine
830 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
832 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
834 self
.CurrentOffsetWithinLine
+= len(String
)
835 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
839 ## __IsKeyword() method
841 # Check whether input keyword is found from current char position along, whole word only!
842 # If found, the string value is put into self.__Token
844 # @param self The object pointer
845 # @param Keyword The string to search
846 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
847 # @retval True Successfully find string, file buffer pointer moved forward
848 # @retval False Not able to find string, file buffer pointer not changed
850 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
851 self
.__SkipWhiteSpace
()
853 # Only consider the same line, no multi-line token allowed
854 StartPos
= self
.CurrentOffsetWithinLine
857 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
859 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
861 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
862 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
864 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
865 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
869 ## __GetNextWord() method
871 # Get next C name from file lines
872 # If found, the string value is put into self.__Token
874 # @param self The object pointer
875 # @retval True Successfully find a C name string, file buffer pointer moved forward
876 # @retval False Not able to find a C name string, file buffer pointer not changed
878 def __GetNextWord(self
):
879 self
.__SkipWhiteSpace
()
880 if self
.__EndOfFile
():
883 TempChar
= self
.__CurrentChar
()
884 StartPos
= self
.CurrentOffsetWithinLine
885 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
887 while not self
.__EndOfLine
():
888 TempChar
= self
.__CurrentChar
()
889 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
890 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
896 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
901 ## __GetNextToken() method
903 # Get next token unit before a seperator
904 # If found, the string value is put into self.__Token
906 # @param self The object pointer
907 # @retval True Successfully find a token unit, file buffer pointer moved forward
908 # @retval False Not able to find a token unit, file buffer pointer not changed
910 def __GetNextToken(self
):
911 # Skip leading spaces, if exist.
912 self
.__SkipWhiteSpace
()
913 if self
.__EndOfFile
():
915 # Record the token start position, the position of the first non-space char.
916 StartPos
= self
.CurrentOffsetWithinLine
917 StartLine
= self
.CurrentLineNumber
918 while not self
.__EndOfLine
():
919 TempChar
= self
.__CurrentChar
()
920 # Try to find the end char that is not a space and not in seperator tuple.
921 # That is, when we got a space or any char in the tuple, we got the end of token.
922 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
924 # if we happen to meet a seperator as the first char, we must proceed to get it.
925 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
926 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
934 EndPos
= self
.CurrentOffsetWithinLine
935 if self
.CurrentLineNumber
!= StartLine
:
936 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
937 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
938 if StartPos
!= self
.CurrentOffsetWithinLine
:
943 def __GetNextOp(self
):
944 # Skip leading spaces, if exist.
945 self
.__SkipWhiteSpace
()
946 if self
.__EndOfFile
():
948 # Record the token start position, the position of the first non-space char.
949 StartPos
= self
.CurrentOffsetWithinLine
950 while not self
.__EndOfLine
():
951 TempChar
= self
.__CurrentChar
()
952 # Try to find the end char that is not a space
953 if not str(TempChar
).isspace():
960 if StartPos
!= self
.CurrentOffsetWithinLine
:
961 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
965 ## __GetNextGuid() method
967 # Get next token unit before a seperator
968 # If found, the GUID string is put into self.__Token
970 # @param self The object pointer
971 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
972 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
974 def __GetNextGuid(self
):
976 if not self
.__GetNextToken
():
978 p
= re
.compile('[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')
979 if p
.match(self
.__Token
) != None:
985 ## __UndoToken() method
987 # Go back one token unit in file buffer
989 # @param self The object pointer
991 def __UndoToken(self
):
993 while self
.__CurrentChar
().isspace():
994 if not self
.__UndoOneChar
():
999 StartPos
= self
.CurrentOffsetWithinLine
1000 CurrentLine
= self
.CurrentLineNumber
1001 while CurrentLine
== self
.CurrentLineNumber
:
1003 TempChar
= self
.__CurrentChar
()
1004 # Try to find the end char that is not a space and not in seperator tuple.
1005 # That is, when we got a space or any char in the tuple, we got the end of token.
1006 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1007 if not self
.__UndoOneChar
():
1009 # if we happen to meet a seperator as the first char, we must proceed to get it.
1010 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1011 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1018 ## __HexDigit() method
1020 # Whether char input is a Hex data bit
1022 # @param self The object pointer
1023 # @param TempChar The char to test
1024 # @retval True The char is a Hex data bit
1025 # @retval False The char is NOT a Hex data bit
1027 def __HexDigit(self
, TempChar
):
1028 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1029 or (TempChar
>= '0' and TempChar
<= '9'):
1034 def __IsHex(self
, HexStr
):
1035 if not HexStr
.upper().startswith("0X"):
1037 if len(self
.__Token
) <= 2:
1039 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1040 if len(charList
) == 0:
1044 ## __GetNextHexNumber() method
1046 # Get next HEX data before a seperator
1047 # If found, the HEX data is put into self.__Token
1049 # @param self The object pointer
1050 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1051 # @retval False Not able to find a HEX data, file buffer pointer not changed
1053 def __GetNextHexNumber(self
):
1054 if not self
.__GetNextToken
():
1056 if self
.__IsHex
(self
.__Token
):
1062 ## __GetNextDecimalNumber() method
1064 # Get next decimal data before a seperator
1065 # If found, the decimal data is put into self.__Token
1067 # @param self The object pointer
1068 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1069 # @retval False Not able to find a decimal data, file buffer pointer not changed
1071 def __GetNextDecimalNumber(self
):
1072 if not self
.__GetNextToken
():
1074 if self
.__Token
.isdigit():
1080 ## __GetNextPcdName() method
1082 # Get next PCD token space C name and PCD C name pair before a seperator
1083 # If found, the decimal data is put into self.__Token
1085 # @param self The object pointer
1086 # @retval Tuple PCD C name and PCD token space C name pair
1088 def __GetNextPcdName(self
):
1089 if not self
.__GetNextWord
():
1090 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1091 pcdTokenSpaceCName
= self
.__Token
1093 if not self
.__IsToken
( "."):
1094 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1096 if not self
.__GetNextWord
():
1097 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1098 pcdCName
= self
.__Token
1100 return (pcdCName
, pcdTokenSpaceCName
)
1102 ## __GetStringData() method
1104 # Get string contents quoted in ""
1105 # If found, the decimal data is put into self.__Token
1107 # @param self The object pointer
1108 # @retval True Successfully find a string data, file buffer pointer moved forward
1109 # @retval False Not able to find a string data, file buffer pointer not changed
1111 def __GetStringData(self
):
1112 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1114 self
.__SkipToToken
("\"")
1115 currentLineNumber
= self
.CurrentLineNumber
1117 if not self
.__SkipToToken
("\""):
1118 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1119 if currentLineNumber
!= self
.CurrentLineNumber
:
1120 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1121 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1124 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1126 self
.__SkipToToken
("\'")
1127 currentLineNumber
= self
.CurrentLineNumber
1129 if not self
.__SkipToToken
("\'"):
1130 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1131 if currentLineNumber
!= self
.CurrentLineNumber
:
1132 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1133 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1139 ## __SkipToToken() method
1141 # Search forward in file buffer for the string
1142 # The skipped chars are put into self.__SkippedChars
1144 # @param self The object pointer
1145 # @param String The string to search
1146 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1147 # @retval True Successfully find the string, file buffer pointer moved forward
1148 # @retval False Not able to find the string, file buffer pointer not changed
1150 def __SkipToToken(self
, String
, IgnoreCase
= False):
1151 StartPos
= self
.GetFileBufferPos()
1153 self
.__SkippedChars
= ""
1154 while not self
.__EndOfFile
():
1157 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1159 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1161 self
.CurrentOffsetWithinLine
+= len(String
)
1162 self
.__SkippedChars
+= String
1164 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1167 self
.SetFileBufferPos( StartPos
)
1168 self
.__SkippedChars
= ""
1171 ## GetFileBufferPos() method
1173 # Return the tuple of current line and offset within the line
1175 # @param self The object pointer
1176 # @retval Tuple Line number and offset pair
1178 def GetFileBufferPos(self
):
1179 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1181 ## SetFileBufferPos() method
1183 # Restore the file buffer position
1185 # @param self The object pointer
1186 # @param Pos The new file buffer position
1188 def SetFileBufferPos(self
, Pos
):
1189 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1191 ## ParseFile() method
1193 # Parse the file profile buffer to extract fd, fv ... information
1194 # Exception will be raised if syntax error found
1196 # @param self The object pointer
1198 def ParseFile(self
):
1201 self
.__StringToList
()
1202 self
.PreprocessFile()
1203 self
.PreprocessIncludeFile()
1204 self
.__StringToList
()
1205 self
.PreprocessFile()
1206 self
.PreprocessConditionalStatement()
1207 self
.__StringToList
()
1208 for Pos
in self
.__WipeOffArea
:
1209 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1210 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1212 while self
.__GetDefines
():
1216 while Index
< len(self
.Profile
.FileLinesList
):
1217 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1218 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1221 while self
.__GetFd
():
1224 while self
.__GetFv
():
1227 while self
.__GetCapsule
():
1230 while self
.__GetVtf
():
1233 while self
.__GetRule
():
1236 while self
.__GetOptionRom
():
1241 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1242 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1243 X
.Message
+= ' near line %d, column %d: %s' \
1244 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1247 ## __GetDefines() method
1249 # Get Defines section contents and store its data into AllMacrosList
1251 # @param self The object pointer
1252 # @retval True Successfully find a Defines
1253 # @retval False Not able to find a Defines
1255 def __GetDefines(self
):
1257 if not self
.__GetNextToken
():
1260 S
= self
.__Token
.upper()
1261 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1262 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1263 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1264 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
)
1269 if not self
.__IsToken
("[DEFINES", True):
1270 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1271 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1272 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1273 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1275 if not self
.__IsToken
( "]"):
1276 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1278 while self
.__GetNextWord
():
1279 # handle the SET statement
1280 if self
.__Token
== 'SET':
1282 self
.__GetSetStatement
(None)
1285 Macro
= self
.__Token
1287 if not self
.__IsToken
("="):
1288 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1289 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1290 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1291 Value
= self
.__Token
1292 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1293 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1294 MacProfile
.MacroName
= Macro
1295 MacProfile
.MacroValue
= Value
1296 AllMacroList
.append(MacProfile
)
1302 # Get FD section contents and store its data into FD dictionary of self.Profile
1304 # @param self The object pointer
1305 # @retval True Successfully find a FD
1306 # @retval False Not able to find a FD
1310 if not self
.__GetNextToken
():
1313 S
= self
.__Token
.upper()
1314 if S
.startswith("[") and not S
.startswith("[FD."):
1315 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1316 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1317 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1322 if not self
.__IsToken
("[FD.", True):
1323 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1324 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1325 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1326 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1328 FdName
= self
.__GetUiName
()
1330 if len (self
.Profile
.FdDict
) == 0:
1331 FdName
= GenFdsGlobalVariable
.PlatformName
1332 self
.Profile
.FdNameNotSet
= True
1334 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1335 self
.CurrentFdName
= FdName
.upper()
1337 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1338 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1340 if not self
.__IsToken
( "]"):
1341 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1344 FdObj
.FdUiName
= self
.CurrentFdName
1345 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1347 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1348 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1350 Status
= self
.__GetCreateFile
(FdObj
)
1352 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1354 self
.__GetTokenStatements
(FdObj
)
1356 self
.__GetDefineStatements
(FdObj
)
1358 self
.__GetSetStatements
(FdObj
)
1360 if not self
.__GetRegionLayout
(FdObj
):
1361 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1363 while self
.__GetRegionLayout
(FdObj
):
1367 ## __GetUiName() method
1369 # Return the UI name of a section
1371 # @param self The object pointer
1372 # @retval FdName UI name
1374 def __GetUiName(self
):
1376 if self
.__GetNextWord
():
1381 ## __GetCreateFile() method
1383 # Return the output file name of object
1385 # @param self The object pointer
1386 # @param Obj object whose data will be stored in file
1387 # @retval FdName UI name
1389 def __GetCreateFile(self
, Obj
):
1391 if self
.__IsKeyword
( "CREATE_FILE"):
1392 if not self
.__IsToken
( "="):
1393 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1395 if not self
.__GetNextToken
():
1396 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1398 FileName
= self
.__Token
1399 Obj
.CreateFileName
= FileName
1403 ## __GetTokenStatements() method
1405 # Get token statements
1407 # @param self The object pointer
1408 # @param Obj for whom token statement is got
1410 def __GetTokenStatements(self
, Obj
):
1411 if not self
.__IsKeyword
( "BaseAddress"):
1412 raise Warning("BaseAddress missing", self
.FileName
, self
.CurrentLineNumber
)
1414 if not self
.__IsToken
( "="):
1415 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1417 if not self
.__GetNextHexNumber
():
1418 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1420 Obj
.BaseAddress
= self
.__Token
1422 if self
.__IsToken
( "|"):
1423 pcdPair
= self
.__GetNextPcdName
()
1424 Obj
.BaseAddressPcd
= pcdPair
1425 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1427 if not self
.__IsKeyword
( "Size"):
1428 raise Warning("Size missing", self
.FileName
, self
.CurrentLineNumber
)
1430 if not self
.__IsToken
( "="):
1431 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1433 if not self
.__GetNextHexNumber
():
1434 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1438 if self
.__IsToken
( "|"):
1439 pcdPair
= self
.__GetNextPcdName
()
1440 Obj
.SizePcd
= pcdPair
1441 self
.Profile
.PcdDict
[pcdPair
] = Size
1442 Obj
.Size
= long(Size
, 0)
1444 if not self
.__IsKeyword
( "ErasePolarity"):
1445 raise Warning("ErasePolarity missing", self
.FileName
, self
.CurrentLineNumber
)
1447 if not self
.__IsToken
( "="):
1448 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1450 if not self
.__GetNextToken
():
1451 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1453 if self
.__Token
!= "1" and self
.__Token
!= "0":
1454 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1456 Obj
.ErasePolarity
= self
.__Token
1458 self
.__GetBlockStatements
(Obj
)
1460 ## __GetAddressStatements() method
1462 # Get address statements
1464 # @param self The object pointer
1465 # @param Obj for whom address statement is got
1466 # @retval True Successfully find
1467 # @retval False Not able to find
1469 def __GetAddressStatements(self
, Obj
):
1471 if self
.__IsKeyword
("BsBaseAddress"):
1472 if not self
.__IsToken
( "="):
1473 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1475 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1476 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1478 BsAddress
= long(self
.__Token
, 0)
1479 Obj
.BsBaseAddress
= BsAddress
1481 if self
.__IsKeyword
("RtBaseAddress"):
1482 if not self
.__IsToken
( "="):
1483 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1485 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1486 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1488 RtAddress
= long(self
.__Token
, 0)
1489 Obj
.RtBaseAddress
= RtAddress
1491 ## __GetBlockStatements() method
1493 # Get block statements
1495 # @param self The object pointer
1496 # @param Obj for whom block statement is got
1498 def __GetBlockStatements(self
, Obj
):
1500 if not self
.__GetBlockStatement
(Obj
):
1501 #set default block size is 1
1502 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1505 while self
.__GetBlockStatement
(Obj
):
1508 for Item
in Obj
.BlockSizeList
:
1509 if Item
[0] == None or Item
[1] == None:
1510 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1512 ## __GetBlockStatement() method
1514 # Get block statement
1516 # @param self The object pointer
1517 # @param Obj for whom block statement is got
1518 # @retval True Successfully find
1519 # @retval False Not able to find
1521 def __GetBlockStatement(self
, Obj
):
1522 if not self
.__IsKeyword
( "BlockSize"):
1525 if not self
.__IsToken
( "="):
1526 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1528 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1529 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1531 BlockSize
= self
.__Token
1533 if self
.__IsToken
( "|"):
1534 PcdPair
= self
.__GetNextPcdName
()
1535 BlockSizePcd
= PcdPair
1536 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1537 BlockSize
= long(BlockSize
, 0)
1540 if self
.__IsKeyword
( "NumBlocks"):
1541 if not self
.__IsToken
( "="):
1542 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1544 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1545 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1547 BlockNumber
= long(self
.__Token
, 0)
1549 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1552 ## __GetDefineStatements() method
1554 # Get define statements
1556 # @param self The object pointer
1557 # @param Obj for whom define statement is got
1558 # @retval True Successfully find
1559 # @retval False Not able to find
1561 def __GetDefineStatements(self
, Obj
):
1562 while self
.__GetDefineStatement
( Obj
):
1565 ## __GetDefineStatement() method
1567 # Get define statement
1569 # @param self The object pointer
1570 # @param Obj for whom define statement is got
1571 # @retval True Successfully find
1572 # @retval False Not able to find
1574 def __GetDefineStatement(self
, Obj
):
1575 if self
.__IsKeyword
("DEFINE"):
1576 self
.__GetNextToken
()
1577 Macro
= self
.__Token
1578 if not self
.__IsToken
( "="):
1579 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1581 if not self
.__GetNextToken
():
1582 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1584 Value
= self
.__Token
1585 Macro
= '$(' + Macro
+ ')'
1586 Obj
.DefineVarDict
[Macro
] = Value
1591 ## __GetSetStatements() method
1593 # Get set statements
1595 # @param self The object pointer
1596 # @param Obj for whom set statement is got
1597 # @retval True Successfully find
1598 # @retval False Not able to find
1600 def __GetSetStatements(self
, Obj
):
1601 while self
.__GetSetStatement
(Obj
):
1604 ## __GetSetStatement() method
1608 # @param self The object pointer
1609 # @param Obj for whom set statement is got
1610 # @retval True Successfully find
1611 # @retval False Not able to find
1613 def __GetSetStatement(self
, Obj
):
1614 if self
.__IsKeyword
("SET"):
1615 PcdPair
= self
.__GetNextPcdName
()
1617 if not self
.__IsToken
( "="):
1618 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1620 if not self
.__GetNextToken
():
1621 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1623 Value
= self
.__Token
1624 if Value
.startswith("{"):
1625 # deal with value with {}
1626 if not self
.__SkipToToken
( "}"):
1627 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1628 Value
+= self
.__SkippedChars
1631 Obj
.SetVarDict
[PcdPair
] = Value
1632 self
.Profile
.PcdDict
[PcdPair
] = Value
1637 ## __GetRegionLayout() method
1639 # Get region layout for FD
1641 # @param self The object pointer
1642 # @param Fd for whom region is got
1643 # @retval True Successfully find
1644 # @retval False Not able to find
1646 def __GetRegionLayout(self
, Fd
):
1647 if not self
.__GetNextHexNumber
():
1650 RegionObj
= Region
.Region()
1651 RegionObj
.Offset
= long(self
.__Token
, 0)
1652 Fd
.RegionList
.append(RegionObj
)
1654 if not self
.__IsToken
( "|"):
1655 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1657 if not self
.__GetNextHexNumber
():
1658 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1659 RegionObj
.Size
= long(self
.__Token
, 0)
1661 if not self
.__GetNextWord
():
1664 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1666 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1667 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1668 if self
.__IsToken
( "|"):
1669 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1670 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1672 if not self
.__GetNextWord
():
1675 if self
.__Token
== "SET":
1677 self
.__GetSetStatements
( RegionObj
)
1678 if not self
.__GetNextWord
():
1681 elif self
.__Token
== "FV":
1683 self
.__GetRegionFvType
( RegionObj
)
1685 elif self
.__Token
== "CAPSULE":
1687 self
.__GetRegionCapType
( RegionObj
)
1689 elif self
.__Token
== "FILE":
1691 self
.__GetRegionFileType
( RegionObj
)
1693 elif self
.__Token
== "DATA":
1695 self
.__GetRegionDataType
( RegionObj
)
1697 raise Warning("A valid region type was not found. "
1698 "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",
1699 self
.FileName
, self
.CurrentLineNumber
)
1703 ## __GetRegionFvType() method
1705 # Get region fv data for region
1707 # @param self The object pointer
1708 # @param RegionObj for whom region data is got
1710 def __GetRegionFvType(self
, RegionObj
):
1712 if not self
.__IsKeyword
( "FV"):
1713 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1715 if not self
.__IsToken
( "="):
1716 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1718 if not self
.__GetNextToken
():
1719 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1721 RegionObj
.RegionType
= "FV"
1722 RegionObj
.RegionDataList
.append(self
.__Token
)
1724 while self
.__IsKeyword
( "FV"):
1726 if not self
.__IsToken
( "="):
1727 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1729 if not self
.__GetNextToken
():
1730 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1732 RegionObj
.RegionDataList
.append(self
.__Token
)
1734 ## __GetRegionCapType() method
1736 # Get region capsule data for region
1738 # @param self The object pointer
1739 # @param RegionObj for whom region data is got
1741 def __GetRegionCapType(self
, RegionObj
):
1743 if not self
.__IsKeyword
("CAPSULE"):
1744 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1746 if not self
.__IsToken
("="):
1747 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1749 if not self
.__GetNextToken
():
1750 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1752 RegionObj
.RegionType
= "CAPSULE"
1753 RegionObj
.RegionDataList
.append(self
.__Token
)
1755 while self
.__IsKeyword
("CAPSULE"):
1757 if not self
.__IsToken
("="):
1758 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1760 if not self
.__GetNextToken
():
1761 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1763 RegionObj
.RegionDataList
.append(self
.__Token
)
1765 ## __GetRegionFileType() method
1767 # Get region file data for region
1769 # @param self The object pointer
1770 # @param RegionObj for whom region data is got
1772 def __GetRegionFileType(self
, RegionObj
):
1774 if not self
.__IsKeyword
( "FILE"):
1775 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1777 if not self
.__IsToken
( "="):
1778 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1780 if not self
.__GetNextToken
():
1781 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1783 RegionObj
.RegionType
= "FILE"
1784 RegionObj
.RegionDataList
.append( self
.__Token
)
1786 while self
.__IsKeyword
( "FILE"):
1788 if not self
.__IsToken
( "="):
1789 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1791 if not self
.__GetNextToken
():
1792 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1794 RegionObj
.RegionDataList
.append(self
.__Token
)
1796 ## __GetRegionDataType() method
1798 # Get region array data for region
1800 # @param self The object pointer
1801 # @param RegionObj for whom region data is got
1803 def __GetRegionDataType(self
, RegionObj
):
1805 if not self
.__IsKeyword
( "DATA"):
1806 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
1808 if not self
.__IsToken
( "="):
1809 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1811 if not self
.__IsToken
( "{"):
1812 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1814 if not self
.__GetNextHexNumber
():
1815 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1817 if len(self
.__Token
) > 18:
1818 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1820 # convert hex string value to byte hex string array
1821 AllString
= self
.__Token
1822 AllStrLen
= len (AllString
)
1824 while AllStrLen
> 4:
1825 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1826 AllStrLen
= AllStrLen
- 2
1827 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1830 if len (self
.__Token
) <= 4:
1831 while self
.__IsToken
(","):
1832 if not self
.__GetNextHexNumber
():
1833 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1834 if len(self
.__Token
) > 4:
1835 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1836 DataString
+= self
.__Token
1839 if not self
.__IsToken
( "}"):
1840 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1842 DataString
= DataString
.rstrip(",")
1843 RegionObj
.RegionType
= "DATA"
1844 RegionObj
.RegionDataList
.append( DataString
)
1846 while self
.__IsKeyword
( "DATA"):
1848 if not self
.__IsToken
( "="):
1849 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1851 if not self
.__IsToken
( "{"):
1852 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1854 if not self
.__GetNextHexNumber
():
1855 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1857 if len(self
.__Token
) > 18:
1858 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1860 # convert hex string value to byte hex string array
1861 AllString
= self
.__Token
1862 AllStrLen
= len (AllString
)
1864 while AllStrLen
> 4:
1865 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1866 AllStrLen
= AllStrLen
- 2
1867 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1870 if len (self
.__Token
) <= 4:
1871 while self
.__IsToken
(","):
1872 if not self
.__GetNextHexNumber
():
1873 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1874 if len(self
.__Token
) > 4:
1875 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1876 DataString
+= self
.__Token
1879 if not self
.__IsToken
( "}"):
1880 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1882 DataString
= DataString
.rstrip(",")
1883 RegionObj
.RegionDataList
.append( DataString
)
1887 # Get FV section contents and store its data into FV dictionary of self.Profile
1889 # @param self The object pointer
1890 # @retval True Successfully find a FV
1891 # @retval False Not able to find a FV
1894 if not self
.__GetNextToken
():
1897 S
= self
.__Token
.upper()
1898 if S
.startswith("[") and not S
.startswith("[FV."):
1899 if not S
.startswith("[CAPSULE.") \
1900 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1901 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1906 if not self
.__IsToken
("[FV.", True):
1907 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1908 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1909 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1910 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1912 FvName
= self
.__GetUiName
()
1913 self
.CurrentFvName
= FvName
.upper()
1915 if not self
.__IsToken
( "]"):
1916 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1919 FvObj
.UiFvName
= self
.CurrentFvName
1920 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1922 Status
= self
.__GetCreateFile
(FvObj
)
1924 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
1926 self
.__GetDefineStatements
(FvObj
)
1928 self
.__GetAddressStatements
(FvObj
)
1930 while self
.__GetBlockStatement
(FvObj
):
1933 self
.__GetSetStatements
(FvObj
)
1935 self
.__GetFvBaseAddress
(FvObj
)
1937 self
.__GetFvForceRebase
(FvObj
)
1939 self
.__GetFvAlignment
(FvObj
)
1941 self
.__GetFvAttributes
(FvObj
)
1943 self
.__GetFvNameGuid
(FvObj
)
1945 FvObj
.FvExtEntryTypeValue
= []
1946 FvObj
.FvExtEntryType
= []
1947 FvObj
.FvExtEntryData
= []
1949 isFvExtEntry
= self
.__GetFvExtEntryStatement
(FvObj
)
1950 if not isFvExtEntry
:
1953 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1954 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1957 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1958 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1959 if not isInf
and not isFile
:
1964 ## __GetFvAlignment() method
1966 # Get alignment for FV
1968 # @param self The object pointer
1969 # @param Obj for whom alignment is got
1970 # @retval True Successfully find a alignment statement
1971 # @retval False Not able to find a alignment statement
1973 def __GetFvAlignment(self
, Obj
):
1975 if not self
.__IsKeyword
( "FvAlignment"):
1978 if not self
.__IsToken
( "="):
1979 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1981 if not self
.__GetNextToken
():
1982 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
1984 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1985 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1986 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1988 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1989 Obj
.FvAlignment
= self
.__Token
1992 ## __GetFvBaseAddress() method
1994 # Get BaseAddress for FV
1996 # @param self The object pointer
1997 # @param Obj for whom FvBaseAddress is got
1998 # @retval True Successfully find a FvBaseAddress statement
1999 # @retval False Not able to find a FvBaseAddress statement
2001 def __GetFvBaseAddress(self
, Obj
):
2003 if not self
.__IsKeyword
("FvBaseAddress"):
2006 if not self
.__IsToken
( "="):
2007 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2009 if not self
.__GetNextToken
():
2010 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2012 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2014 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2015 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2016 Obj
.FvBaseAddress
= self
.__Token
2019 ## __GetFvForceRebase() method
2021 # Get FvForceRebase for FV
2023 # @param self The object pointer
2024 # @param Obj for whom FvForceRebase is got
2025 # @retval True Successfully find a FvForceRebase statement
2026 # @retval False Not able to find a FvForceRebase statement
2028 def __GetFvForceRebase(self
, Obj
):
2030 if not self
.__IsKeyword
("FvForceRebase"):
2033 if not self
.__IsToken
( "="):
2034 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2036 if not self
.__GetNextToken
():
2037 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2039 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2040 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2042 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2043 Obj
.FvForceRebase
= True
2044 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2045 Obj
.FvForceRebase
= False
2047 Obj
.FvForceRebase
= None
2051 ## __GetFvAttributes() method
2053 # Get attributes for FV
2055 # @param self The object pointer
2056 # @param Obj for whom attribute is got
2059 def __GetFvAttributes(self
, FvObj
):
2061 while self
.__GetNextWord
():
2063 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2064 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2065 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2066 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2067 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2068 "WRITE_POLICY_RELIABLE"):
2072 if not self
.__IsToken
( "="):
2073 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2075 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2076 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2078 FvObj
.FvAttributeDict
[name
] = self
.__Token
2082 ## __GetFvNameGuid() method
2084 # Get FV GUID for FV
2086 # @param self The object pointer
2087 # @param Obj for whom GUID is got
2090 def __GetFvNameGuid(self
, FvObj
):
2092 if not self
.__IsKeyword
( "FvNameGuid"):
2095 if not self
.__IsToken
( "="):
2096 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2098 if not self
.__GetNextGuid
():
2099 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2101 FvObj
.FvNameGuid
= self
.__Token
2105 def __GetFvExtEntryStatement(self
, FvObj
):
2107 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2110 if not self
.__IsKeyword
("TYPE"):
2111 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2113 if not self
.__IsToken
( "="):
2114 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2116 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2117 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2119 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2121 if not self
.__IsToken
( "{"):
2122 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2124 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2125 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2127 FvObj
.FvExtEntryType
+= [self
.__Token
]
2129 if self
.__Token
== 'DATA':
2131 if not self
.__IsToken
( "="):
2132 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2134 if not self
.__IsToken
( "{"):
2135 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2137 if not self
.__GetNextHexNumber
():
2138 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2140 if len(self
.__Token
) > 4:
2141 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2143 DataString
= self
.__Token
2146 while self
.__IsToken
(","):
2147 if not self
.__GetNextHexNumber
():
2148 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2149 if len(self
.__Token
) > 4:
2150 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2151 DataString
+= self
.__Token
2154 if not self
.__IsToken
( "}"):
2155 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2157 if not self
.__IsToken
( "}"):
2158 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2160 DataString
= DataString
.rstrip(",")
2161 FvObj
.FvExtEntryData
+= [DataString
]
2163 if self
.__Token
== 'FILE':
2165 if not self
.__IsToken
( "="):
2166 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2168 if not self
.__GetNextToken
():
2169 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2171 FvObj
.FvExtEntryData
+= [self
.__Token
]
2173 if not self
.__IsToken
( "}"):
2174 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2178 ## __GetAprioriSection() method
2180 # Get token statements
2182 # @param self The object pointer
2183 # @param FvObj for whom apriori is got
2184 # @param MacroDict dictionary used to replace macro
2185 # @retval True Successfully find apriori statement
2186 # @retval False Not able to find apriori statement
2188 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2190 if not self
.__IsKeyword
( "APRIORI"):
2193 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2194 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2195 AprType
= self
.__Token
2197 if not self
.__IsToken
( "{"):
2198 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2200 AprSectionObj
= AprioriSection
.AprioriSection()
2201 AprSectionObj
.AprioriType
= AprType
2203 self
.__GetDefineStatements
(AprSectionObj
)
2204 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2207 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2208 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2209 if not IsInf
and not IsFile
:
2212 if not self
.__IsToken
( "}"):
2213 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2215 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2218 ## __GetInfStatement() method
2220 # Get INF statements
2222 # @param self The object pointer
2223 # @param Obj for whom inf statement is got
2224 # @param MacroDict dictionary used to replace macro
2225 # @retval True Successfully find inf statement
2226 # @retval False Not able to find inf statement
2228 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2230 if not self
.__IsKeyword
( "INF"):
2233 ffsInf
= FfsInfStatement
.FfsInfStatement()
2234 self
.__GetInfOptions
( ffsInf
)
2236 if not self
.__GetNextToken
():
2237 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2238 ffsInf
.InfFileName
= self
.__Token
2239 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2240 #do case sensitive check for file path
2241 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2243 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2245 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2246 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2248 if self
.__IsToken
('|'):
2249 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2250 ffsInf
.KeepReloc
= False
2251 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2252 ffsInf
.KeepReloc
= True
2254 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2256 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2257 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2260 capsuleFfs
= CapsuleData
.CapsuleFfs()
2261 capsuleFfs
.Ffs
= ffsInf
2262 Obj
.CapsuleDataList
.append(capsuleFfs
)
2264 Obj
.FfsList
.append(ffsInf
)
2267 ## __GetInfOptions() method
2269 # Get options for INF
2271 # @param self The object pointer
2272 # @param FfsInfObj for whom option is got
2274 def __GetInfOptions(self
, FfsInfObj
):
2276 if self
.__IsKeyword
( "RuleOverride"):
2277 if not self
.__IsToken
( "="):
2278 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2279 if not self
.__GetNextToken
():
2280 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2281 FfsInfObj
.Rule
= self
.__Token
2283 if self
.__IsKeyword
( "VERSION"):
2284 if not self
.__IsToken
( "="):
2285 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2286 if not self
.__GetNextToken
():
2287 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2289 if self
.__GetStringData
():
2290 FfsInfObj
.Version
= self
.__Token
2292 if self
.__IsKeyword
( "UI"):
2293 if not self
.__IsToken
( "="):
2294 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2295 if not self
.__GetNextToken
():
2296 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2298 if self
.__GetStringData
():
2299 FfsInfObj
.Ui
= self
.__Token
2301 if self
.__IsKeyword
( "USE"):
2302 if not self
.__IsToken
( "="):
2303 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2304 if not self
.__GetNextToken
():
2305 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2306 FfsInfObj
.UseArch
= self
.__Token
2309 if self
.__GetNextToken
():
2310 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2311 if p
.match(self
.__Token
):
2312 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2313 if not self
.__IsToken
(","):
2319 while self
.__GetNextToken
():
2320 if not p
.match(self
.__Token
):
2321 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2322 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2324 if not self
.__IsToken
(","):
2327 ## __GetFileStatement() method
2329 # Get FILE statements
2331 # @param self The object pointer
2332 # @param Obj for whom FILE statement is got
2333 # @param MacroDict dictionary used to replace macro
2334 # @retval True Successfully find FILE statement
2335 # @retval False Not able to find FILE statement
2337 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2339 if not self
.__IsKeyword
( "FILE"):
2342 if not self
.__GetNextWord
():
2343 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2345 if ForCapsule
and self
.__Token
== 'DATA':
2350 FfsFileObj
= FfsFileStatement
.FileStatement()
2351 FfsFileObj
.FvFileType
= self
.__Token
2353 if not self
.__IsToken
( "="):
2354 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2356 if not self
.__GetNextGuid
():
2357 if not self
.__GetNextWord
():
2358 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2359 if self
.__Token
== 'PCD':
2360 if not self
.__IsToken
( "("):
2361 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2362 PcdPair
= self
.__GetNextPcdName
()
2363 if not self
.__IsToken
( ")"):
2364 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2365 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2367 FfsFileObj
.NameGuid
= self
.__Token
2369 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2370 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2372 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2375 capsuleFfs
= CapsuleData
.CapsuleFfs()
2376 capsuleFfs
.Ffs
= FfsFileObj
2377 Obj
.CapsuleDataList
.append(capsuleFfs
)
2379 Obj
.FfsList
.append(FfsFileObj
)
2383 ## __FileCouldHaveRelocFlag() method
2385 # Check whether reloc strip flag can be set for a file type.
2387 # @param self The object pointer
2388 # @param FileType The file type to check with
2389 # @retval True This type could have relocation strip flag
2390 # @retval False No way to have it
2393 def __FileCouldHaveRelocFlag (self
, FileType
):
2394 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2399 ## __SectionCouldHaveRelocFlag() method
2401 # Check whether reloc strip flag can be set for a section type.
2403 # @param self The object pointer
2404 # @param SectionType The section type to check with
2405 # @retval True This type could have relocation strip flag
2406 # @retval False No way to have it
2409 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2410 if SectionType
in ('TE', 'PE32'):
2415 ## __GetFilePart() method
2417 # Get components for FILE statement
2419 # @param self The object pointer
2420 # @param FfsFileObj for whom component is got
2421 # @param MacroDict dictionary used to replace macro
2423 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2425 self
.__GetFileOpts
( FfsFileObj
)
2427 if not self
.__IsToken
("{"):
2428 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2429 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2430 # if self.__Token == 'RELOCS_STRIPPED':
2431 # FfsFileObj.KeepReloc = False
2433 # FfsFileObj.KeepReloc = True
2435 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2437 # if not self.__IsToken("{"):
2438 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2440 if not self
.__GetNextToken
():
2441 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2443 if self
.__Token
== "FV":
2444 if not self
.__IsToken
( "="):
2445 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2446 if not self
.__GetNextToken
():
2447 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2448 FfsFileObj
.FvName
= self
.__Token
2450 elif self
.__Token
== "FD":
2451 if not self
.__IsToken
( "="):
2452 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2453 if not self
.__GetNextToken
():
2454 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2455 FfsFileObj
.FdName
= self
.__Token
2457 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2459 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2461 FfsFileObj
.FileName
= self
.__Token
2462 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2464 # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase.
2466 if not GlobalData
.gAutoGenPhase
:
2467 #do case sensitive check for file path
2468 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2470 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2472 if not InputMacroDict
["OUTPUT_DIRECTORY"] in FfsFileObj
.FileName
:
2473 #do case sensitive check for file path
2474 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2476 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2478 if not self
.__IsToken
( "}"):
2479 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2481 ## __GetFileOpts() method
2483 # Get options for FILE statement
2485 # @param self The object pointer
2486 # @param FfsFileObj for whom options is got
2488 def __GetFileOpts(self
, FfsFileObj
):
2490 if self
.__GetNextToken
():
2491 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2492 if Pattern
.match(self
.__Token
):
2493 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2494 if self
.__IsToken
(","):
2495 while self
.__GetNextToken
():
2496 if not Pattern
.match(self
.__Token
):
2497 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2498 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2500 if not self
.__IsToken
(","):
2506 if self
.__IsKeyword
( "FIXED", True):
2507 FfsFileObj
.Fixed
= True
2509 if self
.__IsKeyword
( "CHECKSUM", True):
2510 FfsFileObj
.CheckSum
= True
2512 if self
.__GetAlignment
():
2513 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2514 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2515 #For FFS, Auto is default option same to ""
2516 if not self
.__Token
== "Auto":
2517 FfsFileObj
.Alignment
= self
.__Token
2519 ## __GetAlignment() method
2521 # Return the alignment value
2523 # @param self The object pointer
2524 # @retval True Successfully find alignment
2525 # @retval False Not able to find alignment
2527 def __GetAlignment(self
):
2528 if self
.__IsKeyword
( "Align", True):
2529 if not self
.__IsToken
( "="):
2530 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2532 if not self
.__GetNextToken
():
2533 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2538 ## __GetFilePart() method
2540 # Get section data for FILE statement
2542 # @param self The object pointer
2543 # @param FfsFileObj for whom section is got
2544 # @param MacroDict dictionary used to replace macro
2546 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2548 Dict
.update(MacroDict
)
2550 self
.__GetDefineStatements
(FfsFileObj
)
2552 Dict
.update(FfsFileObj
.DefineVarDict
)
2553 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2554 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2557 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2558 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2559 if not IsLeafSection
and not IsEncapSection
:
2562 ## __GetLeafSection() method
2564 # Get leaf section for Obj
2566 # @param self The object pointer
2567 # @param Obj for whom leaf section is got
2568 # @param MacroDict dictionary used to replace macro
2569 # @retval True Successfully find section statement
2570 # @retval False Not able to find section statement
2572 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2574 OldPos
= self
.GetFileBufferPos()
2576 if not self
.__IsKeyword
( "SECTION"):
2577 if len(Obj
.SectionList
) == 0:
2578 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2583 if self
.__GetAlignment
():
2584 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2585 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2586 AlignValue
= self
.__Token
2589 if self
.__IsKeyword
( "BUILD_NUM"):
2590 if not self
.__IsToken
( "="):
2591 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2593 if not self
.__GetNextToken
():
2594 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2596 BuildNum
= self
.__Token
2598 if self
.__IsKeyword
( "VERSION"):
2599 if AlignValue
== 'Auto':
2600 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2601 if not self
.__IsToken
( "="):
2602 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2603 if not self
.__GetNextToken
():
2604 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2605 VerSectionObj
= VerSection
.VerSection()
2606 VerSectionObj
.Alignment
= AlignValue
2607 VerSectionObj
.BuildNum
= BuildNum
2608 if self
.__GetStringData
():
2609 VerSectionObj
.StringData
= self
.__Token
2611 VerSectionObj
.FileName
= self
.__Token
2612 Obj
.SectionList
.append(VerSectionObj
)
2614 elif self
.__IsKeyword
( "UI"):
2615 if AlignValue
== 'Auto':
2616 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2617 if not self
.__IsToken
( "="):
2618 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2619 if not self
.__GetNextToken
():
2620 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2621 UiSectionObj
= UiSection
.UiSection()
2622 UiSectionObj
.Alignment
= AlignValue
2623 if self
.__GetStringData
():
2624 UiSectionObj
.StringData
= self
.__Token
2626 UiSectionObj
.FileName
= self
.__Token
2627 Obj
.SectionList
.append(UiSectionObj
)
2629 elif self
.__IsKeyword
( "FV_IMAGE"):
2630 if AlignValue
== 'Auto':
2631 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2632 if not self
.__IsToken
( "="):
2633 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2634 if not self
.__GetNextToken
():
2635 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2637 FvName
= self
.__Token
2640 if self
.__IsToken
( "{"):
2642 FvObj
.UiFvName
= FvName
.upper()
2643 self
.__GetDefineStatements
(FvObj
)
2644 MacroDict
.update(FvObj
.DefineVarDict
)
2645 self
.__GetBlockStatement
(FvObj
)
2646 self
.__GetSetStatements
(FvObj
)
2647 self
.__GetFvAlignment
(FvObj
)
2648 self
.__GetFvAttributes
(FvObj
)
2649 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2650 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2653 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2654 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2655 if not IsInf
and not IsFile
:
2658 if not self
.__IsToken
( "}"):
2659 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2661 FvImageSectionObj
= FvImageSection
.FvImageSection()
2662 FvImageSectionObj
.Alignment
= AlignValue
2664 FvImageSectionObj
.Fv
= FvObj
2665 FvImageSectionObj
.FvName
= None
2667 FvImageSectionObj
.FvName
= FvName
.upper()
2668 FvImageSectionObj
.FvFileName
= FvName
2670 Obj
.SectionList
.append(FvImageSectionObj
)
2672 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2673 if AlignValue
== 'Auto':
2674 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2675 DepexSectionObj
= DepexSection
.DepexSection()
2676 DepexSectionObj
.Alignment
= AlignValue
2677 DepexSectionObj
.DepexType
= self
.__Token
2679 if not self
.__IsToken
( "="):
2680 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2681 if not self
.__IsToken
( "{"):
2682 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2683 if not self
.__SkipToToken
( "}"):
2684 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2686 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2687 Obj
.SectionList
.append(DepexSectionObj
)
2690 if not self
.__GetNextWord
():
2691 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2693 # Encapsulation section appear, UndoToken and return
2694 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2695 self
.SetFileBufferPos(OldPos
)
2698 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2699 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2700 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2701 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2702 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2705 DataSectionObj
= DataSection
.DataSection()
2706 DataSectionObj
.Alignment
= AlignValue
2707 DataSectionObj
.SecType
= self
.__Token
2709 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2710 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2711 if self
.__Token
== 'RELOCS_STRIPPED':
2712 DataSectionObj
.KeepReloc
= False
2714 DataSectionObj
.KeepReloc
= True
2716 raise Warning("File type %s, section type %s, could not have reloc strip flag%d" % (Obj
.FvFileType
, DataSectionObj
.SecType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2718 if self
.__IsToken
("="):
2719 if not self
.__GetNextToken
():
2720 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2721 DataSectionObj
.SectFileName
= self
.__Token
2722 if DataSectionObj
.SectFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2723 #do case sensitive check for file path
2724 ErrorCode
, ErrorInfo
= PathClass(NormPath(DataSectionObj
.SectFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2726 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2728 if not self
.__GetCglSection
(DataSectionObj
):
2731 Obj
.SectionList
.append(DataSectionObj
)
2735 ## __GetCglSection() method
2737 # Get compressed or GUIDed section for Obj
2739 # @param self The object pointer
2740 # @param Obj for whom leaf section is got
2741 # @param AlignValue alignment value for complex section
2742 # @retval True Successfully find section statement
2743 # @retval False Not able to find section statement
2745 def __GetCglSection(self
, Obj
, AlignValue
= None):
2747 if self
.__IsKeyword
( "COMPRESS"):
2749 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2752 if not self
.__IsToken
("{"):
2753 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2755 CompressSectionObj
= CompressSection
.CompressSection()
2756 CompressSectionObj
.Alignment
= AlignValue
2757 CompressSectionObj
.CompType
= type
2758 # Recursive sections...
2760 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2761 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2762 if not IsLeafSection
and not IsEncapSection
:
2766 if not self
.__IsToken
( "}"):
2767 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2768 Obj
.SectionList
.append(CompressSectionObj
)
2771 # raise Warning("Compress type not known")
2775 elif self
.__IsKeyword
( "GUIDED"):
2777 if self
.__GetNextGuid
():
2778 GuidValue
= self
.__Token
2780 AttribDict
= self
.__GetGuidAttrib
()
2781 if not self
.__IsToken
("{"):
2782 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2783 GuidSectionObj
= GuidSection
.GuidSection()
2784 GuidSectionObj
.Alignment
= AlignValue
2785 GuidSectionObj
.NameGuid
= GuidValue
2786 GuidSectionObj
.SectionType
= "GUIDED"
2787 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2788 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2789 # Recursive sections...
2791 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2792 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2793 if not IsLeafSection
and not IsEncapSection
:
2796 if not self
.__IsToken
( "}"):
2797 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2798 Obj
.SectionList
.append(GuidSectionObj
)
2804 ## __GetGuidAttri() method
2806 # Get attributes for GUID section
2808 # @param self The object pointer
2809 # @retval AttribDict Dictionary of key-value pair of section attributes
2811 def __GetGuidAttrib(self
):
2814 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
2815 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
2816 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2817 AttribKey
= self
.__Token
2819 if not self
.__IsToken
("="):
2820 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2822 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2823 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2824 AttribDict
[AttribKey
] = self
.__Token
2826 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2827 AttribKey
= self
.__Token
2829 if not self
.__IsToken
("="):
2830 raise Warning("expected '='")
2832 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2833 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2834 AttribDict
[AttribKey
] = self
.__Token
2838 ## __GetEncapsulationSec() method
2840 # Get encapsulation section for FILE
2842 # @param self The object pointer
2843 # @param FfsFile for whom section is got
2844 # @retval True Successfully find section statement
2845 # @retval False Not able to find section statement
2847 def __GetEncapsulationSec(self
, FfsFileObj
):
2849 OldPos
= self
.GetFileBufferPos()
2850 if not self
.__IsKeyword
( "SECTION"):
2851 if len(FfsFileObj
.SectionList
) == 0:
2852 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2857 if self
.__GetAlignment
():
2858 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2859 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2860 AlignValue
= self
.__Token
2862 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2863 self
.SetFileBufferPos(OldPos
)
2868 ## __GetCapsule() method
2870 # Get capsule section contents and store its data into capsule list of self.Profile
2872 # @param self The object pointer
2873 # @retval True Successfully find a capsule
2874 # @retval False Not able to find a capsule
2876 def __GetCapsule(self
):
2878 if not self
.__GetNextToken
():
2881 S
= self
.__Token
.upper()
2882 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2883 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2884 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2889 if not self
.__IsToken
("[CAPSULE.", True):
2890 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2891 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2892 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2893 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2895 CapsuleObj
= Capsule
.Capsule()
2897 CapsuleName
= self
.__GetUiName
()
2899 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2901 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2903 if not self
.__IsToken
( "]"):
2904 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2906 if self
.__IsKeyword
("CREATE_FILE"):
2907 if not self
.__IsToken
( "="):
2908 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2910 if not self
.__GetNextToken
():
2911 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2913 CapsuleObj
.CreateFile
= self
.__Token
2915 self
.__GetCapsuleStatements
(CapsuleObj
)
2916 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
2919 ## __GetCapsuleStatements() method
2921 # Get statements for capsule
2923 # @param self The object pointer
2924 # @param Obj for whom statements are got
2926 def __GetCapsuleStatements(self
, Obj
):
2927 self
.__GetCapsuleTokens
(Obj
)
2928 self
.__GetDefineStatements
(Obj
)
2929 self
.__GetSetStatements
(Obj
)
2930 self
.__GetCapsuleData
(Obj
)
2932 ## __GetCapsuleTokens() method
2934 # Get token statements for capsule
2936 # @param self The object pointer
2937 # @param Obj for whom token statements are got
2939 def __GetCapsuleTokens(self
, Obj
):
2940 if not self
.__GetNextToken
():
2942 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):
2943 Name
= self
.__Token
.strip()
2944 if not self
.__IsToken
("="):
2945 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2946 if not self
.__GetNextToken
():
2947 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2948 if Name
== 'CAPSULE_FLAGS':
2949 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2950 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2951 Value
= self
.__Token
.strip()
2952 while self
.__IsToken
(","):
2954 if not self
.__GetNextToken
():
2955 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2956 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2957 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2958 Value
+= self
.__Token
.strip()
2960 Value
= self
.__Token
.strip()
2961 Obj
.TokensDict
[Name
] = Value
2962 if not self
.__GetNextToken
():
2966 ## __GetCapsuleData() method
2968 # Get capsule data for capsule
2970 # @param self The object pointer
2971 # @param Obj for whom capsule data are got
2973 def __GetCapsuleData(self
, Obj
):
2976 IsInf
= self
.__GetInfStatement
(Obj
, True)
2977 IsFile
= self
.__GetFileStatement
(Obj
, True)
2978 IsFv
= self
.__GetFvStatement
(Obj
)
2979 IsFd
= self
.__GetFdStatement
(Obj
)
2980 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
2981 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
):
2984 ## __GetFvStatement() method
2986 # Get FV for capsule
2988 # @param self The object pointer
2989 # @param CapsuleObj for whom FV is got
2990 # @retval True Successfully find a FV statement
2991 # @retval False Not able to find a FV statement
2993 def __GetFvStatement(self
, CapsuleObj
):
2995 if not self
.__IsKeyword
("FV"):
2998 if not self
.__IsToken
("="):
2999 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3001 if not self
.__GetNextToken
():
3002 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3004 CapsuleFv
= CapsuleData
.CapsuleFv()
3005 CapsuleFv
.FvName
= self
.__Token
3006 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3009 ## __GetFdStatement() method
3011 # Get FD for capsule
3013 # @param self The object pointer
3014 # @param CapsuleObj for whom FD is got
3015 # @retval True Successfully find a FD statement
3016 # @retval False Not able to find a FD statement
3018 def __GetFdStatement(self
, CapsuleObj
):
3020 if not self
.__IsKeyword
("FD"):
3023 if not self
.__IsToken
("="):
3024 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3026 if not self
.__GetNextToken
():
3027 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3029 CapsuleFd
= CapsuleData
.CapsuleFd()
3030 CapsuleFd
.FdName
= self
.__Token
3031 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3034 ## __GetAnyFileStatement() method
3036 # Get AnyFile for capsule
3038 # @param self The object pointer
3039 # @param CapsuleObj for whom AnyFile is got
3040 # @retval True Successfully find a Anyfile statement
3041 # @retval False Not able to find a AnyFile statement
3043 def __GetAnyFileStatement(self
, CapsuleObj
):
3045 if not self
.__IsKeyword
("FILE"):
3048 if not self
.__IsKeyword
("DATA"):
3052 if not self
.__IsToken
("="):
3053 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3055 if not self
.__GetNextToken
():
3056 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3058 AnyFileName
= self
.__Token
3059 AnyFileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AnyFileName
)
3060 if not os
.path
.exists(AnyFileName
):
3061 raise Warning("File %s not exists"%AnyFileName
, self
.FileName
, self
.CurrentLineNumber
)
3063 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3064 CapsuleAnyFile
.FileName
= AnyFileName
3065 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3068 ## __GetRule() method
3070 # Get Rule section contents and store its data into rule list of self.Profile
3072 # @param self The object pointer
3073 # @retval True Successfully find a Rule
3074 # @retval False Not able to find a Rule
3076 def __GetRule(self
):
3078 if not self
.__GetNextToken
():
3081 S
= self
.__Token
.upper()
3082 if S
.startswith("[") and not S
.startswith("[RULE."):
3083 if not S
.startswith("[OPTIONROM."):
3084 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3088 if not self
.__IsToken
("[Rule.", True):
3089 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3090 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3091 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3092 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3094 if not self
.__SkipToToken
("."):
3095 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3097 Arch
= self
.__SkippedChars
.rstrip(".")
3098 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
3099 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3101 ModuleType
= self
.__GetModuleType
()
3104 if self
.__IsToken
("."):
3105 if not self
.__GetNextWord
():
3106 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3107 TemplateName
= self
.__Token
3109 if not self
.__IsToken
( "]"):
3110 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3112 RuleObj
= self
.__GetRuleFileStatements
()
3113 RuleObj
.Arch
= Arch
.upper()
3114 RuleObj
.ModuleType
= ModuleType
3115 RuleObj
.TemplateName
= TemplateName
3116 if TemplateName
== '' :
3117 self
.Profile
.RuleDict
['RULE' + \
3121 ModuleType
.upper() ] = RuleObj
3123 self
.Profile
.RuleDict
['RULE' + \
3127 ModuleType
.upper() + \
3129 TemplateName
.upper() ] = RuleObj
3130 # self.Profile.RuleList.append(rule)
3133 ## __GetModuleType() method
3135 # Return the module type
3137 # @param self The object pointer
3138 # @retval string module type
3140 def __GetModuleType(self
):
3142 if not self
.__GetNextWord
():
3143 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3144 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3145 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3146 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3147 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3148 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3149 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3150 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3153 ## __GetFileExtension() method
3155 # Return the file extension
3157 # @param self The object pointer
3158 # @retval string file name extension
3160 def __GetFileExtension(self
):
3161 if not self
.__IsToken
("."):
3162 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3165 if self
.__GetNextToken
():
3166 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3167 if Pattern
.match(self
.__Token
):
3171 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3174 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3176 ## __GetRuleFileStatement() method
3180 # @param self The object pointer
3181 # @retval Rule Rule object
3183 def __GetRuleFileStatements(self
):
3185 if not self
.__IsKeyword
("FILE"):
3186 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3188 if not self
.__GetNextWord
():
3189 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3191 Type
= self
.__Token
.strip().upper()
3192 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3193 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3194 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3196 if not self
.__IsToken
("="):
3197 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3199 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3200 if not self
.__GetNextWord
():
3201 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3202 if self
.__Token
== 'PCD':
3203 if not self
.__IsToken
( "("):
3204 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3205 PcdPair
= self
.__GetNextPcdName
()
3206 if not self
.__IsToken
( ")"):
3207 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3208 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3210 NameGuid
= self
.__Token
3213 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3214 if self
.__FileCouldHaveRelocFlag
(Type
):
3215 if self
.__Token
== 'RELOCS_STRIPPED':
3220 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3223 if self
.__GetNextToken
():
3224 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3225 if Pattern
.match(self
.__Token
):
3226 KeyStringList
.append(self
.__Token
)
3227 if self
.__IsToken
(","):
3228 while self
.__GetNextToken
():
3229 if not Pattern
.match(self
.__Token
):
3230 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3231 KeyStringList
.append(self
.__Token
)
3233 if not self
.__IsToken
(","):
3241 if self
.__IsKeyword
("Fixed", True):
3245 if self
.__IsKeyword
("CheckSum", True):
3249 if self
.__GetAlignment
():
3250 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3251 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3252 #For FFS, Auto is default option same to ""
3253 if not self
.__Token
== "Auto":
3254 AlignValue
= self
.__Token
3256 if self
.__IsToken
("{"):
3257 # Complex file rule expected
3258 Rule
= RuleComplexFile
.RuleComplexFile()
3259 Rule
.FvFileType
= Type
3260 Rule
.NameGuid
= NameGuid
3261 Rule
.Alignment
= AlignValue
3262 Rule
.CheckSum
= CheckSum
3264 Rule
.KeyStringList
= KeyStringList
3265 if KeepReloc
!= None:
3266 Rule
.KeepReloc
= KeepReloc
3269 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3270 IsLeaf
= self
.__GetEfiSection
(Rule
)
3271 if not IsEncapsulate
and not IsLeaf
:
3274 if not self
.__IsToken
("}"):
3275 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3280 # Simple file rule expected
3281 if not self
.__GetNextWord
():
3282 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3284 SectionName
= self
.__Token
3286 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3287 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3288 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3291 if self
.__IsKeyword
("Fixed", True):
3294 if self
.__IsKeyword
("CheckSum", True):
3298 if self
.__GetAlignment
():
3299 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3300 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3301 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3302 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3303 SectAlignment
= self
.__Token
3306 if self
.__IsToken
('|'):
3307 Ext
= self
.__GetFileExtension
()
3308 elif not self
.__GetNextToken
():
3309 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3311 Rule
= RuleSimpleFile
.RuleSimpleFile()
3312 Rule
.SectionType
= SectionName
3313 Rule
.FvFileType
= Type
3314 Rule
.NameGuid
= NameGuid
3315 Rule
.Alignment
= AlignValue
3316 Rule
.SectAlignment
= SectAlignment
3317 Rule
.CheckSum
= CheckSum
3319 Rule
.KeyStringList
= KeyStringList
3320 if KeepReloc
!= None:
3321 Rule
.KeepReloc
= KeepReloc
3322 Rule
.FileExtension
= Ext
3323 Rule
.FileName
= self
.__Token
3326 ## __GetEfiSection() method
3328 # Get section list for Rule
3330 # @param self The object pointer
3331 # @param Obj for whom section is got
3332 # @retval True Successfully find section statement
3333 # @retval False Not able to find section statement
3335 def __GetEfiSection(self
, Obj
):
3337 OldPos
= self
.GetFileBufferPos()
3338 if not self
.__GetNextWord
():
3340 SectionName
= self
.__Token
3342 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3343 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3347 if SectionName
== "FV_IMAGE":
3348 FvImageSectionObj
= FvImageSection
.FvImageSection()
3349 if self
.__IsKeyword
("FV_IMAGE"):
3351 if self
.__IsToken
( "{"):
3353 self
.__GetDefineStatements
(FvObj
)
3354 self
.__GetBlockStatement
(FvObj
)
3355 self
.__GetSetStatements
(FvObj
)
3356 self
.__GetFvAlignment
(FvObj
)
3357 self
.__GetFvAttributes
(FvObj
)
3358 self
.__GetAprioriSection
(FvObj
)
3359 self
.__GetAprioriSection
(FvObj
)
3362 IsInf
= self
.__GetInfStatement
(FvObj
)
3363 IsFile
= self
.__GetFileStatement
(FvObj
)
3364 if not IsInf
and not IsFile
:
3367 if not self
.__IsToken
( "}"):
3368 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3369 FvImageSectionObj
.Fv
= FvObj
3370 FvImageSectionObj
.FvName
= None
3373 if not self
.__IsKeyword
("FV"):
3374 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3375 FvImageSectionObj
.FvFileType
= self
.__Token
3377 if self
.__GetAlignment
():
3378 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3379 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3380 FvImageSectionObj
.Alignment
= self
.__Token
3382 if self
.__IsToken
('|'):
3383 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3384 elif self
.__GetNextToken
():
3385 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3386 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3387 FvImageSectionObj
.FvFileName
= self
.__Token
3391 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3393 Obj
.SectionList
.append(FvImageSectionObj
)
3396 EfiSectionObj
= EfiSection
.EfiSection()
3397 EfiSectionObj
.SectionType
= SectionName
3399 if not self
.__GetNextToken
():
3400 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3402 if self
.__Token
== "STRING":
3403 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3404 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3406 if not self
.__IsToken
('='):
3407 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3409 if not self
.__GetNextToken
():
3410 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3412 if self
.__GetStringData
():
3413 EfiSectionObj
.StringData
= self
.__Token
3415 if self
.__IsKeyword
("BUILD_NUM"):
3416 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3417 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3419 if not self
.__IsToken
("="):
3420 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3421 if not self
.__GetNextToken
():
3422 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3423 EfiSectionObj
.BuildNum
= self
.__Token
3426 EfiSectionObj
.FileType
= self
.__Token
3427 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3429 if self
.__IsKeyword
("Optional"):
3430 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3431 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3432 EfiSectionObj
.Optional
= True
3434 if self
.__IsKeyword
("BUILD_NUM"):
3435 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3436 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3438 if not self
.__IsToken
("="):
3439 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3440 if not self
.__GetNextToken
():
3441 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3442 EfiSectionObj
.BuildNum
= self
.__Token
3444 if self
.__GetAlignment
():
3445 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3446 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3447 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3448 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3449 EfiSectionObj
.Alignment
= self
.__Token
3451 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3452 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3453 if self
.__Token
== 'RELOCS_STRIPPED':
3454 EfiSectionObj
.KeepReloc
= False
3456 EfiSectionObj
.KeepReloc
= True
3457 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3458 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3460 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3463 if self
.__IsToken
('|'):
3464 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3465 elif self
.__GetNextToken
():
3466 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3467 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3469 if self
.__Token
.startswith('PCD'):
3471 self
.__GetNextWord
()
3473 if self
.__Token
== 'PCD':
3474 if not self
.__IsToken
( "("):
3475 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3476 PcdPair
= self
.__GetNextPcdName
()
3477 if not self
.__IsToken
( ")"):
3478 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3479 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3481 EfiSectionObj
.FileName
= self
.__Token
3486 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3488 Obj
.SectionList
.append(EfiSectionObj
)
3491 ## __RuleSectionCouldBeOptional() method
3493 # Get whether a section could be optional
3495 # @param self The object pointer
3496 # @param SectionType The section type to check
3497 # @retval True section could be optional
3498 # @retval False section never optional
3500 def __RuleSectionCouldBeOptional(self
, SectionType
):
3501 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3506 ## __RuleSectionCouldHaveBuildNum() method
3508 # Get whether a section could have build number information
3510 # @param self The object pointer
3511 # @param SectionType The section type to check
3512 # @retval True section could have build number information
3513 # @retval False section never have build number information
3515 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3516 if SectionType
in ("VERSION"):
3521 ## __RuleSectionCouldHaveString() method
3523 # Get whether a section could have string
3525 # @param self The object pointer
3526 # @param SectionType The section type to check
3527 # @retval True section could have string
3528 # @retval False section never have string
3530 def __RuleSectionCouldHaveString(self
, SectionType
):
3531 if SectionType
in ("UI", "VERSION"):
3536 ## __CheckRuleSectionFileType() method
3538 # Get whether a section matches a file type
3540 # @param self The object pointer
3541 # @param SectionType The section type to check
3542 # @param FileType The file type to check
3544 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3545 if SectionType
== "COMPAT16":
3546 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3547 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3548 elif SectionType
== "PE32":
3549 if FileType
not in ("PE32", "SEC_PE32"):
3550 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3551 elif SectionType
== "PIC":
3552 if FileType
not in ("PIC", "PIC"):
3553 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3554 elif SectionType
== "TE":
3555 if FileType
not in ("TE", "SEC_TE"):
3556 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3557 elif SectionType
== "RAW":
3558 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3559 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3560 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3561 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3562 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3563 elif SectionType
== "UI":
3564 if FileType
not in ("UI", "SEC_UI"):
3565 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3566 elif SectionType
== "VERSION":
3567 if FileType
not in ("VERSION", "SEC_VERSION"):
3568 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3569 elif SectionType
== "PEI_DEPEX":
3570 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3571 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3572 elif SectionType
== "GUID":
3573 if FileType
not in ("PE32", "SEC_GUID"):
3574 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3576 ## __GetRuleEncapsulationSection() method
3578 # Get encapsulation section for Rule
3580 # @param self The object pointer
3581 # @param Rule for whom section is got
3582 # @retval True Successfully find section statement
3583 # @retval False Not able to find section statement
3585 def __GetRuleEncapsulationSection(self
, Rule
):
3587 if self
.__IsKeyword
( "COMPRESS"):
3589 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3592 if not self
.__IsToken
("{"):
3593 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3595 CompressSectionObj
= CompressSection
.CompressSection()
3597 CompressSectionObj
.CompType
= Type
3598 # Recursive sections...
3600 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3601 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3602 if not IsEncapsulate
and not IsLeaf
:
3605 if not self
.__IsToken
( "}"):
3606 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3607 Rule
.SectionList
.append(CompressSectionObj
)
3611 elif self
.__IsKeyword
( "GUIDED"):
3613 if self
.__GetNextGuid
():
3614 GuidValue
= self
.__Token
3616 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3617 GuidValue
= self
.__Token
3619 AttribDict
= self
.__GetGuidAttrib
()
3621 if not self
.__IsToken
("{"):
3622 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3623 GuidSectionObj
= GuidSection
.GuidSection()
3624 GuidSectionObj
.NameGuid
= GuidValue
3625 GuidSectionObj
.SectionType
= "GUIDED"
3626 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3627 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3631 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3632 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3633 if not IsEncapsulate
and not IsLeaf
:
3636 if not self
.__IsToken
( "}"):
3637 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3638 Rule
.SectionList
.append(GuidSectionObj
)
3644 ## __GetVtf() method
3646 # Get VTF section contents and store its data into VTF list of self.Profile
3648 # @param self The object pointer
3649 # @retval True Successfully find a VTF
3650 # @retval False Not able to find a VTF
3654 if not self
.__GetNextToken
():
3657 S
= self
.__Token
.upper()
3658 if S
.startswith("[") and not S
.startswith("[VTF."):
3659 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3660 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3665 if not self
.__IsToken
("[VTF.", True):
3666 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3667 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3668 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3669 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3671 if not self
.__SkipToToken
("."):
3672 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3674 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3675 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3676 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3678 if not self
.__GetNextWord
():
3679 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3680 Name
= self
.__Token
.upper()
3683 VtfObj
.UiName
= Name
3684 VtfObj
.KeyArch
= Arch
3686 if self
.__IsToken
(","):
3687 if not self
.__GetNextWord
():
3688 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3689 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3690 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3691 VtfObj
.ArchList
= self
.__Token
.upper()
3693 if not self
.__IsToken
( "]"):
3694 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3696 if self
.__IsKeyword
("IA32_RST_BIN"):
3697 if not self
.__IsToken
("="):
3698 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3700 if not self
.__GetNextToken
():
3701 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3703 VtfObj
.ResetBin
= self
.__Token
3704 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3705 #check for file path
3706 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3708 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3710 while self
.__GetComponentStatement
(VtfObj
):
3713 self
.Profile
.VtfList
.append(VtfObj
)
3716 ## __GetComponentStatement() method
3718 # Get components in VTF
3720 # @param self The object pointer
3721 # @param VtfObj for whom component is got
3722 # @retval True Successfully find a component
3723 # @retval False Not able to find a component
3725 def __GetComponentStatement(self
, VtfObj
):
3727 if not self
.__IsKeyword
("COMP_NAME"):
3730 if not self
.__IsToken
("="):
3731 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3733 if not self
.__GetNextWord
():
3734 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3736 CompStatementObj
= ComponentStatement
.ComponentStatement()
3737 CompStatementObj
.CompName
= self
.__Token
3739 if not self
.__IsKeyword
("COMP_LOC"):
3740 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3742 if not self
.__IsToken
("="):
3743 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3745 CompStatementObj
.CompLoc
= ""
3746 if self
.__GetNextWord
():
3747 CompStatementObj
.CompLoc
= self
.__Token
3748 if self
.__IsToken
('|'):
3749 if not self
.__GetNextWord
():
3750 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3752 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3753 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3755 CompStatementObj
.FilePos
= self
.__Token
3757 self
.CurrentLineNumber
+= 1
3758 self
.CurrentOffsetWithinLine
= 0
3760 if not self
.__IsKeyword
("COMP_TYPE"):
3761 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3763 if not self
.__IsToken
("="):
3764 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3766 if not self
.__GetNextToken
():
3767 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3768 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3769 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3770 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3771 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3772 CompStatementObj
.CompType
= self
.__Token
3774 if not self
.__IsKeyword
("COMP_VER"):
3775 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
3777 if not self
.__IsToken
("="):
3778 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3780 if not self
.__GetNextToken
():
3781 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
3783 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
3784 if Pattern
.match(self
.__Token
) == None:
3785 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3786 CompStatementObj
.CompVer
= self
.__Token
3788 if not self
.__IsKeyword
("COMP_CS"):
3789 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3791 if not self
.__IsToken
("="):
3792 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3794 if not self
.__GetNextToken
():
3795 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3796 if self
.__Token
not in ("1", "0"):
3797 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3798 CompStatementObj
.CompCs
= self
.__Token
3801 if not self
.__IsKeyword
("COMP_BIN"):
3802 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3804 if not self
.__IsToken
("="):
3805 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3807 if not self
.__GetNextToken
():
3808 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3810 CompStatementObj
.CompBin
= self
.__Token
3811 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3812 #check for file path
3813 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3815 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3817 if not self
.__IsKeyword
("COMP_SYM"):
3818 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3820 if not self
.__IsToken
("="):
3821 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3823 if not self
.__GetNextToken
():
3824 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3826 CompStatementObj
.CompSym
= self
.__Token
3827 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
3828 #check for file path
3829 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3831 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3833 if not self
.__IsKeyword
("COMP_SIZE"):
3834 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3836 if not self
.__IsToken
("="):
3837 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3839 if self
.__IsToken
("-"):
3840 CompStatementObj
.CompSize
= self
.__Token
3841 elif self
.__GetNextDecimalNumber
():
3842 CompStatementObj
.CompSize
= self
.__Token
3843 elif self
.__GetNextHexNumber
():
3844 CompStatementObj
.CompSize
= self
.__Token
3846 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3848 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3851 ## __GetOptionRom() method
3853 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3855 # @param self The object pointer
3856 # @retval True Successfully find a OptionROM
3857 # @retval False Not able to find a OptionROM
3859 def __GetOptionRom(self
):
3861 if not self
.__GetNextToken
():
3864 S
= self
.__Token
.upper()
3865 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3866 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3869 if not self
.__IsToken
("[OptionRom.", True):
3870 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3872 OptRomName
= self
.__GetUiName
()
3874 if not self
.__IsToken
( "]"):
3875 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3877 OptRomObj
= OptionRom
.OPTIONROM()
3878 OptRomObj
.DriverName
= OptRomName
3879 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3882 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3883 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3884 if not isInf
and not isFile
:
3889 ## __GetOptRomInfStatement() method
3891 # Get INF statements
3893 # @param self The object pointer
3894 # @param Obj for whom inf statement is got
3895 # @retval True Successfully find inf statement
3896 # @retval False Not able to find inf statement
3898 def __GetOptRomInfStatement(self
, Obj
):
3900 if not self
.__IsKeyword
( "INF"):
3903 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3904 self
.__GetInfOptions
( ffsInf
)
3906 if not self
.__GetNextToken
():
3907 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3908 ffsInf
.InfFileName
= self
.__Token
3909 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3910 #check for file path
3911 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3913 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3915 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
3916 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
3919 self
.__GetOptRomOverrides
(ffsInf
)
3921 Obj
.FfsList
.append(ffsInf
)
3924 ## __GetOptRomOverrides() method
3926 # Get overrides for OptROM INF & FILE
3928 # @param self The object pointer
3929 # @param FfsInfObj for whom overrides is got
3931 def __GetOptRomOverrides(self
, Obj
):
3932 if self
.__IsToken
('{'):
3933 Overrides
= OptionRom
.OverrideAttribs()
3935 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
3936 if not self
.__IsToken
( "="):
3937 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3938 if not self
.__GetNextHexNumber
():
3939 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
3940 Overrides
.PciVendorId
= self
.__Token
3943 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
3944 if not self
.__IsToken
( "="):
3945 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3946 if not self
.__GetNextHexNumber
():
3947 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
3948 Overrides
.PciClassCode
= self
.__Token
3951 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
3952 if not self
.__IsToken
( "="):
3953 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3954 if not self
.__GetNextHexNumber
():
3955 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
3957 Overrides
.PciDeviceId
= self
.__Token
3960 if self
.__IsKeyword
( "PCI_REVISION"):
3961 if not self
.__IsToken
( "="):
3962 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3963 if not self
.__GetNextHexNumber
():
3964 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
3965 Overrides
.PciRevision
= self
.__Token
3968 if self
.__IsKeyword
( "PCI_COMPRESS"):
3969 if not self
.__IsToken
( "="):
3970 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3971 if not self
.__GetNextToken
():
3972 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
3973 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
3976 if self
.__IsToken
( "}"):
3979 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
3981 Obj
.OverrideAttribs
= Overrides
3983 ## __GetOptRomFileStatement() method
3985 # Get FILE statements
3987 # @param self The object pointer
3988 # @param Obj for whom FILE statement is got
3989 # @retval True Successfully find FILE statement
3990 # @retval False Not able to find FILE statement
3992 def __GetOptRomFileStatement(self
, Obj
):
3994 if not self
.__IsKeyword
( "FILE"):
3997 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
3999 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4000 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4001 FfsFileObj
.FileType
= self
.__Token
4003 if not self
.__GetNextToken
():
4004 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4005 FfsFileObj
.FileName
= self
.__Token
4006 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4007 #check for file path
4008 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4010 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4012 if FfsFileObj
.FileType
== 'EFI':
4013 self
.__GetOptRomOverrides
(FfsFileObj
)
4015 Obj
.FfsList
.append(FfsFileObj
)
4019 ## __GetCapInFd() method
4021 # Get Cap list contained in FD
4023 # @param self The object pointer
4024 # @param FdName FD name
4025 # @retval CapList List of Capsule in FD
4027 def __GetCapInFd (self
, FdName
):
4030 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4031 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4032 for elementRegion
in FdObj
.RegionList
:
4033 if elementRegion
.RegionType
== 'CAPSULE':
4034 for elementRegionData
in elementRegion
.RegionDataList
:
4035 if elementRegionData
.endswith(".cap"):
4037 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
4038 CapList
.append(elementRegionData
.upper())
4041 ## __GetReferencedFdCapTuple() method
4043 # Get FV and FD list referenced by a capsule image
4045 # @param self The object pointer
4046 # @param CapObj Capsule section to be searched
4047 # @param RefFdList referenced FD by section
4048 # @param RefFvList referenced FV by section
4050 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4052 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4053 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4054 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4055 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4056 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4057 elif CapsuleDataObj
.Ffs
!= None:
4058 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4059 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4060 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4061 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4062 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4064 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4066 ## __GetFvInFd() method
4068 # Get FV list contained in FD
4070 # @param self The object pointer
4071 # @param FdName FD name
4072 # @retval FvList list of FV in FD
4074 def __GetFvInFd (self
, FdName
):
4077 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4078 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4079 for elementRegion
in FdObj
.RegionList
:
4080 if elementRegion
.RegionType
== 'FV':
4081 for elementRegionData
in elementRegion
.RegionDataList
:
4082 if elementRegionData
.endswith(".fv"):
4084 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4085 FvList
.append(elementRegionData
.upper())
4088 ## __GetReferencedFdFvTuple() method
4090 # Get FD and FV list referenced by a FFS file
4092 # @param self The object pointer
4093 # @param FfsFile contains sections to be searched
4094 # @param RefFdList referenced FD by section
4095 # @param RefFvList referenced FV by section
4097 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4099 for FfsObj
in FvObj
.FfsList
:
4100 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4101 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4102 RefFvList
.append(FfsObj
.FvName
.upper())
4103 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4104 RefFdList
.append(FfsObj
.FdName
.upper())
4106 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4108 ## __GetReferencedFdFvTupleFromSection() method
4110 # Get FD and FV list referenced by a FFS section
4112 # @param self The object pointer
4113 # @param FfsFile contains sections to be searched
4114 # @param FdList referenced FD by section
4115 # @param FvList referenced FV by section
4117 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4120 SectionStack
.extend(FfsFile
.SectionList
)
4121 while SectionStack
!= []:
4122 SectionObj
= SectionStack
.pop()
4123 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4124 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4125 FvList
.append(SectionObj
.FvName
.upper())
4126 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4127 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4128 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4130 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4131 SectionStack
.extend(SectionObj
.SectionList
)
4133 ## CycleReferenceCheck() method
4135 # Check whether cycle reference exists in FDF
4137 # @param self The object pointer
4138 # @retval True cycle reference exists
4139 # @retval False Not exists cycle reference
4141 def CycleReferenceCheck(self
):
4143 # Check the cycle between FV and FD image
4145 MaxLength
= len (self
.Profile
.FvDict
)
4146 for FvName
in self
.Profile
.FvDict
.keys():
4147 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4149 RefFvStack
.append(FvName
)
4153 while RefFvStack
!= [] and Index
< MaxLength
:
4155 FvNameFromStack
= RefFvStack
.pop()
4156 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4157 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4163 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4165 for RefFdName
in RefFdList
:
4166 if RefFdName
in FdAnalyzedList
:
4169 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4170 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4171 if FvInFdList
!= []:
4172 for FvNameInFd
in FvInFdList
:
4173 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4174 if FvNameInFd
not in RefFvStack
:
4175 RefFvStack
.append(FvNameInFd
)
4177 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4178 EdkLogger
.info(LogStr
)
4180 FdAnalyzedList
.append(RefFdName
)
4182 for RefFvName
in RefFvList
:
4183 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4184 if RefFvName
not in RefFvStack
:
4185 RefFvStack
.append(RefFvName
)
4187 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4188 EdkLogger
.info(LogStr
)
4192 # Check the cycle between Capsule and FD image
4194 MaxLength
= len (self
.Profile
.CapsuleDict
)
4195 for CapName
in self
.Profile
.CapsuleDict
.keys():
4197 # Capsule image to be checked.
4199 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4201 RefCapStack
.append(CapName
)
4206 while RefCapStack
!= [] and Index
< MaxLength
:
4208 CapNameFromStack
= RefCapStack
.pop()
4209 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4210 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4216 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4220 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4221 for RefFdName
in RefFdList
:
4222 if RefFdName
in FdAnalyzedList
:
4225 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4226 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4227 if CapInFdList
!= []:
4228 for CapNameInFd
in CapInFdList
:
4229 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4230 if CapNameInFd
not in RefCapStack
:
4231 RefCapStack
.append(CapNameInFd
)
4233 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4234 EdkLogger
.info(LogStr
)
4237 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4238 if FvInFdList
!= []:
4239 for FvNameInFd
in FvInFdList
:
4240 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4241 if FvNameInFd
not in RefFvList
:
4242 RefFvList
.append(FvNameInFd
)
4244 FdAnalyzedList
.append(RefFdName
)
4246 # the number of the parsed FV and FD image
4248 FvListLength
= len (RefFvList
)
4249 FdListLength
= len (RefFdList
)
4250 for RefFvName
in RefFvList
:
4251 if RefFvName
in FvAnalyzedList
:
4253 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4254 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4255 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4258 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4259 FvAnalyzedList
.append(RefFvName
)
4263 if __name__
== "__main__":
4266 test_file
= sys
.argv
[1]
4267 except IndexError, v
:
4268 print "Usage: %s filename" % sys
.argv
[0]
4271 parser
= FdfParser(test_file
)
4274 parser
.CycleReferenceCheck()