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
52 ##define T_CHAR_SPACE ' '
53 ##define T_CHAR_NULL '\0'
54 ##define T_CHAR_CR '\r'
55 ##define T_CHAR_TAB '\t'
56 ##define T_CHAR_LF '\n'
57 ##define T_CHAR_SLASH '/'
58 ##define T_CHAR_BACKSLASH '\\'
59 ##define T_CHAR_DOUBLE_QUOTE '\"'
60 ##define T_CHAR_SINGLE_QUOTE '\''
61 ##define T_CHAR_STAR '*'
62 ##define T_CHAR_HASH '#'
64 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
65 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
66 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
68 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
71 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
73 # All Macro values when parsing file, not replace existing Macro
76 def GetRealFileLine (File
, Line
):
79 for Profile
in IncludeFileList
:
80 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
81 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
82 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
83 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
85 return (File
, Line
- InsertedLines
)
87 ## The exception class that used to report error messages when parsing FDF
89 # Currently the "ToolName" is set to be "FDF Parser".
91 class Warning (Exception):
94 # @param self The object pointer
95 # @param Str The message to record
96 # @param File The FDF name
97 # @param Line The Line number that error occurs
99 def __init__(self
, Str
, File
= None, Line
= None):
101 FileLineTuple
= GetRealFileLine(File
, Line
)
102 self
.FileName
= FileLineTuple
[0]
103 self
.LineNumber
= FileLineTuple
[1]
105 self
.ToolName
= 'FdfParser'
110 ## The MACRO class that used to record macro value data when parsing include file
116 # @param self The object pointer
117 # @param FileName The file that to be parsed
119 def __init__(self
, FileName
, Line
):
120 self
.FileName
= FileName
121 self
.DefinedAtLine
= Line
122 self
.MacroName
= None
123 self
.MacroValue
= None
125 ## The Include file content class that used to record file data when parsing include file
127 # May raise Exception when opening file.
129 class IncludeFileProfile
:
132 # @param self The object pointer
133 # @param FileName The file that to be parsed
135 def __init__(self
, FileName
):
136 self
.FileName
= FileName
137 self
.FileLinesList
= []
139 fsock
= open(FileName
, "rb", 0)
141 self
.FileLinesList
= fsock
.readlines()
146 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
148 self
.InsertStartLineNumber
= None
149 self
.InsertAdjust
= 0
151 ## The FDF content class that used to record file data when parsing FDF
153 # May raise Exception when opening file.
158 # @param self The object pointer
159 # @param FileName The file that to be parsed
161 def __init__(self
, FileName
):
162 self
.FileLinesList
= []
164 fsock
= open(FileName
, "rb", 0)
166 self
.FileLinesList
= fsock
.readlines()
171 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
178 self
.FdNameNotSet
= False
180 self
.CapsuleDict
= {}
185 ## The syntax parser for FDF
187 # PreprocessFile method should be called prior to ParseFile
188 # CycleReferenceCheck method can detect cycles in FDF contents
190 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
191 # Get*** procedures mean these procedures will make judgement on current token only.
196 # @param self The object pointer
197 # @param FileName The file that to be parsed
199 def __init__(self
, FileName
):
200 self
.Profile
= FileProfile(FileName
)
201 self
.FileName
= FileName
202 self
.CurrentLineNumber
= 1
203 self
.CurrentOffsetWithinLine
= 0
204 self
.CurrentFdName
= None
205 self
.CurrentFvName
= None
207 self
.__SkippedChars
= ""
209 self
.__WipeOffArea
= []
210 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
211 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
213 ## __IsWhiteSpace() method
215 # Whether char at current FileBufferPos is whitespace
217 # @param self The object pointer
218 # @param Char The char to test
219 # @retval True The char is a kind of white space
220 # @retval False The char is NOT a kind of white space
222 def __IsWhiteSpace(self
, Char
):
223 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
228 ## __SkipWhiteSpace() method
230 # Skip white spaces from current char, return number of chars skipped
232 # @param self The object pointer
233 # @retval Count The number of chars skipped
235 def __SkipWhiteSpace(self
):
237 while not self
.__EndOfFile
():
239 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
240 self
.__SkippedChars
+= str(self
.__CurrentChar
())
247 ## __EndOfFile() method
249 # Judge current buffer pos is at file end
251 # @param self The object pointer
252 # @retval True Current File buffer position is at file end
253 # @retval False Current File buffer position is NOT at file end
255 def __EndOfFile(self
):
256 NumberOfLines
= len(self
.Profile
.FileLinesList
)
257 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
258 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
260 elif self
.CurrentLineNumber
> NumberOfLines
:
265 ## __EndOfLine() method
267 # Judge current buffer pos is at line end
269 # @param self The object pointer
270 # @retval True Current File buffer position is at line end
271 # @retval False Current File buffer position is NOT at line end
273 def __EndOfLine(self
):
274 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
276 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
277 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
284 # Reset file data buffer to the initial state
286 # @param self The object pointer
289 self
.CurrentLineNumber
= 1
290 self
.CurrentOffsetWithinLine
= 0
292 ## __UndoOneChar() method
294 # Go back one char in the file buffer
296 # @param self The object pointer
297 # @retval True Successfully go back one char
298 # @retval False Not able to go back one char as file beginning reached
300 def __UndoOneChar(self
):
302 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
304 elif self
.CurrentOffsetWithinLine
== 0:
305 self
.CurrentLineNumber
-= 1
306 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
308 self
.CurrentOffsetWithinLine
-= 1
311 ## __GetOneChar() method
313 # Move forward one char in the file buffer
315 # @param self The object pointer
317 def __GetOneChar(self
):
318 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
319 self
.CurrentLineNumber
+= 1
320 self
.CurrentOffsetWithinLine
= 0
322 self
.CurrentOffsetWithinLine
+= 1
324 ## __CurrentChar() method
326 # Get the char pointed to by the file buffer pointer
328 # @param self The object pointer
329 # @retval Char Current char
331 def __CurrentChar(self
):
332 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
334 ## __NextChar() method
336 # Get the one char pass the char pointed to by the file buffer pointer
338 # @param self The object pointer
339 # @retval Char Next char
341 def __NextChar(self
):
342 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
343 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
345 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
347 ## __SetCurrentCharValue() method
349 # Modify the value of current char
351 # @param self The object pointer
352 # @param Value The new value of current char
354 def __SetCurrentCharValue(self
, Value
):
355 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
357 ## __CurrentLine() method
359 # Get the list that contains current line contents
361 # @param self The object pointer
362 # @retval List current line contents
364 def __CurrentLine(self
):
365 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
367 def __StringToList(self
):
368 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
369 self
.Profile
.FileLinesList
[-1].append(' ')
371 def __ReplaceMacros(self
, Str
, File
, Line
):
373 while Str
.find('$(', MacroEnd
) >= 0:
374 MacroStart
= Str
.find('$(', MacroEnd
)
375 if Str
.find(')', MacroStart
) > 0:
376 MacroEnd
= Str
.find(')', MacroStart
)
377 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
379 if Name
in InputMacroDict
:
380 Value
= InputMacroDict
[Name
]
383 for Profile
in AllMacroList
:
384 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
385 Value
= Profile
.MacroValue
388 Str
= Str
.replace('$(' + Name
+ ')', Value
)
389 MacroEnd
= MacroStart
+ len(Value
)
392 raise Warning("Macro not complete", self
.FileName
, self
.CurrentLineNumber
)
395 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
396 if StartPos
[0] == EndPos
[0]:
398 while Offset
<= EndPos
[1]:
399 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
404 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
405 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
409 while Line
< EndPos
[0]:
411 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
412 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
417 while Offset
<= EndPos
[1]:
418 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
422 def __GetMacroName(self
):
423 if not self
.__GetNextToken
():
424 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
425 MacroName
= self
.__Token
427 if MacroName
.startswith('!'):
429 MacroName
= MacroName
[1:].strip()
431 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
432 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
433 self
.FileName
, self
.CurrentLineNumber
)
434 MacroName
= MacroName
[2:-1]
435 return MacroName
, NotFlag
437 ## PreprocessFile() method
439 # Preprocess file contents, replace comments with spaces.
440 # In the end, rewind the file buffer pointer to the beginning
441 # BUGBUG: No !include statement processing contained in this procedure
442 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
444 # @param self The object pointer
446 def PreprocessFile(self
):
450 DoubleSlashComment
= False
452 # HashComment in quoted string " " is ignored.
455 while not self
.__EndOfFile
():
457 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
458 InString
= not InString
459 # meet new line, then no longer in a comment for // and '#'
460 if self
.__CurrentChar
() == T_CHAR_LF
:
461 self
.CurrentLineNumber
+= 1
462 self
.CurrentOffsetWithinLine
= 0
463 if InComment
and DoubleSlashComment
:
465 DoubleSlashComment
= False
466 if InComment
and HashComment
:
469 # check for */ comment end
470 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
471 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
473 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
476 # set comments to spaces
478 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
480 # check for // comment
481 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
483 DoubleSlashComment
= True
484 # check for '#' comment
485 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
488 # check for /* comment start
489 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
490 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
492 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
498 # restore from ListOfList to ListOfString
499 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
502 ## PreprocessIncludeFile() method
504 # Preprocess file contents, replace !include statements with file contents.
505 # In the end, rewind the file buffer pointer to the beginning
507 # @param self The object pointer
509 def PreprocessIncludeFile(self
):
511 while self
.__GetNextToken
():
513 if self
.__Token
== '!include':
514 IncludeLine
= self
.CurrentLineNumber
515 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
516 if not self
.__GetNextToken
():
517 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
518 IncFileName
= self
.__Token
519 if not os
.path
.isabs(IncFileName
):
520 if IncFileName
.startswith('$(WORKSPACE)'):
521 Str
= IncFileName
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
522 if os
.path
.exists(Str
):
523 if not os
.path
.isabs(Str
):
524 Str
= os
.path
.abspath(Str
)
527 # file is in the same dir with FDF file
528 FullFdf
= self
.FileName
529 if not os
.path
.isabs(self
.FileName
):
530 FullFdf
= os
.path
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
532 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
534 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
535 raise Warning("Include file not exists", self
.FileName
, self
.CurrentLineNumber
)
537 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
539 CurrentLine
= self
.CurrentLineNumber
540 CurrentOffset
= self
.CurrentOffsetWithinLine
541 # list index of the insertion, note that line number is 'CurrentLine + 1'
542 InsertAtLine
= CurrentLine
543 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
544 # deal with remaining portions after "!include filename", if exists.
545 if self
.__GetNextToken
():
546 if self
.CurrentLineNumber
== CurrentLine
:
547 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
548 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
549 IncFileProfile
.InsertAdjust
+= 1
550 self
.CurrentLineNumber
+= 1
551 self
.CurrentOffsetWithinLine
= 0
553 for Line
in IncFileProfile
.FileLinesList
:
554 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
555 self
.CurrentLineNumber
+= 1
558 IncludeFileList
.append(IncFileProfile
)
560 # comment out the processed include file statement
561 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
562 TempList
.insert(IncludeOffset
, '#')
563 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
567 def __GetIfListCurrentItemStat(self
, IfList
):
578 ## PreprocessConditionalStatement() method
580 # Preprocess conditional statement.
581 # In the end, rewind the file buffer pointer to the beginning
583 # @param self The object pointer
585 def PreprocessConditionalStatement(self
):
586 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
588 while self
.__GetNextToken
():
589 if self
.__Token
== 'DEFINE':
590 if self
.__GetIfListCurrentItemStat
(IfList
):
591 DefineLine
= self
.CurrentLineNumber
- 1
592 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
593 if not self
.__GetNextToken
():
594 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
596 if not self
.__IsToken
( "="):
597 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
599 if not self
.__GetNextToken
():
600 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
602 if self
.__GetStringData
():
605 if not Macro
in InputMacroDict
:
606 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
607 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
608 MacProfile
.MacroName
= Macro
609 MacProfile
.MacroValue
= Value
610 AllMacroList
.append(MacProfile
)
611 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
613 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
614 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
615 IfList
.append([IfStartPos
, None, None])
616 CondLabel
= self
.__Token
618 MacroName
, NotFlag
= self
.__GetMacroName
()
619 NotDefineFlag
= False
620 if CondLabel
== '!ifndef':
622 if CondLabel
== '!ifdef' or CondLabel
== '!ifndef':
624 raise Warning("'NOT' operation not allowed for Macro name", self
.FileName
, self
.CurrentLineNumber
)
626 if CondLabel
== '!if':
628 if not self
.__GetNextOp
():
629 raise Warning("expected !endif", self
.FileName
, self
.CurrentLineNumber
)
631 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
633 if not self
.__GetNextToken
():
634 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
635 if self
.__GetStringData
():
637 MacroValue
= self
.__Token
638 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
640 ConditionSatisfied
= not ConditionSatisfied
641 BranchDetermined
= ConditionSatisfied
643 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
644 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
646 ConditionSatisfied
= not ConditionSatisfied
647 BranchDetermined
= ConditionSatisfied
648 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
649 if ConditionSatisfied
:
650 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
653 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1)
655 ConditionSatisfied
= not ConditionSatisfied
656 BranchDetermined
= ConditionSatisfied
657 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
658 if ConditionSatisfied
:
659 self
.__WipeOffArea
.append((IfStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
661 elif self
.__Token
in ('!elseif', '!else'):
662 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
664 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
666 IfList
[-1] = [ElseStartPos
, False, True]
667 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
669 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
670 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
671 if self
.__Token
== '!elseif':
672 MacroName
, NotFlag
= self
.__GetMacroName
()
673 if not self
.__GetNextOp
():
674 raise Warning("expected !endif", self
.FileName
, self
.CurrentLineNumber
)
676 if self
.__Token
in ('!=', '==', '>', '<', '>=', '<='):
678 if not self
.__GetNextToken
():
679 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
680 if self
.__GetStringData
():
682 MacroValue
= self
.__Token
683 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, Op
, MacroValue
)
685 ConditionSatisfied
= not ConditionSatisfied
688 self
.CurrentOffsetWithinLine
-= len(self
.__Token
)
689 ConditionSatisfied
= self
.__EvaluateConditional
(MacroName
, IfList
[-1][0][0] + 1, None, 'Bool')
691 ConditionSatisfied
= not ConditionSatisfied
693 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
697 IfList
[-1][1] = False
700 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
703 elif self
.__Token
== '!endif':
705 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
707 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
713 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
716 def __EvaluateConditional(self
, Name
, Line
, Op
= None, Value
= None):
718 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
719 if Name
in InputMacroDict
:
720 MacroValue
= InputMacroDict
[Name
]
722 if Value
== 'Bool' and MacroValue
== None or MacroValue
.upper() == 'FALSE':
726 if Value
!= MacroValue
:
731 if Value
== MacroValue
:
736 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(MacroValue
) or (MacroValue
!= None and MacroValue
.isdigit())):
737 InputVal
= long(Value
, 0)
738 MacroVal
= long(MacroValue
, 0)
740 if MacroVal
> InputVal
:
745 if MacroVal
>= InputVal
:
750 if MacroVal
< InputVal
:
755 if MacroVal
<= InputVal
:
762 raise Warning("Value %s is not a number", self
.FileName
, Line
)
764 for Profile
in AllMacroList
:
765 if Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= FileLineTuple
[1]:
767 if Value
== 'Bool' and Profile
.MacroValue
== None or Profile
.MacroValue
.upper() == 'FALSE':
771 if Value
!= Profile
.MacroValue
:
776 if Value
== Profile
.MacroValue
:
781 if (self
.__IsHex
(Value
) or Value
.isdigit()) and (self
.__IsHex
(Profile
.MacroValue
) or (Profile
.MacroValue
!= None and Profile
.MacroValue
.isdigit())):
782 InputVal
= long(Value
, 0)
783 MacroVal
= long(Profile
.MacroValue
, 0)
785 if MacroVal
> InputVal
:
790 if MacroVal
>= InputVal
:
795 if MacroVal
< InputVal
:
800 if MacroVal
<= InputVal
:
807 raise Warning("Value %s is not a number", self
.FileName
, Line
)
811 ## __IsToken() method
813 # Check whether input string is found from current char position along
814 # If found, the string value is put into self.__Token
816 # @param self The object pointer
817 # @param String The string to search
818 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
819 # @retval True Successfully find string, file buffer pointer moved forward
820 # @retval False Not able to find string, file buffer pointer not changed
822 def __IsToken(self
, String
, IgnoreCase
= False):
823 self
.__SkipWhiteSpace
()
825 # Only consider the same line, no multi-line token allowed
826 StartPos
= self
.CurrentOffsetWithinLine
829 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
831 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
833 self
.CurrentOffsetWithinLine
+= len(String
)
834 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
838 ## __IsKeyword() method
840 # Check whether input keyword is found from current char position along, whole word only!
841 # If found, the string value is put into self.__Token
843 # @param self The object pointer
844 # @param Keyword The string to search
845 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
846 # @retval True Successfully find string, file buffer pointer moved forward
847 # @retval False Not able to find string, file buffer pointer not changed
849 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
850 self
.__SkipWhiteSpace
()
852 # Only consider the same line, no multi-line token allowed
853 StartPos
= self
.CurrentOffsetWithinLine
856 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
858 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
860 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
861 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
863 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
864 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
868 ## __GetNextWord() method
870 # Get next C name from file lines
871 # If found, the string value is put into self.__Token
873 # @param self The object pointer
874 # @retval True Successfully find a C name string, file buffer pointer moved forward
875 # @retval False Not able to find a C name string, file buffer pointer not changed
877 def __GetNextWord(self
):
878 self
.__SkipWhiteSpace
()
879 if self
.__EndOfFile
():
882 TempChar
= self
.__CurrentChar
()
883 StartPos
= self
.CurrentOffsetWithinLine
884 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
886 while not self
.__EndOfLine
():
887 TempChar
= self
.__CurrentChar
()
888 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
889 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
895 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
900 ## __GetNextToken() method
902 # Get next token unit before a seperator
903 # If found, the string value is put into self.__Token
905 # @param self The object pointer
906 # @retval True Successfully find a token unit, file buffer pointer moved forward
907 # @retval False Not able to find a token unit, file buffer pointer not changed
909 def __GetNextToken(self
):
910 # Skip leading spaces, if exist.
911 self
.__SkipWhiteSpace
()
912 if self
.__EndOfFile
():
914 # Record the token start position, the position of the first non-space char.
915 StartPos
= self
.CurrentOffsetWithinLine
916 StartLine
= self
.CurrentLineNumber
917 while not self
.__EndOfLine
():
918 TempChar
= self
.__CurrentChar
()
919 # Try to find the end char that is not a space and not in seperator tuple.
920 # That is, when we got a space or any char in the tuple, we got the end of token.
921 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
923 # if we happen to meet a seperator as the first char, we must proceed to get it.
924 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
925 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
933 EndPos
= self
.CurrentOffsetWithinLine
934 if self
.CurrentLineNumber
!= StartLine
:
935 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
936 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
937 if StartPos
!= self
.CurrentOffsetWithinLine
:
942 def __GetNextOp(self
):
943 # Skip leading spaces, if exist.
944 self
.__SkipWhiteSpace
()
945 if self
.__EndOfFile
():
947 # Record the token start position, the position of the first non-space char.
948 StartPos
= self
.CurrentOffsetWithinLine
949 while not self
.__EndOfLine
():
950 TempChar
= self
.__CurrentChar
()
951 # Try to find the end char that is not a space
952 if not str(TempChar
).isspace():
959 if StartPos
!= self
.CurrentOffsetWithinLine
:
960 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
964 ## __GetNextGuid() method
966 # Get next token unit before a seperator
967 # If found, the GUID string is put into self.__Token
969 # @param self The object pointer
970 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
971 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
973 def __GetNextGuid(self
):
975 if not self
.__GetNextToken
():
977 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}')
978 if p
.match(self
.__Token
) != None:
984 ## __UndoToken() method
986 # Go back one token unit in file buffer
988 # @param self The object pointer
990 def __UndoToken(self
):
992 while self
.__CurrentChar
().isspace():
993 if not self
.__UndoOneChar
():
998 StartPos
= self
.CurrentOffsetWithinLine
999 CurrentLine
= self
.CurrentLineNumber
1000 while CurrentLine
== self
.CurrentLineNumber
:
1002 TempChar
= self
.__CurrentChar
()
1003 # Try to find the end char that is not a space and not in seperator tuple.
1004 # That is, when we got a space or any char in the tuple, we got the end of token.
1005 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1006 if not self
.__UndoOneChar
():
1008 # if we happen to meet a seperator as the first char, we must proceed to get it.
1009 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1010 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1017 ## __HexDigit() method
1019 # Whether char input is a Hex data bit
1021 # @param self The object pointer
1022 # @param TempChar The char to test
1023 # @retval True The char is a Hex data bit
1024 # @retval False The char is NOT a Hex data bit
1026 def __HexDigit(self
, TempChar
):
1027 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1028 or (TempChar
>= '0' and TempChar
<= '9'):
1033 def __IsHex(self
, HexStr
):
1034 if not HexStr
.upper().startswith("0X"):
1036 if len(self
.__Token
) <= 2:
1038 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1039 if len(charList
) == 0:
1043 ## __GetNextHexNumber() method
1045 # Get next HEX data before a seperator
1046 # If found, the HEX data is put into self.__Token
1048 # @param self The object pointer
1049 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1050 # @retval False Not able to find a HEX data, file buffer pointer not changed
1052 def __GetNextHexNumber(self
):
1053 if not self
.__GetNextToken
():
1055 if self
.__IsHex
(self
.__Token
):
1061 ## __GetNextDecimalNumber() method
1063 # Get next decimal data before a seperator
1064 # If found, the decimal data is put into self.__Token
1066 # @param self The object pointer
1067 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1068 # @retval False Not able to find a decimal data, file buffer pointer not changed
1070 def __GetNextDecimalNumber(self
):
1071 if not self
.__GetNextToken
():
1073 if self
.__Token
.isdigit():
1079 ## __GetNextPcdName() method
1081 # Get next PCD token space C name and PCD C name pair before a seperator
1082 # If found, the decimal data is put into self.__Token
1084 # @param self The object pointer
1085 # @retval Tuple PCD C name and PCD token space C name pair
1087 def __GetNextPcdName(self
):
1088 if not self
.__GetNextWord
():
1089 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1090 pcdTokenSpaceCName
= self
.__Token
1092 if not self
.__IsToken
( "."):
1093 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1095 if not self
.__GetNextWord
():
1096 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1097 pcdCName
= self
.__Token
1099 return (pcdCName
, pcdTokenSpaceCName
)
1101 ## __GetStringData() method
1103 # Get string contents quoted in ""
1104 # If found, the decimal data is put into self.__Token
1106 # @param self The object pointer
1107 # @retval True Successfully find a string data, file buffer pointer moved forward
1108 # @retval False Not able to find a string data, file buffer pointer not changed
1110 def __GetStringData(self
):
1111 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1113 self
.__SkipToToken
("\"")
1114 currentLineNumber
= self
.CurrentLineNumber
1116 if not self
.__SkipToToken
("\""):
1117 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1118 if currentLineNumber
!= self
.CurrentLineNumber
:
1119 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1120 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1123 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1125 self
.__SkipToToken
("\'")
1126 currentLineNumber
= self
.CurrentLineNumber
1128 if not self
.__SkipToToken
("\'"):
1129 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1130 if currentLineNumber
!= self
.CurrentLineNumber
:
1131 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1132 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1138 ## __SkipToToken() method
1140 # Search forward in file buffer for the string
1141 # The skipped chars are put into self.__SkippedChars
1143 # @param self The object pointer
1144 # @param String The string to search
1145 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1146 # @retval True Successfully find the string, file buffer pointer moved forward
1147 # @retval False Not able to find the string, file buffer pointer not changed
1149 def __SkipToToken(self
, String
, IgnoreCase
= False):
1150 StartPos
= self
.GetFileBufferPos()
1152 self
.__SkippedChars
= ""
1153 while not self
.__EndOfFile
():
1156 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1158 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1160 self
.CurrentOffsetWithinLine
+= len(String
)
1161 self
.__SkippedChars
+= String
1163 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1166 self
.SetFileBufferPos( StartPos
)
1167 self
.__SkippedChars
= ""
1170 ## GetFileBufferPos() method
1172 # Return the tuple of current line and offset within the line
1174 # @param self The object pointer
1175 # @retval Tuple Line number and offset pair
1177 def GetFileBufferPos(self
):
1178 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1180 ## SetFileBufferPos() method
1182 # Restore the file buffer position
1184 # @param self The object pointer
1185 # @param Pos The new file buffer position
1187 def SetFileBufferPos(self
, Pos
):
1188 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1190 ## ParseFile() method
1192 # Parse the file profile buffer to extract fd, fv ... information
1193 # Exception will be raised if syntax error found
1195 # @param self The object pointer
1197 def ParseFile(self
):
1200 self
.__StringToList
()
1201 self
.PreprocessFile()
1202 self
.PreprocessIncludeFile()
1203 self
.__StringToList
()
1204 self
.PreprocessFile()
1205 self
.PreprocessConditionalStatement()
1206 self
.__StringToList
()
1207 for Pos
in self
.__WipeOffArea
:
1208 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1209 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1211 while self
.__GetDefines
():
1215 while Index
< len(self
.Profile
.FileLinesList
):
1216 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1217 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1220 while self
.__GetFd
():
1223 while self
.__GetFv
():
1226 while self
.__GetCapsule
():
1229 while self
.__GetVtf
():
1232 while self
.__GetRule
():
1235 while self
.__GetOptionRom
():
1240 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1241 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1242 X
.Message
+= ' near line %d, column %d: %s' \
1243 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1246 ## __GetDefines() method
1248 # Get Defines section contents and store its data into AllMacrosList
1250 # @param self The object pointer
1251 # @retval True Successfully find a Defines
1252 # @retval False Not able to find a Defines
1254 def __GetDefines(self
):
1256 if not self
.__GetNextToken
():
1259 S
= self
.__Token
.upper()
1260 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1261 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1262 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1263 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
)
1268 if not self
.__IsToken
("[DEFINES", True):
1269 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1270 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1271 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1272 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1274 if not self
.__IsToken
( "]"):
1275 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1277 while self
.__GetNextWord
():
1278 # handle the SET statement
1279 if self
.__Token
== 'SET':
1281 self
.__GetSetStatement
(None)
1284 Macro
= self
.__Token
1286 if not self
.__IsToken
("="):
1287 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1288 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1289 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1290 Value
= self
.__Token
1291 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1292 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1293 MacProfile
.MacroName
= Macro
1294 MacProfile
.MacroValue
= Value
1295 AllMacroList
.append(MacProfile
)
1301 # Get FD section contents and store its data into FD dictionary of self.Profile
1303 # @param self The object pointer
1304 # @retval True Successfully find a FD
1305 # @retval False Not able to find a FD
1309 if not self
.__GetNextToken
():
1312 S
= self
.__Token
.upper()
1313 if S
.startswith("[") and not S
.startswith("[FD."):
1314 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1315 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1316 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1321 if not self
.__IsToken
("[FD.", True):
1322 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1323 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1324 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1325 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1327 FdName
= self
.__GetUiName
()
1329 if len (self
.Profile
.FdDict
) == 0:
1330 FdName
= GenFdsGlobalVariable
.PlatformName
1331 self
.Profile
.FdNameNotSet
= True
1333 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1334 self
.CurrentFdName
= FdName
.upper()
1336 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1337 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1339 if not self
.__IsToken
( "]"):
1340 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1343 FdObj
.FdUiName
= self
.CurrentFdName
1344 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1346 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1347 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1349 Status
= self
.__GetCreateFile
(FdObj
)
1351 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1353 self
.__GetTokenStatements
(FdObj
)
1355 self
.__GetDefineStatements
(FdObj
)
1357 self
.__GetSetStatements
(FdObj
)
1359 if not self
.__GetRegionLayout
(FdObj
):
1360 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1362 while self
.__GetRegionLayout
(FdObj
):
1366 ## __GetUiName() method
1368 # Return the UI name of a section
1370 # @param self The object pointer
1371 # @retval FdName UI name
1373 def __GetUiName(self
):
1375 if self
.__GetNextWord
():
1380 ## __GetCreateFile() method
1382 # Return the output file name of object
1384 # @param self The object pointer
1385 # @param Obj object whose data will be stored in file
1386 # @retval FdName UI name
1388 def __GetCreateFile(self
, Obj
):
1390 if self
.__IsKeyword
( "CREATE_FILE"):
1391 if not self
.__IsToken
( "="):
1392 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1394 if not self
.__GetNextToken
():
1395 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1397 FileName
= self
.__Token
1398 Obj
.CreateFileName
= FileName
1402 ## __GetTokenStatements() method
1404 # Get token statements
1406 # @param self The object pointer
1407 # @param Obj for whom token statement is got
1409 def __GetTokenStatements(self
, Obj
):
1410 if not self
.__IsKeyword
( "BaseAddress"):
1411 raise Warning("BaseAddress missing", self
.FileName
, self
.CurrentLineNumber
)
1413 if not self
.__IsToken
( "="):
1414 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1416 if not self
.__GetNextHexNumber
():
1417 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1419 Obj
.BaseAddress
= self
.__Token
1421 if self
.__IsToken
( "|"):
1422 pcdPair
= self
.__GetNextPcdName
()
1423 Obj
.BaseAddressPcd
= pcdPair
1424 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1426 if not self
.__IsKeyword
( "Size"):
1427 raise Warning("Size missing", self
.FileName
, self
.CurrentLineNumber
)
1429 if not self
.__IsToken
( "="):
1430 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1432 if not self
.__GetNextHexNumber
():
1433 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1437 if self
.__IsToken
( "|"):
1438 pcdPair
= self
.__GetNextPcdName
()
1439 Obj
.SizePcd
= pcdPair
1440 self
.Profile
.PcdDict
[pcdPair
] = Size
1441 Obj
.Size
= long(Size
, 0)
1443 if not self
.__IsKeyword
( "ErasePolarity"):
1444 raise Warning("ErasePolarity missing", self
.FileName
, self
.CurrentLineNumber
)
1446 if not self
.__IsToken
( "="):
1447 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1449 if not self
.__GetNextToken
():
1450 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1452 if self
.__Token
!= "1" and self
.__Token
!= "0":
1453 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1455 Obj
.ErasePolarity
= self
.__Token
1457 self
.__GetBlockStatements
(Obj
)
1459 ## __GetAddressStatements() method
1461 # Get address statements
1463 # @param self The object pointer
1464 # @param Obj for whom address statement is got
1465 # @retval True Successfully find
1466 # @retval False Not able to find
1468 def __GetAddressStatements(self
, Obj
):
1470 if self
.__IsKeyword
("BsBaseAddress"):
1471 if not self
.__IsToken
( "="):
1472 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1474 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1475 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1477 BsAddress
= long(self
.__Token
, 0)
1478 Obj
.BsBaseAddress
= BsAddress
1480 if self
.__IsKeyword
("RtBaseAddress"):
1481 if not self
.__IsToken
( "="):
1482 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1484 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1485 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1487 RtAddress
= long(self
.__Token
, 0)
1488 Obj
.RtBaseAddress
= RtAddress
1490 ## __GetBlockStatements() method
1492 # Get block statements
1494 # @param self The object pointer
1495 # @param Obj for whom block statement is got
1497 def __GetBlockStatements(self
, Obj
):
1499 if not self
.__GetBlockStatement
(Obj
):
1500 #set default block size is 1
1501 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1504 while self
.__GetBlockStatement
(Obj
):
1507 for Item
in Obj
.BlockSizeList
:
1508 if Item
[0] == None or Item
[1] == None:
1509 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1511 ## __GetBlockStatement() method
1513 # Get block statement
1515 # @param self The object pointer
1516 # @param Obj for whom block statement is got
1517 # @retval True Successfully find
1518 # @retval False Not able to find
1520 def __GetBlockStatement(self
, Obj
):
1521 if not self
.__IsKeyword
( "BlockSize"):
1524 if not self
.__IsToken
( "="):
1525 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1527 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1528 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1530 BlockSize
= self
.__Token
1532 if self
.__IsToken
( "|"):
1533 PcdPair
= self
.__GetNextPcdName
()
1534 BlockSizePcd
= PcdPair
1535 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1536 BlockSize
= long(BlockSize
, 0)
1539 if self
.__IsKeyword
( "NumBlocks"):
1540 if not self
.__IsToken
( "="):
1541 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1543 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1544 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1546 BlockNumber
= long(self
.__Token
, 0)
1548 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1551 ## __GetDefineStatements() method
1553 # Get define statements
1555 # @param self The object pointer
1556 # @param Obj for whom define statement is got
1557 # @retval True Successfully find
1558 # @retval False Not able to find
1560 def __GetDefineStatements(self
, Obj
):
1561 while self
.__GetDefineStatement
( Obj
):
1564 ## __GetDefineStatement() method
1566 # Get define statement
1568 # @param self The object pointer
1569 # @param Obj for whom define statement is got
1570 # @retval True Successfully find
1571 # @retval False Not able to find
1573 def __GetDefineStatement(self
, Obj
):
1574 if self
.__IsKeyword
("DEFINE"):
1575 self
.__GetNextToken
()
1576 Macro
= self
.__Token
1577 if not self
.__IsToken
( "="):
1578 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1580 if not self
.__GetNextToken
():
1581 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1583 Value
= self
.__Token
1584 Macro
= '$(' + Macro
+ ')'
1585 Obj
.DefineVarDict
[Macro
] = Value
1590 ## __GetSetStatements() method
1592 # Get set statements
1594 # @param self The object pointer
1595 # @param Obj for whom set statement is got
1596 # @retval True Successfully find
1597 # @retval False Not able to find
1599 def __GetSetStatements(self
, Obj
):
1600 while self
.__GetSetStatement
(Obj
):
1603 ## __GetSetStatement() method
1607 # @param self The object pointer
1608 # @param Obj for whom set statement is got
1609 # @retval True Successfully find
1610 # @retval False Not able to find
1612 def __GetSetStatement(self
, Obj
):
1613 if self
.__IsKeyword
("SET"):
1614 PcdPair
= self
.__GetNextPcdName
()
1616 if not self
.__IsToken
( "="):
1617 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1619 if not self
.__GetNextToken
():
1620 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1622 Value
= self
.__Token
1623 if Value
.startswith("{"):
1624 # deal with value with {}
1625 if not self
.__SkipToToken
( "}"):
1626 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1627 Value
+= self
.__SkippedChars
1630 Obj
.SetVarDict
[PcdPair
] = Value
1631 self
.Profile
.PcdDict
[PcdPair
] = Value
1636 ## __GetRegionLayout() method
1638 # Get region layout for FD
1640 # @param self The object pointer
1641 # @param Fd for whom region is got
1642 # @retval True Successfully find
1643 # @retval False Not able to find
1645 def __GetRegionLayout(self
, Fd
):
1646 if not self
.__GetNextHexNumber
():
1649 RegionObj
= Region
.Region()
1650 RegionObj
.Offset
= long(self
.__Token
, 0)
1651 Fd
.RegionList
.append(RegionObj
)
1653 if not self
.__IsToken
( "|"):
1654 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1656 if not self
.__GetNextHexNumber
():
1657 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1658 RegionObj
.Size
= long(self
.__Token
, 0)
1660 if not self
.__GetNextWord
():
1663 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1665 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1666 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1667 if self
.__IsToken
( "|"):
1668 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1669 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1671 if not self
.__GetNextWord
():
1674 if self
.__Token
== "SET":
1676 self
.__GetSetStatements
( RegionObj
)
1677 if not self
.__GetNextWord
():
1680 elif self
.__Token
== "FV":
1682 self
.__GetRegionFvType
( RegionObj
)
1684 elif self
.__Token
== "CAPSULE":
1686 self
.__GetRegionCapType
( RegionObj
)
1688 elif self
.__Token
== "FILE":
1690 self
.__GetRegionFileType
( RegionObj
)
1694 self
.__GetRegionDataType
( RegionObj
)
1698 ## __GetRegionFvType() method
1700 # Get region fv data for region
1702 # @param self The object pointer
1703 # @param RegionObj for whom region data is got
1705 def __GetRegionFvType(self
, RegionObj
):
1707 if not self
.__IsKeyword
( "FV"):
1708 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1710 if not self
.__IsToken
( "="):
1711 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1713 if not self
.__GetNextToken
():
1714 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1716 RegionObj
.RegionType
= "FV"
1717 RegionObj
.RegionDataList
.append(self
.__Token
)
1719 while self
.__IsKeyword
( "FV"):
1721 if not self
.__IsToken
( "="):
1722 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1724 if not self
.__GetNextToken
():
1725 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1727 RegionObj
.RegionDataList
.append(self
.__Token
)
1729 ## __GetRegionCapType() method
1731 # Get region capsule data for region
1733 # @param self The object pointer
1734 # @param RegionObj for whom region data is got
1736 def __GetRegionCapType(self
, RegionObj
):
1738 if not self
.__IsKeyword
("CAPSULE"):
1739 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1741 if not self
.__IsToken
("="):
1742 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1744 if not self
.__GetNextToken
():
1745 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1747 RegionObj
.RegionType
= "CAPSULE"
1748 RegionObj
.RegionDataList
.append(self
.__Token
)
1750 while self
.__IsKeyword
("CAPSULE"):
1752 if not self
.__IsToken
("="):
1753 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1755 if not self
.__GetNextToken
():
1756 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1758 RegionObj
.RegionDataList
.append(self
.__Token
)
1760 ## __GetRegionFileType() method
1762 # Get region file data for region
1764 # @param self The object pointer
1765 # @param RegionObj for whom region data is got
1767 def __GetRegionFileType(self
, RegionObj
):
1769 if not self
.__IsKeyword
( "FILE"):
1770 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1772 if not self
.__IsToken
( "="):
1773 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1775 if not self
.__GetNextToken
():
1776 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1778 RegionObj
.RegionType
= "FILE"
1779 RegionObj
.RegionDataList
.append( self
.__Token
)
1781 while self
.__IsKeyword
( "FILE"):
1783 if not self
.__IsToken
( "="):
1784 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1786 if not self
.__GetNextToken
():
1787 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1789 RegionObj
.RegionDataList
.append(self
.__Token
)
1791 ## __GetRegionDataType() method
1793 # Get region array data for region
1795 # @param self The object pointer
1796 # @param RegionObj for whom region data is got
1798 def __GetRegionDataType(self
, RegionObj
):
1800 if not self
.__IsKeyword
( "DATA"):
1801 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
1803 if not self
.__IsToken
( "="):
1804 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1806 if not self
.__IsToken
( "{"):
1807 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1809 if not self
.__GetNextHexNumber
():
1810 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1812 if len(self
.__Token
) > 18:
1813 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1815 # convert hex string value to byte hex string array
1816 AllString
= self
.__Token
1817 AllStrLen
= len (AllString
)
1819 while AllStrLen
> 4:
1820 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1821 AllStrLen
= AllStrLen
- 2
1822 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1825 if len (self
.__Token
) <= 4:
1826 while self
.__IsToken
(","):
1827 if not self
.__GetNextHexNumber
():
1828 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1829 if len(self
.__Token
) > 4:
1830 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1831 DataString
+= self
.__Token
1834 if not self
.__IsToken
( "}"):
1835 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1837 DataString
= DataString
.rstrip(",")
1838 RegionObj
.RegionType
= "DATA"
1839 RegionObj
.RegionDataList
.append( DataString
)
1841 while self
.__IsKeyword
( "DATA"):
1843 if not self
.__IsToken
( "="):
1844 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1846 if not self
.__IsToken
( "{"):
1847 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1849 if not self
.__GetNextHexNumber
():
1850 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1852 if len(self
.__Token
) > 18:
1853 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1855 # convert hex string value to byte hex string array
1856 AllString
= self
.__Token
1857 AllStrLen
= len (AllString
)
1859 while AllStrLen
> 4:
1860 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1861 AllStrLen
= AllStrLen
- 2
1862 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1865 if len (self
.__Token
) <= 4:
1866 while self
.__IsToken
(","):
1867 if not self
.__GetNextHexNumber
():
1868 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1869 if len(self
.__Token
) > 4:
1870 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1871 DataString
+= self
.__Token
1874 if not self
.__IsToken
( "}"):
1875 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1877 DataString
= DataString
.rstrip(",")
1878 RegionObj
.RegionDataList
.append( DataString
)
1882 # Get FV section contents and store its data into FV dictionary of self.Profile
1884 # @param self The object pointer
1885 # @retval True Successfully find a FV
1886 # @retval False Not able to find a FV
1889 if not self
.__GetNextToken
():
1892 S
= self
.__Token
.upper()
1893 if S
.startswith("[") and not S
.startswith("[FV."):
1894 if not S
.startswith("[CAPSULE.") \
1895 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1896 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1901 if not self
.__IsToken
("[FV.", True):
1902 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1903 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1904 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1905 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1907 FvName
= self
.__GetUiName
()
1908 self
.CurrentFvName
= FvName
.upper()
1910 if not self
.__IsToken
( "]"):
1911 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1914 FvObj
.UiFvName
= self
.CurrentFvName
1915 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1917 Status
= self
.__GetCreateFile
(FvObj
)
1919 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
1921 self
.__GetDefineStatements
(FvObj
)
1923 self
.__GetAddressStatements
(FvObj
)
1925 while self
.__GetBlockStatement
(FvObj
):
1928 self
.__GetSetStatements
(FvObj
)
1930 self
.__GetFvBaseAddress
(FvObj
)
1932 self
.__GetFvAlignment
(FvObj
)
1934 self
.__GetFvAttributes
(FvObj
)
1936 self
.__GetFvNameGuid
(FvObj
)
1938 FvObj
.FvExtEntryTypeValue
= []
1939 FvObj
.FvExtEntryType
= []
1940 FvObj
.FvExtEntryData
= []
1942 isFvExtEntry
= self
.__GetFvExtEntryStatement
(FvObj
)
1943 if not isFvExtEntry
:
1946 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1947 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1950 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1951 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1952 if not isInf
and not isFile
:
1957 ## __GetFvAlignment() method
1959 # Get alignment for FV
1961 # @param self The object pointer
1962 # @param Obj for whom alignment is got
1963 # @retval True Successfully find a alignment statement
1964 # @retval False Not able to find a alignment statement
1966 def __GetFvAlignment(self
, Obj
):
1968 if not self
.__IsKeyword
( "FvAlignment"):
1971 if not self
.__IsToken
( "="):
1972 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1974 if not self
.__GetNextToken
():
1975 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
1977 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1978 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1979 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1981 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1982 Obj
.FvAlignment
= self
.__Token
1985 ## __GetFvBaseAddress() method
1987 # Get BaseAddress for FV
1989 # @param self The object pointer
1990 # @param Obj for whom FvBaseAddress is got
1991 # @retval True Successfully find a FvBaseAddress statement
1992 # @retval False Not able to find a FvBaseAddress statement
1994 def __GetFvBaseAddress(self
, Obj
):
1996 if not self
.__IsKeyword
("FvBaseAddress"):
1999 if not self
.__IsToken
( "="):
2000 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2002 if not self
.__GetNextToken
():
2003 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2005 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2007 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2008 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2009 Obj
.FvBaseAddress
= self
.__Token
2013 ## __GetFvAttributes() method
2015 # Get attributes for FV
2017 # @param self The object pointer
2018 # @param Obj for whom attribute is got
2021 def __GetFvAttributes(self
, FvObj
):
2023 while self
.__GetNextWord
():
2025 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2026 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2027 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2028 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2029 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2030 "WRITE_POLICY_RELIABLE"):
2034 if not self
.__IsToken
( "="):
2035 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2037 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2038 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2040 FvObj
.FvAttributeDict
[name
] = self
.__Token
2044 ## __GetFvNameGuid() method
2046 # Get FV GUID for FV
2048 # @param self The object pointer
2049 # @param Obj for whom GUID is got
2052 def __GetFvNameGuid(self
, FvObj
):
2054 if not self
.__IsKeyword
( "FvNameGuid"):
2057 if not self
.__IsToken
( "="):
2058 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2060 if not self
.__GetNextGuid
():
2061 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2063 FvObj
.FvNameGuid
= self
.__Token
2067 def __GetFvExtEntryStatement(self
, FvObj
):
2069 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2072 if not self
.__IsKeyword
("TYPE"):
2073 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2075 if not self
.__IsToken
( "="):
2076 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2078 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2079 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2081 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2083 if not self
.__IsToken
( "{"):
2084 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2086 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2087 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2089 FvObj
.FvExtEntryType
+= [self
.__Token
]
2091 if self
.__Token
== 'DATA':
2093 if not self
.__IsToken
( "="):
2094 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2096 if not self
.__IsToken
( "{"):
2097 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2099 if not self
.__GetNextHexNumber
():
2100 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2102 if len(self
.__Token
) > 4:
2103 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2105 DataString
= self
.__Token
2108 while self
.__IsToken
(","):
2109 if not self
.__GetNextHexNumber
():
2110 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2111 if len(self
.__Token
) > 4:
2112 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2113 DataString
+= self
.__Token
2116 if not self
.__IsToken
( "}"):
2117 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2119 if not self
.__IsToken
( "}"):
2120 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2122 DataString
= DataString
.rstrip(",")
2123 FvObj
.FvExtEntryData
+= [DataString
]
2125 if self
.__Token
== 'FILE':
2127 if not self
.__IsToken
( "="):
2128 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2130 if not self
.__GetNextToken
():
2131 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2133 FvObj
.FvExtEntryData
+= [self
.__Token
]
2135 if not self
.__IsToken
( "}"):
2136 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2140 ## __GetAprioriSection() method
2142 # Get token statements
2144 # @param self The object pointer
2145 # @param FvObj for whom apriori is got
2146 # @param MacroDict dictionary used to replace macro
2147 # @retval True Successfully find apriori statement
2148 # @retval False Not able to find apriori statement
2150 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2152 if not self
.__IsKeyword
( "APRIORI"):
2155 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2156 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2157 AprType
= self
.__Token
2159 if not self
.__IsToken
( "{"):
2160 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2162 AprSectionObj
= AprioriSection
.AprioriSection()
2163 AprSectionObj
.AprioriType
= AprType
2165 self
.__GetDefineStatements
(AprSectionObj
)
2166 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2169 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2170 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2171 if not IsInf
and not IsFile
:
2174 if not self
.__IsToken
( "}"):
2175 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2177 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2180 ## __GetInfStatement() method
2182 # Get INF statements
2184 # @param self The object pointer
2185 # @param Obj for whom inf statement is got
2186 # @param MacroDict dictionary used to replace macro
2187 # @retval True Successfully find inf statement
2188 # @retval False Not able to find inf statement
2190 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2192 if not self
.__IsKeyword
( "INF"):
2195 ffsInf
= FfsInfStatement
.FfsInfStatement()
2196 self
.__GetInfOptions
( ffsInf
)
2198 if not self
.__GetNextToken
():
2199 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2200 ffsInf
.InfFileName
= self
.__Token
2201 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2202 #do case sensitive check for file path
2203 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2205 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2207 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2208 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2210 if self
.__IsToken
('|'):
2211 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2212 ffsInf
.KeepReloc
= False
2213 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2214 ffsInf
.KeepReloc
= True
2216 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2219 capsuleFfs
= CapsuleData
.CapsuleFfs()
2220 capsuleFfs
.Ffs
= ffsInf
2221 Obj
.CapsuleDataList
.append(capsuleFfs
)
2223 Obj
.FfsList
.append(ffsInf
)
2226 ## __GetInfOptions() method
2228 # Get options for INF
2230 # @param self The object pointer
2231 # @param FfsInfObj for whom option is got
2233 def __GetInfOptions(self
, FfsInfObj
):
2235 if self
.__IsKeyword
( "RuleOverride"):
2236 if not self
.__IsToken
( "="):
2237 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2238 if not self
.__GetNextToken
():
2239 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2240 FfsInfObj
.Rule
= self
.__Token
2242 if self
.__IsKeyword
( "VERSION"):
2243 if not self
.__IsToken
( "="):
2244 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2245 if not self
.__GetNextToken
():
2246 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2248 if self
.__GetStringData
():
2249 FfsInfObj
.Version
= self
.__Token
2251 if self
.__IsKeyword
( "UI"):
2252 if not self
.__IsToken
( "="):
2253 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2254 if not self
.__GetNextToken
():
2255 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2257 if self
.__GetStringData
():
2258 FfsInfObj
.Ui
= self
.__Token
2260 if self
.__IsKeyword
( "USE"):
2261 if not self
.__IsToken
( "="):
2262 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2263 if not self
.__GetNextToken
():
2264 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2265 FfsInfObj
.UseArch
= self
.__Token
2268 if self
.__GetNextToken
():
2269 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2270 if p
.match(self
.__Token
):
2271 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2272 if not self
.__IsToken
(","):
2278 while self
.__GetNextToken
():
2279 if not p
.match(self
.__Token
):
2280 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2281 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2283 if not self
.__IsToken
(","):
2286 ## __GetFileStatement() method
2288 # Get FILE statements
2290 # @param self The object pointer
2291 # @param Obj for whom FILE statement is got
2292 # @param MacroDict dictionary used to replace macro
2293 # @retval True Successfully find FILE statement
2294 # @retval False Not able to find FILE statement
2296 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2298 if not self
.__IsKeyword
( "FILE"):
2301 FfsFileObj
= FfsFileStatement
.FileStatement()
2303 if not self
.__GetNextWord
():
2304 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2305 FfsFileObj
.FvFileType
= self
.__Token
2307 if not self
.__IsToken
( "="):
2308 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2310 if not self
.__GetNextGuid
():
2311 if not self
.__GetNextWord
():
2312 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2313 if self
.__Token
== 'PCD':
2314 if not self
.__IsToken
( "("):
2315 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2316 PcdPair
= self
.__GetNextPcdName
()
2317 if not self
.__IsToken
( ")"):
2318 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2319 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2321 FfsFileObj
.NameGuid
= self
.__Token
2323 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2326 capsuleFfs
= CapsuleData
.CapsuleFfs()
2327 capsuleFfs
.Ffs
= FfsFileObj
2328 Obj
.CapsuleDataList
.append(capsuleFfs
)
2330 Obj
.FfsList
.append(FfsFileObj
)
2334 ## __FileCouldHaveRelocFlag() method
2336 # Check whether reloc strip flag can be set for a file type.
2338 # @param self The object pointer
2339 # @param FileType The file type to check with
2340 # @retval True This type could have relocation strip flag
2341 # @retval False No way to have it
2344 def __FileCouldHaveRelocFlag (self
, FileType
):
2345 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2350 ## __SectionCouldHaveRelocFlag() method
2352 # Check whether reloc strip flag can be set for a section type.
2354 # @param self The object pointer
2355 # @param SectionType The section type to check with
2356 # @retval True This type could have relocation strip flag
2357 # @retval False No way to have it
2360 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2361 if SectionType
in ('TE', 'PE32'):
2366 ## __GetFilePart() method
2368 # Get components for FILE statement
2370 # @param self The object pointer
2371 # @param FfsFileObj for whom component is got
2372 # @param MacroDict dictionary used to replace macro
2374 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2376 self
.__GetFileOpts
( FfsFileObj
)
2378 if not self
.__IsToken
("{"):
2379 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2380 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2381 # if self.__Token == 'RELOCS_STRIPPED':
2382 # FfsFileObj.KeepReloc = False
2384 # FfsFileObj.KeepReloc = True
2386 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2388 # if not self.__IsToken("{"):
2389 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2391 if not self
.__GetNextToken
():
2392 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2394 if self
.__Token
== "FV":
2395 if not self
.__IsToken
( "="):
2396 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2397 if not self
.__GetNextToken
():
2398 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2399 FfsFileObj
.FvName
= self
.__Token
2401 elif self
.__Token
== "FD":
2402 if not self
.__IsToken
( "="):
2403 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2404 if not self
.__GetNextToken
():
2405 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2406 FfsFileObj
.FdName
= self
.__Token
2408 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2410 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2412 FfsFileObj
.FileName
= self
.__Token
2413 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2414 #do case sensitive check for file path
2415 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2417 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2419 if not self
.__IsToken
( "}"):
2420 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2422 ## __GetFileOpts() method
2424 # Get options for FILE statement
2426 # @param self The object pointer
2427 # @param FfsFileObj for whom options is got
2429 def __GetFileOpts(self
, FfsFileObj
):
2431 if self
.__GetNextToken
():
2432 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2433 if Pattern
.match(self
.__Token
):
2434 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2435 if self
.__IsToken
(","):
2436 while self
.__GetNextToken
():
2437 if not Pattern
.match(self
.__Token
):
2438 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2439 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2441 if not self
.__IsToken
(","):
2447 if self
.__IsKeyword
( "FIXED", True):
2448 FfsFileObj
.Fixed
= True
2450 if self
.__IsKeyword
( "CHECKSUM", True):
2451 FfsFileObj
.CheckSum
= True
2453 if self
.__GetAlignment
():
2454 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2455 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2456 #For FFS, Auto is default option same to ""
2457 if not self
.__Token
== "Auto":
2458 FfsFileObj
.Alignment
= self
.__Token
2460 ## __GetAlignment() method
2462 # Return the alignment value
2464 # @param self The object pointer
2465 # @retval True Successfully find alignment
2466 # @retval False Not able to find alignment
2468 def __GetAlignment(self
):
2469 if self
.__IsKeyword
( "Align", True):
2470 if not self
.__IsToken
( "="):
2471 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2473 if not self
.__GetNextToken
():
2474 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2479 ## __GetFilePart() method
2481 # Get section data for FILE statement
2483 # @param self The object pointer
2484 # @param FfsFileObj for whom section is got
2485 # @param MacroDict dictionary used to replace macro
2487 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2489 Dict
.update(MacroDict
)
2491 self
.__GetDefineStatements
(FfsFileObj
)
2493 Dict
.update(FfsFileObj
.DefineVarDict
)
2494 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2495 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2498 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2499 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2500 if not IsLeafSection
and not IsEncapSection
:
2503 ## __GetLeafSection() method
2505 # Get leaf section for Obj
2507 # @param self The object pointer
2508 # @param Obj for whom leaf section is got
2509 # @param MacroDict dictionary used to replace macro
2510 # @retval True Successfully find section statement
2511 # @retval False Not able to find section statement
2513 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2515 OldPos
= self
.GetFileBufferPos()
2517 if not self
.__IsKeyword
( "SECTION"):
2518 if len(Obj
.SectionList
) == 0:
2519 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2524 if self
.__GetAlignment
():
2525 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2526 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2527 AlignValue
= self
.__Token
2530 if self
.__IsKeyword
( "BUILD_NUM"):
2531 if not self
.__IsToken
( "="):
2532 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2534 if not self
.__GetNextToken
():
2535 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2537 BuildNum
= self
.__Token
2539 if self
.__IsKeyword
( "VERSION"):
2540 if AlignValue
== 'Auto':
2541 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2542 if not self
.__IsToken
( "="):
2543 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2544 if not self
.__GetNextToken
():
2545 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2546 VerSectionObj
= VerSection
.VerSection()
2547 VerSectionObj
.Alignment
= AlignValue
2548 VerSectionObj
.BuildNum
= BuildNum
2549 if self
.__GetStringData
():
2550 VerSectionObj
.StringData
= self
.__Token
2552 VerSectionObj
.FileName
= self
.__Token
2553 Obj
.SectionList
.append(VerSectionObj
)
2555 elif self
.__IsKeyword
( "UI"):
2556 if AlignValue
== 'Auto':
2557 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2558 if not self
.__IsToken
( "="):
2559 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2560 if not self
.__GetNextToken
():
2561 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2562 UiSectionObj
= UiSection
.UiSection()
2563 UiSectionObj
.Alignment
= AlignValue
2564 if self
.__GetStringData
():
2565 UiSectionObj
.StringData
= self
.__Token
2567 UiSectionObj
.FileName
= self
.__Token
2568 Obj
.SectionList
.append(UiSectionObj
)
2570 elif self
.__IsKeyword
( "FV_IMAGE"):
2571 if AlignValue
== 'Auto':
2572 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2573 if not self
.__IsToken
( "="):
2574 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2575 if not self
.__GetNextToken
():
2576 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2578 FvName
= self
.__Token
2581 if self
.__IsToken
( "{"):
2583 FvObj
.UiFvName
= FvName
.upper()
2584 self
.__GetDefineStatements
(FvObj
)
2585 MacroDict
.update(FvObj
.DefineVarDict
)
2586 self
.__GetBlockStatement
(FvObj
)
2587 self
.__GetSetStatements
(FvObj
)
2588 self
.__GetFvAlignment
(FvObj
)
2589 self
.__GetFvAttributes
(FvObj
)
2590 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2591 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2594 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2595 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2596 if not IsInf
and not IsFile
:
2599 if not self
.__IsToken
( "}"):
2600 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2602 FvImageSectionObj
= FvImageSection
.FvImageSection()
2603 FvImageSectionObj
.Alignment
= AlignValue
2605 FvImageSectionObj
.Fv
= FvObj
2606 FvImageSectionObj
.FvName
= None
2608 FvImageSectionObj
.FvName
= FvName
.upper()
2609 FvImageSectionObj
.FvFileName
= FvName
2611 Obj
.SectionList
.append(FvImageSectionObj
)
2613 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2614 if AlignValue
== 'Auto':
2615 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2616 DepexSectionObj
= DepexSection
.DepexSection()
2617 DepexSectionObj
.Alignment
= AlignValue
2618 DepexSectionObj
.DepexType
= self
.__Token
2620 if not self
.__IsToken
( "="):
2621 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2622 if not self
.__IsToken
( "{"):
2623 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2624 if not self
.__SkipToToken
( "}"):
2625 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2627 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2628 Obj
.SectionList
.append(DepexSectionObj
)
2631 if not self
.__GetNextWord
():
2632 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2634 # Encapsulation section appear, UndoToken and return
2635 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2636 self
.SetFileBufferPos(OldPos
)
2639 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2640 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2641 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2642 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2643 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2646 DataSectionObj
= DataSection
.DataSection()
2647 DataSectionObj
.Alignment
= AlignValue
2648 DataSectionObj
.SecType
= self
.__Token
2650 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2651 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2652 if self
.__Token
== 'RELOCS_STRIPPED':
2653 DataSectionObj
.KeepReloc
= False
2655 DataSectionObj
.KeepReloc
= True
2657 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
)
2659 if self
.__IsToken
("="):
2660 if not self
.__GetNextToken
():
2661 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2662 DataSectionObj
.SectFileName
= self
.__Token
2663 if DataSectionObj
.SectFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2664 #do case sensitive check for file path
2665 ErrorCode
, ErrorInfo
= PathClass(NormPath(DataSectionObj
.SectFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2667 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2669 if not self
.__GetCglSection
(DataSectionObj
):
2672 Obj
.SectionList
.append(DataSectionObj
)
2676 ## __GetCglSection() method
2678 # Get compressed or GUIDed section for Obj
2680 # @param self The object pointer
2681 # @param Obj for whom leaf section is got
2682 # @param AlignValue alignment value for complex section
2683 # @retval True Successfully find section statement
2684 # @retval False Not able to find section statement
2686 def __GetCglSection(self
, Obj
, AlignValue
= None):
2688 if self
.__IsKeyword
( "COMPRESS"):
2690 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2693 if not self
.__IsToken
("{"):
2694 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2696 CompressSectionObj
= CompressSection
.CompressSection()
2697 CompressSectionObj
.Alignment
= AlignValue
2698 CompressSectionObj
.CompType
= type
2699 # Recursive sections...
2701 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2702 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2703 if not IsLeafSection
and not IsEncapSection
:
2707 if not self
.__IsToken
( "}"):
2708 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2709 Obj
.SectionList
.append(CompressSectionObj
)
2712 # raise Warning("Compress type not known")
2716 elif self
.__IsKeyword
( "GUIDED"):
2718 if self
.__GetNextGuid
():
2719 GuidValue
= self
.__Token
2721 AttribDict
= self
.__GetGuidAttrib
()
2722 if not self
.__IsToken
("{"):
2723 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2724 GuidSectionObj
= GuidSection
.GuidSection()
2725 GuidSectionObj
.Alignment
= AlignValue
2726 GuidSectionObj
.NameGuid
= GuidValue
2727 GuidSectionObj
.SectionType
= "GUIDED"
2728 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2729 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2730 # Recursive sections...
2732 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2733 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2734 if not IsLeafSection
and not IsEncapSection
:
2737 if not self
.__IsToken
( "}"):
2738 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2739 Obj
.SectionList
.append(GuidSectionObj
)
2745 ## __GetGuidAttri() method
2747 # Get attributes for GUID section
2749 # @param self The object pointer
2750 # @retval AttribDict Dictionary of key-value pair of section attributes
2752 def __GetGuidAttrib(self
):
2755 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
2756 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
2757 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2758 AttribKey
= self
.__Token
2760 if not self
.__IsToken
("="):
2761 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2763 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2764 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2765 AttribDict
[AttribKey
] = self
.__Token
2767 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2768 AttribKey
= self
.__Token
2770 if not self
.__IsToken
("="):
2771 raise Warning("expected '='")
2773 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2774 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2775 AttribDict
[AttribKey
] = self
.__Token
2779 ## __GetEncapsulationSec() method
2781 # Get encapsulation section for FILE
2783 # @param self The object pointer
2784 # @param FfsFile for whom section is got
2785 # @retval True Successfully find section statement
2786 # @retval False Not able to find section statement
2788 def __GetEncapsulationSec(self
, FfsFileObj
):
2790 OldPos
= self
.GetFileBufferPos()
2791 if not self
.__IsKeyword
( "SECTION"):
2792 if len(FfsFileObj
.SectionList
) == 0:
2793 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2798 if self
.__GetAlignment
():
2799 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2800 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2801 AlignValue
= self
.__Token
2803 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2804 self
.SetFileBufferPos(OldPos
)
2809 ## __GetCapsule() method
2811 # Get capsule section contents and store its data into capsule list of self.Profile
2813 # @param self The object pointer
2814 # @retval True Successfully find a capsule
2815 # @retval False Not able to find a capsule
2817 def __GetCapsule(self
):
2819 if not self
.__GetNextToken
():
2822 S
= self
.__Token
.upper()
2823 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2824 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2825 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2830 if not self
.__IsToken
("[CAPSULE.", True):
2831 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2832 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2833 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2834 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2836 CapsuleObj
= Capsule
.Capsule()
2838 CapsuleName
= self
.__GetUiName
()
2840 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2842 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2844 if not self
.__IsToken
( "]"):
2845 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2847 if self
.__IsKeyword
("CREATE_FILE"):
2848 if not self
.__IsToken
( "="):
2849 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2851 if not self
.__GetNextToken
():
2852 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2854 CapsuleObj
.CreateFile
= self
.__Token
2856 self
.__GetCapsuleStatements
(CapsuleObj
)
2857 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
2860 ## __GetCapsuleStatements() method
2862 # Get statements for capsule
2864 # @param self The object pointer
2865 # @param Obj for whom statements are got
2867 def __GetCapsuleStatements(self
, Obj
):
2868 self
.__GetCapsuleTokens
(Obj
)
2869 self
.__GetDefineStatements
(Obj
)
2870 self
.__GetSetStatements
(Obj
)
2871 self
.__GetCapsuleData
(Obj
)
2873 ## __GetCapsuleTokens() method
2875 # Get token statements for capsule
2877 # @param self The object pointer
2878 # @param Obj for whom token statements are got
2880 def __GetCapsuleTokens(self
, Obj
):
2881 if not self
.__GetNextToken
():
2883 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):
2884 Name
= self
.__Token
.strip()
2885 if not self
.__IsToken
("="):
2886 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2887 if not self
.__GetNextToken
():
2888 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2889 if Name
== 'CAPSULE_FLAGS':
2890 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2891 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2892 Value
= self
.__Token
.strip()
2893 while self
.__IsToken
(","):
2895 if not self
.__GetNextToken
():
2896 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2897 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2898 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2899 Value
+= self
.__Token
.strip()
2901 Value
= self
.__Token
.strip()
2902 Obj
.TokensDict
[Name
] = Value
2903 if not self
.__GetNextToken
():
2907 ## __GetCapsuleData() method
2909 # Get capsule data for capsule
2911 # @param self The object pointer
2912 # @param Obj for whom capsule data are got
2914 def __GetCapsuleData(self
, Obj
):
2917 IsInf
= self
.__GetInfStatement
(Obj
, True)
2918 IsFile
= self
.__GetFileStatement
(Obj
, True)
2919 IsFv
= self
.__GetFvStatement
(Obj
)
2920 if not IsInf
and not IsFile
and not IsFv
:
2923 ## __GetFvStatement() method
2925 # Get FV for capsule
2927 # @param self The object pointer
2928 # @param CapsuleObj for whom FV is got
2929 # @retval True Successfully find a FV statement
2930 # @retval False Not able to find a FV statement
2932 def __GetFvStatement(self
, CapsuleObj
):
2934 if not self
.__IsKeyword
("FV"):
2937 if not self
.__IsToken
("="):
2938 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2940 if not self
.__GetNextToken
():
2941 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2943 CapsuleFv
= CapsuleData
.CapsuleFv()
2944 CapsuleFv
.FvName
= self
.__Token
2945 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
2948 ## __GetRule() method
2950 # Get Rule section contents and store its data into rule list of self.Profile
2952 # @param self The object pointer
2953 # @retval True Successfully find a Rule
2954 # @retval False Not able to find a Rule
2956 def __GetRule(self
):
2958 if not self
.__GetNextToken
():
2961 S
= self
.__Token
.upper()
2962 if S
.startswith("[") and not S
.startswith("[RULE."):
2963 if not S
.startswith("[OPTIONROM."):
2964 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2968 if not self
.__IsToken
("[Rule.", True):
2969 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2970 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2971 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2972 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
2974 if not self
.__SkipToToken
("."):
2975 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
2977 Arch
= self
.__SkippedChars
.rstrip(".")
2978 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
2979 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2981 ModuleType
= self
.__GetModuleType
()
2984 if self
.__IsToken
("."):
2985 if not self
.__GetNextWord
():
2986 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
2987 TemplateName
= self
.__Token
2989 if not self
.__IsToken
( "]"):
2990 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2992 RuleObj
= self
.__GetRuleFileStatements
()
2993 RuleObj
.Arch
= Arch
.upper()
2994 RuleObj
.ModuleType
= ModuleType
2995 RuleObj
.TemplateName
= TemplateName
2996 if TemplateName
== '' :
2997 self
.Profile
.RuleDict
['RULE' + \
3001 ModuleType
.upper() ] = RuleObj
3003 self
.Profile
.RuleDict
['RULE' + \
3007 ModuleType
.upper() + \
3009 TemplateName
.upper() ] = RuleObj
3010 # self.Profile.RuleList.append(rule)
3013 ## __GetModuleType() method
3015 # Return the module type
3017 # @param self The object pointer
3018 # @retval string module type
3020 def __GetModuleType(self
):
3022 if not self
.__GetNextWord
():
3023 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3024 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3025 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3026 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3027 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3028 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3029 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3030 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3033 ## __GetFileExtension() method
3035 # Return the file extension
3037 # @param self The object pointer
3038 # @retval string file name extension
3040 def __GetFileExtension(self
):
3041 if not self
.__IsToken
("."):
3042 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3045 if self
.__GetNextToken
():
3046 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3047 if Pattern
.match(self
.__Token
):
3051 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3054 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3056 ## __GetRuleFileStatement() method
3060 # @param self The object pointer
3061 # @retval Rule Rule object
3063 def __GetRuleFileStatements(self
):
3065 if not self
.__IsKeyword
("FILE"):
3066 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3068 if not self
.__GetNextWord
():
3069 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3071 Type
= self
.__Token
.strip().upper()
3072 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3073 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3074 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3076 if not self
.__IsToken
("="):
3077 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3079 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3080 if not self
.__GetNextWord
():
3081 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3082 if self
.__Token
== 'PCD':
3083 if not self
.__IsToken
( "("):
3084 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3085 PcdPair
= self
.__GetNextPcdName
()
3086 if not self
.__IsToken
( ")"):
3087 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3088 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3090 NameGuid
= self
.__Token
3093 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3094 if self
.__FileCouldHaveRelocFlag
(Type
):
3095 if self
.__Token
== 'RELOCS_STRIPPED':
3100 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3103 if self
.__GetNextToken
():
3104 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3105 if Pattern
.match(self
.__Token
):
3106 KeyStringList
.append(self
.__Token
)
3107 if self
.__IsToken
(","):
3108 while self
.__GetNextToken
():
3109 if not Pattern
.match(self
.__Token
):
3110 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3111 KeyStringList
.append(self
.__Token
)
3113 if not self
.__IsToken
(","):
3121 if self
.__IsKeyword
("Fixed", True):
3125 if self
.__IsKeyword
("CheckSum", True):
3129 if self
.__GetAlignment
():
3130 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3131 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3132 #For FFS, Auto is default option same to ""
3133 if not self
.__Token
== "Auto":
3134 AlignValue
= self
.__Token
3136 if self
.__IsToken
("{"):
3137 # Complex file rule expected
3138 Rule
= RuleComplexFile
.RuleComplexFile()
3139 Rule
.FvFileType
= Type
3140 Rule
.NameGuid
= NameGuid
3141 Rule
.Alignment
= AlignValue
3142 Rule
.CheckSum
= CheckSum
3144 Rule
.KeyStringList
= KeyStringList
3145 if KeepReloc
!= None:
3146 Rule
.KeepReloc
= KeepReloc
3149 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3150 IsLeaf
= self
.__GetEfiSection
(Rule
)
3151 if not IsEncapsulate
and not IsLeaf
:
3154 if not self
.__IsToken
("}"):
3155 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3160 # Simple file rule expected
3161 if not self
.__GetNextWord
():
3162 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3164 SectionName
= self
.__Token
3166 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3167 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3168 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3171 if self
.__IsKeyword
("Fixed", True):
3174 if self
.__IsKeyword
("CheckSum", True):
3178 if self
.__GetAlignment
():
3179 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3180 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3181 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3182 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3183 SectAlignment
= self
.__Token
3186 if self
.__IsToken
('|'):
3187 Ext
= self
.__GetFileExtension
()
3188 elif not self
.__GetNextToken
():
3189 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3191 Rule
= RuleSimpleFile
.RuleSimpleFile()
3192 Rule
.SectionType
= SectionName
3193 Rule
.FvFileType
= Type
3194 Rule
.NameGuid
= NameGuid
3195 Rule
.Alignment
= AlignValue
3196 Rule
.SectAlignment
= SectAlignment
3197 Rule
.CheckSum
= CheckSum
3199 Rule
.KeyStringList
= KeyStringList
3200 if KeepReloc
!= None:
3201 Rule
.KeepReloc
= KeepReloc
3202 Rule
.FileExtension
= Ext
3203 Rule
.FileName
= self
.__Token
3206 ## __GetEfiSection() method
3208 # Get section list for Rule
3210 # @param self The object pointer
3211 # @param Obj for whom section is got
3212 # @retval True Successfully find section statement
3213 # @retval False Not able to find section statement
3215 def __GetEfiSection(self
, Obj
):
3217 OldPos
= self
.GetFileBufferPos()
3218 if not self
.__GetNextWord
():
3220 SectionName
= self
.__Token
3222 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3223 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3227 if SectionName
== "FV_IMAGE":
3228 FvImageSectionObj
= FvImageSection
.FvImageSection()
3229 if self
.__IsKeyword
("FV_IMAGE"):
3231 if self
.__IsToken
( "{"):
3233 self
.__GetDefineStatements
(FvObj
)
3234 self
.__GetBlockStatement
(FvObj
)
3235 self
.__GetSetStatements
(FvObj
)
3236 self
.__GetFvAlignment
(FvObj
)
3237 self
.__GetFvAttributes
(FvObj
)
3238 self
.__GetAprioriSection
(FvObj
)
3239 self
.__GetAprioriSection
(FvObj
)
3242 IsInf
= self
.__GetInfStatement
(FvObj
)
3243 IsFile
= self
.__GetFileStatement
(FvObj
)
3244 if not IsInf
and not IsFile
:
3247 if not self
.__IsToken
( "}"):
3248 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3249 FvImageSectionObj
.Fv
= FvObj
3250 FvImageSectionObj
.FvName
= None
3253 if not self
.__IsKeyword
("FV"):
3254 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3255 FvImageSectionObj
.FvFileType
= self
.__Token
3257 if self
.__GetAlignment
():
3258 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3259 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3260 FvImageSectionObj
.Alignment
= self
.__Token
3262 if self
.__IsToken
('|'):
3263 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3264 elif self
.__GetNextToken
():
3265 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3266 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3267 FvImageSectionObj
.FvFileName
= self
.__Token
3271 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3273 Obj
.SectionList
.append(FvImageSectionObj
)
3276 EfiSectionObj
= EfiSection
.EfiSection()
3277 EfiSectionObj
.SectionType
= SectionName
3279 if not self
.__GetNextToken
():
3280 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3282 if self
.__Token
== "STRING":
3283 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3284 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3286 if not self
.__IsToken
('='):
3287 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3289 if not self
.__GetNextToken
():
3290 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3292 if self
.__GetStringData
():
3293 EfiSectionObj
.StringData
= self
.__Token
3295 if self
.__IsKeyword
("BUILD_NUM"):
3296 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3297 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3299 if not self
.__IsToken
("="):
3300 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3301 if not self
.__GetNextToken
():
3302 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3303 EfiSectionObj
.BuildNum
= self
.__Token
3306 EfiSectionObj
.FileType
= self
.__Token
3307 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3309 if self
.__IsKeyword
("Optional"):
3310 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3311 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3312 EfiSectionObj
.Optional
= True
3314 if self
.__IsKeyword
("BUILD_NUM"):
3315 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3316 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3318 if not self
.__IsToken
("="):
3319 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3320 if not self
.__GetNextToken
():
3321 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3322 EfiSectionObj
.BuildNum
= self
.__Token
3324 if self
.__GetAlignment
():
3325 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3326 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3327 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3328 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3329 EfiSectionObj
.Alignment
= self
.__Token
3331 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3332 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3333 if self
.__Token
== 'RELOCS_STRIPPED':
3334 EfiSectionObj
.KeepReloc
= False
3336 EfiSectionObj
.KeepReloc
= True
3337 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3338 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3340 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3343 if self
.__IsToken
('|'):
3344 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3345 elif self
.__GetNextToken
():
3346 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3347 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3349 if self
.__Token
.startswith('PCD'):
3351 self
.__GetNextWord
()
3353 if self
.__Token
== 'PCD':
3354 if not self
.__IsToken
( "("):
3355 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3356 PcdPair
= self
.__GetNextPcdName
()
3357 if not self
.__IsToken
( ")"):
3358 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3359 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3361 EfiSectionObj
.FileName
= self
.__Token
3366 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3368 Obj
.SectionList
.append(EfiSectionObj
)
3371 ## __RuleSectionCouldBeOptional() method
3373 # Get whether a section could be optional
3375 # @param self The object pointer
3376 # @param SectionType The section type to check
3377 # @retval True section could be optional
3378 # @retval False section never optional
3380 def __RuleSectionCouldBeOptional(self
, SectionType
):
3381 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3386 ## __RuleSectionCouldHaveBuildNum() method
3388 # Get whether a section could have build number information
3390 # @param self The object pointer
3391 # @param SectionType The section type to check
3392 # @retval True section could have build number information
3393 # @retval False section never have build number information
3395 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3396 if SectionType
in ("VERSION"):
3401 ## __RuleSectionCouldHaveString() method
3403 # Get whether a section could have string
3405 # @param self The object pointer
3406 # @param SectionType The section type to check
3407 # @retval True section could have string
3408 # @retval False section never have string
3410 def __RuleSectionCouldHaveString(self
, SectionType
):
3411 if SectionType
in ("UI", "VERSION"):
3416 ## __CheckRuleSectionFileType() method
3418 # Get whether a section matches a file type
3420 # @param self The object pointer
3421 # @param SectionType The section type to check
3422 # @param FileType The file type to check
3424 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3425 if SectionType
== "COMPAT16":
3426 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3427 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3428 elif SectionType
== "PE32":
3429 if FileType
not in ("PE32", "SEC_PE32"):
3430 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3431 elif SectionType
== "PIC":
3432 if FileType
not in ("PIC", "PIC"):
3433 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3434 elif SectionType
== "TE":
3435 if FileType
not in ("TE", "SEC_TE"):
3436 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3437 elif SectionType
== "RAW":
3438 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3439 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3440 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3441 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3442 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3443 elif SectionType
== "UI":
3444 if FileType
not in ("UI", "SEC_UI"):
3445 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3446 elif SectionType
== "VERSION":
3447 if FileType
not in ("VERSION", "SEC_VERSION"):
3448 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3449 elif SectionType
== "PEI_DEPEX":
3450 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3451 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3452 elif SectionType
== "GUID":
3453 if FileType
not in ("PE32", "SEC_GUID"):
3454 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3456 ## __GetRuleEncapsulationSection() method
3458 # Get encapsulation section for Rule
3460 # @param self The object pointer
3461 # @param Rule for whom section is got
3462 # @retval True Successfully find section statement
3463 # @retval False Not able to find section statement
3465 def __GetRuleEncapsulationSection(self
, Rule
):
3467 if self
.__IsKeyword
( "COMPRESS"):
3469 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3472 if not self
.__IsToken
("{"):
3473 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3475 CompressSectionObj
= CompressSection
.CompressSection()
3477 CompressSectionObj
.CompType
= Type
3478 # Recursive sections...
3480 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3481 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3482 if not IsEncapsulate
and not IsLeaf
:
3485 if not self
.__IsToken
( "}"):
3486 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3487 Rule
.SectionList
.append(CompressSectionObj
)
3491 elif self
.__IsKeyword
( "GUIDED"):
3493 if self
.__GetNextGuid
():
3494 GuidValue
= self
.__Token
3496 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3497 GuidValue
= self
.__Token
3499 AttribDict
= self
.__GetGuidAttrib
()
3501 if not self
.__IsToken
("{"):
3502 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3503 GuidSectionObj
= GuidSection
.GuidSection()
3504 GuidSectionObj
.NameGuid
= GuidValue
3505 GuidSectionObj
.SectionType
= "GUIDED"
3506 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3507 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3511 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3512 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3513 if not IsEncapsulate
and not IsLeaf
:
3516 if not self
.__IsToken
( "}"):
3517 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3518 Rule
.SectionList
.append(GuidSectionObj
)
3524 ## __GetVtf() method
3526 # Get VTF section contents and store its data into VTF list of self.Profile
3528 # @param self The object pointer
3529 # @retval True Successfully find a VTF
3530 # @retval False Not able to find a VTF
3534 if not self
.__GetNextToken
():
3537 S
= self
.__Token
.upper()
3538 if S
.startswith("[") and not S
.startswith("[VTF."):
3539 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3540 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3545 if not self
.__IsToken
("[VTF.", True):
3546 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3547 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3548 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3549 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3551 if not self
.__SkipToToken
("."):
3552 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3554 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3555 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3556 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3558 if not self
.__GetNextWord
():
3559 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3560 Name
= self
.__Token
.upper()
3563 VtfObj
.UiName
= Name
3564 VtfObj
.KeyArch
= Arch
3566 if self
.__IsToken
(","):
3567 if not self
.__GetNextWord
():
3568 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3569 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3570 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3571 VtfObj
.ArchList
= self
.__Token
.upper()
3573 if not self
.__IsToken
( "]"):
3574 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3576 if self
.__IsKeyword
("IA32_RST_BIN"):
3577 if not self
.__IsToken
("="):
3578 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3580 if not self
.__GetNextToken
():
3581 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3583 VtfObj
.ResetBin
= self
.__Token
3584 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3585 #check for file path
3586 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3588 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3590 while self
.__GetComponentStatement
(VtfObj
):
3593 self
.Profile
.VtfList
.append(VtfObj
)
3596 ## __GetComponentStatement() method
3598 # Get components in VTF
3600 # @param self The object pointer
3601 # @param VtfObj for whom component is got
3602 # @retval True Successfully find a component
3603 # @retval False Not able to find a component
3605 def __GetComponentStatement(self
, VtfObj
):
3607 if not self
.__IsKeyword
("COMP_NAME"):
3610 if not self
.__IsToken
("="):
3611 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3613 if not self
.__GetNextWord
():
3614 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3616 CompStatementObj
= ComponentStatement
.ComponentStatement()
3617 CompStatementObj
.CompName
= self
.__Token
3619 if not self
.__IsKeyword
("COMP_LOC"):
3620 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3622 if not self
.__IsToken
("="):
3623 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3625 CompStatementObj
.CompLoc
= ""
3626 if self
.__GetNextWord
():
3627 CompStatementObj
.CompLoc
= self
.__Token
3628 if self
.__IsToken
('|'):
3629 if not self
.__GetNextWord
():
3630 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3632 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3633 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3635 CompStatementObj
.FilePos
= self
.__Token
3637 self
.CurrentLineNumber
+= 1
3638 self
.CurrentOffsetWithinLine
= 0
3640 if not self
.__IsKeyword
("COMP_TYPE"):
3641 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3643 if not self
.__IsToken
("="):
3644 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3646 if not self
.__GetNextToken
():
3647 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3648 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3649 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3650 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3651 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3652 CompStatementObj
.CompType
= self
.__Token
3654 if not self
.__IsKeyword
("COMP_VER"):
3655 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
3657 if not self
.__IsToken
("="):
3658 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3660 if not self
.__GetNextToken
():
3661 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
3663 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
3664 if Pattern
.match(self
.__Token
) == None:
3665 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3666 CompStatementObj
.CompVer
= self
.__Token
3668 if not self
.__IsKeyword
("COMP_CS"):
3669 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3671 if not self
.__IsToken
("="):
3672 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3674 if not self
.__GetNextToken
():
3675 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3676 if self
.__Token
not in ("1", "0"):
3677 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3678 CompStatementObj
.CompCs
= self
.__Token
3681 if not self
.__IsKeyword
("COMP_BIN"):
3682 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3684 if not self
.__IsToken
("="):
3685 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3687 if not self
.__GetNextToken
():
3688 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3690 CompStatementObj
.CompBin
= self
.__Token
3691 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3692 #check for file path
3693 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3695 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3697 if not self
.__IsKeyword
("COMP_SYM"):
3698 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3700 if not self
.__IsToken
("="):
3701 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3703 if not self
.__GetNextToken
():
3704 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3706 CompStatementObj
.CompSym
= self
.__Token
3707 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
3708 #check for file path
3709 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3711 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3713 if not self
.__IsKeyword
("COMP_SIZE"):
3714 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3716 if not self
.__IsToken
("="):
3717 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3719 if self
.__IsToken
("-"):
3720 CompStatementObj
.CompSize
= self
.__Token
3721 elif self
.__GetNextDecimalNumber
():
3722 CompStatementObj
.CompSize
= self
.__Token
3723 elif self
.__GetNextHexNumber
():
3724 CompStatementObj
.CompSize
= self
.__Token
3726 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3728 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3731 ## __GetOptionRom() method
3733 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3735 # @param self The object pointer
3736 # @retval True Successfully find a OptionROM
3737 # @retval False Not able to find a OptionROM
3739 def __GetOptionRom(self
):
3741 if not self
.__GetNextToken
():
3744 S
= self
.__Token
.upper()
3745 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3746 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3749 if not self
.__IsToken
("[OptionRom.", True):
3750 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3752 OptRomName
= self
.__GetUiName
()
3754 if not self
.__IsToken
( "]"):
3755 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3757 OptRomObj
= OptionRom
.OPTIONROM()
3758 OptRomObj
.DriverName
= OptRomName
3759 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3762 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3763 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3764 if not isInf
and not isFile
:
3769 ## __GetOptRomInfStatement() method
3771 # Get INF statements
3773 # @param self The object pointer
3774 # @param Obj for whom inf statement is got
3775 # @retval True Successfully find inf statement
3776 # @retval False Not able to find inf statement
3778 def __GetOptRomInfStatement(self
, Obj
):
3780 if not self
.__IsKeyword
( "INF"):
3783 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3784 self
.__GetInfOptions
( ffsInf
)
3786 if not self
.__GetNextToken
():
3787 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3788 ffsInf
.InfFileName
= self
.__Token
3789 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3790 #check for file path
3791 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3793 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3795 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
3796 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
3799 self
.__GetOptRomOverrides
(ffsInf
)
3801 Obj
.FfsList
.append(ffsInf
)
3804 ## __GetOptRomOverrides() method
3806 # Get overrides for OptROM INF & FILE
3808 # @param self The object pointer
3809 # @param FfsInfObj for whom overrides is got
3811 def __GetOptRomOverrides(self
, Obj
):
3812 if self
.__IsToken
('{'):
3813 Overrides
= OptionRom
.OverrideAttribs()
3815 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
3816 if not self
.__IsToken
( "="):
3817 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3818 if not self
.__GetNextHexNumber
():
3819 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
3820 Overrides
.PciVendorId
= self
.__Token
3823 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
3824 if not self
.__IsToken
( "="):
3825 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3826 if not self
.__GetNextHexNumber
():
3827 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
3828 Overrides
.PciClassCode
= self
.__Token
3831 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
3832 if not self
.__IsToken
( "="):
3833 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3834 if not self
.__GetNextHexNumber
():
3835 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
3837 Overrides
.PciDeviceId
= self
.__Token
3840 if self
.__IsKeyword
( "PCI_REVISION"):
3841 if not self
.__IsToken
( "="):
3842 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3843 if not self
.__GetNextHexNumber
():
3844 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
3845 Overrides
.PciRevision
= self
.__Token
3848 if self
.__IsKeyword
( "COMPRESS"):
3849 if not self
.__IsToken
( "="):
3850 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3851 if not self
.__GetNextToken
():
3852 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
3853 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
3856 if self
.__IsToken
( "}"):
3859 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
3861 Obj
.OverrideAttribs
= Overrides
3863 ## __GetOptRomFileStatement() method
3865 # Get FILE statements
3867 # @param self The object pointer
3868 # @param Obj for whom FILE statement is got
3869 # @retval True Successfully find FILE statement
3870 # @retval False Not able to find FILE statement
3872 def __GetOptRomFileStatement(self
, Obj
):
3874 if not self
.__IsKeyword
( "FILE"):
3877 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
3879 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
3880 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
3881 FfsFileObj
.FileType
= self
.__Token
3883 if not self
.__GetNextToken
():
3884 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
3885 FfsFileObj
.FileName
= self
.__Token
3886 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3887 #check for file path
3888 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3890 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3892 if FfsFileObj
.FileType
== 'EFI':
3893 self
.__GetOptRomOverrides
(FfsFileObj
)
3895 Obj
.FfsList
.append(FfsFileObj
)
3899 ## __GetCapInFd() method
3901 # Get Cap list contained in FD
3903 # @param self The object pointer
3904 # @param FdName FD name
3905 # @retval CapList List of Capsule in FD
3907 def __GetCapInFd (self
, FdName
):
3910 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3911 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3912 for elementRegion
in FdObj
.RegionList
:
3913 if elementRegion
.RegionType
== 'CAPSULE':
3914 for elementRegionData
in elementRegion
.RegionDataList
:
3915 if elementRegionData
.endswith(".cap"):
3917 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
3918 CapList
.append(elementRegionData
.upper())
3921 ## __GetReferencedFdCapTuple() method
3923 # Get FV and FD list referenced by a capsule image
3925 # @param self The object pointer
3926 # @param CapObj Capsule section to be searched
3927 # @param RefFdList referenced FD by section
3928 # @param RefFvList referenced FV by section
3930 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
3932 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
3933 if CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
3934 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
3935 elif CapsuleDataObj
.Ffs
!= None:
3936 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
3937 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
3938 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
3939 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
3940 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
3942 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
3944 ## __GetFvInFd() method
3946 # Get FV list contained in FD
3948 # @param self The object pointer
3949 # @param FdName FD name
3950 # @retval FvList list of FV in FD
3952 def __GetFvInFd (self
, FdName
):
3955 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3956 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3957 for elementRegion
in FdObj
.RegionList
:
3958 if elementRegion
.RegionType
== 'FV':
3959 for elementRegionData
in elementRegion
.RegionDataList
:
3960 if elementRegionData
.endswith(".fv"):
3962 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3963 FvList
.append(elementRegionData
.upper())
3966 ## __GetReferencedFdFvTuple() method
3968 # Get FD and FV list referenced by a FFS file
3970 # @param self The object pointer
3971 # @param FfsFile contains sections to be searched
3972 # @param RefFdList referenced FD by section
3973 # @param RefFvList referenced FV by section
3975 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3977 for FfsObj
in FvObj
.FfsList
:
3978 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3979 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3980 RefFvList
.append(FfsObj
.FvName
.upper())
3981 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3982 RefFdList
.append(FfsObj
.FdName
.upper())
3984 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3986 ## __GetReferencedFdFvTupleFromSection() method
3988 # Get FD and FV list referenced by a FFS section
3990 # @param self The object pointer
3991 # @param FfsFile contains sections to be searched
3992 # @param FdList referenced FD by section
3993 # @param FvList referenced FV by section
3995 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3998 SectionStack
.extend(FfsFile
.SectionList
)
3999 while SectionStack
!= []:
4000 SectionObj
= SectionStack
.pop()
4001 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4002 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4003 FvList
.append(SectionObj
.FvName
.upper())
4004 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4005 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4006 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4008 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4009 SectionStack
.extend(SectionObj
.SectionList
)
4011 ## CycleReferenceCheck() method
4013 # Check whether cycle reference exists in FDF
4015 # @param self The object pointer
4016 # @retval True cycle reference exists
4017 # @retval False Not exists cycle reference
4019 def CycleReferenceCheck(self
):
4021 # Check the cycle between FV and FD image
4023 MaxLength
= len (self
.Profile
.FvDict
)
4024 for FvName
in self
.Profile
.FvDict
.keys():
4025 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4027 RefFvStack
.append(FvName
)
4031 while RefFvStack
!= [] and Index
< MaxLength
:
4033 FvNameFromStack
= RefFvStack
.pop()
4034 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4035 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4041 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4043 for RefFdName
in RefFdList
:
4044 if RefFdName
in FdAnalyzedList
:
4047 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4048 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4049 if FvInFdList
!= []:
4050 for FvNameInFd
in FvInFdList
:
4051 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4052 if FvNameInFd
not in RefFvStack
:
4053 RefFvStack
.append(FvNameInFd
)
4055 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4056 EdkLogger
.info(LogStr
)
4058 FdAnalyzedList
.append(RefFdName
)
4060 for RefFvName
in RefFvList
:
4061 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4062 if RefFvName
not in RefFvStack
:
4063 RefFvStack
.append(RefFvName
)
4065 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4066 EdkLogger
.info(LogStr
)
4070 # Check the cycle between Capsule and FD image
4072 MaxLength
= len (self
.Profile
.CapsuleDict
)
4073 for CapName
in self
.Profile
.CapsuleDict
.keys():
4075 # Capsule image to be checked.
4077 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4079 RefCapStack
.append(CapName
)
4084 while RefCapStack
!= [] and Index
< MaxLength
:
4086 CapNameFromStack
= RefCapStack
.pop()
4087 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4088 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4094 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4098 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4099 for RefFdName
in RefFdList
:
4100 if RefFdName
in FdAnalyzedList
:
4103 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4104 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4105 if CapInFdList
!= []:
4106 for CapNameInFd
in CapInFdList
:
4107 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4108 if CapNameInFd
not in RefCapStack
:
4109 RefCapStack
.append(CapNameInFd
)
4111 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4112 EdkLogger
.info(LogStr
)
4115 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4116 if FvInFdList
!= []:
4117 for FvNameInFd
in FvInFdList
:
4118 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4119 if FvNameInFd
not in RefFvList
:
4120 RefFvList
.append(FvNameInFd
)
4122 FdAnalyzedList
.append(RefFdName
)
4124 # the number of the parsed FV and FD image
4126 FvListLength
= len (RefFvList
)
4127 FdListLength
= len (RefFdList
)
4128 for RefFvName
in RefFvList
:
4129 if RefFvName
in FvAnalyzedList
:
4131 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4132 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4133 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4136 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4137 FvAnalyzedList
.append(RefFvName
)
4141 if __name__
== "__main__":
4142 parser
= FdfParser("..\LakeportX64Pkg.fdf")
4145 parser
.CycleReferenceCheck()