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
.__GetFvAlignment
(FvObj
)
1932 self
.__GetFvAttributes
(FvObj
)
1934 self
.__GetFvNameGuid
(FvObj
)
1936 FvObj
.FvExtEntryTypeValue
= []
1937 FvObj
.FvExtEntryType
= []
1938 FvObj
.FvExtEntryData
= []
1940 isFvExtEntry
= self
.__GetFvExtEntryStatement
(FvObj
)
1941 if not isFvExtEntry
:
1944 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1945 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1948 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1949 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1950 if not isInf
and not isFile
:
1955 ## __GetFvAlignment() method
1957 # Get alignment for FV
1959 # @param self The object pointer
1960 # @param Obj for whom alignment is got
1961 # @retval True Successfully find a alignment statement
1962 # @retval False Not able to find a alignment statement
1964 def __GetFvAlignment(self
, Obj
):
1966 if not self
.__IsKeyword
( "FvAlignment"):
1969 if not self
.__IsToken
( "="):
1970 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1972 if not self
.__GetNextToken
():
1973 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
1975 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1976 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1977 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1979 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1980 Obj
.FvAlignment
= self
.__Token
1983 ## __GetFvAttributes() method
1985 # Get attributes for FV
1987 # @param self The object pointer
1988 # @param Obj for whom attribute is got
1991 def __GetFvAttributes(self
, FvObj
):
1993 while self
.__GetNextWord
():
1995 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
1996 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
1997 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
1998 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
1999 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2000 "WRITE_POLICY_RELIABLE"):
2004 if not self
.__IsToken
( "="):
2005 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2007 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2008 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2010 FvObj
.FvAttributeDict
[name
] = self
.__Token
2014 ## __GetFvNameGuid() method
2016 # Get FV GUID for FV
2018 # @param self The object pointer
2019 # @param Obj for whom GUID is got
2022 def __GetFvNameGuid(self
, FvObj
):
2024 if not self
.__IsKeyword
( "FvNameGuid"):
2027 if not self
.__IsToken
( "="):
2028 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2030 if not self
.__GetNextGuid
():
2031 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2033 FvObj
.FvNameGuid
= self
.__Token
2037 def __GetFvExtEntryStatement(self
, FvObj
):
2039 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2042 if not self
.__IsKeyword
("TYPE"):
2043 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2045 if not self
.__IsToken
( "="):
2046 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2048 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2049 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2051 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2053 if not self
.__IsToken
( "{"):
2054 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2056 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2057 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2059 FvObj
.FvExtEntryType
+= [self
.__Token
]
2061 if self
.__Token
== 'DATA':
2063 if not self
.__IsToken
( "="):
2064 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2066 if not self
.__IsToken
( "{"):
2067 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2069 if not self
.__GetNextHexNumber
():
2070 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2072 if len(self
.__Token
) > 4:
2073 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2075 DataString
= self
.__Token
2078 while self
.__IsToken
(","):
2079 if not self
.__GetNextHexNumber
():
2080 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2081 if len(self
.__Token
) > 4:
2082 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2083 DataString
+= self
.__Token
2086 if not self
.__IsToken
( "}"):
2087 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2089 if not self
.__IsToken
( "}"):
2090 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2092 DataString
= DataString
.rstrip(",")
2093 FvObj
.FvExtEntryData
+= [DataString
]
2095 if self
.__Token
== 'FILE':
2097 if not self
.__IsToken
( "="):
2098 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2100 if not self
.__GetNextToken
():
2101 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2103 FvObj
.FvExtEntryData
+= [self
.__Token
]
2105 if not self
.__IsToken
( "}"):
2106 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2110 ## __GetAprioriSection() method
2112 # Get token statements
2114 # @param self The object pointer
2115 # @param FvObj for whom apriori is got
2116 # @param MacroDict dictionary used to replace macro
2117 # @retval True Successfully find apriori statement
2118 # @retval False Not able to find apriori statement
2120 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2122 if not self
.__IsKeyword
( "APRIORI"):
2125 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2126 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2127 AprType
= self
.__Token
2129 if not self
.__IsToken
( "{"):
2130 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2132 AprSectionObj
= AprioriSection
.AprioriSection()
2133 AprSectionObj
.AprioriType
= AprType
2135 self
.__GetDefineStatements
(AprSectionObj
)
2136 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2139 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2140 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2141 if not IsInf
and not IsFile
:
2144 if not self
.__IsToken
( "}"):
2145 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2147 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2150 ## __GetInfStatement() method
2152 # Get INF statements
2154 # @param self The object pointer
2155 # @param Obj for whom inf statement is got
2156 # @param MacroDict dictionary used to replace macro
2157 # @retval True Successfully find inf statement
2158 # @retval False Not able to find inf statement
2160 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2162 if not self
.__IsKeyword
( "INF"):
2165 ffsInf
= FfsInfStatement
.FfsInfStatement()
2166 self
.__GetInfOptions
( ffsInf
)
2168 if not self
.__GetNextToken
():
2169 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2170 ffsInf
.InfFileName
= self
.__Token
2171 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2172 #do case sensitive check for file path
2173 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2175 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2177 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2178 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2180 if self
.__IsToken
('|'):
2181 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2182 ffsInf
.KeepReloc
= False
2183 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2184 ffsInf
.KeepReloc
= True
2186 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2189 capsuleFfs
= CapsuleData
.CapsuleFfs()
2190 capsuleFfs
.Ffs
= ffsInf
2191 Obj
.CapsuleDataList
.append(capsuleFfs
)
2193 Obj
.FfsList
.append(ffsInf
)
2196 ## __GetInfOptions() method
2198 # Get options for INF
2200 # @param self The object pointer
2201 # @param FfsInfObj for whom option is got
2203 def __GetInfOptions(self
, FfsInfObj
):
2205 if self
.__IsKeyword
( "RuleOverride"):
2206 if not self
.__IsToken
( "="):
2207 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2208 if not self
.__GetNextToken
():
2209 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2210 FfsInfObj
.Rule
= self
.__Token
2212 if self
.__IsKeyword
( "VERSION"):
2213 if not self
.__IsToken
( "="):
2214 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2215 if not self
.__GetNextToken
():
2216 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2218 if self
.__GetStringData
():
2219 FfsInfObj
.Version
= self
.__Token
2221 if self
.__IsKeyword
( "UI"):
2222 if not self
.__IsToken
( "="):
2223 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2224 if not self
.__GetNextToken
():
2225 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2227 if self
.__GetStringData
():
2228 FfsInfObj
.Ui
= self
.__Token
2230 if self
.__IsKeyword
( "USE"):
2231 if not self
.__IsToken
( "="):
2232 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2233 if not self
.__GetNextToken
():
2234 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2235 FfsInfObj
.UseArch
= self
.__Token
2238 if self
.__GetNextToken
():
2239 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2240 if p
.match(self
.__Token
):
2241 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2242 if not self
.__IsToken
(","):
2248 while self
.__GetNextToken
():
2249 if not p
.match(self
.__Token
):
2250 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2251 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2253 if not self
.__IsToken
(","):
2256 ## __GetFileStatement() method
2258 # Get FILE statements
2260 # @param self The object pointer
2261 # @param Obj for whom FILE statement is got
2262 # @param MacroDict dictionary used to replace macro
2263 # @retval True Successfully find FILE statement
2264 # @retval False Not able to find FILE statement
2266 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2268 if not self
.__IsKeyword
( "FILE"):
2271 FfsFileObj
= FfsFileStatement
.FileStatement()
2273 if not self
.__GetNextWord
():
2274 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2275 FfsFileObj
.FvFileType
= self
.__Token
2277 if not self
.__IsToken
( "="):
2278 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2280 if not self
.__GetNextGuid
():
2281 if not self
.__GetNextWord
():
2282 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2283 if self
.__Token
== 'PCD':
2284 if not self
.__IsToken
( "("):
2285 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2286 PcdPair
= self
.__GetNextPcdName
()
2287 if not self
.__IsToken
( ")"):
2288 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2289 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2291 FfsFileObj
.NameGuid
= self
.__Token
2293 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2296 capsuleFfs
= CapsuleData
.CapsuleFfs()
2297 capsuleFfs
.Ffs
= FfsFileObj
2298 Obj
.CapsuleDataList
.append(capsuleFfs
)
2300 Obj
.FfsList
.append(FfsFileObj
)
2304 ## __FileCouldHaveRelocFlag() method
2306 # Check whether reloc strip flag can be set for a file type.
2308 # @param self The object pointer
2309 # @param FileType The file type to check with
2310 # @retval True This type could have relocation strip flag
2311 # @retval False No way to have it
2314 def __FileCouldHaveRelocFlag (self
, FileType
):
2315 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2320 ## __SectionCouldHaveRelocFlag() method
2322 # Check whether reloc strip flag can be set for a section type.
2324 # @param self The object pointer
2325 # @param SectionType The section type to check with
2326 # @retval True This type could have relocation strip flag
2327 # @retval False No way to have it
2330 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2331 if SectionType
in ('TE', 'PE32'):
2336 ## __GetFilePart() method
2338 # Get components for FILE statement
2340 # @param self The object pointer
2341 # @param FfsFileObj for whom component is got
2342 # @param MacroDict dictionary used to replace macro
2344 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2346 self
.__GetFileOpts
( FfsFileObj
)
2348 if not self
.__IsToken
("{"):
2349 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2350 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2351 # if self.__Token == 'RELOCS_STRIPPED':
2352 # FfsFileObj.KeepReloc = False
2354 # FfsFileObj.KeepReloc = True
2356 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2358 # if not self.__IsToken("{"):
2359 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2361 if not self
.__GetNextToken
():
2362 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2364 if self
.__Token
== "FV":
2365 if not self
.__IsToken
( "="):
2366 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2367 if not self
.__GetNextToken
():
2368 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2369 FfsFileObj
.FvName
= self
.__Token
2371 elif self
.__Token
== "FD":
2372 if not self
.__IsToken
( "="):
2373 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2374 if not self
.__GetNextToken
():
2375 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2376 FfsFileObj
.FdName
= self
.__Token
2378 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2380 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2382 FfsFileObj
.FileName
= self
.__Token
2383 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2384 #do case sensitive check for file path
2385 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2387 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2389 if not self
.__IsToken
( "}"):
2390 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2392 ## __GetFileOpts() method
2394 # Get options for FILE statement
2396 # @param self The object pointer
2397 # @param FfsFileObj for whom options is got
2399 def __GetFileOpts(self
, FfsFileObj
):
2401 if self
.__GetNextToken
():
2402 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2403 if Pattern
.match(self
.__Token
):
2404 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2405 if self
.__IsToken
(","):
2406 while self
.__GetNextToken
():
2407 if not Pattern
.match(self
.__Token
):
2408 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2409 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2411 if not self
.__IsToken
(","):
2417 if self
.__IsKeyword
( "FIXED", True):
2418 FfsFileObj
.Fixed
= True
2420 if self
.__IsKeyword
( "CHECKSUM", True):
2421 FfsFileObj
.CheckSum
= True
2423 if self
.__GetAlignment
():
2424 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2425 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2426 #For FFS, Auto is default option same to ""
2427 if not self
.__Token
== "Auto":
2428 FfsFileObj
.Alignment
= self
.__Token
2430 ## __GetAlignment() method
2432 # Return the alignment value
2434 # @param self The object pointer
2435 # @retval True Successfully find alignment
2436 # @retval False Not able to find alignment
2438 def __GetAlignment(self
):
2439 if self
.__IsKeyword
( "Align", True):
2440 if not self
.__IsToken
( "="):
2441 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2443 if not self
.__GetNextToken
():
2444 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2449 ## __GetFilePart() method
2451 # Get section data for FILE statement
2453 # @param self The object pointer
2454 # @param FfsFileObj for whom section is got
2455 # @param MacroDict dictionary used to replace macro
2457 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2459 Dict
.update(MacroDict
)
2461 self
.__GetDefineStatements
(FfsFileObj
)
2463 Dict
.update(FfsFileObj
.DefineVarDict
)
2464 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2465 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2468 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2469 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2470 if not IsLeafSection
and not IsEncapSection
:
2473 ## __GetLeafSection() method
2475 # Get leaf section for Obj
2477 # @param self The object pointer
2478 # @param Obj for whom leaf section is got
2479 # @param MacroDict dictionary used to replace macro
2480 # @retval True Successfully find section statement
2481 # @retval False Not able to find section statement
2483 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2485 OldPos
= self
.GetFileBufferPos()
2487 if not self
.__IsKeyword
( "SECTION"):
2488 if len(Obj
.SectionList
) == 0:
2489 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2494 if self
.__GetAlignment
():
2495 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2496 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2497 AlignValue
= self
.__Token
2500 if self
.__IsKeyword
( "BUILD_NUM"):
2501 if not self
.__IsToken
( "="):
2502 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2504 if not self
.__GetNextToken
():
2505 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2507 BuildNum
= self
.__Token
2509 if self
.__IsKeyword
( "VERSION"):
2510 if AlignValue
== 'Auto':
2511 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2512 if not self
.__IsToken
( "="):
2513 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2514 if not self
.__GetNextToken
():
2515 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2516 VerSectionObj
= VerSection
.VerSection()
2517 VerSectionObj
.Alignment
= AlignValue
2518 VerSectionObj
.BuildNum
= BuildNum
2519 if self
.__GetStringData
():
2520 VerSectionObj
.StringData
= self
.__Token
2522 VerSectionObj
.FileName
= self
.__Token
2523 Obj
.SectionList
.append(VerSectionObj
)
2525 elif self
.__IsKeyword
( "UI"):
2526 if AlignValue
== 'Auto':
2527 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2528 if not self
.__IsToken
( "="):
2529 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2530 if not self
.__GetNextToken
():
2531 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2532 UiSectionObj
= UiSection
.UiSection()
2533 UiSectionObj
.Alignment
= AlignValue
2534 if self
.__GetStringData
():
2535 UiSectionObj
.StringData
= self
.__Token
2537 UiSectionObj
.FileName
= self
.__Token
2538 Obj
.SectionList
.append(UiSectionObj
)
2540 elif self
.__IsKeyword
( "FV_IMAGE"):
2541 if AlignValue
== 'Auto':
2542 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2543 if not self
.__IsToken
( "="):
2544 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2545 if not self
.__GetNextToken
():
2546 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2548 FvName
= self
.__Token
2551 if self
.__IsToken
( "{"):
2553 FvObj
.UiFvName
= FvName
.upper()
2554 self
.__GetDefineStatements
(FvObj
)
2555 MacroDict
.update(FvObj
.DefineVarDict
)
2556 self
.__GetBlockStatement
(FvObj
)
2557 self
.__GetSetStatements
(FvObj
)
2558 self
.__GetFvAlignment
(FvObj
)
2559 self
.__GetFvAttributes
(FvObj
)
2560 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2561 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2564 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2565 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2566 if not IsInf
and not IsFile
:
2569 if not self
.__IsToken
( "}"):
2570 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2572 FvImageSectionObj
= FvImageSection
.FvImageSection()
2573 FvImageSectionObj
.Alignment
= AlignValue
2575 FvImageSectionObj
.Fv
= FvObj
2576 FvImageSectionObj
.FvName
= None
2578 FvImageSectionObj
.FvName
= FvName
.upper()
2579 FvImageSectionObj
.FvFileName
= FvName
2581 Obj
.SectionList
.append(FvImageSectionObj
)
2583 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2584 if AlignValue
== 'Auto':
2585 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2586 DepexSectionObj
= DepexSection
.DepexSection()
2587 DepexSectionObj
.Alignment
= AlignValue
2588 DepexSectionObj
.DepexType
= self
.__Token
2590 if not self
.__IsToken
( "="):
2591 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2592 if not self
.__IsToken
( "{"):
2593 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2594 if not self
.__SkipToToken
( "}"):
2595 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2597 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2598 Obj
.SectionList
.append(DepexSectionObj
)
2601 if not self
.__GetNextWord
():
2602 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2604 # Encapsulation section appear, UndoToken and return
2605 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2606 self
.SetFileBufferPos(OldPos
)
2609 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2610 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2611 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2612 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2613 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2616 DataSectionObj
= DataSection
.DataSection()
2617 DataSectionObj
.Alignment
= AlignValue
2618 DataSectionObj
.SecType
= self
.__Token
2620 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2621 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2622 if self
.__Token
== 'RELOCS_STRIPPED':
2623 DataSectionObj
.KeepReloc
= False
2625 DataSectionObj
.KeepReloc
= True
2627 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
)
2629 if self
.__IsToken
("="):
2630 if not self
.__GetNextToken
():
2631 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2632 DataSectionObj
.SectFileName
= self
.__Token
2633 if DataSectionObj
.SectFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2634 #do case sensitive check for file path
2635 ErrorCode
, ErrorInfo
= PathClass(NormPath(DataSectionObj
.SectFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2637 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2639 if not self
.__GetCglSection
(DataSectionObj
):
2642 Obj
.SectionList
.append(DataSectionObj
)
2646 ## __GetCglSection() method
2648 # Get compressed or GUIDed section for Obj
2650 # @param self The object pointer
2651 # @param Obj for whom leaf section is got
2652 # @param AlignValue alignment value for complex section
2653 # @retval True Successfully find section statement
2654 # @retval False Not able to find section statement
2656 def __GetCglSection(self
, Obj
, AlignValue
= None):
2658 if self
.__IsKeyword
( "COMPRESS"):
2660 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2663 if not self
.__IsToken
("{"):
2664 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2666 CompressSectionObj
= CompressSection
.CompressSection()
2667 CompressSectionObj
.Alignment
= AlignValue
2668 CompressSectionObj
.CompType
= type
2669 # Recursive sections...
2671 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2672 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2673 if not IsLeafSection
and not IsEncapSection
:
2677 if not self
.__IsToken
( "}"):
2678 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2679 Obj
.SectionList
.append(CompressSectionObj
)
2682 # raise Warning("Compress type not known")
2686 elif self
.__IsKeyword
( "GUIDED"):
2688 if self
.__GetNextGuid
():
2689 GuidValue
= self
.__Token
2691 AttribDict
= self
.__GetGuidAttrib
()
2692 if not self
.__IsToken
("{"):
2693 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2694 GuidSectionObj
= GuidSection
.GuidSection()
2695 GuidSectionObj
.Alignment
= AlignValue
2696 GuidSectionObj
.NameGuid
= GuidValue
2697 GuidSectionObj
.SectionType
= "GUIDED"
2698 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2699 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2700 # Recursive sections...
2702 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2703 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2704 if not IsLeafSection
and not IsEncapSection
:
2707 if not self
.__IsToken
( "}"):
2708 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2709 Obj
.SectionList
.append(GuidSectionObj
)
2715 ## __GetGuidAttri() method
2717 # Get attributes for GUID section
2719 # @param self The object pointer
2720 # @retval AttribDict Dictionary of key-value pair of section attributes
2722 def __GetGuidAttrib(self
):
2725 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
2726 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
2727 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2728 AttribKey
= self
.__Token
2730 if not self
.__IsToken
("="):
2731 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2733 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2734 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2735 AttribDict
[AttribKey
] = self
.__Token
2737 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2738 AttribKey
= self
.__Token
2740 if not self
.__IsToken
("="):
2741 raise Warning("expected '='")
2743 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2744 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2745 AttribDict
[AttribKey
] = self
.__Token
2749 ## __GetEncapsulationSec() method
2751 # Get encapsulation section for FILE
2753 # @param self The object pointer
2754 # @param FfsFile for whom section is got
2755 # @retval True Successfully find section statement
2756 # @retval False Not able to find section statement
2758 def __GetEncapsulationSec(self
, FfsFileObj
):
2760 OldPos
= self
.GetFileBufferPos()
2761 if not self
.__IsKeyword
( "SECTION"):
2762 if len(FfsFileObj
.SectionList
) == 0:
2763 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2768 if self
.__GetAlignment
():
2769 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2770 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2771 AlignValue
= self
.__Token
2773 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2774 self
.SetFileBufferPos(OldPos
)
2779 ## __GetCapsule() method
2781 # Get capsule section contents and store its data into capsule list of self.Profile
2783 # @param self The object pointer
2784 # @retval True Successfully find a capsule
2785 # @retval False Not able to find a capsule
2787 def __GetCapsule(self
):
2789 if not self
.__GetNextToken
():
2792 S
= self
.__Token
.upper()
2793 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2794 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2795 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2800 if not self
.__IsToken
("[CAPSULE.", True):
2801 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2802 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2803 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2804 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2806 CapsuleObj
= Capsule
.Capsule()
2808 CapsuleName
= self
.__GetUiName
()
2810 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2812 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2814 if not self
.__IsToken
( "]"):
2815 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2817 if self
.__IsKeyword
("CREATE_FILE"):
2818 if not self
.__IsToken
( "="):
2819 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2821 if not self
.__GetNextToken
():
2822 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2824 CapsuleObj
.CreateFile
= self
.__Token
2826 self
.__GetCapsuleStatements
(CapsuleObj
)
2827 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
2830 ## __GetCapsuleStatements() method
2832 # Get statements for capsule
2834 # @param self The object pointer
2835 # @param Obj for whom statements are got
2837 def __GetCapsuleStatements(self
, Obj
):
2838 self
.__GetCapsuleTokens
(Obj
)
2839 self
.__GetDefineStatements
(Obj
)
2840 self
.__GetSetStatements
(Obj
)
2841 self
.__GetCapsuleData
(Obj
)
2843 ## __GetCapsuleTokens() method
2845 # Get token statements for capsule
2847 # @param self The object pointer
2848 # @param Obj for whom token statements are got
2850 def __GetCapsuleTokens(self
, Obj
):
2851 if not self
.__GetNextToken
():
2853 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):
2854 Name
= self
.__Token
.strip()
2855 if not self
.__IsToken
("="):
2856 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2857 if not self
.__GetNextToken
():
2858 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2859 if Name
== 'CAPSULE_FLAGS':
2860 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2861 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2862 Value
= self
.__Token
.strip()
2863 while self
.__IsToken
(","):
2865 if not self
.__GetNextToken
():
2866 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2867 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2868 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2869 Value
+= self
.__Token
.strip()
2871 Value
= self
.__Token
.strip()
2872 Obj
.TokensDict
[Name
] = Value
2873 if not self
.__GetNextToken
():
2877 ## __GetCapsuleData() method
2879 # Get capsule data for capsule
2881 # @param self The object pointer
2882 # @param Obj for whom capsule data are got
2884 def __GetCapsuleData(self
, Obj
):
2887 IsInf
= self
.__GetInfStatement
(Obj
, True)
2888 IsFile
= self
.__GetFileStatement
(Obj
, True)
2889 IsFv
= self
.__GetFvStatement
(Obj
)
2890 if not IsInf
and not IsFile
and not IsFv
:
2893 ## __GetFvStatement() method
2895 # Get FV for capsule
2897 # @param self The object pointer
2898 # @param CapsuleObj for whom FV is got
2899 # @retval True Successfully find a FV statement
2900 # @retval False Not able to find a FV statement
2902 def __GetFvStatement(self
, CapsuleObj
):
2904 if not self
.__IsKeyword
("FV"):
2907 if not self
.__IsToken
("="):
2908 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2910 if not self
.__GetNextToken
():
2911 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2913 CapsuleFv
= CapsuleData
.CapsuleFv()
2914 CapsuleFv
.FvName
= self
.__Token
2915 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
2918 ## __GetRule() method
2920 # Get Rule section contents and store its data into rule list of self.Profile
2922 # @param self The object pointer
2923 # @retval True Successfully find a Rule
2924 # @retval False Not able to find a Rule
2926 def __GetRule(self
):
2928 if not self
.__GetNextToken
():
2931 S
= self
.__Token
.upper()
2932 if S
.startswith("[") and not S
.startswith("[RULE."):
2933 if not S
.startswith("[OPTIONROM."):
2934 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2938 if not self
.__IsToken
("[Rule.", True):
2939 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2940 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2941 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2942 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
2944 if not self
.__SkipToToken
("."):
2945 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
2947 Arch
= self
.__SkippedChars
.rstrip(".")
2948 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
2949 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
2951 ModuleType
= self
.__GetModuleType
()
2954 if self
.__IsToken
("."):
2955 if not self
.__GetNextWord
():
2956 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
2957 TemplateName
= self
.__Token
2959 if not self
.__IsToken
( "]"):
2960 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2962 RuleObj
= self
.__GetRuleFileStatements
()
2963 RuleObj
.Arch
= Arch
.upper()
2964 RuleObj
.ModuleType
= ModuleType
2965 RuleObj
.TemplateName
= TemplateName
2966 if TemplateName
== '' :
2967 self
.Profile
.RuleDict
['RULE' + \
2971 ModuleType
.upper() ] = RuleObj
2973 self
.Profile
.RuleDict
['RULE' + \
2977 ModuleType
.upper() + \
2979 TemplateName
.upper() ] = RuleObj
2980 # self.Profile.RuleList.append(rule)
2983 ## __GetModuleType() method
2985 # Return the module type
2987 # @param self The object pointer
2988 # @retval string module type
2990 def __GetModuleType(self
):
2992 if not self
.__GetNextWord
():
2993 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
2994 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
2995 "DXE_DRIVER", "DXE_SAL_DRIVER", \
2996 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
2997 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
2998 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
2999 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3000 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3003 ## __GetFileExtension() method
3005 # Return the file extension
3007 # @param self The object pointer
3008 # @retval string file name extension
3010 def __GetFileExtension(self
):
3011 if not self
.__IsToken
("."):
3012 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3015 if self
.__GetNextToken
():
3016 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3017 if Pattern
.match(self
.__Token
):
3021 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3024 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3026 ## __GetRuleFileStatement() method
3030 # @param self The object pointer
3031 # @retval Rule Rule object
3033 def __GetRuleFileStatements(self
):
3035 if not self
.__IsKeyword
("FILE"):
3036 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3038 if not self
.__GetNextWord
():
3039 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3041 Type
= self
.__Token
.strip().upper()
3042 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3043 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3044 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3046 if not self
.__IsToken
("="):
3047 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3049 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3050 if not self
.__GetNextWord
():
3051 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3052 if self
.__Token
== 'PCD':
3053 if not self
.__IsToken
( "("):
3054 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3055 PcdPair
= self
.__GetNextPcdName
()
3056 if not self
.__IsToken
( ")"):
3057 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3058 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3060 NameGuid
= self
.__Token
3063 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3064 if self
.__FileCouldHaveRelocFlag
(Type
):
3065 if self
.__Token
== 'RELOCS_STRIPPED':
3070 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3073 if self
.__GetNextToken
():
3074 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3075 if Pattern
.match(self
.__Token
):
3076 KeyStringList
.append(self
.__Token
)
3077 if self
.__IsToken
(","):
3078 while self
.__GetNextToken
():
3079 if not Pattern
.match(self
.__Token
):
3080 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3081 KeyStringList
.append(self
.__Token
)
3083 if not self
.__IsToken
(","):
3091 if self
.__IsKeyword
("Fixed", True):
3095 if self
.__IsKeyword
("CheckSum", True):
3099 if self
.__GetAlignment
():
3100 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3101 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3102 #For FFS, Auto is default option same to ""
3103 if not self
.__Token
== "Auto":
3104 AlignValue
= self
.__Token
3106 if self
.__IsToken
("{"):
3107 # Complex file rule expected
3108 Rule
= RuleComplexFile
.RuleComplexFile()
3109 Rule
.FvFileType
= Type
3110 Rule
.NameGuid
= NameGuid
3111 Rule
.Alignment
= AlignValue
3112 Rule
.CheckSum
= CheckSum
3114 Rule
.KeyStringList
= KeyStringList
3115 if KeepReloc
!= None:
3116 Rule
.KeepReloc
= KeepReloc
3119 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3120 IsLeaf
= self
.__GetEfiSection
(Rule
)
3121 if not IsEncapsulate
and not IsLeaf
:
3124 if not self
.__IsToken
("}"):
3125 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3130 # Simple file rule expected
3131 if not self
.__GetNextWord
():
3132 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3134 SectionName
= self
.__Token
3136 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3137 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3138 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3141 if self
.__IsKeyword
("Fixed", True):
3144 if self
.__IsKeyword
("CheckSum", True):
3148 if self
.__GetAlignment
():
3149 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3150 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3151 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3152 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3153 SectAlignment
= self
.__Token
3156 if self
.__IsToken
('|'):
3157 Ext
= self
.__GetFileExtension
()
3158 elif not self
.__GetNextToken
():
3159 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3161 Rule
= RuleSimpleFile
.RuleSimpleFile()
3162 Rule
.SectionType
= SectionName
3163 Rule
.FvFileType
= Type
3164 Rule
.NameGuid
= NameGuid
3165 Rule
.Alignment
= AlignValue
3166 Rule
.SectAlignment
= SectAlignment
3167 Rule
.CheckSum
= CheckSum
3169 Rule
.KeyStringList
= KeyStringList
3170 if KeepReloc
!= None:
3171 Rule
.KeepReloc
= KeepReloc
3172 Rule
.FileExtension
= Ext
3173 Rule
.FileName
= self
.__Token
3176 ## __GetEfiSection() method
3178 # Get section list for Rule
3180 # @param self The object pointer
3181 # @param Obj for whom section is got
3182 # @retval True Successfully find section statement
3183 # @retval False Not able to find section statement
3185 def __GetEfiSection(self
, Obj
):
3187 OldPos
= self
.GetFileBufferPos()
3188 if not self
.__GetNextWord
():
3190 SectionName
= self
.__Token
3192 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3193 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3197 if SectionName
== "FV_IMAGE":
3198 FvImageSectionObj
= FvImageSection
.FvImageSection()
3199 if self
.__IsKeyword
("FV_IMAGE"):
3201 if self
.__IsToken
( "{"):
3203 self
.__GetDefineStatements
(FvObj
)
3204 self
.__GetBlockStatement
(FvObj
)
3205 self
.__GetSetStatements
(FvObj
)
3206 self
.__GetFvAlignment
(FvObj
)
3207 self
.__GetFvAttributes
(FvObj
)
3208 self
.__GetAprioriSection
(FvObj
)
3209 self
.__GetAprioriSection
(FvObj
)
3212 IsInf
= self
.__GetInfStatement
(FvObj
)
3213 IsFile
= self
.__GetFileStatement
(FvObj
)
3214 if not IsInf
and not IsFile
:
3217 if not self
.__IsToken
( "}"):
3218 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3219 FvImageSectionObj
.Fv
= FvObj
3220 FvImageSectionObj
.FvName
= None
3223 if not self
.__IsKeyword
("FV"):
3224 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3225 FvImageSectionObj
.FvFileType
= self
.__Token
3227 if self
.__GetAlignment
():
3228 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3229 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3230 FvImageSectionObj
.Alignment
= self
.__Token
3232 if self
.__IsToken
('|'):
3233 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3234 elif self
.__GetNextToken
():
3235 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3236 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3237 FvImageSectionObj
.FvFileName
= self
.__Token
3241 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3243 Obj
.SectionList
.append(FvImageSectionObj
)
3246 EfiSectionObj
= EfiSection
.EfiSection()
3247 EfiSectionObj
.SectionType
= SectionName
3249 if not self
.__GetNextToken
():
3250 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3252 if self
.__Token
== "STRING":
3253 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3254 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3256 if not self
.__IsToken
('='):
3257 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3259 if not self
.__GetNextToken
():
3260 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3262 if self
.__GetStringData
():
3263 EfiSectionObj
.StringData
= self
.__Token
3265 if self
.__IsKeyword
("BUILD_NUM"):
3266 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3267 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3269 if not self
.__IsToken
("="):
3270 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3271 if not self
.__GetNextToken
():
3272 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3273 EfiSectionObj
.BuildNum
= self
.__Token
3276 EfiSectionObj
.FileType
= self
.__Token
3277 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3279 if self
.__IsKeyword
("Optional"):
3280 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3281 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3282 EfiSectionObj
.Optional
= True
3284 if self
.__IsKeyword
("BUILD_NUM"):
3285 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3286 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3288 if not self
.__IsToken
("="):
3289 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3290 if not self
.__GetNextToken
():
3291 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3292 EfiSectionObj
.BuildNum
= self
.__Token
3294 if self
.__GetAlignment
():
3295 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3296 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3297 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3298 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3299 EfiSectionObj
.Alignment
= self
.__Token
3301 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3302 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3303 if self
.__Token
== 'RELOCS_STRIPPED':
3304 EfiSectionObj
.KeepReloc
= False
3306 EfiSectionObj
.KeepReloc
= True
3307 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3308 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3310 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3313 if self
.__IsToken
('|'):
3314 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3315 elif self
.__GetNextToken
():
3316 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3317 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3319 if self
.__Token
.startswith('PCD'):
3321 self
.__GetNextWord
()
3323 if self
.__Token
== 'PCD':
3324 if not self
.__IsToken
( "("):
3325 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3326 PcdPair
= self
.__GetNextPcdName
()
3327 if not self
.__IsToken
( ")"):
3328 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3329 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3331 EfiSectionObj
.FileName
= self
.__Token
3336 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3338 Obj
.SectionList
.append(EfiSectionObj
)
3341 ## __RuleSectionCouldBeOptional() method
3343 # Get whether a section could be optional
3345 # @param self The object pointer
3346 # @param SectionType The section type to check
3347 # @retval True section could be optional
3348 # @retval False section never optional
3350 def __RuleSectionCouldBeOptional(self
, SectionType
):
3351 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3356 ## __RuleSectionCouldHaveBuildNum() method
3358 # Get whether a section could have build number information
3360 # @param self The object pointer
3361 # @param SectionType The section type to check
3362 # @retval True section could have build number information
3363 # @retval False section never have build number information
3365 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3366 if SectionType
in ("VERSION"):
3371 ## __RuleSectionCouldHaveString() method
3373 # Get whether a section could have string
3375 # @param self The object pointer
3376 # @param SectionType The section type to check
3377 # @retval True section could have string
3378 # @retval False section never have string
3380 def __RuleSectionCouldHaveString(self
, SectionType
):
3381 if SectionType
in ("UI", "VERSION"):
3386 ## __CheckRuleSectionFileType() method
3388 # Get whether a section matches a file type
3390 # @param self The object pointer
3391 # @param SectionType The section type to check
3392 # @param FileType The file type to check
3394 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3395 if SectionType
== "COMPAT16":
3396 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3397 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3398 elif SectionType
== "PE32":
3399 if FileType
not in ("PE32", "SEC_PE32"):
3400 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3401 elif SectionType
== "PIC":
3402 if FileType
not in ("PIC", "PIC"):
3403 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3404 elif SectionType
== "TE":
3405 if FileType
not in ("TE", "SEC_TE"):
3406 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3407 elif SectionType
== "RAW":
3408 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3409 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3410 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3411 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3412 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3413 elif SectionType
== "UI":
3414 if FileType
not in ("UI", "SEC_UI"):
3415 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3416 elif SectionType
== "VERSION":
3417 if FileType
not in ("VERSION", "SEC_VERSION"):
3418 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3419 elif SectionType
== "PEI_DEPEX":
3420 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3421 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3422 elif SectionType
== "GUID":
3423 if FileType
not in ("PE32", "SEC_GUID"):
3424 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3426 ## __GetRuleEncapsulationSection() method
3428 # Get encapsulation section for Rule
3430 # @param self The object pointer
3431 # @param Rule for whom section is got
3432 # @retval True Successfully find section statement
3433 # @retval False Not able to find section statement
3435 def __GetRuleEncapsulationSection(self
, Rule
):
3437 if self
.__IsKeyword
( "COMPRESS"):
3439 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3442 if not self
.__IsToken
("{"):
3443 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3445 CompressSectionObj
= CompressSection
.CompressSection()
3447 CompressSectionObj
.CompType
= Type
3448 # Recursive sections...
3450 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3451 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3452 if not IsEncapsulate
and not IsLeaf
:
3455 if not self
.__IsToken
( "}"):
3456 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3457 Rule
.SectionList
.append(CompressSectionObj
)
3461 elif self
.__IsKeyword
( "GUIDED"):
3463 if self
.__GetNextGuid
():
3464 GuidValue
= self
.__Token
3466 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3467 GuidValue
= self
.__Token
3469 AttribDict
= self
.__GetGuidAttrib
()
3471 if not self
.__IsToken
("{"):
3472 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3473 GuidSectionObj
= GuidSection
.GuidSection()
3474 GuidSectionObj
.NameGuid
= GuidValue
3475 GuidSectionObj
.SectionType
= "GUIDED"
3476 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3477 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3481 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3482 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3483 if not IsEncapsulate
and not IsLeaf
:
3486 if not self
.__IsToken
( "}"):
3487 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3488 Rule
.SectionList
.append(GuidSectionObj
)
3494 ## __GetVtf() method
3496 # Get VTF section contents and store its data into VTF list of self.Profile
3498 # @param self The object pointer
3499 # @retval True Successfully find a VTF
3500 # @retval False Not able to find a VTF
3504 if not self
.__GetNextToken
():
3507 S
= self
.__Token
.upper()
3508 if S
.startswith("[") and not S
.startswith("[VTF."):
3509 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3510 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3515 if not self
.__IsToken
("[VTF.", True):
3516 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3517 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3518 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3519 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3521 if not self
.__SkipToToken
("."):
3522 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3524 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3525 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3526 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3528 if not self
.__GetNextWord
():
3529 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3530 Name
= self
.__Token
.upper()
3533 VtfObj
.UiName
= Name
3534 VtfObj
.KeyArch
= Arch
3536 if self
.__IsToken
(","):
3537 if not self
.__GetNextWord
():
3538 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3539 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3540 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3541 VtfObj
.ArchList
= self
.__Token
.upper()
3543 if not self
.__IsToken
( "]"):
3544 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3546 if self
.__IsKeyword
("IA32_RST_BIN"):
3547 if not self
.__IsToken
("="):
3548 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3550 if not self
.__GetNextToken
():
3551 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3553 VtfObj
.ResetBin
= self
.__Token
3554 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3555 #check for file path
3556 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3558 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3560 while self
.__GetComponentStatement
(VtfObj
):
3563 self
.Profile
.VtfList
.append(VtfObj
)
3566 ## __GetComponentStatement() method
3568 # Get components in VTF
3570 # @param self The object pointer
3571 # @param VtfObj for whom component is got
3572 # @retval True Successfully find a component
3573 # @retval False Not able to find a component
3575 def __GetComponentStatement(self
, VtfObj
):
3577 if not self
.__IsKeyword
("COMP_NAME"):
3580 if not self
.__IsToken
("="):
3581 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3583 if not self
.__GetNextWord
():
3584 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3586 CompStatementObj
= ComponentStatement
.ComponentStatement()
3587 CompStatementObj
.CompName
= self
.__Token
3589 if not self
.__IsKeyword
("COMP_LOC"):
3590 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3592 if not self
.__IsToken
("="):
3593 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3595 CompStatementObj
.CompLoc
= ""
3596 if self
.__GetNextWord
():
3597 CompStatementObj
.CompLoc
= self
.__Token
3598 if self
.__IsToken
('|'):
3599 if not self
.__GetNextWord
():
3600 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3602 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3603 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3605 CompStatementObj
.FilePos
= self
.__Token
3607 self
.CurrentLineNumber
+= 1
3608 self
.CurrentOffsetWithinLine
= 0
3610 if not self
.__IsKeyword
("COMP_TYPE"):
3611 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3613 if not self
.__IsToken
("="):
3614 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3616 if not self
.__GetNextToken
():
3617 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3618 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3619 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3620 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3621 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3622 CompStatementObj
.CompType
= self
.__Token
3624 if not self
.__IsKeyword
("COMP_VER"):
3625 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
3627 if not self
.__IsToken
("="):
3628 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3630 if not self
.__GetNextToken
():
3631 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
3633 Pattern
= re
.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
3634 if Pattern
.match(self
.__Token
) == None:
3635 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3636 CompStatementObj
.CompVer
= self
.__Token
3638 if not self
.__IsKeyword
("COMP_CS"):
3639 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3641 if not self
.__IsToken
("="):
3642 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3644 if not self
.__GetNextToken
():
3645 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3646 if self
.__Token
not in ("1", "0"):
3647 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3648 CompStatementObj
.CompCs
= self
.__Token
3651 if not self
.__IsKeyword
("COMP_BIN"):
3652 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3654 if not self
.__IsToken
("="):
3655 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3657 if not self
.__GetNextToken
():
3658 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3660 CompStatementObj
.CompBin
= self
.__Token
3661 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3662 #check for file path
3663 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3665 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3667 if not self
.__IsKeyword
("COMP_SYM"):
3668 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3670 if not self
.__IsToken
("="):
3671 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3673 if not self
.__GetNextToken
():
3674 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3676 CompStatementObj
.CompSym
= self
.__Token
3677 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
3678 #check for file path
3679 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3681 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3683 if not self
.__IsKeyword
("COMP_SIZE"):
3684 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3686 if not self
.__IsToken
("="):
3687 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3689 if self
.__IsToken
("-"):
3690 CompStatementObj
.CompSize
= self
.__Token
3691 elif self
.__GetNextDecimalNumber
():
3692 CompStatementObj
.CompSize
= self
.__Token
3693 elif self
.__GetNextHexNumber
():
3694 CompStatementObj
.CompSize
= self
.__Token
3696 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3698 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3701 ## __GetOptionRom() method
3703 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3705 # @param self The object pointer
3706 # @retval True Successfully find a OptionROM
3707 # @retval False Not able to find a OptionROM
3709 def __GetOptionRom(self
):
3711 if not self
.__GetNextToken
():
3714 S
= self
.__Token
.upper()
3715 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3716 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3719 if not self
.__IsToken
("[OptionRom.", True):
3720 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3722 OptRomName
= self
.__GetUiName
()
3724 if not self
.__IsToken
( "]"):
3725 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3727 OptRomObj
= OptionRom
.OPTIONROM()
3728 OptRomObj
.DriverName
= OptRomName
3729 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3732 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3733 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3734 if not isInf
and not isFile
:
3739 ## __GetOptRomInfStatement() method
3741 # Get INF statements
3743 # @param self The object pointer
3744 # @param Obj for whom inf statement is got
3745 # @retval True Successfully find inf statement
3746 # @retval False Not able to find inf statement
3748 def __GetOptRomInfStatement(self
, Obj
):
3750 if not self
.__IsKeyword
( "INF"):
3753 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3754 self
.__GetInfOptions
( ffsInf
)
3756 if not self
.__GetNextToken
():
3757 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3758 ffsInf
.InfFileName
= self
.__Token
3759 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3760 #check for file path
3761 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3763 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3765 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
3766 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
3769 self
.__GetOptRomOverrides
(ffsInf
)
3771 Obj
.FfsList
.append(ffsInf
)
3774 ## __GetOptRomOverrides() method
3776 # Get overrides for OptROM INF & FILE
3778 # @param self The object pointer
3779 # @param FfsInfObj for whom overrides is got
3781 def __GetOptRomOverrides(self
, Obj
):
3782 if self
.__IsToken
('{'):
3783 Overrides
= OptionRom
.OverrideAttribs()
3785 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
3786 if not self
.__IsToken
( "="):
3787 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3788 if not self
.__GetNextHexNumber
():
3789 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
3790 Overrides
.PciVendorId
= self
.__Token
3793 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
3794 if not self
.__IsToken
( "="):
3795 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3796 if not self
.__GetNextHexNumber
():
3797 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
3798 Overrides
.PciClassCode
= self
.__Token
3801 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
3802 if not self
.__IsToken
( "="):
3803 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3804 if not self
.__GetNextHexNumber
():
3805 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
3807 Overrides
.PciDeviceId
= self
.__Token
3810 if self
.__IsKeyword
( "PCI_REVISION"):
3811 if not self
.__IsToken
( "="):
3812 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3813 if not self
.__GetNextHexNumber
():
3814 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
3815 Overrides
.PciRevision
= self
.__Token
3818 if self
.__IsKeyword
( "COMPRESS"):
3819 if not self
.__IsToken
( "="):
3820 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3821 if not self
.__GetNextToken
():
3822 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
3823 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
3826 if self
.__IsToken
( "}"):
3829 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
3831 Obj
.OverrideAttribs
= Overrides
3833 ## __GetOptRomFileStatement() method
3835 # Get FILE statements
3837 # @param self The object pointer
3838 # @param Obj for whom FILE statement is got
3839 # @retval True Successfully find FILE statement
3840 # @retval False Not able to find FILE statement
3842 def __GetOptRomFileStatement(self
, Obj
):
3844 if not self
.__IsKeyword
( "FILE"):
3847 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
3849 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
3850 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
3851 FfsFileObj
.FileType
= self
.__Token
3853 if not self
.__GetNextToken
():
3854 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
3855 FfsFileObj
.FileName
= self
.__Token
3856 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3857 #check for file path
3858 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3860 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3862 if FfsFileObj
.FileType
== 'EFI':
3863 self
.__GetOptRomOverrides
(FfsFileObj
)
3865 Obj
.FfsList
.append(FfsFileObj
)
3869 ## __GetCapInFd() method
3871 # Get Cap list contained in FD
3873 # @param self The object pointer
3874 # @param FdName FD name
3875 # @retval CapList List of Capsule in FD
3877 def __GetCapInFd (self
, FdName
):
3880 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3881 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3882 for elementRegion
in FdObj
.RegionList
:
3883 if elementRegion
.RegionType
== 'CAPSULE':
3884 for elementRegionData
in elementRegion
.RegionDataList
:
3885 if elementRegionData
.endswith(".cap"):
3887 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
3888 CapList
.append(elementRegionData
.upper())
3891 ## __GetReferencedFdCapTuple() method
3893 # Get FV and FD list referenced by a capsule image
3895 # @param self The object pointer
3896 # @param CapObj Capsule section to be searched
3897 # @param RefFdList referenced FD by section
3898 # @param RefFvList referenced FV by section
3900 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
3902 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
3903 if CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
3904 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
3905 elif CapsuleDataObj
.Ffs
!= None:
3906 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
3907 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
3908 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
3909 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
3910 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
3912 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
3914 ## __GetFvInFd() method
3916 # Get FV list contained in FD
3918 # @param self The object pointer
3919 # @param FdName FD name
3920 # @retval FvList list of FV in FD
3922 def __GetFvInFd (self
, FdName
):
3925 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3926 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3927 for elementRegion
in FdObj
.RegionList
:
3928 if elementRegion
.RegionType
== 'FV':
3929 for elementRegionData
in elementRegion
.RegionDataList
:
3930 if elementRegionData
.endswith(".fv"):
3932 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
3933 FvList
.append(elementRegionData
.upper())
3936 ## __GetReferencedFdFvTuple() method
3938 # Get FD and FV list referenced by a FFS file
3940 # @param self The object pointer
3941 # @param FfsFile contains sections to be searched
3942 # @param RefFdList referenced FD by section
3943 # @param RefFvList referenced FV by section
3945 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
3947 for FfsObj
in FvObj
.FfsList
:
3948 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
3949 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
3950 RefFvList
.append(FfsObj
.FvName
.upper())
3951 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
3952 RefFdList
.append(FfsObj
.FdName
.upper())
3954 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
3956 ## __GetReferencedFdFvTupleFromSection() method
3958 # Get FD and FV list referenced by a FFS section
3960 # @param self The object pointer
3961 # @param FfsFile contains sections to be searched
3962 # @param FdList referenced FD by section
3963 # @param FvList referenced FV by section
3965 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
3968 SectionStack
.extend(FfsFile
.SectionList
)
3969 while SectionStack
!= []:
3970 SectionObj
= SectionStack
.pop()
3971 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
3972 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
3973 FvList
.append(SectionObj
.FvName
.upper())
3974 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
3975 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
3976 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
3978 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
3979 SectionStack
.extend(SectionObj
.SectionList
)
3981 ## CycleReferenceCheck() method
3983 # Check whether cycle reference exists in FDF
3985 # @param self The object pointer
3986 # @retval True cycle reference exists
3987 # @retval False Not exists cycle reference
3989 def CycleReferenceCheck(self
):
3991 # Check the cycle between FV and FD image
3993 MaxLength
= len (self
.Profile
.FvDict
)
3994 for FvName
in self
.Profile
.FvDict
.keys():
3995 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
3997 RefFvStack
.append(FvName
)
4001 while RefFvStack
!= [] and Index
< MaxLength
:
4003 FvNameFromStack
= RefFvStack
.pop()
4004 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4005 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4011 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4013 for RefFdName
in RefFdList
:
4014 if RefFdName
in FdAnalyzedList
:
4017 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4018 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4019 if FvInFdList
!= []:
4020 for FvNameInFd
in FvInFdList
:
4021 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4022 if FvNameInFd
not in RefFvStack
:
4023 RefFvStack
.append(FvNameInFd
)
4025 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4026 EdkLogger
.info(LogStr
)
4028 FdAnalyzedList
.append(RefFdName
)
4030 for RefFvName
in RefFvList
:
4031 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4032 if RefFvName
not in RefFvStack
:
4033 RefFvStack
.append(RefFvName
)
4035 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4036 EdkLogger
.info(LogStr
)
4040 # Check the cycle between Capsule and FD image
4042 MaxLength
= len (self
.Profile
.CapsuleDict
)
4043 for CapName
in self
.Profile
.CapsuleDict
.keys():
4045 # Capsule image to be checked.
4047 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4049 RefCapStack
.append(CapName
)
4054 while RefCapStack
!= [] and Index
< MaxLength
:
4056 CapNameFromStack
= RefCapStack
.pop()
4057 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4058 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4064 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4068 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4069 for RefFdName
in RefFdList
:
4070 if RefFdName
in FdAnalyzedList
:
4073 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4074 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4075 if CapInFdList
!= []:
4076 for CapNameInFd
in CapInFdList
:
4077 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4078 if CapNameInFd
not in RefCapStack
:
4079 RefCapStack
.append(CapNameInFd
)
4081 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4082 EdkLogger
.info(LogStr
)
4085 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4086 if FvInFdList
!= []:
4087 for FvNameInFd
in FvInFdList
:
4088 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4089 if FvNameInFd
not in RefFvList
:
4090 RefFvList
.append(FvNameInFd
)
4092 FdAnalyzedList
.append(RefFdName
)
4094 # the number of the parsed FV and FD image
4096 FvListLength
= len (RefFvList
)
4097 FdListLength
= len (RefFdList
)
4098 for RefFvName
in RefFvList
:
4099 if RefFvName
in FvAnalyzedList
:
4101 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4102 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4103 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4106 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4107 FvAnalyzedList
.append(RefFvName
)
4111 if __name__
== "__main__":
4112 parser
= FdfParser("..\LakeportX64Pkg.fdf")
4115 parser
.CycleReferenceCheck()