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.
24 import FfsInfStatement
25 import FfsFileStatement
31 import CompressSection
36 import RuleComplexFile
40 import ComponentStatement
42 import OptRomInfStatement
43 import OptRomFileStatement
45 from GenFdsGlobalVariable
import GenFdsGlobalVariable
46 from Common
.BuildToolError
import *
47 from Common
import EdkLogger
48 from Common
.Misc
import PathClass
49 from Common
.String
import NormPath
50 import Common
.GlobalData
as GlobalData
51 from Common
.Expression
import *
52 from Common
import GlobalData
53 from Common
.String
import ReplaceMacro
55 from Common
.Misc
import tdict
60 ##define T_CHAR_SPACE ' '
61 ##define T_CHAR_NULL '\0'
62 ##define T_CHAR_CR '\r'
63 ##define T_CHAR_TAB '\t'
64 ##define T_CHAR_LF '\n'
65 ##define T_CHAR_SLASH '/'
66 ##define T_CHAR_BACKSLASH '\\'
67 ##define T_CHAR_DOUBLE_QUOTE '\"'
68 ##define T_CHAR_SINGLE_QUOTE '\''
69 ##define T_CHAR_STAR '*'
70 ##define T_CHAR_HASH '#'
72 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
73 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
74 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
76 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
78 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
79 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
83 def GetRealFileLine (File
, Line
):
86 for Profile
in IncludeFileList
:
87 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
88 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
89 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
90 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
92 return (File
, Line
- InsertedLines
)
94 ## The exception class that used to report error messages when parsing FDF
96 # Currently the "ToolName" is set to be "FDF Parser".
98 class Warning (Exception):
101 # @param self The object pointer
102 # @param Str The message to record
103 # @param File The FDF name
104 # @param Line The Line number that error occurs
106 def __init__(self
, Str
, File
= None, Line
= None):
108 FileLineTuple
= GetRealFileLine(File
, Line
)
109 self
.FileName
= FileLineTuple
[0]
110 self
.LineNumber
= FileLineTuple
[1]
112 self
.ToolName
= 'FdfParser'
117 ## The MACRO class that used to record macro value data when parsing include file
123 # @param self The object pointer
124 # @param FileName The file that to be parsed
126 def __init__(self
, FileName
, Line
):
127 self
.FileName
= FileName
128 self
.DefinedAtLine
= Line
129 self
.MacroName
= None
130 self
.MacroValue
= None
132 ## The Include file content class that used to record file data when parsing include file
134 # May raise Exception when opening file.
136 class IncludeFileProfile
:
139 # @param self The object pointer
140 # @param FileName The file that to be parsed
142 def __init__(self
, FileName
):
143 self
.FileName
= FileName
144 self
.FileLinesList
= []
146 fsock
= open(FileName
, "rb", 0)
148 self
.FileLinesList
= fsock
.readlines()
153 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
155 self
.InsertStartLineNumber
= None
156 self
.InsertAdjust
= 0
158 ## The FDF content class that used to record file data when parsing FDF
160 # May raise Exception when opening file.
165 # @param self The object pointer
166 # @param FileName The file that to be parsed
168 def __init__(self
, FileName
):
169 self
.FileLinesList
= []
171 fsock
= open(FileName
, "rb", 0)
173 self
.FileLinesList
= fsock
.readlines()
178 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
183 # ECC will use this Dict and List information
184 self
.PcdFileLineDict
= {}
185 self
.InfFileLineList
= []
188 self
.FdNameNotSet
= False
190 self
.CapsuleDict
= {}
195 ## The syntax parser for FDF
197 # PreprocessFile method should be called prior to ParseFile
198 # CycleReferenceCheck method can detect cycles in FDF contents
200 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
201 # Get*** procedures mean these procedures will make judgement on current token only.
206 # @param self The object pointer
207 # @param FileName The file that to be parsed
209 def __init__(self
, FileName
):
210 self
.Profile
= FileProfile(FileName
)
211 self
.FileName
= FileName
212 self
.CurrentLineNumber
= 1
213 self
.CurrentOffsetWithinLine
= 0
214 self
.CurrentFdName
= None
215 self
.CurrentFvName
= None
217 self
.__SkippedChars
= ""
219 # Used to section info
220 self
.__CurSection
= []
221 # Key: [section name, UI name, arch]
222 # Value: {MACRO_NAME : MACRO_VALUE}
223 self
.__MacroDict
= tdict(True, 3)
226 self
.__WipeOffArea
= []
227 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
228 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
230 ## __IsWhiteSpace() method
232 # Whether char at current FileBufferPos is whitespace
234 # @param self The object pointer
235 # @param Char The char to test
236 # @retval True The char is a kind of white space
237 # @retval False The char is NOT a kind of white space
239 def __IsWhiteSpace(self
, Char
):
240 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
245 ## __SkipWhiteSpace() method
247 # Skip white spaces from current char, return number of chars skipped
249 # @param self The object pointer
250 # @retval Count The number of chars skipped
252 def __SkipWhiteSpace(self
):
254 while not self
.__EndOfFile
():
256 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
257 self
.__SkippedChars
+= str(self
.__CurrentChar
())
264 ## __EndOfFile() method
266 # Judge current buffer pos is at file end
268 # @param self The object pointer
269 # @retval True Current File buffer position is at file end
270 # @retval False Current File buffer position is NOT at file end
272 def __EndOfFile(self
):
273 NumberOfLines
= len(self
.Profile
.FileLinesList
)
274 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
275 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
277 elif self
.CurrentLineNumber
> NumberOfLines
:
282 ## __EndOfLine() method
284 # Judge current buffer pos is at line end
286 # @param self The object pointer
287 # @retval True Current File buffer position is at line end
288 # @retval False Current File buffer position is NOT at line end
290 def __EndOfLine(self
):
291 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
293 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
294 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
301 # Reset file data buffer to the initial state
303 # @param self The object pointer
306 self
.CurrentLineNumber
= 1
307 self
.CurrentOffsetWithinLine
= 0
309 ## __UndoOneChar() method
311 # Go back one char in the file buffer
313 # @param self The object pointer
314 # @retval True Successfully go back one char
315 # @retval False Not able to go back one char as file beginning reached
317 def __UndoOneChar(self
):
319 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
321 elif self
.CurrentOffsetWithinLine
== 0:
322 self
.CurrentLineNumber
-= 1
323 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
325 self
.CurrentOffsetWithinLine
-= 1
328 ## __GetOneChar() method
330 # Move forward one char in the file buffer
332 # @param self The object pointer
334 def __GetOneChar(self
):
335 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
336 self
.CurrentLineNumber
+= 1
337 self
.CurrentOffsetWithinLine
= 0
339 self
.CurrentOffsetWithinLine
+= 1
341 ## __CurrentChar() method
343 # Get the char pointed to by the file buffer pointer
345 # @param self The object pointer
346 # @retval Char Current char
348 def __CurrentChar(self
):
349 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
351 ## __NextChar() method
353 # Get the one char pass the char pointed to by the file buffer pointer
355 # @param self The object pointer
356 # @retval Char Next char
358 def __NextChar(self
):
359 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
360 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
362 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
364 ## __SetCurrentCharValue() method
366 # Modify the value of current char
368 # @param self The object pointer
369 # @param Value The new value of current char
371 def __SetCurrentCharValue(self
, Value
):
372 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
374 ## __CurrentLine() method
376 # Get the list that contains current line contents
378 # @param self The object pointer
379 # @retval List current line contents
381 def __CurrentLine(self
):
382 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
384 def __StringToList(self
):
385 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
386 self
.Profile
.FileLinesList
[-1].append(' ')
388 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
389 if StartPos
[0] == EndPos
[0]:
391 while Offset
<= EndPos
[1]:
392 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
397 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
398 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
402 while Line
< EndPos
[0]:
404 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
405 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
410 while Offset
<= EndPos
[1]:
411 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
415 def __GetMacroName(self
):
416 if not self
.__GetNextToken
():
417 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
418 MacroName
= self
.__Token
420 if MacroName
.startswith('!'):
422 MacroName
= MacroName
[1:].strip()
424 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
425 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
426 self
.FileName
, self
.CurrentLineNumber
)
427 MacroName
= MacroName
[2:-1]
428 return MacroName
, NotFlag
430 def __SetMacroValue(self
, Macro
, Value
):
431 if not self
.__CurSection
:
435 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
436 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
438 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
439 MacroDict
[Macro
] = Value
441 def __GetMacroValue(self
, Macro
):
443 if Macro
in GlobalData
.gCommandLineDefines
:
444 return GlobalData
.gCommandLineDefines
[Macro
]
445 if Macro
in GlobalData
.gGlobalDefines
:
446 return GlobalData
.gGlobalDefines
[Macro
]
448 if self
.__CurSection
:
449 MacroDict
= self
.__MacroDict
[
450 self
.__CurSection
[0],
451 self
.__CurSection
[1],
454 if MacroDict
and Macro
in MacroDict
:
455 return MacroDict
[Macro
]
458 if Macro
in GlobalData
.gPlatformDefines
:
459 return GlobalData
.gPlatformDefines
[Macro
]
462 def __SectionHeaderParser(self
, Section
):
464 # [FD.UiName]: use dummy instead if UI name is optional
467 # [Rule]: don't take rule section into account, macro is not allowed in this section
468 # [VTF.arch.UiName, arch]
469 # [OptionRom.DriverName]
470 self
.__CurSection
= []
471 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
472 ItemList
= Section
.split('.')
474 if Item
== '' or Item
== 'RULE':
477 if Item
== 'DEFINES':
478 self
.__CurSection
= ['COMMON', 'COMMON', 'COMMON']
479 elif Item
== 'VTF' and len(ItemList
) == 3:
481 Pos
= UiName
.find(',')
483 UiName
= UiName
[:Pos
]
484 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
485 elif len(ItemList
) > 1:
486 self
.__CurSection
= [ItemList
[0], ItemList
[1], 'COMMON']
487 elif len(ItemList
) > 0:
488 self
.__CurSection
= [ItemList
[0], 'DUMMY', 'COMMON']
490 ## PreprocessFile() method
492 # Preprocess file contents, replace comments with spaces.
493 # In the end, rewind the file buffer pointer to the beginning
494 # BUGBUG: No !include statement processing contained in this procedure
495 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
497 # @param self The object pointer
499 def PreprocessFile(self
):
503 DoubleSlashComment
= False
505 # HashComment in quoted string " " is ignored.
508 while not self
.__EndOfFile
():
510 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
511 InString
= not InString
512 # meet new line, then no longer in a comment for // and '#'
513 if self
.__CurrentChar
() == T_CHAR_LF
:
514 self
.CurrentLineNumber
+= 1
515 self
.CurrentOffsetWithinLine
= 0
516 if InComment
and DoubleSlashComment
:
518 DoubleSlashComment
= False
519 if InComment
and HashComment
:
522 # check for */ comment end
523 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
524 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
526 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
529 # set comments to spaces
531 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
533 # check for // comment
534 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
536 DoubleSlashComment
= True
537 # check for '#' comment
538 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
541 # check for /* comment start
542 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
543 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
545 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
551 # restore from ListOfList to ListOfString
552 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
555 ## PreprocessIncludeFile() method
557 # Preprocess file contents, replace !include statements with file contents.
558 # In the end, rewind the file buffer pointer to the beginning
560 # @param self The object pointer
562 def PreprocessIncludeFile(self
):
564 while self
.__GetNextToken
():
566 if self
.__Token
== '!include':
567 IncludeLine
= self
.CurrentLineNumber
568 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
569 if not self
.__GetNextToken
():
570 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
571 IncFileName
= self
.__Token
573 for Macro
in ['WORKSPACE', 'ECP_SOURCE', 'EFI_SOURCE', 'EDK_SOURCE']:
574 MacroVal
= self
.__GetMacroValue
(Macro
)
576 __IncludeMacros
[Macro
] = MacroVal
579 IncludedFile
= NormPath(ReplaceMacro(IncFileName
, __IncludeMacros
, RaiseError
=True))
581 raise Warning("only these system environment variables are permitted to start the path of the included file: "
582 "$(WORKSPACE), $(ECP_SOURCE), $(EFI_SOURCE), $(EDK_SOURCE)",
583 self
.FileName
, self
.CurrentLineNumber
)
585 # First search the include file under the same directory as FDF file
587 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
588 ErrorCode
= IncludedFile1
.Validate()[0]
591 # Then search the include file under the same directory as DSC file
594 if GenFdsGlobalVariable
.ActivePlatform
:
595 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
596 elif GlobalData
.gActivePlatform
:
597 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
598 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
599 ErrorCode
= IncludedFile1
.Validate()[0]
602 # Also search file under the WORKSPACE directory
604 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
605 ErrorCode
= IncludedFile1
.Validate()[0]
607 raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os
.path
.dirname(self
.FileName
), PlatformDir
, GlobalData
.gWorkspace
),
608 self
.FileName
, self
.CurrentLineNumber
)
610 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
612 CurrentLine
= self
.CurrentLineNumber
613 CurrentOffset
= self
.CurrentOffsetWithinLine
614 # list index of the insertion, note that line number is 'CurrentLine + 1'
615 InsertAtLine
= CurrentLine
616 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
617 # deal with remaining portions after "!include filename", if exists.
618 if self
.__GetNextToken
():
619 if self
.CurrentLineNumber
== CurrentLine
:
620 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
621 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
622 IncFileProfile
.InsertAdjust
+= 1
623 self
.CurrentLineNumber
+= 1
624 self
.CurrentOffsetWithinLine
= 0
626 for Line
in IncFileProfile
.FileLinesList
:
627 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
628 self
.CurrentLineNumber
+= 1
631 IncludeFileList
.append(IncFileProfile
)
633 # comment out the processed include file statement
634 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
635 TempList
.insert(IncludeOffset
, '#')
636 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
640 def __GetIfListCurrentItemStat(self
, IfList
):
650 ## PreprocessConditionalStatement() method
652 # Preprocess conditional statement.
653 # In the end, rewind the file buffer pointer to the beginning
655 # @param self The object pointer
657 def PreprocessConditionalStatement(self
):
658 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
662 while self
.__GetNextToken
():
663 # Determine section name and the location dependent macro
664 if self
.__GetIfListCurrentItemStat
(IfList
):
665 if self
.__Token
.startswith('['):
666 Header
= self
.__Token
667 if not self
.__Token
.endswith(']'):
668 self
.__SkipToToken
(']')
669 Header
+= self
.__SkippedChars
670 if Header
.find('$(') != -1:
671 raise Warning("macro cannot be used in section header", self
.FileName
, self
.CurrentLineNumber
)
672 self
.__SectionHeaderParser
(Header
)
674 # Replace macros except in RULE section or out of section
675 elif self
.__CurSection
and ReplacedLine
!= self
.CurrentLineNumber
:
676 ReplacedLine
= self
.CurrentLineNumber
678 CurLine
= self
.Profile
.FileLinesList
[ReplacedLine
- 1]
680 StartPos
= CurLine
.find('$(', PreIndex
)
681 EndPos
= CurLine
.find(')', StartPos
+2)
682 while StartPos
!= -1 and EndPos
!= -1:
683 MacroName
= CurLine
[StartPos
+2 : EndPos
]
684 MacorValue
= self
.__GetMacroValue
(MacroName
)
685 if MacorValue
!= None:
686 CurLine
= CurLine
.replace('$(' + MacroName
+ ')', MacorValue
, 1)
687 if MacorValue
.find('$(') != -1:
690 PreIndex
= StartPos
+ len(MacorValue
)
692 PreIndex
= EndPos
+ 1
693 StartPos
= CurLine
.find('$(', PreIndex
)
694 EndPos
= CurLine
.find(')', StartPos
+2)
695 self
.Profile
.FileLinesList
[ReplacedLine
- 1] = CurLine
698 if self
.__Token
== 'DEFINE':
699 if self
.__GetIfListCurrentItemStat
(IfList
):
700 if not self
.__CurSection
:
701 raise Warning("macro cannot be defined in Rule section or out of section", self
.FileName
, self
.CurrentLineNumber
)
702 DefineLine
= self
.CurrentLineNumber
- 1
703 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
704 if not self
.__GetNextToken
():
705 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
707 if not self
.__IsToken
( "="):
708 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
710 Value
= self
.__GetExpression
()
711 self
.__SetMacroValue
(Macro
, Value
)
712 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
713 elif self
.__Token
== 'SET':
714 PcdPair
= self
.__GetNextPcdName
()
715 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
716 if not self
.__IsToken
( "="):
717 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
719 Value
= self
.__GetExpression
()
720 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
722 self
.__PcdDict
[PcdName
] = Value
723 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
724 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
725 IfList
.append([IfStartPos
, None, None])
727 CondLabel
= self
.__Token
728 Expression
= self
.__GetExpression
()
730 if CondLabel
== '!if':
731 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
733 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
734 if CondLabel
== '!ifndef':
735 ConditionSatisfied
= not ConditionSatisfied
737 BranchDetermined
= ConditionSatisfied
738 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
739 if ConditionSatisfied
:
740 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
741 elif self
.__Token
in ('!elseif', '!else'):
742 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
744 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
747 IfList
[-1] = [ElseStartPos
, False, True]
748 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
750 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
751 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
752 if self
.__Token
== '!elseif':
753 Expression
= self
.__GetExpression
()
754 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
755 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
759 IfList
[-1][1] = False
762 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
763 elif self
.__Token
== '!endif':
765 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
767 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
769 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
772 elif not IfList
: # Don't use PCDs inside conditional directive
773 if self
.CurrentLineNumber
<= RegionLayoutLine
:
774 # Don't try the same line twice
776 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
778 RegionLayoutLine
= self
.CurrentLineNumber
780 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
781 if not RegionSizeGuid
:
782 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
784 self
.__PcdDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
785 self
.__PcdDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
786 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
789 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
792 def __CollectMacroPcd(self
):
796 MacroDict
.update(self
.__PcdDict
)
799 MacroDict
.update(GlobalData
.gPlatformDefines
)
801 if self
.__CurSection
:
803 ScopeMacro
= self
.__MacroDict
['COMMON', 'COMMON', 'COMMON']
805 MacroDict
.update(ScopeMacro
)
808 ScopeMacro
= self
.__MacroDict
[
809 self
.__CurSection
[0],
810 self
.__CurSection
[1],
814 MacroDict
.update(ScopeMacro
)
816 MacroDict
.update(GlobalData
.gGlobalDefines
)
817 MacroDict
.update(GlobalData
.gCommandLineDefines
)
822 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
823 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
824 MacroPcdDict
= self
.__CollectMacroPcd
()
828 return ValueExpression(Expression
, MacroPcdDict
)(True)
830 return ValueExpression(Expression
, MacroPcdDict
)()
831 except WrnExpression
, Excpt
:
833 # Catch expression evaluation warning here. We need to report
834 # the precise number of line and return the evaluation result
836 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
837 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
840 except Exception, Excpt
:
841 raise Warning("Invalid expression", *FileLineTuple
)
843 if Expression
.startswith('$(') and Expression
[-1] == ')':
844 Expression
= Expression
[2:-1]
845 return Expression
in MacroPcdDict
847 ## __IsToken() method
849 # Check whether input string is found from current char position along
850 # If found, the string value is put into self.__Token
852 # @param self The object pointer
853 # @param String The string to search
854 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
855 # @retval True Successfully find string, file buffer pointer moved forward
856 # @retval False Not able to find string, file buffer pointer not changed
858 def __IsToken(self
, String
, IgnoreCase
= False):
859 self
.__SkipWhiteSpace
()
861 # Only consider the same line, no multi-line token allowed
862 StartPos
= self
.CurrentOffsetWithinLine
865 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
867 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
869 self
.CurrentOffsetWithinLine
+= len(String
)
870 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
874 ## __IsKeyword() method
876 # Check whether input keyword is found from current char position along, whole word only!
877 # If found, the string value is put into self.__Token
879 # @param self The object pointer
880 # @param Keyword The string to search
881 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
882 # @retval True Successfully find string, file buffer pointer moved forward
883 # @retval False Not able to find string, file buffer pointer not changed
885 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
886 self
.__SkipWhiteSpace
()
888 # Only consider the same line, no multi-line token allowed
889 StartPos
= self
.CurrentOffsetWithinLine
892 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
894 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
896 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
897 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
899 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
900 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
904 def __GetExpression(self
):
905 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
906 Index
= len(Line
) - 1
907 while Line
[Index
] in ['\r', '\n']:
909 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
910 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
911 ExpressionString
= ExpressionString
.strip()
912 return ExpressionString
914 ## __GetNextWord() method
916 # Get next C name from file lines
917 # If found, the string value is put into self.__Token
919 # @param self The object pointer
920 # @retval True Successfully find a C name string, file buffer pointer moved forward
921 # @retval False Not able to find a C name string, file buffer pointer not changed
923 def __GetNextWord(self
):
924 self
.__SkipWhiteSpace
()
925 if self
.__EndOfFile
():
928 TempChar
= self
.__CurrentChar
()
929 StartPos
= self
.CurrentOffsetWithinLine
930 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
932 while not self
.__EndOfLine
():
933 TempChar
= self
.__CurrentChar
()
934 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
935 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
941 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
946 ## __GetNextToken() method
948 # Get next token unit before a seperator
949 # If found, the string value is put into self.__Token
951 # @param self The object pointer
952 # @retval True Successfully find a token unit, file buffer pointer moved forward
953 # @retval False Not able to find a token unit, file buffer pointer not changed
955 def __GetNextToken(self
):
956 # Skip leading spaces, if exist.
957 self
.__SkipWhiteSpace
()
958 if self
.__EndOfFile
():
960 # Record the token start position, the position of the first non-space char.
961 StartPos
= self
.CurrentOffsetWithinLine
962 StartLine
= self
.CurrentLineNumber
963 while StartLine
== self
.CurrentLineNumber
:
964 TempChar
= self
.__CurrentChar
()
965 # Try to find the end char that is not a space and not in seperator tuple.
966 # That is, when we got a space or any char in the tuple, we got the end of token.
967 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
969 # if we happen to meet a seperator as the first char, we must proceed to get it.
970 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
971 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
979 EndPos
= self
.CurrentOffsetWithinLine
980 if self
.CurrentLineNumber
!= StartLine
:
981 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
982 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
983 if StartPos
!= self
.CurrentOffsetWithinLine
:
988 def __GetNextOp(self
):
989 # Skip leading spaces, if exist.
990 self
.__SkipWhiteSpace
()
991 if self
.__EndOfFile
():
993 # Record the token start position, the position of the first non-space char.
994 StartPos
= self
.CurrentOffsetWithinLine
995 while not self
.__EndOfLine
():
996 TempChar
= self
.__CurrentChar
()
997 # Try to find the end char that is not a space
998 if not str(TempChar
).isspace():
1005 if StartPos
!= self
.CurrentOffsetWithinLine
:
1006 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1010 ## __GetNextGuid() method
1012 # Get next token unit before a seperator
1013 # If found, the GUID string is put into self.__Token
1015 # @param self The object pointer
1016 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1017 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1019 def __GetNextGuid(self
):
1021 if not self
.__GetNextToken
():
1023 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}')
1024 if p
.match(self
.__Token
) != None:
1030 ## __UndoToken() method
1032 # Go back one token unit in file buffer
1034 # @param self The object pointer
1036 def __UndoToken(self
):
1037 self
.__UndoOneChar
()
1038 while self
.__CurrentChar
().isspace():
1039 if not self
.__UndoOneChar
():
1044 StartPos
= self
.CurrentOffsetWithinLine
1045 CurrentLine
= self
.CurrentLineNumber
1046 while CurrentLine
== self
.CurrentLineNumber
:
1048 TempChar
= self
.__CurrentChar
()
1049 # Try to find the end char that is not a space and not in seperator tuple.
1050 # That is, when we got a space or any char in the tuple, we got the end of token.
1051 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1052 if not self
.__UndoOneChar
():
1054 # if we happen to meet a seperator as the first char, we must proceed to get it.
1055 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1056 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1063 ## __HexDigit() method
1065 # Whether char input is a Hex data bit
1067 # @param self The object pointer
1068 # @param TempChar The char to test
1069 # @retval True The char is a Hex data bit
1070 # @retval False The char is NOT a Hex data bit
1072 def __HexDigit(self
, TempChar
):
1073 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1074 or (TempChar
>= '0' and TempChar
<= '9'):
1079 def __IsHex(self
, HexStr
):
1080 if not HexStr
.upper().startswith("0X"):
1082 if len(self
.__Token
) <= 2:
1084 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1085 if len(charList
) == 0:
1089 ## __GetNextHexNumber() method
1091 # Get next HEX data before a seperator
1092 # If found, the HEX data is put into self.__Token
1094 # @param self The object pointer
1095 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1096 # @retval False Not able to find a HEX data, file buffer pointer not changed
1098 def __GetNextHexNumber(self
):
1099 if not self
.__GetNextToken
():
1101 if self
.__IsHex
(self
.__Token
):
1107 ## __GetNextDecimalNumber() method
1109 # Get next decimal data before a seperator
1110 # If found, the decimal data is put into self.__Token
1112 # @param self The object pointer
1113 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1114 # @retval False Not able to find a decimal data, file buffer pointer not changed
1116 def __GetNextDecimalNumber(self
):
1117 if not self
.__GetNextToken
():
1119 if self
.__Token
.isdigit():
1125 ## __GetNextPcdName() method
1127 # Get next PCD token space C name and PCD C name pair before a seperator
1128 # If found, the decimal data is put into self.__Token
1130 # @param self The object pointer
1131 # @retval Tuple PCD C name and PCD token space C name pair
1133 def __GetNextPcdName(self
):
1134 if not self
.__GetNextWord
():
1135 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1136 pcdTokenSpaceCName
= self
.__Token
1138 if not self
.__IsToken
( "."):
1139 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1141 if not self
.__GetNextWord
():
1142 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1143 pcdCName
= self
.__Token
1145 return (pcdCName
, pcdTokenSpaceCName
)
1147 ## __GetStringData() method
1149 # Get string contents quoted in ""
1150 # If found, the decimal data is put into self.__Token
1152 # @param self The object pointer
1153 # @retval True Successfully find a string data, file buffer pointer moved forward
1154 # @retval False Not able to find a string data, file buffer pointer not changed
1156 def __GetStringData(self
):
1157 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1159 self
.__SkipToToken
("\"")
1160 currentLineNumber
= self
.CurrentLineNumber
1162 if not self
.__SkipToToken
("\""):
1163 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1164 if currentLineNumber
!= self
.CurrentLineNumber
:
1165 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1166 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1169 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1171 self
.__SkipToToken
("\'")
1172 currentLineNumber
= self
.CurrentLineNumber
1174 if not self
.__SkipToToken
("\'"):
1175 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1176 if currentLineNumber
!= self
.CurrentLineNumber
:
1177 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1178 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1184 ## __SkipToToken() method
1186 # Search forward in file buffer for the string
1187 # The skipped chars are put into self.__SkippedChars
1189 # @param self The object pointer
1190 # @param String The string to search
1191 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1192 # @retval True Successfully find the string, file buffer pointer moved forward
1193 # @retval False Not able to find the string, file buffer pointer not changed
1195 def __SkipToToken(self
, String
, IgnoreCase
= False):
1196 StartPos
= self
.GetFileBufferPos()
1198 self
.__SkippedChars
= ""
1199 while not self
.__EndOfFile
():
1202 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1204 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1206 self
.CurrentOffsetWithinLine
+= len(String
)
1207 self
.__SkippedChars
+= String
1209 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1212 self
.SetFileBufferPos( StartPos
)
1213 self
.__SkippedChars
= ""
1216 ## GetFileBufferPos() method
1218 # Return the tuple of current line and offset within the line
1220 # @param self The object pointer
1221 # @retval Tuple Line number and offset pair
1223 def GetFileBufferPos(self
):
1224 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1226 ## SetFileBufferPos() method
1228 # Restore the file buffer position
1230 # @param self The object pointer
1231 # @param Pos The new file buffer position
1233 def SetFileBufferPos(self
, Pos
):
1234 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1236 ## Preprocess() method
1238 # Preprocess comment, conditional directive, include directive, replace macro.
1239 # Exception will be raised if syntax error found
1241 # @param self The object pointer
1243 def Preprocess(self
):
1244 self
.__StringToList
()
1245 self
.PreprocessFile()
1246 self
.PreprocessIncludeFile()
1247 self
.__StringToList
()
1248 self
.PreprocessFile()
1249 self
.PreprocessConditionalStatement()
1250 self
.__StringToList
()
1251 for Pos
in self
.__WipeOffArea
:
1252 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1253 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1255 while self
.__GetDefines
():
1258 ## ParseFile() method
1260 # Parse the file profile buffer to extract fd, fv ... information
1261 # Exception will be raised if syntax error found
1263 # @param self The object pointer
1265 def ParseFile(self
):
1269 while self
.__GetFd
():
1272 while self
.__GetFv
():
1275 while self
.__GetCapsule
():
1278 while self
.__GetVtf
():
1281 while self
.__GetRule
():
1284 while self
.__GetOptionRom
():
1289 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1290 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1291 X
.Message
+= ' near line %d, column %d: %s' \
1292 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1295 ## __GetDefines() method
1297 # Get Defines section contents and store its data into AllMacrosList
1299 # @param self The object pointer
1300 # @retval True Successfully find a Defines
1301 # @retval False Not able to find a Defines
1303 def __GetDefines(self
):
1305 if not self
.__GetNextToken
():
1308 S
= self
.__Token
.upper()
1309 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1310 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1311 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1312 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
)
1317 if not self
.__IsToken
("[DEFINES", True):
1318 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1319 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1320 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1321 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1323 if not self
.__IsToken
( "]"):
1324 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1326 while self
.__GetNextWord
():
1327 # handle the SET statement
1328 if self
.__Token
== 'SET':
1330 self
.__GetSetStatement
(None)
1333 Macro
= self
.__Token
1335 if not self
.__IsToken
("="):
1336 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1337 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1338 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1339 Value
= self
.__Token
1345 # Get FD section contents and store its data into FD dictionary of self.Profile
1347 # @param self The object pointer
1348 # @retval True Successfully find a FD
1349 # @retval False Not able to find a FD
1353 if not self
.__GetNextToken
():
1356 S
= self
.__Token
.upper()
1357 if S
.startswith("[") and not S
.startswith("[FD."):
1358 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1359 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1360 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1365 if not self
.__IsToken
("[FD.", True):
1366 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1367 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1368 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1369 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1371 FdName
= self
.__GetUiName
()
1373 if len (self
.Profile
.FdDict
) == 0:
1374 FdName
= GenFdsGlobalVariable
.PlatformName
1375 if FdName
== "" and GlobalData
.gActivePlatform
:
1376 FdName
= GlobalData
.gActivePlatform
.PlatformName
1377 self
.Profile
.FdNameNotSet
= True
1379 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1380 self
.CurrentFdName
= FdName
.upper()
1382 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1383 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1385 if not self
.__IsToken
( "]"):
1386 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1389 FdObj
.FdUiName
= self
.CurrentFdName
1390 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1392 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1393 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1395 Status
= self
.__GetCreateFile
(FdObj
)
1397 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1399 self
.__GetTokenStatements
(FdObj
)
1401 self
.__GetDefineStatements
(FdObj
)
1403 self
.__GetSetStatements
(FdObj
)
1405 if not self
.__GetRegionLayout
(FdObj
):
1406 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1408 while self
.__GetRegionLayout
(FdObj
):
1412 ## __GetUiName() method
1414 # Return the UI name of a section
1416 # @param self The object pointer
1417 # @retval FdName UI name
1419 def __GetUiName(self
):
1421 if self
.__GetNextWord
():
1426 ## __GetCreateFile() method
1428 # Return the output file name of object
1430 # @param self The object pointer
1431 # @param Obj object whose data will be stored in file
1432 # @retval FdName UI name
1434 def __GetCreateFile(self
, Obj
):
1436 if self
.__IsKeyword
( "CREATE_FILE"):
1437 if not self
.__IsToken
( "="):
1438 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1440 if not self
.__GetNextToken
():
1441 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1443 FileName
= self
.__Token
1444 Obj
.CreateFileName
= FileName
1448 ## __GetTokenStatements() method
1450 # Get token statements
1452 # @param self The object pointer
1453 # @param Obj for whom token statement is got
1455 def __GetTokenStatements(self
, Obj
):
1456 if not self
.__IsKeyword
( "BaseAddress"):
1457 raise Warning("BaseAddress missing", self
.FileName
, self
.CurrentLineNumber
)
1459 if not self
.__IsToken
( "="):
1460 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1462 if not self
.__GetNextHexNumber
():
1463 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1465 Obj
.BaseAddress
= self
.__Token
1467 if self
.__IsToken
( "|"):
1468 pcdPair
= self
.__GetNextPcdName
()
1469 Obj
.BaseAddressPcd
= pcdPair
1470 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1471 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1472 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1474 if not self
.__IsKeyword
( "Size"):
1475 raise Warning("Size missing", self
.FileName
, self
.CurrentLineNumber
)
1477 if not self
.__IsToken
( "="):
1478 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1480 if not self
.__GetNextHexNumber
():
1481 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1485 if self
.__IsToken
( "|"):
1486 pcdPair
= self
.__GetNextPcdName
()
1487 Obj
.SizePcd
= pcdPair
1488 self
.Profile
.PcdDict
[pcdPair
] = Size
1489 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1490 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1491 Obj
.Size
= long(Size
, 0)
1493 if not self
.__IsKeyword
( "ErasePolarity"):
1494 raise Warning("ErasePolarity missing", self
.FileName
, self
.CurrentLineNumber
)
1496 if not self
.__IsToken
( "="):
1497 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1499 if not self
.__GetNextToken
():
1500 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1502 if self
.__Token
!= "1" and self
.__Token
!= "0":
1503 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1505 Obj
.ErasePolarity
= self
.__Token
1507 self
.__GetBlockStatements
(Obj
)
1509 ## __GetAddressStatements() method
1511 # Get address statements
1513 # @param self The object pointer
1514 # @param Obj for whom address statement is got
1515 # @retval True Successfully find
1516 # @retval False Not able to find
1518 def __GetAddressStatements(self
, Obj
):
1520 if self
.__IsKeyword
("BsBaseAddress"):
1521 if not self
.__IsToken
( "="):
1522 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1524 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1525 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1527 BsAddress
= long(self
.__Token
, 0)
1528 Obj
.BsBaseAddress
= BsAddress
1530 if self
.__IsKeyword
("RtBaseAddress"):
1531 if not self
.__IsToken
( "="):
1532 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1534 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1535 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1537 RtAddress
= long(self
.__Token
, 0)
1538 Obj
.RtBaseAddress
= RtAddress
1540 ## __GetBlockStatements() method
1542 # Get block statements
1544 # @param self The object pointer
1545 # @param Obj for whom block statement is got
1547 def __GetBlockStatements(self
, Obj
):
1549 if not self
.__GetBlockStatement
(Obj
):
1550 #set default block size is 1
1551 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1554 while self
.__GetBlockStatement
(Obj
):
1557 for Item
in Obj
.BlockSizeList
:
1558 if Item
[0] == None or Item
[1] == None:
1559 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1561 ## __GetBlockStatement() method
1563 # Get block statement
1565 # @param self The object pointer
1566 # @param Obj for whom block statement is got
1567 # @retval True Successfully find
1568 # @retval False Not able to find
1570 def __GetBlockStatement(self
, Obj
):
1571 if not self
.__IsKeyword
( "BlockSize"):
1574 if not self
.__IsToken
( "="):
1575 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1577 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1578 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1580 BlockSize
= self
.__Token
1582 if self
.__IsToken
( "|"):
1583 PcdPair
= self
.__GetNextPcdName
()
1584 BlockSizePcd
= PcdPair
1585 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1586 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1587 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1588 BlockSize
= long(BlockSize
, 0)
1591 if self
.__IsKeyword
( "NumBlocks"):
1592 if not self
.__IsToken
( "="):
1593 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1595 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1596 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1598 BlockNumber
= long(self
.__Token
, 0)
1600 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1603 ## __GetDefineStatements() method
1605 # Get define statements
1607 # @param self The object pointer
1608 # @param Obj for whom define statement is got
1609 # @retval True Successfully find
1610 # @retval False Not able to find
1612 def __GetDefineStatements(self
, Obj
):
1613 while self
.__GetDefineStatement
( Obj
):
1616 ## __GetDefineStatement() method
1618 # Get define statement
1620 # @param self The object pointer
1621 # @param Obj for whom define statement is got
1622 # @retval True Successfully find
1623 # @retval False Not able to find
1625 def __GetDefineStatement(self
, Obj
):
1626 if self
.__IsKeyword
("DEFINE"):
1627 self
.__GetNextToken
()
1628 Macro
= self
.__Token
1629 if not self
.__IsToken
( "="):
1630 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1632 if not self
.__GetNextToken
():
1633 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1635 Value
= self
.__Token
1636 Macro
= '$(' + Macro
+ ')'
1637 Obj
.DefineVarDict
[Macro
] = Value
1642 ## __GetSetStatements() method
1644 # Get set statements
1646 # @param self The object pointer
1647 # @param Obj for whom set statement is got
1648 # @retval True Successfully find
1649 # @retval False Not able to find
1651 def __GetSetStatements(self
, Obj
):
1652 while self
.__GetSetStatement
(Obj
):
1655 ## __GetSetStatement() method
1659 # @param self The object pointer
1660 # @param Obj for whom set statement is got
1661 # @retval True Successfully find
1662 # @retval False Not able to find
1664 def __GetSetStatement(self
, Obj
):
1665 if self
.__IsKeyword
("SET"):
1666 PcdPair
= self
.__GetNextPcdName
()
1668 if not self
.__IsToken
( "="):
1669 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1671 Value
= self
.__GetExpression
()
1672 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1675 Obj
.SetVarDict
[PcdPair
] = Value
1676 self
.Profile
.PcdDict
[PcdPair
] = Value
1677 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1678 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1683 ## __GetRegionLayout() method
1685 # Get region layout for FD
1687 # @param self The object pointer
1688 # @param Fd for whom region is got
1689 # @retval True Successfully find
1690 # @retval False Not able to find
1692 def __GetRegionLayout(self
, Fd
):
1693 if not self
.__GetNextHexNumber
():
1696 RegionObj
= Region
.Region()
1697 RegionObj
.Offset
= long(self
.__Token
, 0)
1698 Fd
.RegionList
.append(RegionObj
)
1700 if not self
.__IsToken
( "|"):
1701 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1703 if not self
.__GetNextHexNumber
():
1704 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1705 RegionObj
.Size
= long(self
.__Token
, 0)
1707 if not self
.__GetNextWord
():
1710 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1712 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1713 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1714 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1715 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1716 if self
.__IsToken
( "|"):
1717 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1718 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1719 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1720 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1722 if not self
.__GetNextWord
():
1725 if self
.__Token
== "SET":
1727 self
.__GetSetStatements
( RegionObj
)
1728 if not self
.__GetNextWord
():
1731 elif self
.__Token
== "FV":
1733 self
.__GetRegionFvType
( RegionObj
)
1735 elif self
.__Token
== "CAPSULE":
1737 self
.__GetRegionCapType
( RegionObj
)
1739 elif self
.__Token
== "FILE":
1741 self
.__GetRegionFileType
( RegionObj
)
1743 elif self
.__Token
== "DATA":
1745 self
.__GetRegionDataType
( RegionObj
)
1747 raise Warning("A valid region type was not found. "
1748 "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",
1749 self
.FileName
, self
.CurrentLineNumber
)
1753 ## __GetRegionFvType() method
1755 # Get region fv data for region
1757 # @param self The object pointer
1758 # @param RegionObj for whom region data is got
1760 def __GetRegionFvType(self
, RegionObj
):
1762 if not self
.__IsKeyword
( "FV"):
1763 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1765 if not self
.__IsToken
( "="):
1766 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1768 if not self
.__GetNextToken
():
1769 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1771 RegionObj
.RegionType
= "FV"
1772 RegionObj
.RegionDataList
.append(self
.__Token
)
1774 while self
.__IsKeyword
( "FV"):
1776 if not self
.__IsToken
( "="):
1777 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1779 if not self
.__GetNextToken
():
1780 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1782 RegionObj
.RegionDataList
.append(self
.__Token
)
1784 ## __GetRegionCapType() method
1786 # Get region capsule data for region
1788 # @param self The object pointer
1789 # @param RegionObj for whom region data is got
1791 def __GetRegionCapType(self
, RegionObj
):
1793 if not self
.__IsKeyword
("CAPSULE"):
1794 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1796 if not self
.__IsToken
("="):
1797 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1799 if not self
.__GetNextToken
():
1800 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1802 RegionObj
.RegionType
= "CAPSULE"
1803 RegionObj
.RegionDataList
.append(self
.__Token
)
1805 while self
.__IsKeyword
("CAPSULE"):
1807 if not self
.__IsToken
("="):
1808 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1810 if not self
.__GetNextToken
():
1811 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1813 RegionObj
.RegionDataList
.append(self
.__Token
)
1815 ## __GetRegionFileType() method
1817 # Get region file data for region
1819 # @param self The object pointer
1820 # @param RegionObj for whom region data is got
1822 def __GetRegionFileType(self
, RegionObj
):
1824 if not self
.__IsKeyword
( "FILE"):
1825 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1827 if not self
.__IsToken
( "="):
1828 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1830 if not self
.__GetNextToken
():
1831 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1833 RegionObj
.RegionType
= "FILE"
1834 RegionObj
.RegionDataList
.append( self
.__Token
)
1836 while self
.__IsKeyword
( "FILE"):
1838 if not self
.__IsToken
( "="):
1839 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1841 if not self
.__GetNextToken
():
1842 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1844 RegionObj
.RegionDataList
.append(self
.__Token
)
1846 ## __GetRegionDataType() method
1848 # Get region array data for region
1850 # @param self The object pointer
1851 # @param RegionObj for whom region data is got
1853 def __GetRegionDataType(self
, RegionObj
):
1855 if not self
.__IsKeyword
( "DATA"):
1856 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
1858 if not self
.__IsToken
( "="):
1859 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1861 if not self
.__IsToken
( "{"):
1862 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1864 if not self
.__GetNextHexNumber
():
1865 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1867 if len(self
.__Token
) > 18:
1868 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1870 # convert hex string value to byte hex string array
1871 AllString
= self
.__Token
1872 AllStrLen
= len (AllString
)
1874 while AllStrLen
> 4:
1875 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1876 AllStrLen
= AllStrLen
- 2
1877 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1880 if len (self
.__Token
) <= 4:
1881 while self
.__IsToken
(","):
1882 if not self
.__GetNextHexNumber
():
1883 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1884 if len(self
.__Token
) > 4:
1885 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1886 DataString
+= self
.__Token
1889 if not self
.__IsToken
( "}"):
1890 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1892 DataString
= DataString
.rstrip(",")
1893 RegionObj
.RegionType
= "DATA"
1894 RegionObj
.RegionDataList
.append( DataString
)
1896 while self
.__IsKeyword
( "DATA"):
1898 if not self
.__IsToken
( "="):
1899 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1901 if not self
.__IsToken
( "{"):
1902 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1904 if not self
.__GetNextHexNumber
():
1905 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1907 if len(self
.__Token
) > 18:
1908 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1910 # convert hex string value to byte hex string array
1911 AllString
= self
.__Token
1912 AllStrLen
= len (AllString
)
1914 while AllStrLen
> 4:
1915 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1916 AllStrLen
= AllStrLen
- 2
1917 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1920 if len (self
.__Token
) <= 4:
1921 while self
.__IsToken
(","):
1922 if not self
.__GetNextHexNumber
():
1923 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1924 if len(self
.__Token
) > 4:
1925 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1926 DataString
+= self
.__Token
1929 if not self
.__IsToken
( "}"):
1930 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1932 DataString
= DataString
.rstrip(",")
1933 RegionObj
.RegionDataList
.append( DataString
)
1937 # Get FV section contents and store its data into FV dictionary of self.Profile
1939 # @param self The object pointer
1940 # @retval True Successfully find a FV
1941 # @retval False Not able to find a FV
1944 if not self
.__GetNextToken
():
1947 S
= self
.__Token
.upper()
1948 if S
.startswith("[") and not S
.startswith("[FV."):
1949 if not S
.startswith("[CAPSULE.") \
1950 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1951 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1956 if not self
.__IsToken
("[FV.", True):
1957 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1958 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1959 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1960 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1962 FvName
= self
.__GetUiName
()
1963 self
.CurrentFvName
= FvName
.upper()
1965 if not self
.__IsToken
( "]"):
1966 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1969 FvObj
.UiFvName
= self
.CurrentFvName
1970 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1972 Status
= self
.__GetCreateFile
(FvObj
)
1974 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
1976 self
.__GetDefineStatements
(FvObj
)
1978 self
.__GetAddressStatements
(FvObj
)
1980 while self
.__GetBlockStatement
(FvObj
):
1983 self
.__GetSetStatements
(FvObj
)
1985 self
.__GetFvBaseAddress
(FvObj
)
1987 self
.__GetFvForceRebase
(FvObj
)
1989 self
.__GetFvAlignment
(FvObj
)
1991 self
.__GetFvAttributes
(FvObj
)
1993 self
.__GetFvNameGuid
(FvObj
)
1995 FvObj
.FvExtEntryTypeValue
= []
1996 FvObj
.FvExtEntryType
= []
1997 FvObj
.FvExtEntryData
= []
1999 isFvExtEntry
= self
.__GetFvExtEntryStatement
(FvObj
)
2000 if not isFvExtEntry
:
2003 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2004 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2007 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2008 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2009 if not isInf
and not isFile
:
2014 ## __GetFvAlignment() method
2016 # Get alignment for FV
2018 # @param self The object pointer
2019 # @param Obj for whom alignment is got
2020 # @retval True Successfully find a alignment statement
2021 # @retval False Not able to find a alignment statement
2023 def __GetFvAlignment(self
, Obj
):
2025 if not self
.__IsKeyword
( "FvAlignment"):
2028 if not self
.__IsToken
( "="):
2029 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2031 if not self
.__GetNextToken
():
2032 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2034 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2035 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2036 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2038 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2039 Obj
.FvAlignment
= self
.__Token
2042 ## __GetFvBaseAddress() method
2044 # Get BaseAddress for FV
2046 # @param self The object pointer
2047 # @param Obj for whom FvBaseAddress is got
2048 # @retval True Successfully find a FvBaseAddress statement
2049 # @retval False Not able to find a FvBaseAddress statement
2051 def __GetFvBaseAddress(self
, Obj
):
2053 if not self
.__IsKeyword
("FvBaseAddress"):
2056 if not self
.__IsToken
( "="):
2057 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2059 if not self
.__GetNextToken
():
2060 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2062 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2064 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2065 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2066 Obj
.FvBaseAddress
= self
.__Token
2069 ## __GetFvForceRebase() method
2071 # Get FvForceRebase for FV
2073 # @param self The object pointer
2074 # @param Obj for whom FvForceRebase is got
2075 # @retval True Successfully find a FvForceRebase statement
2076 # @retval False Not able to find a FvForceRebase statement
2078 def __GetFvForceRebase(self
, Obj
):
2080 if not self
.__IsKeyword
("FvForceRebase"):
2083 if not self
.__IsToken
( "="):
2084 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2086 if not self
.__GetNextToken
():
2087 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2089 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2090 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2092 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2093 Obj
.FvForceRebase
= True
2094 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2095 Obj
.FvForceRebase
= False
2097 Obj
.FvForceRebase
= None
2102 ## __GetFvAttributes() method
2104 # Get attributes for FV
2106 # @param self The object pointer
2107 # @param Obj for whom attribute is got
2110 def __GetFvAttributes(self
, FvObj
):
2112 while self
.__GetNextWord
():
2114 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2115 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2116 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2117 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2118 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2119 "WRITE_POLICY_RELIABLE"):
2123 if not self
.__IsToken
( "="):
2124 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2126 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2127 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2129 FvObj
.FvAttributeDict
[name
] = self
.__Token
2133 ## __GetFvNameGuid() method
2135 # Get FV GUID for FV
2137 # @param self The object pointer
2138 # @param Obj for whom GUID is got
2141 def __GetFvNameGuid(self
, FvObj
):
2143 if not self
.__IsKeyword
( "FvNameGuid"):
2146 if not self
.__IsToken
( "="):
2147 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2149 if not self
.__GetNextGuid
():
2150 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2152 FvObj
.FvNameGuid
= self
.__Token
2156 def __GetFvExtEntryStatement(self
, FvObj
):
2158 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2161 if not self
.__IsKeyword
("TYPE"):
2162 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2164 if not self
.__IsToken
( "="):
2165 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2167 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2168 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2170 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2172 if not self
.__IsToken
( "{"):
2173 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2175 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2176 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2178 FvObj
.FvExtEntryType
+= [self
.__Token
]
2180 if self
.__Token
== 'DATA':
2182 if not self
.__IsToken
( "="):
2183 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2185 if not self
.__IsToken
( "{"):
2186 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2188 if not self
.__GetNextHexNumber
():
2189 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2191 if len(self
.__Token
) > 4:
2192 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2194 DataString
= self
.__Token
2197 while self
.__IsToken
(","):
2198 if not self
.__GetNextHexNumber
():
2199 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2200 if len(self
.__Token
) > 4:
2201 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2202 DataString
+= self
.__Token
2205 if not self
.__IsToken
( "}"):
2206 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2208 if not self
.__IsToken
( "}"):
2209 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2211 DataString
= DataString
.rstrip(",")
2212 FvObj
.FvExtEntryData
+= [DataString
]
2214 if self
.__Token
== 'FILE':
2216 if not self
.__IsToken
( "="):
2217 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2219 if not self
.__GetNextToken
():
2220 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2222 FvObj
.FvExtEntryData
+= [self
.__Token
]
2224 if not self
.__IsToken
( "}"):
2225 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2229 ## __GetAprioriSection() method
2231 # Get token statements
2233 # @param self The object pointer
2234 # @param FvObj for whom apriori is got
2235 # @param MacroDict dictionary used to replace macro
2236 # @retval True Successfully find apriori statement
2237 # @retval False Not able to find apriori statement
2239 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2241 if not self
.__IsKeyword
( "APRIORI"):
2244 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2245 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2246 AprType
= self
.__Token
2248 if not self
.__IsToken
( "{"):
2249 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2251 AprSectionObj
= AprioriSection
.AprioriSection()
2252 AprSectionObj
.AprioriType
= AprType
2254 self
.__GetDefineStatements
(AprSectionObj
)
2255 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2258 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2259 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2260 if not IsInf
and not IsFile
:
2263 if not self
.__IsToken
( "}"):
2264 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2266 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2269 ## __GetInfStatement() method
2271 # Get INF statements
2273 # @param self The object pointer
2274 # @param Obj for whom inf statement is got
2275 # @param MacroDict dictionary used to replace macro
2276 # @retval True Successfully find inf statement
2277 # @retval False Not able to find inf statement
2279 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2281 if not self
.__IsKeyword
( "INF"):
2284 ffsInf
= FfsInfStatement
.FfsInfStatement()
2285 self
.__GetInfOptions
( ffsInf
)
2287 if not self
.__GetNextToken
():
2288 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2289 ffsInf
.InfFileName
= self
.__Token
2290 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2291 #do case sensitive check for file path
2292 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2294 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2296 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2297 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2298 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2299 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2301 if self
.__IsToken
('|'):
2302 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2303 ffsInf
.KeepReloc
= False
2304 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2305 ffsInf
.KeepReloc
= True
2307 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2309 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2310 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2313 capsuleFfs
= CapsuleData
.CapsuleFfs()
2314 capsuleFfs
.Ffs
= ffsInf
2315 Obj
.CapsuleDataList
.append(capsuleFfs
)
2317 Obj
.FfsList
.append(ffsInf
)
2320 ## __GetInfOptions() method
2322 # Get options for INF
2324 # @param self The object pointer
2325 # @param FfsInfObj for whom option is got
2327 def __GetInfOptions(self
, FfsInfObj
):
2329 if self
.__IsKeyword
( "RuleOverride"):
2330 if not self
.__IsToken
( "="):
2331 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2332 if not self
.__GetNextToken
():
2333 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2334 FfsInfObj
.Rule
= self
.__Token
2336 if self
.__IsKeyword
( "VERSION"):
2337 if not self
.__IsToken
( "="):
2338 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2339 if not self
.__GetNextToken
():
2340 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2342 if self
.__GetStringData
():
2343 FfsInfObj
.Version
= self
.__Token
2345 if self
.__IsKeyword
( "UI"):
2346 if not self
.__IsToken
( "="):
2347 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2348 if not self
.__GetNextToken
():
2349 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2351 if self
.__GetStringData
():
2352 FfsInfObj
.Ui
= self
.__Token
2354 if self
.__IsKeyword
( "USE"):
2355 if not self
.__IsToken
( "="):
2356 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2357 if not self
.__GetNextToken
():
2358 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2359 FfsInfObj
.UseArch
= self
.__Token
2362 if self
.__GetNextToken
():
2363 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2364 if p
.match(self
.__Token
):
2365 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2366 if not self
.__IsToken
(","):
2372 while self
.__GetNextToken
():
2373 if not p
.match(self
.__Token
):
2374 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2375 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2377 if not self
.__IsToken
(","):
2380 ## __GetFileStatement() method
2382 # Get FILE statements
2384 # @param self The object pointer
2385 # @param Obj for whom FILE statement is got
2386 # @param MacroDict dictionary used to replace macro
2387 # @retval True Successfully find FILE statement
2388 # @retval False Not able to find FILE statement
2390 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2392 if not self
.__IsKeyword
( "FILE"):
2395 if not self
.__GetNextWord
():
2396 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2398 if ForCapsule
and self
.__Token
== 'DATA':
2403 FfsFileObj
= FfsFileStatement
.FileStatement()
2404 FfsFileObj
.FvFileType
= self
.__Token
2406 if not self
.__IsToken
( "="):
2407 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2409 if not self
.__GetNextGuid
():
2410 if not self
.__GetNextWord
():
2411 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2412 if self
.__Token
== 'PCD':
2413 if not self
.__IsToken
( "("):
2414 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2415 PcdPair
= self
.__GetNextPcdName
()
2416 if not self
.__IsToken
( ")"):
2417 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2418 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2420 FfsFileObj
.NameGuid
= self
.__Token
2422 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2423 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2425 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2428 capsuleFfs
= CapsuleData
.CapsuleFfs()
2429 capsuleFfs
.Ffs
= FfsFileObj
2430 Obj
.CapsuleDataList
.append(capsuleFfs
)
2432 Obj
.FfsList
.append(FfsFileObj
)
2436 ## __FileCouldHaveRelocFlag() method
2438 # Check whether reloc strip flag can be set for a file type.
2440 # @param self The object pointer
2441 # @param FileType The file type to check with
2442 # @retval True This type could have relocation strip flag
2443 # @retval False No way to have it
2446 def __FileCouldHaveRelocFlag (self
, FileType
):
2447 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2452 ## __SectionCouldHaveRelocFlag() method
2454 # Check whether reloc strip flag can be set for a section type.
2456 # @param self The object pointer
2457 # @param SectionType The section type to check with
2458 # @retval True This type could have relocation strip flag
2459 # @retval False No way to have it
2462 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2463 if SectionType
in ('TE', 'PE32'):
2468 ## __GetFilePart() method
2470 # Get components for FILE statement
2472 # @param self The object pointer
2473 # @param FfsFileObj for whom component is got
2474 # @param MacroDict dictionary used to replace macro
2476 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2478 self
.__GetFileOpts
( FfsFileObj
)
2480 if not self
.__IsToken
("{"):
2481 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2482 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2483 # if self.__Token == 'RELOCS_STRIPPED':
2484 # FfsFileObj.KeepReloc = False
2486 # FfsFileObj.KeepReloc = True
2488 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2490 # if not self.__IsToken("{"):
2491 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2493 if not self
.__GetNextToken
():
2494 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2496 if self
.__Token
== "FV":
2497 if not self
.__IsToken
( "="):
2498 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2499 if not self
.__GetNextToken
():
2500 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2501 FfsFileObj
.FvName
= self
.__Token
2503 elif self
.__Token
== "FD":
2504 if not self
.__IsToken
( "="):
2505 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2506 if not self
.__GetNextToken
():
2507 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2508 FfsFileObj
.FdName
= self
.__Token
2510 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2512 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2514 FfsFileObj
.FileName
= self
.__Token
2515 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2517 # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase.
2519 if not GlobalData
.gAutoGenPhase
:
2520 #do case sensitive check for file path
2521 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2523 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2525 if not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FfsFileObj
.FileName
:
2526 #do case sensitive check for file path
2527 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2529 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2532 if not self
.__IsToken
( "}"):
2533 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2535 ## __GetFileOpts() method
2537 # Get options for FILE statement
2539 # @param self The object pointer
2540 # @param FfsFileObj for whom options is got
2542 def __GetFileOpts(self
, FfsFileObj
):
2544 if self
.__GetNextToken
():
2545 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2546 if Pattern
.match(self
.__Token
):
2547 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2548 if self
.__IsToken
(","):
2549 while self
.__GetNextToken
():
2550 if not Pattern
.match(self
.__Token
):
2551 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2552 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2554 if not self
.__IsToken
(","):
2560 if self
.__IsKeyword
( "FIXED", True):
2561 FfsFileObj
.Fixed
= True
2563 if self
.__IsKeyword
( "CHECKSUM", True):
2564 FfsFileObj
.CheckSum
= True
2566 if self
.__GetAlignment
():
2567 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2568 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2569 #For FFS, Auto is default option same to ""
2570 if not self
.__Token
== "Auto":
2571 FfsFileObj
.Alignment
= self
.__Token
2573 ## __GetAlignment() method
2575 # Return the alignment value
2577 # @param self The object pointer
2578 # @retval True Successfully find alignment
2579 # @retval False Not able to find alignment
2581 def __GetAlignment(self
):
2582 if self
.__IsKeyword
( "Align", True):
2583 if not self
.__IsToken
( "="):
2584 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2586 if not self
.__GetNextToken
():
2587 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2592 ## __GetFilePart() method
2594 # Get section data for FILE statement
2596 # @param self The object pointer
2597 # @param FfsFileObj for whom section is got
2598 # @param MacroDict dictionary used to replace macro
2600 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2602 Dict
.update(MacroDict
)
2604 self
.__GetDefineStatements
(FfsFileObj
)
2606 Dict
.update(FfsFileObj
.DefineVarDict
)
2607 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2608 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2611 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2612 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2613 if not IsLeafSection
and not IsEncapSection
:
2616 ## __GetLeafSection() method
2618 # Get leaf section for Obj
2620 # @param self The object pointer
2621 # @param Obj for whom leaf section is got
2622 # @param MacroDict dictionary used to replace macro
2623 # @retval True Successfully find section statement
2624 # @retval False Not able to find section statement
2626 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2628 OldPos
= self
.GetFileBufferPos()
2630 if not self
.__IsKeyword
( "SECTION"):
2631 if len(Obj
.SectionList
) == 0:
2632 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2637 if self
.__GetAlignment
():
2638 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2639 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2640 AlignValue
= self
.__Token
2643 if self
.__IsKeyword
( "BUILD_NUM"):
2644 if not self
.__IsToken
( "="):
2645 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2647 if not self
.__GetNextToken
():
2648 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2650 BuildNum
= self
.__Token
2652 if self
.__IsKeyword
( "VERSION"):
2653 if AlignValue
== 'Auto':
2654 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2655 if not self
.__IsToken
( "="):
2656 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2657 if not self
.__GetNextToken
():
2658 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2659 VerSectionObj
= VerSection
.VerSection()
2660 VerSectionObj
.Alignment
= AlignValue
2661 VerSectionObj
.BuildNum
= BuildNum
2662 if self
.__GetStringData
():
2663 VerSectionObj
.StringData
= self
.__Token
2665 VerSectionObj
.FileName
= self
.__Token
2666 Obj
.SectionList
.append(VerSectionObj
)
2668 elif self
.__IsKeyword
( "UI"):
2669 if AlignValue
== 'Auto':
2670 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2671 if not self
.__IsToken
( "="):
2672 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2673 if not self
.__GetNextToken
():
2674 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2675 UiSectionObj
= UiSection
.UiSection()
2676 UiSectionObj
.Alignment
= AlignValue
2677 if self
.__GetStringData
():
2678 UiSectionObj
.StringData
= self
.__Token
2680 UiSectionObj
.FileName
= self
.__Token
2681 Obj
.SectionList
.append(UiSectionObj
)
2683 elif self
.__IsKeyword
( "FV_IMAGE"):
2684 if AlignValue
== 'Auto':
2685 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2686 if not self
.__IsToken
( "="):
2687 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2688 if not self
.__GetNextToken
():
2689 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2691 FvName
= self
.__Token
2694 if self
.__IsToken
( "{"):
2696 FvObj
.UiFvName
= FvName
.upper()
2697 self
.__GetDefineStatements
(FvObj
)
2698 MacroDict
.update(FvObj
.DefineVarDict
)
2699 self
.__GetBlockStatement
(FvObj
)
2700 self
.__GetSetStatements
(FvObj
)
2701 self
.__GetFvAlignment
(FvObj
)
2702 self
.__GetFvAttributes
(FvObj
)
2703 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2704 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2707 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2708 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2709 if not IsInf
and not IsFile
:
2712 if not self
.__IsToken
( "}"):
2713 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2715 FvImageSectionObj
= FvImageSection
.FvImageSection()
2716 FvImageSectionObj
.Alignment
= AlignValue
2718 FvImageSectionObj
.Fv
= FvObj
2719 FvImageSectionObj
.FvName
= None
2721 FvImageSectionObj
.FvName
= FvName
.upper()
2722 FvImageSectionObj
.FvFileName
= FvName
2724 Obj
.SectionList
.append(FvImageSectionObj
)
2726 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2727 if AlignValue
== 'Auto':
2728 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2729 DepexSectionObj
= DepexSection
.DepexSection()
2730 DepexSectionObj
.Alignment
= AlignValue
2731 DepexSectionObj
.DepexType
= self
.__Token
2733 if not self
.__IsToken
( "="):
2734 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2735 if not self
.__IsToken
( "{"):
2736 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2737 if not self
.__SkipToToken
( "}"):
2738 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2740 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2741 Obj
.SectionList
.append(DepexSectionObj
)
2744 if not self
.__GetNextWord
():
2745 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2747 # Encapsulation section appear, UndoToken and return
2748 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2749 self
.SetFileBufferPos(OldPos
)
2752 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2753 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2754 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2755 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2756 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2759 DataSectionObj
= DataSection
.DataSection()
2760 DataSectionObj
.Alignment
= AlignValue
2761 DataSectionObj
.SecType
= self
.__Token
2763 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2764 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2765 if self
.__Token
== 'RELOCS_STRIPPED':
2766 DataSectionObj
.KeepReloc
= False
2768 DataSectionObj
.KeepReloc
= True
2770 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
)
2772 if self
.__IsToken
("="):
2773 if not self
.__GetNextToken
():
2774 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2775 DataSectionObj
.SectFileName
= self
.__Token
2776 if DataSectionObj
.SectFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2777 #do case sensitive check for file path
2778 ErrorCode
, ErrorInfo
= PathClass(NormPath(DataSectionObj
.SectFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2780 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2782 if not self
.__GetCglSection
(DataSectionObj
):
2785 Obj
.SectionList
.append(DataSectionObj
)
2789 ## __GetCglSection() method
2791 # Get compressed or GUIDed section for Obj
2793 # @param self The object pointer
2794 # @param Obj for whom leaf section is got
2795 # @param AlignValue alignment value for complex section
2796 # @retval True Successfully find section statement
2797 # @retval False Not able to find section statement
2799 def __GetCglSection(self
, Obj
, AlignValue
= None):
2801 if self
.__IsKeyword
( "COMPRESS"):
2803 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2806 if not self
.__IsToken
("{"):
2807 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2809 CompressSectionObj
= CompressSection
.CompressSection()
2810 CompressSectionObj
.Alignment
= AlignValue
2811 CompressSectionObj
.CompType
= type
2812 # Recursive sections...
2814 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2815 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2816 if not IsLeafSection
and not IsEncapSection
:
2820 if not self
.__IsToken
( "}"):
2821 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2822 Obj
.SectionList
.append(CompressSectionObj
)
2825 # raise Warning("Compress type not known")
2829 elif self
.__IsKeyword
( "GUIDED"):
2831 if self
.__GetNextGuid
():
2832 GuidValue
= self
.__Token
2834 AttribDict
= self
.__GetGuidAttrib
()
2835 if not self
.__IsToken
("{"):
2836 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2837 GuidSectionObj
= GuidSection
.GuidSection()
2838 GuidSectionObj
.Alignment
= AlignValue
2839 GuidSectionObj
.NameGuid
= GuidValue
2840 GuidSectionObj
.SectionType
= "GUIDED"
2841 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2842 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2843 # Recursive sections...
2845 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2846 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2847 if not IsLeafSection
and not IsEncapSection
:
2850 if not self
.__IsToken
( "}"):
2851 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2852 Obj
.SectionList
.append(GuidSectionObj
)
2858 ## __GetGuidAttri() method
2860 # Get attributes for GUID section
2862 # @param self The object pointer
2863 # @retval AttribDict Dictionary of key-value pair of section attributes
2865 def __GetGuidAttrib(self
):
2868 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
2869 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
2870 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2871 AttribKey
= self
.__Token
2873 if not self
.__IsToken
("="):
2874 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2876 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2877 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2878 AttribDict
[AttribKey
] = self
.__Token
2880 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2881 AttribKey
= self
.__Token
2883 if not self
.__IsToken
("="):
2884 raise Warning("expected '='")
2886 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2887 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2888 AttribDict
[AttribKey
] = self
.__Token
2892 ## __GetEncapsulationSec() method
2894 # Get encapsulation section for FILE
2896 # @param self The object pointer
2897 # @param FfsFile for whom section is got
2898 # @retval True Successfully find section statement
2899 # @retval False Not able to find section statement
2901 def __GetEncapsulationSec(self
, FfsFileObj
):
2903 OldPos
= self
.GetFileBufferPos()
2904 if not self
.__IsKeyword
( "SECTION"):
2905 if len(FfsFileObj
.SectionList
) == 0:
2906 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2911 if self
.__GetAlignment
():
2912 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2913 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2914 AlignValue
= self
.__Token
2916 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2917 self
.SetFileBufferPos(OldPos
)
2922 ## __GetCapsule() method
2924 # Get capsule section contents and store its data into capsule list of self.Profile
2926 # @param self The object pointer
2927 # @retval True Successfully find a capsule
2928 # @retval False Not able to find a capsule
2930 def __GetCapsule(self
):
2932 if not self
.__GetNextToken
():
2935 S
= self
.__Token
.upper()
2936 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2937 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2938 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2943 if not self
.__IsToken
("[CAPSULE.", True):
2944 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2945 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2946 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2947 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2949 CapsuleObj
= Capsule
.Capsule()
2951 CapsuleName
= self
.__GetUiName
()
2953 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2955 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2957 if not self
.__IsToken
( "]"):
2958 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2960 if self
.__IsKeyword
("CREATE_FILE"):
2961 if not self
.__IsToken
( "="):
2962 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2964 if not self
.__GetNextToken
():
2965 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2967 CapsuleObj
.CreateFile
= self
.__Token
2969 self
.__GetCapsuleStatements
(CapsuleObj
)
2970 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
2973 ## __GetCapsuleStatements() method
2975 # Get statements for capsule
2977 # @param self The object pointer
2978 # @param Obj for whom statements are got
2980 def __GetCapsuleStatements(self
, Obj
):
2981 self
.__GetCapsuleTokens
(Obj
)
2982 self
.__GetDefineStatements
(Obj
)
2983 self
.__GetSetStatements
(Obj
)
2984 self
.__GetCapsuleData
(Obj
)
2986 ## __GetCapsuleTokens() method
2988 # Get token statements for capsule
2990 # @param self The object pointer
2991 # @param Obj for whom token statements are got
2993 def __GetCapsuleTokens(self
, Obj
):
2994 if not self
.__GetNextToken
():
2996 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):
2997 Name
= self
.__Token
.strip()
2998 if not self
.__IsToken
("="):
2999 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3000 if not self
.__GetNextToken
():
3001 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3002 if Name
== 'CAPSULE_FLAGS':
3003 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3004 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3005 Value
= self
.__Token
.strip()
3006 while self
.__IsToken
(","):
3008 if not self
.__GetNextToken
():
3009 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3010 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3011 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3012 Value
+= self
.__Token
.strip()
3014 Value
= self
.__Token
.strip()
3015 Obj
.TokensDict
[Name
] = Value
3016 if not self
.__GetNextToken
():
3020 ## __GetCapsuleData() method
3022 # Get capsule data for capsule
3024 # @param self The object pointer
3025 # @param Obj for whom capsule data are got
3027 def __GetCapsuleData(self
, Obj
):
3030 IsInf
= self
.__GetInfStatement
(Obj
, True)
3031 IsFile
= self
.__GetFileStatement
(Obj
, True)
3032 IsFv
= self
.__GetFvStatement
(Obj
)
3033 IsFd
= self
.__GetFdStatement
(Obj
)
3034 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3035 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
):
3038 ## __GetFvStatement() method
3040 # Get FV for capsule
3042 # @param self The object pointer
3043 # @param CapsuleObj for whom FV is got
3044 # @retval True Successfully find a FV statement
3045 # @retval False Not able to find a FV statement
3047 def __GetFvStatement(self
, CapsuleObj
):
3049 if not self
.__IsKeyword
("FV"):
3052 if not self
.__IsToken
("="):
3053 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3055 if not self
.__GetNextToken
():
3056 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3058 if self
.__Token
.upper() not in self
.Profile
.FvDict
.keys():
3059 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3061 CapsuleFv
= CapsuleData
.CapsuleFv()
3062 CapsuleFv
.FvName
= self
.__Token
3063 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3066 ## __GetFdStatement() method
3068 # Get FD for capsule
3070 # @param self The object pointer
3071 # @param CapsuleObj for whom FD is got
3072 # @retval True Successfully find a FD statement
3073 # @retval False Not able to find a FD statement
3075 def __GetFdStatement(self
, CapsuleObj
):
3077 if not self
.__IsKeyword
("FD"):
3080 if not self
.__IsToken
("="):
3081 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3083 if not self
.__GetNextToken
():
3084 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3086 if self
.__Token
.upper() not in self
.Profile
.FdDict
.keys():
3087 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3089 CapsuleFd
= CapsuleData
.CapsuleFd()
3090 CapsuleFd
.FdName
= self
.__Token
3091 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3094 ## __GetAnyFileStatement() method
3096 # Get AnyFile for capsule
3098 # @param self The object pointer
3099 # @param CapsuleObj for whom AnyFile is got
3100 # @retval True Successfully find a Anyfile statement
3101 # @retval False Not able to find a AnyFile statement
3103 def __GetAnyFileStatement(self
, CapsuleObj
):
3105 if not self
.__IsKeyword
("FILE"):
3108 if not self
.__IsKeyword
("DATA"):
3112 if not self
.__IsToken
("="):
3113 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3115 if not self
.__GetNextToken
():
3116 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3118 AnyFileName
= self
.__Token
3119 AnyFileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AnyFileName
)
3120 if not os
.path
.exists(AnyFileName
):
3121 raise Warning("File %s not exists"%AnyFileName
, self
.FileName
, self
.CurrentLineNumber
)
3123 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3124 CapsuleAnyFile
.FileName
= AnyFileName
3125 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3128 ## __GetRule() method
3130 # Get Rule section contents and store its data into rule list of self.Profile
3132 # @param self The object pointer
3133 # @retval True Successfully find a Rule
3134 # @retval False Not able to find a Rule
3136 def __GetRule(self
):
3138 if not self
.__GetNextToken
():
3141 S
= self
.__Token
.upper()
3142 if S
.startswith("[") and not S
.startswith("[RULE."):
3143 if not S
.startswith("[OPTIONROM."):
3144 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3148 if not self
.__IsToken
("[Rule.", True):
3149 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3150 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3151 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3152 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3154 if not self
.__SkipToToken
("."):
3155 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3157 Arch
= self
.__SkippedChars
.rstrip(".")
3158 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
3159 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3161 ModuleType
= self
.__GetModuleType
()
3164 if self
.__IsToken
("."):
3165 if not self
.__GetNextWord
():
3166 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3167 TemplateName
= self
.__Token
3169 if not self
.__IsToken
( "]"):
3170 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3172 RuleObj
= self
.__GetRuleFileStatements
()
3173 RuleObj
.Arch
= Arch
.upper()
3174 RuleObj
.ModuleType
= ModuleType
3175 RuleObj
.TemplateName
= TemplateName
3176 if TemplateName
== '' :
3177 self
.Profile
.RuleDict
['RULE' + \
3181 ModuleType
.upper() ] = RuleObj
3183 self
.Profile
.RuleDict
['RULE' + \
3187 ModuleType
.upper() + \
3189 TemplateName
.upper() ] = RuleObj
3190 # self.Profile.RuleList.append(rule)
3193 ## __GetModuleType() method
3195 # Return the module type
3197 # @param self The object pointer
3198 # @retval string module type
3200 def __GetModuleType(self
):
3202 if not self
.__GetNextWord
():
3203 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3204 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3205 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3206 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3207 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3208 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3209 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3210 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3213 ## __GetFileExtension() method
3215 # Return the file extension
3217 # @param self The object pointer
3218 # @retval string file name extension
3220 def __GetFileExtension(self
):
3221 if not self
.__IsToken
("."):
3222 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3225 if self
.__GetNextToken
():
3226 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3227 if Pattern
.match(self
.__Token
):
3231 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3234 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3236 ## __GetRuleFileStatement() method
3240 # @param self The object pointer
3241 # @retval Rule Rule object
3243 def __GetRuleFileStatements(self
):
3245 if not self
.__IsKeyword
("FILE"):
3246 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3248 if not self
.__GetNextWord
():
3249 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3251 Type
= self
.__Token
.strip().upper()
3252 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3253 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3254 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3256 if not self
.__IsToken
("="):
3257 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3259 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3260 if not self
.__GetNextWord
():
3261 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3262 if self
.__Token
== 'PCD':
3263 if not self
.__IsToken
( "("):
3264 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3265 PcdPair
= self
.__GetNextPcdName
()
3266 if not self
.__IsToken
( ")"):
3267 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3268 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3270 NameGuid
= self
.__Token
3273 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3274 if self
.__FileCouldHaveRelocFlag
(Type
):
3275 if self
.__Token
== 'RELOCS_STRIPPED':
3280 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3283 if self
.__GetNextToken
():
3284 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3285 if Pattern
.match(self
.__Token
):
3286 KeyStringList
.append(self
.__Token
)
3287 if self
.__IsToken
(","):
3288 while self
.__GetNextToken
():
3289 if not Pattern
.match(self
.__Token
):
3290 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3291 KeyStringList
.append(self
.__Token
)
3293 if not self
.__IsToken
(","):
3301 if self
.__IsKeyword
("Fixed", True):
3305 if self
.__IsKeyword
("CheckSum", True):
3309 if self
.__GetAlignment
():
3310 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3311 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3312 #For FFS, Auto is default option same to ""
3313 if not self
.__Token
== "Auto":
3314 AlignValue
= self
.__Token
3316 if self
.__IsToken
("{"):
3317 # Complex file rule expected
3318 Rule
= RuleComplexFile
.RuleComplexFile()
3319 Rule
.FvFileType
= Type
3320 Rule
.NameGuid
= NameGuid
3321 Rule
.Alignment
= AlignValue
3322 Rule
.CheckSum
= CheckSum
3324 Rule
.KeyStringList
= KeyStringList
3325 if KeepReloc
!= None:
3326 Rule
.KeepReloc
= KeepReloc
3329 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3330 IsLeaf
= self
.__GetEfiSection
(Rule
)
3331 if not IsEncapsulate
and not IsLeaf
:
3334 if not self
.__IsToken
("}"):
3335 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3340 # Simple file rule expected
3341 if not self
.__GetNextWord
():
3342 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3344 SectionName
= self
.__Token
3346 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3347 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3348 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3351 if self
.__IsKeyword
("Fixed", True):
3354 if self
.__IsKeyword
("CheckSum", True):
3358 if self
.__GetAlignment
():
3359 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3360 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3361 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3362 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3363 SectAlignment
= self
.__Token
3366 if self
.__IsToken
('|'):
3367 Ext
= self
.__GetFileExtension
()
3368 elif not self
.__GetNextToken
():
3369 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3371 Rule
= RuleSimpleFile
.RuleSimpleFile()
3372 Rule
.SectionType
= SectionName
3373 Rule
.FvFileType
= Type
3374 Rule
.NameGuid
= NameGuid
3375 Rule
.Alignment
= AlignValue
3376 Rule
.SectAlignment
= SectAlignment
3377 Rule
.CheckSum
= CheckSum
3379 Rule
.KeyStringList
= KeyStringList
3380 if KeepReloc
!= None:
3381 Rule
.KeepReloc
= KeepReloc
3382 Rule
.FileExtension
= Ext
3383 Rule
.FileName
= self
.__Token
3386 ## __GetEfiSection() method
3388 # Get section list for Rule
3390 # @param self The object pointer
3391 # @param Obj for whom section is got
3392 # @retval True Successfully find section statement
3393 # @retval False Not able to find section statement
3395 def __GetEfiSection(self
, Obj
):
3397 OldPos
= self
.GetFileBufferPos()
3398 if not self
.__GetNextWord
():
3400 SectionName
= self
.__Token
3402 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3403 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3407 if SectionName
== "FV_IMAGE":
3408 FvImageSectionObj
= FvImageSection
.FvImageSection()
3409 if self
.__IsKeyword
("FV_IMAGE"):
3411 if self
.__IsToken
( "{"):
3413 self
.__GetDefineStatements
(FvObj
)
3414 self
.__GetBlockStatement
(FvObj
)
3415 self
.__GetSetStatements
(FvObj
)
3416 self
.__GetFvAlignment
(FvObj
)
3417 self
.__GetFvAttributes
(FvObj
)
3418 self
.__GetAprioriSection
(FvObj
)
3419 self
.__GetAprioriSection
(FvObj
)
3422 IsInf
= self
.__GetInfStatement
(FvObj
)
3423 IsFile
= self
.__GetFileStatement
(FvObj
)
3424 if not IsInf
and not IsFile
:
3427 if not self
.__IsToken
( "}"):
3428 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3429 FvImageSectionObj
.Fv
= FvObj
3430 FvImageSectionObj
.FvName
= None
3433 if not self
.__IsKeyword
("FV"):
3434 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3435 FvImageSectionObj
.FvFileType
= self
.__Token
3437 if self
.__GetAlignment
():
3438 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3439 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3440 FvImageSectionObj
.Alignment
= self
.__Token
3442 if self
.__IsToken
('|'):
3443 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3444 elif self
.__GetNextToken
():
3445 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3446 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3447 FvImageSectionObj
.FvFileName
= self
.__Token
3451 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3453 Obj
.SectionList
.append(FvImageSectionObj
)
3456 EfiSectionObj
= EfiSection
.EfiSection()
3457 EfiSectionObj
.SectionType
= SectionName
3459 if not self
.__GetNextToken
():
3460 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3462 if self
.__Token
== "STRING":
3463 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3464 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3466 if not self
.__IsToken
('='):
3467 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3469 if not self
.__GetNextToken
():
3470 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3472 if self
.__GetStringData
():
3473 EfiSectionObj
.StringData
= self
.__Token
3475 if self
.__IsKeyword
("BUILD_NUM"):
3476 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3477 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3479 if not self
.__IsToken
("="):
3480 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3481 if not self
.__GetNextToken
():
3482 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3483 EfiSectionObj
.BuildNum
= self
.__Token
3486 EfiSectionObj
.FileType
= self
.__Token
3487 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3489 if self
.__IsKeyword
("Optional"):
3490 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3491 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3492 EfiSectionObj
.Optional
= True
3494 if self
.__IsKeyword
("BUILD_NUM"):
3495 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3496 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3498 if not self
.__IsToken
("="):
3499 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3500 if not self
.__GetNextToken
():
3501 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3502 EfiSectionObj
.BuildNum
= self
.__Token
3504 if self
.__GetAlignment
():
3505 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3506 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3507 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3508 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3509 EfiSectionObj
.Alignment
= self
.__Token
3511 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3512 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3513 if self
.__Token
== 'RELOCS_STRIPPED':
3514 EfiSectionObj
.KeepReloc
= False
3516 EfiSectionObj
.KeepReloc
= True
3517 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3518 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3520 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3523 if self
.__IsToken
('|'):
3524 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3525 elif self
.__GetNextToken
():
3526 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3527 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3529 if self
.__Token
.startswith('PCD'):
3531 self
.__GetNextWord
()
3533 if self
.__Token
== 'PCD':
3534 if not self
.__IsToken
( "("):
3535 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3536 PcdPair
= self
.__GetNextPcdName
()
3537 if not self
.__IsToken
( ")"):
3538 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3539 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3541 EfiSectionObj
.FileName
= self
.__Token
3546 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3548 Obj
.SectionList
.append(EfiSectionObj
)
3551 ## __RuleSectionCouldBeOptional() method
3553 # Get whether a section could be optional
3555 # @param self The object pointer
3556 # @param SectionType The section type to check
3557 # @retval True section could be optional
3558 # @retval False section never optional
3560 def __RuleSectionCouldBeOptional(self
, SectionType
):
3561 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3566 ## __RuleSectionCouldHaveBuildNum() method
3568 # Get whether a section could have build number information
3570 # @param self The object pointer
3571 # @param SectionType The section type to check
3572 # @retval True section could have build number information
3573 # @retval False section never have build number information
3575 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3576 if SectionType
in ("VERSION"):
3581 ## __RuleSectionCouldHaveString() method
3583 # Get whether a section could have string
3585 # @param self The object pointer
3586 # @param SectionType The section type to check
3587 # @retval True section could have string
3588 # @retval False section never have string
3590 def __RuleSectionCouldHaveString(self
, SectionType
):
3591 if SectionType
in ("UI", "VERSION"):
3596 ## __CheckRuleSectionFileType() method
3598 # Get whether a section matches a file type
3600 # @param self The object pointer
3601 # @param SectionType The section type to check
3602 # @param FileType The file type to check
3604 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3605 if SectionType
== "COMPAT16":
3606 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3607 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3608 elif SectionType
== "PE32":
3609 if FileType
not in ("PE32", "SEC_PE32"):
3610 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3611 elif SectionType
== "PIC":
3612 if FileType
not in ("PIC", "PIC"):
3613 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3614 elif SectionType
== "TE":
3615 if FileType
not in ("TE", "SEC_TE"):
3616 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3617 elif SectionType
== "RAW":
3618 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3619 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3620 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3621 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3622 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3623 elif SectionType
== "UI":
3624 if FileType
not in ("UI", "SEC_UI"):
3625 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3626 elif SectionType
== "VERSION":
3627 if FileType
not in ("VERSION", "SEC_VERSION"):
3628 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3629 elif SectionType
== "PEI_DEPEX":
3630 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3631 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3632 elif SectionType
== "GUID":
3633 if FileType
not in ("PE32", "SEC_GUID"):
3634 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3636 ## __GetRuleEncapsulationSection() method
3638 # Get encapsulation section for Rule
3640 # @param self The object pointer
3641 # @param Rule for whom section is got
3642 # @retval True Successfully find section statement
3643 # @retval False Not able to find section statement
3645 def __GetRuleEncapsulationSection(self
, Rule
):
3647 if self
.__IsKeyword
( "COMPRESS"):
3649 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3652 if not self
.__IsToken
("{"):
3653 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3655 CompressSectionObj
= CompressSection
.CompressSection()
3657 CompressSectionObj
.CompType
= Type
3658 # Recursive sections...
3660 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3661 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3662 if not IsEncapsulate
and not IsLeaf
:
3665 if not self
.__IsToken
( "}"):
3666 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3667 Rule
.SectionList
.append(CompressSectionObj
)
3671 elif self
.__IsKeyword
( "GUIDED"):
3673 if self
.__GetNextGuid
():
3674 GuidValue
= self
.__Token
3676 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3677 GuidValue
= self
.__Token
3679 AttribDict
= self
.__GetGuidAttrib
()
3681 if not self
.__IsToken
("{"):
3682 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3683 GuidSectionObj
= GuidSection
.GuidSection()
3684 GuidSectionObj
.NameGuid
= GuidValue
3685 GuidSectionObj
.SectionType
= "GUIDED"
3686 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3687 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3691 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3692 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3693 if not IsEncapsulate
and not IsLeaf
:
3696 if not self
.__IsToken
( "}"):
3697 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3698 Rule
.SectionList
.append(GuidSectionObj
)
3704 ## __GetVtf() method
3706 # Get VTF section contents and store its data into VTF list of self.Profile
3708 # @param self The object pointer
3709 # @retval True Successfully find a VTF
3710 # @retval False Not able to find a VTF
3714 if not self
.__GetNextToken
():
3717 S
= self
.__Token
.upper()
3718 if S
.startswith("[") and not S
.startswith("[VTF."):
3719 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3720 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3725 if not self
.__IsToken
("[VTF.", True):
3726 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3727 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3728 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3729 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3731 if not self
.__SkipToToken
("."):
3732 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3734 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3735 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3736 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3738 if not self
.__GetNextWord
():
3739 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3740 Name
= self
.__Token
.upper()
3743 VtfObj
.UiName
= Name
3744 VtfObj
.KeyArch
= Arch
3746 if self
.__IsToken
(","):
3747 if not self
.__GetNextWord
():
3748 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3749 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3750 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3751 VtfObj
.ArchList
= self
.__Token
.upper()
3753 if not self
.__IsToken
( "]"):
3754 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3756 if self
.__IsKeyword
("IA32_RST_BIN"):
3757 if not self
.__IsToken
("="):
3758 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3760 if not self
.__GetNextToken
():
3761 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3763 VtfObj
.ResetBin
= self
.__Token
3764 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3765 #check for file path
3766 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3768 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3770 while self
.__GetComponentStatement
(VtfObj
):
3773 self
.Profile
.VtfList
.append(VtfObj
)
3776 ## __GetComponentStatement() method
3778 # Get components in VTF
3780 # @param self The object pointer
3781 # @param VtfObj for whom component is got
3782 # @retval True Successfully find a component
3783 # @retval False Not able to find a component
3785 def __GetComponentStatement(self
, VtfObj
):
3787 if not self
.__IsKeyword
("COMP_NAME"):
3790 if not self
.__IsToken
("="):
3791 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3793 if not self
.__GetNextWord
():
3794 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3796 CompStatementObj
= ComponentStatement
.ComponentStatement()
3797 CompStatementObj
.CompName
= self
.__Token
3799 if not self
.__IsKeyword
("COMP_LOC"):
3800 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3802 if not self
.__IsToken
("="):
3803 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3805 CompStatementObj
.CompLoc
= ""
3806 if self
.__GetNextWord
():
3807 CompStatementObj
.CompLoc
= self
.__Token
3808 if self
.__IsToken
('|'):
3809 if not self
.__GetNextWord
():
3810 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3812 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3813 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3815 CompStatementObj
.FilePos
= self
.__Token
3817 self
.CurrentLineNumber
+= 1
3818 self
.CurrentOffsetWithinLine
= 0
3820 if not self
.__IsKeyword
("COMP_TYPE"):
3821 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3823 if not self
.__IsToken
("="):
3824 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3826 if not self
.__GetNextToken
():
3827 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3828 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3829 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3830 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3831 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3832 CompStatementObj
.CompType
= self
.__Token
3834 if not self
.__IsKeyword
("COMP_VER"):
3835 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
3837 if not self
.__IsToken
("="):
3838 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3840 if not self
.__GetNextToken
():
3841 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
3843 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
3844 if Pattern
.match(self
.__Token
) == None:
3845 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3846 CompStatementObj
.CompVer
= self
.__Token
3848 if not self
.__IsKeyword
("COMP_CS"):
3849 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3851 if not self
.__IsToken
("="):
3852 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3854 if not self
.__GetNextToken
():
3855 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3856 if self
.__Token
not in ("1", "0"):
3857 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3858 CompStatementObj
.CompCs
= self
.__Token
3861 if not self
.__IsKeyword
("COMP_BIN"):
3862 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3864 if not self
.__IsToken
("="):
3865 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3867 if not self
.__GetNextToken
():
3868 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3870 CompStatementObj
.CompBin
= self
.__Token
3871 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3872 #check for file path
3873 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3875 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3877 if not self
.__IsKeyword
("COMP_SYM"):
3878 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3880 if not self
.__IsToken
("="):
3881 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3883 if not self
.__GetNextToken
():
3884 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3886 CompStatementObj
.CompSym
= self
.__Token
3887 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
3888 #check for file path
3889 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3891 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3893 if not self
.__IsKeyword
("COMP_SIZE"):
3894 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3896 if not self
.__IsToken
("="):
3897 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3899 if self
.__IsToken
("-"):
3900 CompStatementObj
.CompSize
= self
.__Token
3901 elif self
.__GetNextDecimalNumber
():
3902 CompStatementObj
.CompSize
= self
.__Token
3903 elif self
.__GetNextHexNumber
():
3904 CompStatementObj
.CompSize
= self
.__Token
3906 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3908 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3911 ## __GetOptionRom() method
3913 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3915 # @param self The object pointer
3916 # @retval True Successfully find a OptionROM
3917 # @retval False Not able to find a OptionROM
3919 def __GetOptionRom(self
):
3921 if not self
.__GetNextToken
():
3924 S
= self
.__Token
.upper()
3925 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3926 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3929 if not self
.__IsToken
("[OptionRom.", True):
3930 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3932 OptRomName
= self
.__GetUiName
()
3934 if not self
.__IsToken
( "]"):
3935 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3937 OptRomObj
= OptionRom
.OPTIONROM()
3938 OptRomObj
.DriverName
= OptRomName
3939 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3942 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3943 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3944 if not isInf
and not isFile
:
3949 ## __GetOptRomInfStatement() method
3951 # Get INF statements
3953 # @param self The object pointer
3954 # @param Obj for whom inf statement is got
3955 # @retval True Successfully find inf statement
3956 # @retval False Not able to find inf statement
3958 def __GetOptRomInfStatement(self
, Obj
):
3960 if not self
.__IsKeyword
( "INF"):
3963 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3964 self
.__GetInfOptions
( ffsInf
)
3966 if not self
.__GetNextToken
():
3967 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3968 ffsInf
.InfFileName
= self
.__Token
3969 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3970 #check for file path
3971 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3973 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3975 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
3976 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
3977 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3978 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
3981 self
.__GetOptRomOverrides
(ffsInf
)
3983 Obj
.FfsList
.append(ffsInf
)
3986 ## __GetOptRomOverrides() method
3988 # Get overrides for OptROM INF & FILE
3990 # @param self The object pointer
3991 # @param FfsInfObj for whom overrides is got
3993 def __GetOptRomOverrides(self
, Obj
):
3994 if self
.__IsToken
('{'):
3995 Overrides
= OptionRom
.OverrideAttribs()
3997 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
3998 if not self
.__IsToken
( "="):
3999 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4000 if not self
.__GetNextHexNumber
():
4001 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4002 Overrides
.PciVendorId
= self
.__Token
4005 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4006 if not self
.__IsToken
( "="):
4007 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4008 if not self
.__GetNextHexNumber
():
4009 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4010 Overrides
.PciClassCode
= self
.__Token
4013 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4014 if not self
.__IsToken
( "="):
4015 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4016 if not self
.__GetNextHexNumber
():
4017 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4019 Overrides
.PciDeviceId
= self
.__Token
4022 if self
.__IsKeyword
( "PCI_REVISION"):
4023 if not self
.__IsToken
( "="):
4024 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4025 if not self
.__GetNextHexNumber
():
4026 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4027 Overrides
.PciRevision
= self
.__Token
4030 if self
.__IsKeyword
( "PCI_COMPRESS"):
4031 if not self
.__IsToken
( "="):
4032 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4033 if not self
.__GetNextToken
():
4034 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4035 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4038 if self
.__IsToken
( "}"):
4041 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4043 Obj
.OverrideAttribs
= Overrides
4045 ## __GetOptRomFileStatement() method
4047 # Get FILE statements
4049 # @param self The object pointer
4050 # @param Obj for whom FILE statement is got
4051 # @retval True Successfully find FILE statement
4052 # @retval False Not able to find FILE statement
4054 def __GetOptRomFileStatement(self
, Obj
):
4056 if not self
.__IsKeyword
( "FILE"):
4059 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4061 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4062 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4063 FfsFileObj
.FileType
= self
.__Token
4065 if not self
.__GetNextToken
():
4066 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4067 FfsFileObj
.FileName
= self
.__Token
4068 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4069 #check for file path
4070 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4072 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4074 if FfsFileObj
.FileType
== 'EFI':
4075 self
.__GetOptRomOverrides
(FfsFileObj
)
4077 Obj
.FfsList
.append(FfsFileObj
)
4081 ## __GetCapInFd() method
4083 # Get Cap list contained in FD
4085 # @param self The object pointer
4086 # @param FdName FD name
4087 # @retval CapList List of Capsule in FD
4089 def __GetCapInFd (self
, FdName
):
4092 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4093 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4094 for elementRegion
in FdObj
.RegionList
:
4095 if elementRegion
.RegionType
== 'CAPSULE':
4096 for elementRegionData
in elementRegion
.RegionDataList
:
4097 if elementRegionData
.endswith(".cap"):
4099 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
4100 CapList
.append(elementRegionData
.upper())
4103 ## __GetReferencedFdCapTuple() method
4105 # Get FV and FD list referenced by a capsule image
4107 # @param self The object pointer
4108 # @param CapObj Capsule section to be searched
4109 # @param RefFdList referenced FD by section
4110 # @param RefFvList referenced FV by section
4112 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4114 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4115 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4116 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4117 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4118 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4119 elif CapsuleDataObj
.Ffs
!= None:
4120 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4121 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4122 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4123 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4124 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4126 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4128 ## __GetFvInFd() method
4130 # Get FV list contained in FD
4132 # @param self The object pointer
4133 # @param FdName FD name
4134 # @retval FvList list of FV in FD
4136 def __GetFvInFd (self
, FdName
):
4139 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4140 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4141 for elementRegion
in FdObj
.RegionList
:
4142 if elementRegion
.RegionType
== 'FV':
4143 for elementRegionData
in elementRegion
.RegionDataList
:
4144 if elementRegionData
.endswith(".fv"):
4146 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4147 FvList
.append(elementRegionData
.upper())
4150 ## __GetReferencedFdFvTuple() method
4152 # Get FD and FV list referenced by a FFS file
4154 # @param self The object pointer
4155 # @param FfsFile contains sections to be searched
4156 # @param RefFdList referenced FD by section
4157 # @param RefFvList referenced FV by section
4159 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4161 for FfsObj
in FvObj
.FfsList
:
4162 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4163 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4164 RefFvList
.append(FfsObj
.FvName
.upper())
4165 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4166 RefFdList
.append(FfsObj
.FdName
.upper())
4168 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4170 ## __GetReferencedFdFvTupleFromSection() method
4172 # Get FD and FV list referenced by a FFS section
4174 # @param self The object pointer
4175 # @param FfsFile contains sections to be searched
4176 # @param FdList referenced FD by section
4177 # @param FvList referenced FV by section
4179 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4182 SectionStack
.extend(FfsFile
.SectionList
)
4183 while SectionStack
!= []:
4184 SectionObj
= SectionStack
.pop()
4185 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4186 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4187 FvList
.append(SectionObj
.FvName
.upper())
4188 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4189 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4190 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4192 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4193 SectionStack
.extend(SectionObj
.SectionList
)
4195 ## CycleReferenceCheck() method
4197 # Check whether cycle reference exists in FDF
4199 # @param self The object pointer
4200 # @retval True cycle reference exists
4201 # @retval False Not exists cycle reference
4203 def CycleReferenceCheck(self
):
4205 # Check the cycle between FV and FD image
4207 MaxLength
= len (self
.Profile
.FvDict
)
4208 for FvName
in self
.Profile
.FvDict
.keys():
4209 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4211 RefFvStack
.append(FvName
)
4215 while RefFvStack
!= [] and Index
< MaxLength
:
4217 FvNameFromStack
= RefFvStack
.pop()
4218 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4219 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4225 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4227 for RefFdName
in RefFdList
:
4228 if RefFdName
in FdAnalyzedList
:
4231 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4232 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4233 if FvInFdList
!= []:
4234 for FvNameInFd
in FvInFdList
:
4235 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4236 if FvNameInFd
not in RefFvStack
:
4237 RefFvStack
.append(FvNameInFd
)
4239 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4240 EdkLogger
.info(LogStr
)
4242 FdAnalyzedList
.append(RefFdName
)
4244 for RefFvName
in RefFvList
:
4245 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4246 if RefFvName
not in RefFvStack
:
4247 RefFvStack
.append(RefFvName
)
4249 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4250 EdkLogger
.info(LogStr
)
4254 # Check the cycle between Capsule and FD image
4256 MaxLength
= len (self
.Profile
.CapsuleDict
)
4257 for CapName
in self
.Profile
.CapsuleDict
.keys():
4259 # Capsule image to be checked.
4261 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4263 RefCapStack
.append(CapName
)
4268 while RefCapStack
!= [] and Index
< MaxLength
:
4270 CapNameFromStack
= RefCapStack
.pop()
4271 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4272 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4278 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4282 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4283 for RefFdName
in RefFdList
:
4284 if RefFdName
in FdAnalyzedList
:
4287 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4288 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4289 if CapInFdList
!= []:
4290 for CapNameInFd
in CapInFdList
:
4291 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4292 if CapNameInFd
not in RefCapStack
:
4293 RefCapStack
.append(CapNameInFd
)
4295 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4296 EdkLogger
.info(LogStr
)
4299 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4300 if FvInFdList
!= []:
4301 for FvNameInFd
in FvInFdList
:
4302 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4303 if FvNameInFd
not in RefFvList
:
4304 RefFvList
.append(FvNameInFd
)
4306 FdAnalyzedList
.append(RefFdName
)
4308 # the number of the parsed FV and FD image
4310 FvListLength
= len (RefFvList
)
4311 FdListLength
= len (RefFdList
)
4312 for RefFvName
in RefFvList
:
4313 if RefFvName
in FvAnalyzedList
:
4315 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4316 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4317 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4320 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4321 FvAnalyzedList
.append(RefFvName
)
4325 if __name__
== "__main__":
4328 test_file
= sys
.argv
[1]
4329 except IndexError, v
:
4330 print "Usage: %s filename" % sys
.argv
[0]
4333 parser
= FdfParser(test_file
)
4336 parser
.CycleReferenceCheck()