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*")
80 ShortcutPcdPattern
= re
.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
84 def GetRealFileLine (File
, Line
):
87 for Profile
in IncludeFileList
:
88 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
89 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
90 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
91 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
93 return (File
, Line
- InsertedLines
)
95 ## The exception class that used to report error messages when parsing FDF
97 # Currently the "ToolName" is set to be "FDF Parser".
99 class Warning (Exception):
102 # @param self The object pointer
103 # @param Str The message to record
104 # @param File The FDF name
105 # @param Line The Line number that error occurs
107 def __init__(self
, Str
, File
= None, Line
= None):
109 FileLineTuple
= GetRealFileLine(File
, Line
)
110 self
.FileName
= FileLineTuple
[0]
111 self
.LineNumber
= FileLineTuple
[1]
113 self
.ToolName
= 'FdfParser'
118 ## The MACRO class that used to record macro value data when parsing include file
124 # @param self The object pointer
125 # @param FileName The file that to be parsed
127 def __init__(self
, FileName
, Line
):
128 self
.FileName
= FileName
129 self
.DefinedAtLine
= Line
130 self
.MacroName
= None
131 self
.MacroValue
= None
133 ## The Include file content class that used to record file data when parsing include file
135 # May raise Exception when opening file.
137 class IncludeFileProfile
:
140 # @param self The object pointer
141 # @param FileName The file that to be parsed
143 def __init__(self
, FileName
):
144 self
.FileName
= FileName
145 self
.FileLinesList
= []
147 fsock
= open(FileName
, "rb", 0)
149 self
.FileLinesList
= fsock
.readlines()
154 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
156 self
.InsertStartLineNumber
= None
157 self
.InsertAdjust
= 0
159 ## The FDF content class that used to record file data when parsing FDF
161 # May raise Exception when opening file.
166 # @param self The object pointer
167 # @param FileName The file that to be parsed
169 def __init__(self
, FileName
):
170 self
.FileLinesList
= []
172 fsock
= open(FileName
, "rb", 0)
174 self
.FileLinesList
= fsock
.readlines()
179 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
184 # ECC will use this Dict and List information
185 self
.PcdFileLineDict
= {}
186 self
.InfFileLineList
= []
189 self
.FdNameNotSet
= False
191 self
.CapsuleDict
= {}
196 ## The syntax parser for FDF
198 # PreprocessFile method should be called prior to ParseFile
199 # CycleReferenceCheck method can detect cycles in FDF contents
201 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
202 # Get*** procedures mean these procedures will make judgement on current token only.
207 # @param self The object pointer
208 # @param FileName The file that to be parsed
210 def __init__(self
, FileName
):
211 self
.Profile
= FileProfile(FileName
)
212 self
.FileName
= FileName
213 self
.CurrentLineNumber
= 1
214 self
.CurrentOffsetWithinLine
= 0
215 self
.CurrentFdName
= None
216 self
.CurrentFvName
= None
218 self
.__SkippedChars
= ""
220 # Used to section info
221 self
.__CurSection
= []
222 # Key: [section name, UI name, arch]
223 # Value: {MACRO_NAME : MACRO_VALUE}
224 self
.__MacroDict
= tdict(True, 3)
227 self
.__WipeOffArea
= []
228 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
229 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
231 ## __IsWhiteSpace() method
233 # Whether char at current FileBufferPos is whitespace
235 # @param self The object pointer
236 # @param Char The char to test
237 # @retval True The char is a kind of white space
238 # @retval False The char is NOT a kind of white space
240 def __IsWhiteSpace(self
, Char
):
241 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
246 ## __SkipWhiteSpace() method
248 # Skip white spaces from current char, return number of chars skipped
250 # @param self The object pointer
251 # @retval Count The number of chars skipped
253 def __SkipWhiteSpace(self
):
255 while not self
.__EndOfFile
():
257 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
258 self
.__SkippedChars
+= str(self
.__CurrentChar
())
265 ## __EndOfFile() method
267 # Judge current buffer pos is at file end
269 # @param self The object pointer
270 # @retval True Current File buffer position is at file end
271 # @retval False Current File buffer position is NOT at file end
273 def __EndOfFile(self
):
274 NumberOfLines
= len(self
.Profile
.FileLinesList
)
275 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
276 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
278 elif self
.CurrentLineNumber
> NumberOfLines
:
283 ## __EndOfLine() method
285 # Judge current buffer pos is at line end
287 # @param self The object pointer
288 # @retval True Current File buffer position is at line end
289 # @retval False Current File buffer position is NOT at line end
291 def __EndOfLine(self
):
292 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
294 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
295 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
302 # Reset file data buffer to the initial state
304 # @param self The object pointer
307 self
.CurrentLineNumber
= 1
308 self
.CurrentOffsetWithinLine
= 0
310 ## __UndoOneChar() method
312 # Go back one char in the file buffer
314 # @param self The object pointer
315 # @retval True Successfully go back one char
316 # @retval False Not able to go back one char as file beginning reached
318 def __UndoOneChar(self
):
320 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
322 elif self
.CurrentOffsetWithinLine
== 0:
323 self
.CurrentLineNumber
-= 1
324 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
326 self
.CurrentOffsetWithinLine
-= 1
329 ## __GetOneChar() method
331 # Move forward one char in the file buffer
333 # @param self The object pointer
335 def __GetOneChar(self
):
336 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
337 self
.CurrentLineNumber
+= 1
338 self
.CurrentOffsetWithinLine
= 0
340 self
.CurrentOffsetWithinLine
+= 1
342 ## __CurrentChar() method
344 # Get the char pointed to by the file buffer pointer
346 # @param self The object pointer
347 # @retval Char Current char
349 def __CurrentChar(self
):
350 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
352 ## __NextChar() method
354 # Get the one char pass the char pointed to by the file buffer pointer
356 # @param self The object pointer
357 # @retval Char Next char
359 def __NextChar(self
):
360 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
361 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
363 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
365 ## __SetCurrentCharValue() method
367 # Modify the value of current char
369 # @param self The object pointer
370 # @param Value The new value of current char
372 def __SetCurrentCharValue(self
, Value
):
373 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
375 ## __CurrentLine() method
377 # Get the list that contains current line contents
379 # @param self The object pointer
380 # @retval List current line contents
382 def __CurrentLine(self
):
383 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
385 def __StringToList(self
):
386 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
387 self
.Profile
.FileLinesList
[-1].append(' ')
389 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
390 if StartPos
[0] == EndPos
[0]:
392 while Offset
<= EndPos
[1]:
393 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
398 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
399 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
403 while Line
< EndPos
[0]:
405 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
406 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
411 while Offset
<= EndPos
[1]:
412 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
416 def __GetMacroName(self
):
417 if not self
.__GetNextToken
():
418 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
419 MacroName
= self
.__Token
421 if MacroName
.startswith('!'):
423 MacroName
= MacroName
[1:].strip()
425 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
426 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
427 self
.FileName
, self
.CurrentLineNumber
)
428 MacroName
= MacroName
[2:-1]
429 return MacroName
, NotFlag
431 def __SetMacroValue(self
, Macro
, Value
):
432 if not self
.__CurSection
:
436 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
437 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
439 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
440 MacroDict
[Macro
] = Value
442 def __GetMacroValue(self
, Macro
):
444 if Macro
in GlobalData
.gCommandLineDefines
:
445 return GlobalData
.gCommandLineDefines
[Macro
]
446 if Macro
in GlobalData
.gGlobalDefines
:
447 return GlobalData
.gGlobalDefines
[Macro
]
449 if self
.__CurSection
:
450 MacroDict
= self
.__MacroDict
[
451 self
.__CurSection
[0],
452 self
.__CurSection
[1],
455 if MacroDict
and Macro
in MacroDict
:
456 return MacroDict
[Macro
]
459 if Macro
in GlobalData
.gPlatformDefines
:
460 return GlobalData
.gPlatformDefines
[Macro
]
463 def __SectionHeaderParser(self
, Section
):
465 # [FD.UiName]: use dummy instead if UI name is optional
468 # [Rule]: don't take rule section into account, macro is not allowed in this section
469 # [VTF.arch.UiName, arch]
470 # [OptionRom.DriverName]
471 self
.__CurSection
= []
472 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
473 ItemList
= Section
.split('.')
475 if Item
== '' or Item
== 'RULE':
478 if Item
== 'DEFINES':
479 self
.__CurSection
= ['COMMON', 'COMMON', 'COMMON']
480 elif Item
== 'VTF' and len(ItemList
) == 3:
482 Pos
= UiName
.find(',')
484 UiName
= UiName
[:Pos
]
485 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
486 elif len(ItemList
) > 1:
487 self
.__CurSection
= [ItemList
[0], ItemList
[1], 'COMMON']
488 elif len(ItemList
) > 0:
489 self
.__CurSection
= [ItemList
[0], 'DUMMY', 'COMMON']
491 ## PreprocessFile() method
493 # Preprocess file contents, replace comments with spaces.
494 # In the end, rewind the file buffer pointer to the beginning
495 # BUGBUG: No !include statement processing contained in this procedure
496 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
498 # @param self The object pointer
500 def PreprocessFile(self
):
504 DoubleSlashComment
= False
506 # HashComment in quoted string " " is ignored.
509 while not self
.__EndOfFile
():
511 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
512 InString
= not InString
513 # meet new line, then no longer in a comment for // and '#'
514 if self
.__CurrentChar
() == T_CHAR_LF
:
515 self
.CurrentLineNumber
+= 1
516 self
.CurrentOffsetWithinLine
= 0
517 if InComment
and DoubleSlashComment
:
519 DoubleSlashComment
= False
520 if InComment
and HashComment
:
523 # check for */ comment end
524 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
525 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
527 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
530 # set comments to spaces
532 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
534 # check for // comment
535 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
537 DoubleSlashComment
= True
538 # check for '#' comment
539 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
542 # check for /* comment start
543 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
544 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
546 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
552 # restore from ListOfList to ListOfString
553 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
556 ## PreprocessIncludeFile() method
558 # Preprocess file contents, replace !include statements with file contents.
559 # In the end, rewind the file buffer pointer to the beginning
561 # @param self The object pointer
563 def PreprocessIncludeFile(self
):
565 while self
.__GetNextToken
():
567 if self
.__Token
== '!include':
568 IncludeLine
= self
.CurrentLineNumber
569 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
570 if not self
.__GetNextToken
():
571 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
572 IncFileName
= self
.__Token
574 for Macro
in ['WORKSPACE', 'ECP_SOURCE', 'EFI_SOURCE', 'EDK_SOURCE']:
575 MacroVal
= self
.__GetMacroValue
(Macro
)
577 __IncludeMacros
[Macro
] = MacroVal
580 IncludedFile
= NormPath(ReplaceMacro(IncFileName
, __IncludeMacros
, RaiseError
=True))
582 raise Warning("only these system environment variables are permitted to start the path of the included file: "
583 "$(WORKSPACE), $(ECP_SOURCE), $(EFI_SOURCE), $(EDK_SOURCE)",
584 self
.FileName
, self
.CurrentLineNumber
)
586 # First search the include file under the same directory as FDF file
588 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
589 ErrorCode
= IncludedFile1
.Validate()[0]
592 # Then search the include file under the same directory as DSC file
595 if GenFdsGlobalVariable
.ActivePlatform
:
596 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
597 elif GlobalData
.gActivePlatform
:
598 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
599 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
600 ErrorCode
= IncludedFile1
.Validate()[0]
603 # Also search file under the WORKSPACE directory
605 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
606 ErrorCode
= IncludedFile1
.Validate()[0]
608 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
),
609 self
.FileName
, self
.CurrentLineNumber
)
611 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
613 CurrentLine
= self
.CurrentLineNumber
614 CurrentOffset
= self
.CurrentOffsetWithinLine
615 # list index of the insertion, note that line number is 'CurrentLine + 1'
616 InsertAtLine
= CurrentLine
617 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
618 # deal with remaining portions after "!include filename", if exists.
619 if self
.__GetNextToken
():
620 if self
.CurrentLineNumber
== CurrentLine
:
621 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
622 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
623 IncFileProfile
.InsertAdjust
+= 1
624 self
.CurrentLineNumber
+= 1
625 self
.CurrentOffsetWithinLine
= 0
627 for Line
in IncFileProfile
.FileLinesList
:
628 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
629 self
.CurrentLineNumber
+= 1
632 IncludeFileList
.append(IncFileProfile
)
634 # comment out the processed include file statement
635 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
636 TempList
.insert(IncludeOffset
, '#')
637 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
641 def __GetIfListCurrentItemStat(self
, IfList
):
651 ## PreprocessConditionalStatement() method
653 # Preprocess conditional statement.
654 # In the end, rewind the file buffer pointer to the beginning
656 # @param self The object pointer
658 def PreprocessConditionalStatement(self
):
659 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
663 while self
.__GetNextToken
():
664 # Determine section name and the location dependent macro
665 if self
.__GetIfListCurrentItemStat
(IfList
):
666 if self
.__Token
.startswith('['):
667 Header
= self
.__Token
668 if not self
.__Token
.endswith(']'):
669 self
.__SkipToToken
(']')
670 Header
+= self
.__SkippedChars
671 if Header
.find('$(') != -1:
672 raise Warning("macro cannot be used in section header", self
.FileName
, self
.CurrentLineNumber
)
673 self
.__SectionHeaderParser
(Header
)
675 # Replace macros except in RULE section or out of section
676 elif self
.__CurSection
and ReplacedLine
!= self
.CurrentLineNumber
:
677 ReplacedLine
= self
.CurrentLineNumber
679 CurLine
= self
.Profile
.FileLinesList
[ReplacedLine
- 1]
681 StartPos
= CurLine
.find('$(', PreIndex
)
682 EndPos
= CurLine
.find(')', StartPos
+2)
683 while StartPos
!= -1 and EndPos
!= -1 and self
.__Token
not in ['!ifdef', '!ifndef', '!if', '!elseif']:
684 MacroName
= CurLine
[StartPos
+2 : EndPos
]
685 MacorValue
= self
.__GetMacroValue
(MacroName
)
686 if MacorValue
!= None:
687 CurLine
= CurLine
.replace('$(' + MacroName
+ ')', MacorValue
, 1)
688 if MacorValue
.find('$(') != -1:
691 PreIndex
= StartPos
+ len(MacorValue
)
693 PreIndex
= EndPos
+ 1
694 StartPos
= CurLine
.find('$(', PreIndex
)
695 EndPos
= CurLine
.find(')', StartPos
+2)
696 self
.Profile
.FileLinesList
[ReplacedLine
- 1] = CurLine
699 if self
.__Token
== 'DEFINE':
700 if self
.__GetIfListCurrentItemStat
(IfList
):
701 if not self
.__CurSection
:
702 raise Warning("macro cannot be defined in Rule section or out of section", self
.FileName
, self
.CurrentLineNumber
)
703 DefineLine
= self
.CurrentLineNumber
- 1
704 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
705 if not self
.__GetNextToken
():
706 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
708 if not self
.__IsToken
( "="):
709 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
711 Value
= self
.__GetExpression
()
712 self
.__SetMacroValue
(Macro
, Value
)
713 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
714 elif self
.__Token
== 'SET':
715 SetLine
= self
.CurrentLineNumber
- 1
716 SetOffset
= self
.CurrentOffsetWithinLine
- len('SET')
717 PcdPair
= self
.__GetNextPcdName
()
718 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
719 if not self
.__IsToken
( "="):
720 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
722 Value
= self
.__GetExpression
()
723 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
725 self
.__PcdDict
[PcdName
] = Value
727 self
.Profile
.PcdDict
[PcdPair
] = Value
728 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
729 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
731 self
.__WipeOffArea
.append(((SetLine
, SetOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
732 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
733 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
734 IfList
.append([IfStartPos
, None, None])
736 CondLabel
= self
.__Token
737 Expression
= self
.__GetExpression
()
739 if CondLabel
== '!if':
740 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
742 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
743 if CondLabel
== '!ifndef':
744 ConditionSatisfied
= not ConditionSatisfied
746 BranchDetermined
= ConditionSatisfied
747 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
748 if ConditionSatisfied
:
749 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
750 elif self
.__Token
in ('!elseif', '!else'):
751 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
753 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
756 IfList
[-1] = [ElseStartPos
, False, True]
757 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
759 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
760 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
761 if self
.__Token
== '!elseif':
762 Expression
= self
.__GetExpression
()
763 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
764 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
768 IfList
[-1][1] = False
771 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
772 elif self
.__Token
== '!endif':
774 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
776 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
778 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
781 elif not IfList
: # Don't use PCDs inside conditional directive
782 if self
.CurrentLineNumber
<= RegionLayoutLine
:
783 # Don't try the same line twice
785 SetPcd
= ShortcutPcdPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
787 self
.__PcdDict
[SetPcd
.group('name')] = SetPcd
.group('value')
788 RegionLayoutLine
= self
.CurrentLineNumber
790 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
792 RegionLayoutLine
= self
.CurrentLineNumber
794 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
795 if not RegionSizeGuid
:
796 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
798 self
.__PcdDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
799 self
.__PcdDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
800 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
803 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
806 def __CollectMacroPcd(self
):
810 MacroDict
.update(GlobalData
.gPlatformPcds
)
811 MacroDict
.update(self
.__PcdDict
)
814 MacroDict
.update(GlobalData
.gPlatformDefines
)
816 if self
.__CurSection
:
818 ScopeMacro
= self
.__MacroDict
['COMMON', 'COMMON', 'COMMON']
820 MacroDict
.update(ScopeMacro
)
823 ScopeMacro
= self
.__MacroDict
[
824 self
.__CurSection
[0],
825 self
.__CurSection
[1],
829 MacroDict
.update(ScopeMacro
)
831 MacroDict
.update(GlobalData
.gGlobalDefines
)
832 MacroDict
.update(GlobalData
.gCommandLineDefines
)
837 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
838 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
839 MacroPcdDict
= self
.__CollectMacroPcd
()
843 return ValueExpression(Expression
, MacroPcdDict
)(True)
845 return ValueExpression(Expression
, MacroPcdDict
)()
846 except WrnExpression
, Excpt
:
848 # Catch expression evaluation warning here. We need to report
849 # the precise number of line and return the evaluation result
851 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
852 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
855 except Exception, Excpt
:
856 if hasattr(Excpt
, 'Pcd'):
857 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
858 Info
= GlobalData
.gPlatformOtherPcds
[Excpt
.Pcd
]
859 raise Warning("Cannot use this PCD (%s) in an expression as"
860 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
861 " of the DSC file (%s), and it is currently defined in this section:"
862 " %s, line #: %d." % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE'], Info
[0], Info
[1]),
865 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE']),
868 raise Warning(str(Excpt
), *FileLineTuple
)
870 if Expression
.startswith('$(') and Expression
[-1] == ')':
871 Expression
= Expression
[2:-1]
872 return Expression
in MacroPcdDict
874 ## __IsToken() method
876 # Check whether input string is found from current char position along
877 # If found, the string value is put into self.__Token
879 # @param self The object pointer
880 # @param String 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 __IsToken(self
, String
, 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(String
.upper())
894 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
896 self
.CurrentOffsetWithinLine
+= len(String
)
897 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
901 ## __IsKeyword() method
903 # Check whether input keyword is found from current char position along, whole word only!
904 # If found, the string value is put into self.__Token
906 # @param self The object pointer
907 # @param Keyword The string to search
908 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
909 # @retval True Successfully find string, file buffer pointer moved forward
910 # @retval False Not able to find string, file buffer pointer not changed
912 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
913 self
.__SkipWhiteSpace
()
915 # Only consider the same line, no multi-line token allowed
916 StartPos
= self
.CurrentOffsetWithinLine
919 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
921 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
923 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
924 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
926 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
927 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
931 def __GetExpression(self
):
932 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
933 Index
= len(Line
) - 1
934 while Line
[Index
] in ['\r', '\n']:
936 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
937 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
938 ExpressionString
= ExpressionString
.strip()
939 return ExpressionString
941 ## __GetNextWord() method
943 # Get next C name from file lines
944 # If found, the string value is put into self.__Token
946 # @param self The object pointer
947 # @retval True Successfully find a C name string, file buffer pointer moved forward
948 # @retval False Not able to find a C name string, file buffer pointer not changed
950 def __GetNextWord(self
):
951 self
.__SkipWhiteSpace
()
952 if self
.__EndOfFile
():
955 TempChar
= self
.__CurrentChar
()
956 StartPos
= self
.CurrentOffsetWithinLine
957 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
959 while not self
.__EndOfLine
():
960 TempChar
= self
.__CurrentChar
()
961 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
962 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
968 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
973 ## __GetNextToken() method
975 # Get next token unit before a seperator
976 # If found, the string value is put into self.__Token
978 # @param self The object pointer
979 # @retval True Successfully find a token unit, file buffer pointer moved forward
980 # @retval False Not able to find a token unit, file buffer pointer not changed
982 def __GetNextToken(self
):
983 # Skip leading spaces, if exist.
984 self
.__SkipWhiteSpace
()
985 if self
.__EndOfFile
():
987 # Record the token start position, the position of the first non-space char.
988 StartPos
= self
.CurrentOffsetWithinLine
989 StartLine
= self
.CurrentLineNumber
990 while StartLine
== self
.CurrentLineNumber
:
991 TempChar
= self
.__CurrentChar
()
992 # Try to find the end char that is not a space and not in seperator tuple.
993 # That is, when we got a space or any char in the tuple, we got the end of token.
994 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
996 # if we happen to meet a seperator as the first char, we must proceed to get it.
997 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
998 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1006 EndPos
= self
.CurrentOffsetWithinLine
1007 if self
.CurrentLineNumber
!= StartLine
:
1008 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
1009 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
1010 if StartPos
!= self
.CurrentOffsetWithinLine
:
1015 def __GetNextOp(self
):
1016 # Skip leading spaces, if exist.
1017 self
.__SkipWhiteSpace
()
1018 if self
.__EndOfFile
():
1020 # Record the token start position, the position of the first non-space char.
1021 StartPos
= self
.CurrentOffsetWithinLine
1022 while not self
.__EndOfLine
():
1023 TempChar
= self
.__CurrentChar
()
1024 # Try to find the end char that is not a space
1025 if not str(TempChar
).isspace():
1032 if StartPos
!= self
.CurrentOffsetWithinLine
:
1033 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1037 ## __GetNextGuid() method
1039 # Get next token unit before a seperator
1040 # If found, the GUID string is put into self.__Token
1042 # @param self The object pointer
1043 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1044 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1046 def __GetNextGuid(self
):
1048 if not self
.__GetNextToken
():
1050 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}')
1051 if p
.match(self
.__Token
) != None:
1057 ## __UndoToken() method
1059 # Go back one token unit in file buffer
1061 # @param self The object pointer
1063 def __UndoToken(self
):
1064 self
.__UndoOneChar
()
1065 while self
.__CurrentChar
().isspace():
1066 if not self
.__UndoOneChar
():
1071 StartPos
= self
.CurrentOffsetWithinLine
1072 CurrentLine
= self
.CurrentLineNumber
1073 while CurrentLine
== self
.CurrentLineNumber
:
1075 TempChar
= self
.__CurrentChar
()
1076 # Try to find the end char that is not a space and not in seperator tuple.
1077 # That is, when we got a space or any char in the tuple, we got the end of token.
1078 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1079 if not self
.__UndoOneChar
():
1081 # if we happen to meet a seperator as the first char, we must proceed to get it.
1082 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1083 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1090 ## __HexDigit() method
1092 # Whether char input is a Hex data bit
1094 # @param self The object pointer
1095 # @param TempChar The char to test
1096 # @retval True The char is a Hex data bit
1097 # @retval False The char is NOT a Hex data bit
1099 def __HexDigit(self
, TempChar
):
1100 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1101 or (TempChar
>= '0' and TempChar
<= '9'):
1106 def __IsHex(self
, HexStr
):
1107 if not HexStr
.upper().startswith("0X"):
1109 if len(self
.__Token
) <= 2:
1111 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1112 if len(charList
) == 0:
1116 ## __GetNextHexNumber() method
1118 # Get next HEX data before a seperator
1119 # If found, the HEX data is put into self.__Token
1121 # @param self The object pointer
1122 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1123 # @retval False Not able to find a HEX data, file buffer pointer not changed
1125 def __GetNextHexNumber(self
):
1126 if not self
.__GetNextToken
():
1128 if self
.__IsHex
(self
.__Token
):
1134 ## __GetNextDecimalNumber() method
1136 # Get next decimal data before a seperator
1137 # If found, the decimal data is put into self.__Token
1139 # @param self The object pointer
1140 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1141 # @retval False Not able to find a decimal data, file buffer pointer not changed
1143 def __GetNextDecimalNumber(self
):
1144 if not self
.__GetNextToken
():
1146 if self
.__Token
.isdigit():
1152 ## __GetNextPcdName() method
1154 # Get next PCD token space C name and PCD C name pair before a seperator
1155 # If found, the decimal data is put into self.__Token
1157 # @param self The object pointer
1158 # @retval Tuple PCD C name and PCD token space C name pair
1160 def __GetNextPcdName(self
):
1161 if not self
.__GetNextWord
():
1162 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1163 pcdTokenSpaceCName
= self
.__Token
1165 if not self
.__IsToken
( "."):
1166 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1168 if not self
.__GetNextWord
():
1169 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1170 pcdCName
= self
.__Token
1172 return (pcdCName
, pcdTokenSpaceCName
)
1174 ## __GetStringData() method
1176 # Get string contents quoted in ""
1177 # If found, the decimal data is put into self.__Token
1179 # @param self The object pointer
1180 # @retval True Successfully find a string data, file buffer pointer moved forward
1181 # @retval False Not able to find a string data, file buffer pointer not changed
1183 def __GetStringData(self
):
1184 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1186 self
.__SkipToToken
("\"")
1187 currentLineNumber
= self
.CurrentLineNumber
1189 if not self
.__SkipToToken
("\""):
1190 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1191 if currentLineNumber
!= self
.CurrentLineNumber
:
1192 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1193 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1196 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1198 self
.__SkipToToken
("\'")
1199 currentLineNumber
= self
.CurrentLineNumber
1201 if not self
.__SkipToToken
("\'"):
1202 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1203 if currentLineNumber
!= self
.CurrentLineNumber
:
1204 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1205 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1211 ## __SkipToToken() method
1213 # Search forward in file buffer for the string
1214 # The skipped chars are put into self.__SkippedChars
1216 # @param self The object pointer
1217 # @param String The string to search
1218 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1219 # @retval True Successfully find the string, file buffer pointer moved forward
1220 # @retval False Not able to find the string, file buffer pointer not changed
1222 def __SkipToToken(self
, String
, IgnoreCase
= False):
1223 StartPos
= self
.GetFileBufferPos()
1225 self
.__SkippedChars
= ""
1226 while not self
.__EndOfFile
():
1229 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1231 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1233 self
.CurrentOffsetWithinLine
+= len(String
)
1234 self
.__SkippedChars
+= String
1236 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1239 self
.SetFileBufferPos( StartPos
)
1240 self
.__SkippedChars
= ""
1243 ## GetFileBufferPos() method
1245 # Return the tuple of current line and offset within the line
1247 # @param self The object pointer
1248 # @retval Tuple Line number and offset pair
1250 def GetFileBufferPos(self
):
1251 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1253 ## SetFileBufferPos() method
1255 # Restore the file buffer position
1257 # @param self The object pointer
1258 # @param Pos The new file buffer position
1260 def SetFileBufferPos(self
, Pos
):
1261 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1263 ## Preprocess() method
1265 # Preprocess comment, conditional directive, include directive, replace macro.
1266 # Exception will be raised if syntax error found
1268 # @param self The object pointer
1270 def Preprocess(self
):
1271 self
.__StringToList
()
1272 self
.PreprocessFile()
1273 self
.PreprocessIncludeFile()
1274 self
.__StringToList
()
1275 self
.PreprocessFile()
1276 self
.PreprocessConditionalStatement()
1277 self
.__StringToList
()
1278 for Pos
in self
.__WipeOffArea
:
1279 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1280 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1282 while self
.__GetDefines
():
1285 ## ParseFile() method
1287 # Parse the file profile buffer to extract fd, fv ... information
1288 # Exception will be raised if syntax error found
1290 # @param self The object pointer
1292 def ParseFile(self
):
1296 while self
.__GetFd
():
1299 while self
.__GetFv
():
1302 while self
.__GetCapsule
():
1305 while self
.__GetVtf
():
1308 while self
.__GetRule
():
1311 while self
.__GetOptionRom
():
1316 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1317 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1318 X
.Message
+= ' near line %d, column %d: %s' \
1319 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1322 ## __GetDefines() method
1324 # Get Defines section contents and store its data into AllMacrosList
1326 # @param self The object pointer
1327 # @retval True Successfully find a Defines
1328 # @retval False Not able to find a Defines
1330 def __GetDefines(self
):
1332 if not self
.__GetNextToken
():
1335 S
= self
.__Token
.upper()
1336 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1337 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1338 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1339 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
)
1344 if not self
.__IsToken
("[DEFINES", True):
1345 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1346 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1347 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1348 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1350 if not self
.__IsToken
( "]"):
1351 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1353 while self
.__GetNextWord
():
1354 # handle the SET statement
1355 if self
.__Token
== 'SET':
1357 self
.__GetSetStatement
(None)
1360 Macro
= self
.__Token
1362 if not self
.__IsToken
("="):
1363 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1364 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1365 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1366 Value
= self
.__Token
1372 # Get FD section contents and store its data into FD dictionary of self.Profile
1374 # @param self The object pointer
1375 # @retval True Successfully find a FD
1376 # @retval False Not able to find a FD
1380 if not self
.__GetNextToken
():
1383 S
= self
.__Token
.upper()
1384 if S
.startswith("[") and not S
.startswith("[FD."):
1385 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1386 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1387 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1392 if not self
.__IsToken
("[FD.", True):
1393 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1394 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1395 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1396 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1398 FdName
= self
.__GetUiName
()
1400 if len (self
.Profile
.FdDict
) == 0:
1401 FdName
= GenFdsGlobalVariable
.PlatformName
1402 if FdName
== "" and GlobalData
.gActivePlatform
:
1403 FdName
= GlobalData
.gActivePlatform
.PlatformName
1404 self
.Profile
.FdNameNotSet
= True
1406 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1407 self
.CurrentFdName
= FdName
.upper()
1409 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1410 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1412 if not self
.__IsToken
( "]"):
1413 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1416 FdObj
.FdUiName
= self
.CurrentFdName
1417 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1419 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1420 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1422 Status
= self
.__GetCreateFile
(FdObj
)
1424 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1426 self
.__GetTokenStatements
(FdObj
)
1428 self
.__GetDefineStatements
(FdObj
)
1430 self
.__GetSetStatements
(FdObj
)
1432 if not self
.__GetRegionLayout
(FdObj
):
1433 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1435 while self
.__GetRegionLayout
(FdObj
):
1439 ## __GetUiName() method
1441 # Return the UI name of a section
1443 # @param self The object pointer
1444 # @retval FdName UI name
1446 def __GetUiName(self
):
1448 if self
.__GetNextWord
():
1453 ## __GetCreateFile() method
1455 # Return the output file name of object
1457 # @param self The object pointer
1458 # @param Obj object whose data will be stored in file
1459 # @retval FdName UI name
1461 def __GetCreateFile(self
, Obj
):
1463 if self
.__IsKeyword
( "CREATE_FILE"):
1464 if not self
.__IsToken
( "="):
1465 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1467 if not self
.__GetNextToken
():
1468 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1470 FileName
= self
.__Token
1471 Obj
.CreateFileName
= FileName
1475 ## __GetTokenStatements() method
1477 # Get token statements
1479 # @param self The object pointer
1480 # @param Obj for whom token statement is got
1482 def __GetTokenStatements(self
, Obj
):
1483 if not self
.__IsKeyword
( "BaseAddress"):
1484 raise Warning("BaseAddress missing", self
.FileName
, self
.CurrentLineNumber
)
1486 if not self
.__IsToken
( "="):
1487 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1489 if not self
.__GetNextHexNumber
():
1490 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1492 Obj
.BaseAddress
= self
.__Token
1494 if self
.__IsToken
( "|"):
1495 pcdPair
= self
.__GetNextPcdName
()
1496 Obj
.BaseAddressPcd
= pcdPair
1497 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1498 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1499 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1501 if not self
.__IsKeyword
( "Size"):
1502 raise Warning("Size missing", self
.FileName
, self
.CurrentLineNumber
)
1504 if not self
.__IsToken
( "="):
1505 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1507 if not self
.__GetNextHexNumber
():
1508 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1512 if self
.__IsToken
( "|"):
1513 pcdPair
= self
.__GetNextPcdName
()
1514 Obj
.SizePcd
= pcdPair
1515 self
.Profile
.PcdDict
[pcdPair
] = Size
1516 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1517 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1518 Obj
.Size
= long(Size
, 0)
1520 if not self
.__IsKeyword
( "ErasePolarity"):
1521 raise Warning("ErasePolarity missing", self
.FileName
, self
.CurrentLineNumber
)
1523 if not self
.__IsToken
( "="):
1524 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1526 if not self
.__GetNextToken
():
1527 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1529 if self
.__Token
!= "1" and self
.__Token
!= "0":
1530 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1532 Obj
.ErasePolarity
= self
.__Token
1534 self
.__GetBlockStatements
(Obj
)
1536 ## __GetAddressStatements() method
1538 # Get address statements
1540 # @param self The object pointer
1541 # @param Obj for whom address statement is got
1542 # @retval True Successfully find
1543 # @retval False Not able to find
1545 def __GetAddressStatements(self
, Obj
):
1547 if self
.__IsKeyword
("BsBaseAddress"):
1548 if not self
.__IsToken
( "="):
1549 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1551 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1552 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1554 BsAddress
= long(self
.__Token
, 0)
1555 Obj
.BsBaseAddress
= BsAddress
1557 if self
.__IsKeyword
("RtBaseAddress"):
1558 if not self
.__IsToken
( "="):
1559 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1561 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1562 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1564 RtAddress
= long(self
.__Token
, 0)
1565 Obj
.RtBaseAddress
= RtAddress
1567 ## __GetBlockStatements() method
1569 # Get block statements
1571 # @param self The object pointer
1572 # @param Obj for whom block statement is got
1574 def __GetBlockStatements(self
, Obj
):
1576 if not self
.__GetBlockStatement
(Obj
):
1577 #set default block size is 1
1578 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1581 while self
.__GetBlockStatement
(Obj
):
1584 for Item
in Obj
.BlockSizeList
:
1585 if Item
[0] == None or Item
[1] == None:
1586 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1588 ## __GetBlockStatement() method
1590 # Get block statement
1592 # @param self The object pointer
1593 # @param Obj for whom block statement is got
1594 # @retval True Successfully find
1595 # @retval False Not able to find
1597 def __GetBlockStatement(self
, Obj
):
1598 if not self
.__IsKeyword
( "BlockSize"):
1601 if not self
.__IsToken
( "="):
1602 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1604 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1605 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1607 BlockSize
= self
.__Token
1609 if self
.__IsToken
( "|"):
1610 PcdPair
= self
.__GetNextPcdName
()
1611 BlockSizePcd
= PcdPair
1612 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1613 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1614 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1615 BlockSize
= long(BlockSize
, 0)
1618 if self
.__IsKeyword
( "NumBlocks"):
1619 if not self
.__IsToken
( "="):
1620 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1622 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1623 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1625 BlockNumber
= long(self
.__Token
, 0)
1627 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1630 ## __GetDefineStatements() method
1632 # Get define statements
1634 # @param self The object pointer
1635 # @param Obj for whom define statement is got
1636 # @retval True Successfully find
1637 # @retval False Not able to find
1639 def __GetDefineStatements(self
, Obj
):
1640 while self
.__GetDefineStatement
( Obj
):
1643 ## __GetDefineStatement() method
1645 # Get define statement
1647 # @param self The object pointer
1648 # @param Obj for whom define statement is got
1649 # @retval True Successfully find
1650 # @retval False Not able to find
1652 def __GetDefineStatement(self
, Obj
):
1653 if self
.__IsKeyword
("DEFINE"):
1654 self
.__GetNextToken
()
1655 Macro
= self
.__Token
1656 if not self
.__IsToken
( "="):
1657 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1659 if not self
.__GetNextToken
():
1660 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1662 Value
= self
.__Token
1663 Macro
= '$(' + Macro
+ ')'
1664 Obj
.DefineVarDict
[Macro
] = Value
1669 ## __GetSetStatements() method
1671 # Get set statements
1673 # @param self The object pointer
1674 # @param Obj for whom set statement is got
1675 # @retval True Successfully find
1676 # @retval False Not able to find
1678 def __GetSetStatements(self
, Obj
):
1679 while self
.__GetSetStatement
(Obj
):
1682 ## __GetSetStatement() method
1686 # @param self The object pointer
1687 # @param Obj for whom set statement is got
1688 # @retval True Successfully find
1689 # @retval False Not able to find
1691 def __GetSetStatement(self
, Obj
):
1692 if self
.__IsKeyword
("SET"):
1693 PcdPair
= self
.__GetNextPcdName
()
1695 if not self
.__IsToken
( "="):
1696 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1698 Value
= self
.__GetExpression
()
1699 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1702 Obj
.SetVarDict
[PcdPair
] = Value
1703 self
.Profile
.PcdDict
[PcdPair
] = Value
1704 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1705 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1710 ## __GetRegionLayout() method
1712 # Get region layout for FD
1714 # @param self The object pointer
1715 # @param Fd for whom region is got
1716 # @retval True Successfully find
1717 # @retval False Not able to find
1719 def __GetRegionLayout(self
, Fd
):
1720 if not self
.__GetNextHexNumber
():
1723 RegionObj
= Region
.Region()
1724 RegionObj
.Offset
= long(self
.__Token
, 0)
1725 Fd
.RegionList
.append(RegionObj
)
1727 if not self
.__IsToken
( "|"):
1728 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1730 if not self
.__GetNextHexNumber
():
1731 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1732 RegionObj
.Size
= long(self
.__Token
, 0)
1734 if not self
.__GetNextWord
():
1737 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1739 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1740 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1741 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1742 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1743 if self
.__IsToken
( "|"):
1744 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1745 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1746 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1747 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1749 if not self
.__GetNextWord
():
1752 if self
.__Token
== "SET":
1754 self
.__GetSetStatements
( RegionObj
)
1755 if not self
.__GetNextWord
():
1758 elif self
.__Token
== "FV":
1760 self
.__GetRegionFvType
( RegionObj
)
1762 elif self
.__Token
== "CAPSULE":
1764 self
.__GetRegionCapType
( RegionObj
)
1766 elif self
.__Token
== "FILE":
1768 self
.__GetRegionFileType
( RegionObj
)
1770 elif self
.__Token
== "DATA":
1772 self
.__GetRegionDataType
( RegionObj
)
1774 raise Warning("A valid region type was not found. "
1775 "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",
1776 self
.FileName
, self
.CurrentLineNumber
)
1780 ## __GetRegionFvType() method
1782 # Get region fv data for region
1784 # @param self The object pointer
1785 # @param RegionObj for whom region data is got
1787 def __GetRegionFvType(self
, RegionObj
):
1789 if not self
.__IsKeyword
( "FV"):
1790 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1792 if not self
.__IsToken
( "="):
1793 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1795 if not self
.__GetNextToken
():
1796 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1798 RegionObj
.RegionType
= "FV"
1799 RegionObj
.RegionDataList
.append(self
.__Token
)
1801 while self
.__IsKeyword
( "FV"):
1803 if not self
.__IsToken
( "="):
1804 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1806 if not self
.__GetNextToken
():
1807 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1809 RegionObj
.RegionDataList
.append(self
.__Token
)
1811 ## __GetRegionCapType() method
1813 # Get region capsule data for region
1815 # @param self The object pointer
1816 # @param RegionObj for whom region data is got
1818 def __GetRegionCapType(self
, RegionObj
):
1820 if not self
.__IsKeyword
("CAPSULE"):
1821 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1823 if not self
.__IsToken
("="):
1824 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1826 if not self
.__GetNextToken
():
1827 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1829 RegionObj
.RegionType
= "CAPSULE"
1830 RegionObj
.RegionDataList
.append(self
.__Token
)
1832 while self
.__IsKeyword
("CAPSULE"):
1834 if not self
.__IsToken
("="):
1835 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1837 if not self
.__GetNextToken
():
1838 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1840 RegionObj
.RegionDataList
.append(self
.__Token
)
1842 ## __GetRegionFileType() method
1844 # Get region file data for region
1846 # @param self The object pointer
1847 # @param RegionObj for whom region data is got
1849 def __GetRegionFileType(self
, RegionObj
):
1851 if not self
.__IsKeyword
( "FILE"):
1852 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1854 if not self
.__IsToken
( "="):
1855 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1857 if not self
.__GetNextToken
():
1858 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1860 RegionObj
.RegionType
= "FILE"
1861 RegionObj
.RegionDataList
.append( self
.__Token
)
1863 while self
.__IsKeyword
( "FILE"):
1865 if not self
.__IsToken
( "="):
1866 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1868 if not self
.__GetNextToken
():
1869 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1871 RegionObj
.RegionDataList
.append(self
.__Token
)
1873 ## __GetRegionDataType() method
1875 # Get region array data for region
1877 # @param self The object pointer
1878 # @param RegionObj for whom region data is got
1880 def __GetRegionDataType(self
, RegionObj
):
1882 if not self
.__IsKeyword
( "DATA"):
1883 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
1885 if not self
.__IsToken
( "="):
1886 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1888 if not self
.__IsToken
( "{"):
1889 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1891 if not self
.__GetNextHexNumber
():
1892 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1894 if len(self
.__Token
) > 18:
1895 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1897 # convert hex string value to byte hex string array
1898 AllString
= self
.__Token
1899 AllStrLen
= len (AllString
)
1901 while AllStrLen
> 4:
1902 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1903 AllStrLen
= AllStrLen
- 2
1904 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1907 if len (self
.__Token
) <= 4:
1908 while self
.__IsToken
(","):
1909 if not self
.__GetNextHexNumber
():
1910 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1911 if len(self
.__Token
) > 4:
1912 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1913 DataString
+= self
.__Token
1916 if not self
.__IsToken
( "}"):
1917 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1919 DataString
= DataString
.rstrip(",")
1920 RegionObj
.RegionType
= "DATA"
1921 RegionObj
.RegionDataList
.append( DataString
)
1923 while self
.__IsKeyword
( "DATA"):
1925 if not self
.__IsToken
( "="):
1926 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1928 if not self
.__IsToken
( "{"):
1929 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1931 if not self
.__GetNextHexNumber
():
1932 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1934 if len(self
.__Token
) > 18:
1935 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1937 # convert hex string value to byte hex string array
1938 AllString
= self
.__Token
1939 AllStrLen
= len (AllString
)
1941 while AllStrLen
> 4:
1942 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1943 AllStrLen
= AllStrLen
- 2
1944 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1947 if len (self
.__Token
) <= 4:
1948 while self
.__IsToken
(","):
1949 if not self
.__GetNextHexNumber
():
1950 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1951 if len(self
.__Token
) > 4:
1952 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1953 DataString
+= self
.__Token
1956 if not self
.__IsToken
( "}"):
1957 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1959 DataString
= DataString
.rstrip(",")
1960 RegionObj
.RegionDataList
.append( DataString
)
1964 # Get FV section contents and store its data into FV dictionary of self.Profile
1966 # @param self The object pointer
1967 # @retval True Successfully find a FV
1968 # @retval False Not able to find a FV
1971 if not self
.__GetNextToken
():
1974 S
= self
.__Token
.upper()
1975 if S
.startswith("[") and not S
.startswith("[FV."):
1976 if not S
.startswith("[CAPSULE.") \
1977 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1978 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1983 if not self
.__IsToken
("[FV.", True):
1984 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1985 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1986 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1987 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1989 FvName
= self
.__GetUiName
()
1990 self
.CurrentFvName
= FvName
.upper()
1992 if not self
.__IsToken
( "]"):
1993 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1996 FvObj
.UiFvName
= self
.CurrentFvName
1997 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1999 Status
= self
.__GetCreateFile
(FvObj
)
2001 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2003 self
.__GetDefineStatements
(FvObj
)
2005 self
.__GetAddressStatements
(FvObj
)
2007 while self
.__GetBlockStatement
(FvObj
):
2010 self
.__GetSetStatements
(FvObj
)
2012 self
.__GetFvBaseAddress
(FvObj
)
2014 self
.__GetFvForceRebase
(FvObj
)
2016 self
.__GetFvAlignment
(FvObj
)
2018 self
.__GetFvAttributes
(FvObj
)
2020 self
.__GetFvNameGuid
(FvObj
)
2022 FvObj
.FvExtEntryTypeValue
= []
2023 FvObj
.FvExtEntryType
= []
2024 FvObj
.FvExtEntryData
= []
2026 isFvExtEntry
= self
.__GetFvExtEntryStatement
(FvObj
)
2027 if not isFvExtEntry
:
2030 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2031 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2034 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2035 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2036 if not isInf
and not isFile
:
2041 ## __GetFvAlignment() method
2043 # Get alignment for FV
2045 # @param self The object pointer
2046 # @param Obj for whom alignment is got
2047 # @retval True Successfully find a alignment statement
2048 # @retval False Not able to find a alignment statement
2050 def __GetFvAlignment(self
, Obj
):
2052 if not self
.__IsKeyword
( "FvAlignment"):
2055 if not self
.__IsToken
( "="):
2056 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2058 if not self
.__GetNextToken
():
2059 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2061 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2062 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2063 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2065 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2066 Obj
.FvAlignment
= self
.__Token
2069 ## __GetFvBaseAddress() method
2071 # Get BaseAddress for FV
2073 # @param self The object pointer
2074 # @param Obj for whom FvBaseAddress is got
2075 # @retval True Successfully find a FvBaseAddress statement
2076 # @retval False Not able to find a FvBaseAddress statement
2078 def __GetFvBaseAddress(self
, Obj
):
2080 if not self
.__IsKeyword
("FvBaseAddress"):
2083 if not self
.__IsToken
( "="):
2084 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2086 if not self
.__GetNextToken
():
2087 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2089 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2091 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2092 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2093 Obj
.FvBaseAddress
= self
.__Token
2096 ## __GetFvForceRebase() method
2098 # Get FvForceRebase for FV
2100 # @param self The object pointer
2101 # @param Obj for whom FvForceRebase is got
2102 # @retval True Successfully find a FvForceRebase statement
2103 # @retval False Not able to find a FvForceRebase statement
2105 def __GetFvForceRebase(self
, Obj
):
2107 if not self
.__IsKeyword
("FvForceRebase"):
2110 if not self
.__IsToken
( "="):
2111 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2113 if not self
.__GetNextToken
():
2114 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2116 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2117 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2119 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2120 Obj
.FvForceRebase
= True
2121 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2122 Obj
.FvForceRebase
= False
2124 Obj
.FvForceRebase
= None
2129 ## __GetFvAttributes() method
2131 # Get attributes for FV
2133 # @param self The object pointer
2134 # @param Obj for whom attribute is got
2137 def __GetFvAttributes(self
, FvObj
):
2139 while self
.__GetNextWord
():
2141 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2142 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2143 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2144 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2145 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2146 "WRITE_POLICY_RELIABLE"):
2150 if not self
.__IsToken
( "="):
2151 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2153 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2154 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2156 FvObj
.FvAttributeDict
[name
] = self
.__Token
2160 ## __GetFvNameGuid() method
2162 # Get FV GUID for FV
2164 # @param self The object pointer
2165 # @param Obj for whom GUID is got
2168 def __GetFvNameGuid(self
, FvObj
):
2170 if not self
.__IsKeyword
( "FvNameGuid"):
2173 if not self
.__IsToken
( "="):
2174 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2176 if not self
.__GetNextGuid
():
2177 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2179 FvObj
.FvNameGuid
= self
.__Token
2183 def __GetFvExtEntryStatement(self
, FvObj
):
2185 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2188 if not self
.__IsKeyword
("TYPE"):
2189 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2191 if not self
.__IsToken
( "="):
2192 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2194 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2195 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2197 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2199 if not self
.__IsToken
( "{"):
2200 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2202 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2203 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2205 FvObj
.FvExtEntryType
+= [self
.__Token
]
2207 if self
.__Token
== 'DATA':
2209 if not self
.__IsToken
( "="):
2210 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2212 if not self
.__IsToken
( "{"):
2213 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2215 if not self
.__GetNextHexNumber
():
2216 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2218 if len(self
.__Token
) > 4:
2219 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2221 DataString
= self
.__Token
2224 while self
.__IsToken
(","):
2225 if not self
.__GetNextHexNumber
():
2226 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2227 if len(self
.__Token
) > 4:
2228 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2229 DataString
+= self
.__Token
2232 if not self
.__IsToken
( "}"):
2233 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2235 if not self
.__IsToken
( "}"):
2236 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2238 DataString
= DataString
.rstrip(",")
2239 FvObj
.FvExtEntryData
+= [DataString
]
2241 if self
.__Token
== 'FILE':
2243 if not self
.__IsToken
( "="):
2244 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2246 if not self
.__GetNextToken
():
2247 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2249 FvObj
.FvExtEntryData
+= [self
.__Token
]
2251 if not self
.__IsToken
( "}"):
2252 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2256 ## __GetAprioriSection() method
2258 # Get token statements
2260 # @param self The object pointer
2261 # @param FvObj for whom apriori is got
2262 # @param MacroDict dictionary used to replace macro
2263 # @retval True Successfully find apriori statement
2264 # @retval False Not able to find apriori statement
2266 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2268 if not self
.__IsKeyword
( "APRIORI"):
2271 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2272 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2273 AprType
= self
.__Token
2275 if not self
.__IsToken
( "{"):
2276 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2278 AprSectionObj
= AprioriSection
.AprioriSection()
2279 AprSectionObj
.AprioriType
= AprType
2281 self
.__GetDefineStatements
(AprSectionObj
)
2282 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2285 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2286 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2287 if not IsInf
and not IsFile
:
2290 if not self
.__IsToken
( "}"):
2291 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2293 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2296 ## __GetInfStatement() method
2298 # Get INF statements
2300 # @param self The object pointer
2301 # @param Obj for whom inf statement is got
2302 # @param MacroDict dictionary used to replace macro
2303 # @retval True Successfully find inf statement
2304 # @retval False Not able to find inf statement
2306 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2308 if not self
.__IsKeyword
( "INF"):
2311 ffsInf
= FfsInfStatement
.FfsInfStatement()
2312 self
.__GetInfOptions
( ffsInf
)
2314 if not self
.__GetNextToken
():
2315 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2316 ffsInf
.InfFileName
= self
.__Token
2318 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2319 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2321 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2322 #do case sensitive check for file path
2323 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2325 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2327 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2328 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2329 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2330 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2332 if self
.__IsToken
('|'):
2333 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2334 ffsInf
.KeepReloc
= False
2335 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2336 ffsInf
.KeepReloc
= True
2338 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2341 capsuleFfs
= CapsuleData
.CapsuleFfs()
2342 capsuleFfs
.Ffs
= ffsInf
2343 Obj
.CapsuleDataList
.append(capsuleFfs
)
2345 Obj
.FfsList
.append(ffsInf
)
2348 ## __GetInfOptions() method
2350 # Get options for INF
2352 # @param self The object pointer
2353 # @param FfsInfObj for whom option is got
2355 def __GetInfOptions(self
, FfsInfObj
):
2357 if self
.__IsKeyword
( "RuleOverride"):
2358 if not self
.__IsToken
( "="):
2359 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2360 if not self
.__GetNextToken
():
2361 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2362 FfsInfObj
.Rule
= self
.__Token
2364 if self
.__IsKeyword
( "VERSION"):
2365 if not self
.__IsToken
( "="):
2366 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2367 if not self
.__GetNextToken
():
2368 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2370 if self
.__GetStringData
():
2371 FfsInfObj
.Version
= self
.__Token
2373 if self
.__IsKeyword
( "UI"):
2374 if not self
.__IsToken
( "="):
2375 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2376 if not self
.__GetNextToken
():
2377 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2379 if self
.__GetStringData
():
2380 FfsInfObj
.Ui
= self
.__Token
2382 if self
.__IsKeyword
( "USE"):
2383 if not self
.__IsToken
( "="):
2384 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2385 if not self
.__GetNextToken
():
2386 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2387 FfsInfObj
.UseArch
= self
.__Token
2390 if self
.__GetNextToken
():
2391 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2392 if p
.match(self
.__Token
):
2393 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2394 if not self
.__IsToken
(","):
2400 while self
.__GetNextToken
():
2401 if not p
.match(self
.__Token
):
2402 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2403 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2405 if not self
.__IsToken
(","):
2408 ## __GetFileStatement() method
2410 # Get FILE statements
2412 # @param self The object pointer
2413 # @param Obj for whom FILE statement is got
2414 # @param MacroDict dictionary used to replace macro
2415 # @retval True Successfully find FILE statement
2416 # @retval False Not able to find FILE statement
2418 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2420 if not self
.__IsKeyword
( "FILE"):
2423 if not self
.__GetNextWord
():
2424 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2426 if ForCapsule
and self
.__Token
== 'DATA':
2431 FfsFileObj
= FfsFileStatement
.FileStatement()
2432 FfsFileObj
.FvFileType
= self
.__Token
2434 if not self
.__IsToken
( "="):
2435 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2437 if not self
.__GetNextGuid
():
2438 if not self
.__GetNextWord
():
2439 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2440 if self
.__Token
== 'PCD':
2441 if not self
.__IsToken
( "("):
2442 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2443 PcdPair
= self
.__GetNextPcdName
()
2444 if not self
.__IsToken
( ")"):
2445 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2446 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2448 FfsFileObj
.NameGuid
= self
.__Token
2450 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2453 capsuleFfs
= CapsuleData
.CapsuleFfs()
2454 capsuleFfs
.Ffs
= FfsFileObj
2455 Obj
.CapsuleDataList
.append(capsuleFfs
)
2457 Obj
.FfsList
.append(FfsFileObj
)
2461 ## __FileCouldHaveRelocFlag() method
2463 # Check whether reloc strip flag can be set for a file type.
2465 # @param self The object pointer
2466 # @param FileType The file type to check with
2467 # @retval True This type could have relocation strip flag
2468 # @retval False No way to have it
2471 def __FileCouldHaveRelocFlag (self
, FileType
):
2472 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2477 ## __SectionCouldHaveRelocFlag() method
2479 # Check whether reloc strip flag can be set for a section type.
2481 # @param self The object pointer
2482 # @param SectionType The section type to check with
2483 # @retval True This type could have relocation strip flag
2484 # @retval False No way to have it
2487 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2488 if SectionType
in ('TE', 'PE32'):
2493 ## __GetFilePart() method
2495 # Get components for FILE statement
2497 # @param self The object pointer
2498 # @param FfsFileObj for whom component is got
2499 # @param MacroDict dictionary used to replace macro
2501 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2503 self
.__GetFileOpts
( FfsFileObj
)
2505 if not self
.__IsToken
("{"):
2506 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2507 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2508 # if self.__Token == 'RELOCS_STRIPPED':
2509 # FfsFileObj.KeepReloc = False
2511 # FfsFileObj.KeepReloc = True
2513 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2515 # if not self.__IsToken("{"):
2516 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2518 if not self
.__GetNextToken
():
2519 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2521 if self
.__Token
== "FV":
2522 if not self
.__IsToken
( "="):
2523 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2524 if not self
.__GetNextToken
():
2525 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2526 FfsFileObj
.FvName
= self
.__Token
2528 elif self
.__Token
== "FD":
2529 if not self
.__IsToken
( "="):
2530 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2531 if not self
.__GetNextToken
():
2532 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2533 FfsFileObj
.FdName
= self
.__Token
2535 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2537 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2539 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2540 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2541 FfsFileObj
.FileName
= self
.__Token
2542 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2544 # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase.
2546 if not GlobalData
.gAutoGenPhase
:
2547 #do case sensitive check for file path
2548 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2550 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2552 if not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FfsFileObj
.FileName
:
2553 #do case sensitive check for file path
2554 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2556 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2559 if not self
.__IsToken
( "}"):
2560 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2562 ## __GetFileOpts() method
2564 # Get options for FILE statement
2566 # @param self The object pointer
2567 # @param FfsFileObj for whom options is got
2569 def __GetFileOpts(self
, FfsFileObj
):
2571 if self
.__GetNextToken
():
2572 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2573 if Pattern
.match(self
.__Token
):
2574 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2575 if self
.__IsToken
(","):
2576 while self
.__GetNextToken
():
2577 if not Pattern
.match(self
.__Token
):
2578 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2579 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2581 if not self
.__IsToken
(","):
2587 if self
.__IsKeyword
( "FIXED", True):
2588 FfsFileObj
.Fixed
= True
2590 if self
.__IsKeyword
( "CHECKSUM", True):
2591 FfsFileObj
.CheckSum
= True
2593 if self
.__GetAlignment
():
2594 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2595 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2596 #For FFS, Auto is default option same to ""
2597 if not self
.__Token
== "Auto":
2598 FfsFileObj
.Alignment
= self
.__Token
2600 ## __GetAlignment() method
2602 # Return the alignment value
2604 # @param self The object pointer
2605 # @retval True Successfully find alignment
2606 # @retval False Not able to find alignment
2608 def __GetAlignment(self
):
2609 if self
.__IsKeyword
( "Align", True):
2610 if not self
.__IsToken
( "="):
2611 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2613 if not self
.__GetNextToken
():
2614 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2619 ## __GetFilePart() method
2621 # Get section data for FILE statement
2623 # @param self The object pointer
2624 # @param FfsFileObj for whom section is got
2625 # @param MacroDict dictionary used to replace macro
2627 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2629 Dict
.update(MacroDict
)
2631 self
.__GetDefineStatements
(FfsFileObj
)
2633 Dict
.update(FfsFileObj
.DefineVarDict
)
2634 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2635 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2638 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2639 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2640 if not IsLeafSection
and not IsEncapSection
:
2643 ## __GetLeafSection() method
2645 # Get leaf section for Obj
2647 # @param self The object pointer
2648 # @param Obj for whom leaf section is got
2649 # @param MacroDict dictionary used to replace macro
2650 # @retval True Successfully find section statement
2651 # @retval False Not able to find section statement
2653 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2655 OldPos
= self
.GetFileBufferPos()
2657 if not self
.__IsKeyword
( "SECTION"):
2658 if len(Obj
.SectionList
) == 0:
2659 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2664 if self
.__GetAlignment
():
2665 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2666 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2667 AlignValue
= self
.__Token
2670 if self
.__IsKeyword
( "BUILD_NUM"):
2671 if not self
.__IsToken
( "="):
2672 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2674 if not self
.__GetNextToken
():
2675 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2677 BuildNum
= self
.__Token
2679 if self
.__IsKeyword
( "VERSION"):
2680 if AlignValue
== 'Auto':
2681 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2682 if not self
.__IsToken
( "="):
2683 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2684 if not self
.__GetNextToken
():
2685 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2686 VerSectionObj
= VerSection
.VerSection()
2687 VerSectionObj
.Alignment
= AlignValue
2688 VerSectionObj
.BuildNum
= BuildNum
2689 if self
.__GetStringData
():
2690 VerSectionObj
.StringData
= self
.__Token
2692 VerSectionObj
.FileName
= self
.__Token
2693 Obj
.SectionList
.append(VerSectionObj
)
2695 elif self
.__IsKeyword
( "UI"):
2696 if AlignValue
== 'Auto':
2697 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2698 if not self
.__IsToken
( "="):
2699 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2700 if not self
.__GetNextToken
():
2701 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2702 UiSectionObj
= UiSection
.UiSection()
2703 UiSectionObj
.Alignment
= AlignValue
2704 if self
.__GetStringData
():
2705 UiSectionObj
.StringData
= self
.__Token
2707 UiSectionObj
.FileName
= self
.__Token
2708 Obj
.SectionList
.append(UiSectionObj
)
2710 elif self
.__IsKeyword
( "FV_IMAGE"):
2711 if AlignValue
== 'Auto':
2712 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2713 if not self
.__IsToken
( "="):
2714 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2715 if not self
.__GetNextToken
():
2716 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2718 FvName
= self
.__Token
2721 if self
.__IsToken
( "{"):
2723 FvObj
.UiFvName
= FvName
.upper()
2724 self
.__GetDefineStatements
(FvObj
)
2725 MacroDict
.update(FvObj
.DefineVarDict
)
2726 self
.__GetBlockStatement
(FvObj
)
2727 self
.__GetSetStatements
(FvObj
)
2728 self
.__GetFvAlignment
(FvObj
)
2729 self
.__GetFvAttributes
(FvObj
)
2730 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2731 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2734 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2735 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2736 if not IsInf
and not IsFile
:
2739 if not self
.__IsToken
( "}"):
2740 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2742 FvImageSectionObj
= FvImageSection
.FvImageSection()
2743 FvImageSectionObj
.Alignment
= AlignValue
2745 FvImageSectionObj
.Fv
= FvObj
2746 FvImageSectionObj
.FvName
= None
2748 FvImageSectionObj
.FvName
= FvName
.upper()
2749 FvImageSectionObj
.FvFileName
= FvName
2751 Obj
.SectionList
.append(FvImageSectionObj
)
2753 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2754 if AlignValue
== 'Auto':
2755 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2756 DepexSectionObj
= DepexSection
.DepexSection()
2757 DepexSectionObj
.Alignment
= AlignValue
2758 DepexSectionObj
.DepexType
= self
.__Token
2760 if not self
.__IsToken
( "="):
2761 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2762 if not self
.__IsToken
( "{"):
2763 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2764 if not self
.__SkipToToken
( "}"):
2765 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2767 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2768 Obj
.SectionList
.append(DepexSectionObj
)
2771 if not self
.__GetNextWord
():
2772 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2774 # Encapsulation section appear, UndoToken and return
2775 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2776 self
.SetFileBufferPos(OldPos
)
2779 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2780 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2781 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2782 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2783 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2786 DataSectionObj
= DataSection
.DataSection()
2787 DataSectionObj
.Alignment
= AlignValue
2788 DataSectionObj
.SecType
= self
.__Token
2790 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2791 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2792 if self
.__Token
== 'RELOCS_STRIPPED':
2793 DataSectionObj
.KeepReloc
= False
2795 DataSectionObj
.KeepReloc
= True
2797 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
)
2799 if self
.__IsToken
("="):
2800 if not self
.__GetNextToken
():
2801 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2802 DataSectionObj
.SectFileName
= self
.__Token
2803 if DataSectionObj
.SectFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2804 #do case sensitive check for file path
2805 ErrorCode
, ErrorInfo
= PathClass(NormPath(DataSectionObj
.SectFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2807 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2809 if not self
.__GetCglSection
(DataSectionObj
):
2812 Obj
.SectionList
.append(DataSectionObj
)
2816 ## __GetCglSection() method
2818 # Get compressed or GUIDed section for Obj
2820 # @param self The object pointer
2821 # @param Obj for whom leaf section is got
2822 # @param AlignValue alignment value for complex section
2823 # @retval True Successfully find section statement
2824 # @retval False Not able to find section statement
2826 def __GetCglSection(self
, Obj
, AlignValue
= None):
2828 if self
.__IsKeyword
( "COMPRESS"):
2830 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2833 if not self
.__IsToken
("{"):
2834 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2836 CompressSectionObj
= CompressSection
.CompressSection()
2837 CompressSectionObj
.Alignment
= AlignValue
2838 CompressSectionObj
.CompType
= type
2839 # Recursive sections...
2841 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2842 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2843 if not IsLeafSection
and not IsEncapSection
:
2847 if not self
.__IsToken
( "}"):
2848 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2849 Obj
.SectionList
.append(CompressSectionObj
)
2852 # raise Warning("Compress type not known")
2856 elif self
.__IsKeyword
( "GUIDED"):
2858 if self
.__GetNextGuid
():
2859 GuidValue
= self
.__Token
2861 AttribDict
= self
.__GetGuidAttrib
()
2862 if not self
.__IsToken
("{"):
2863 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2864 GuidSectionObj
= GuidSection
.GuidSection()
2865 GuidSectionObj
.Alignment
= AlignValue
2866 GuidSectionObj
.NameGuid
= GuidValue
2867 GuidSectionObj
.SectionType
= "GUIDED"
2868 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2869 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2870 # Recursive sections...
2872 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2873 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2874 if not IsLeafSection
and not IsEncapSection
:
2877 if not self
.__IsToken
( "}"):
2878 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2879 Obj
.SectionList
.append(GuidSectionObj
)
2885 ## __GetGuidAttri() method
2887 # Get attributes for GUID section
2889 # @param self The object pointer
2890 # @retval AttribDict Dictionary of key-value pair of section attributes
2892 def __GetGuidAttrib(self
):
2895 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
2896 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
2897 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2898 AttribKey
= self
.__Token
2900 if not self
.__IsToken
("="):
2901 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2903 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2904 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2905 AttribDict
[AttribKey
] = self
.__Token
2907 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2908 AttribKey
= self
.__Token
2910 if not self
.__IsToken
("="):
2911 raise Warning("expected '='")
2913 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2914 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2915 AttribDict
[AttribKey
] = self
.__Token
2919 ## __GetEncapsulationSec() method
2921 # Get encapsulation section for FILE
2923 # @param self The object pointer
2924 # @param FfsFile for whom section is got
2925 # @retval True Successfully find section statement
2926 # @retval False Not able to find section statement
2928 def __GetEncapsulationSec(self
, FfsFileObj
):
2930 OldPos
= self
.GetFileBufferPos()
2931 if not self
.__IsKeyword
( "SECTION"):
2932 if len(FfsFileObj
.SectionList
) == 0:
2933 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2938 if self
.__GetAlignment
():
2939 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2940 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2941 AlignValue
= self
.__Token
2943 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2944 self
.SetFileBufferPos(OldPos
)
2949 ## __GetCapsule() method
2951 # Get capsule section contents and store its data into capsule list of self.Profile
2953 # @param self The object pointer
2954 # @retval True Successfully find a capsule
2955 # @retval False Not able to find a capsule
2957 def __GetCapsule(self
):
2959 if not self
.__GetNextToken
():
2962 S
= self
.__Token
.upper()
2963 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2964 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2965 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2970 if not self
.__IsToken
("[CAPSULE.", True):
2971 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2972 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2973 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2974 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2976 CapsuleObj
= Capsule
.Capsule()
2978 CapsuleName
= self
.__GetUiName
()
2980 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2982 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2984 if not self
.__IsToken
( "]"):
2985 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2987 if self
.__IsKeyword
("CREATE_FILE"):
2988 if not self
.__IsToken
( "="):
2989 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2991 if not self
.__GetNextToken
():
2992 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2994 CapsuleObj
.CreateFile
= self
.__Token
2996 self
.__GetCapsuleStatements
(CapsuleObj
)
2997 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3000 ## __GetCapsuleStatements() method
3002 # Get statements for capsule
3004 # @param self The object pointer
3005 # @param Obj for whom statements are got
3007 def __GetCapsuleStatements(self
, Obj
):
3008 self
.__GetCapsuleTokens
(Obj
)
3009 self
.__GetDefineStatements
(Obj
)
3010 self
.__GetSetStatements
(Obj
)
3011 self
.__GetCapsuleData
(Obj
)
3013 ## __GetCapsuleTokens() method
3015 # Get token statements for capsule
3017 # @param self The object pointer
3018 # @param Obj for whom token statements are got
3020 def __GetCapsuleTokens(self
, Obj
):
3021 if not self
.__GetNextToken
():
3023 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):
3024 Name
= self
.__Token
.strip()
3025 if not self
.__IsToken
("="):
3026 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3027 if not self
.__GetNextToken
():
3028 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3029 if Name
== 'CAPSULE_FLAGS':
3030 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3031 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3032 Value
= self
.__Token
.strip()
3033 while self
.__IsToken
(","):
3035 if not self
.__GetNextToken
():
3036 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3037 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3038 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3039 Value
+= self
.__Token
.strip()
3041 Value
= self
.__Token
.strip()
3042 Obj
.TokensDict
[Name
] = Value
3043 if not self
.__GetNextToken
():
3047 ## __GetCapsuleData() method
3049 # Get capsule data for capsule
3051 # @param self The object pointer
3052 # @param Obj for whom capsule data are got
3054 def __GetCapsuleData(self
, Obj
):
3057 IsInf
= self
.__GetInfStatement
(Obj
, True)
3058 IsFile
= self
.__GetFileStatement
(Obj
, True)
3059 IsFv
= self
.__GetFvStatement
(Obj
)
3060 IsFd
= self
.__GetFdStatement
(Obj
)
3061 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3062 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
):
3065 ## __GetFvStatement() method
3067 # Get FV for capsule
3069 # @param self The object pointer
3070 # @param CapsuleObj for whom FV is got
3071 # @retval True Successfully find a FV statement
3072 # @retval False Not able to find a FV statement
3074 def __GetFvStatement(self
, CapsuleObj
):
3076 if not self
.__IsKeyword
("FV"):
3079 if not self
.__IsToken
("="):
3080 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3082 if not self
.__GetNextToken
():
3083 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3085 if self
.__Token
.upper() not in self
.Profile
.FvDict
.keys():
3086 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3088 CapsuleFv
= CapsuleData
.CapsuleFv()
3089 CapsuleFv
.FvName
= self
.__Token
3090 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3093 ## __GetFdStatement() method
3095 # Get FD for capsule
3097 # @param self The object pointer
3098 # @param CapsuleObj for whom FD is got
3099 # @retval True Successfully find a FD statement
3100 # @retval False Not able to find a FD statement
3102 def __GetFdStatement(self
, CapsuleObj
):
3104 if not self
.__IsKeyword
("FD"):
3107 if not self
.__IsToken
("="):
3108 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3110 if not self
.__GetNextToken
():
3111 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3113 if self
.__Token
.upper() not in self
.Profile
.FdDict
.keys():
3114 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3116 CapsuleFd
= CapsuleData
.CapsuleFd()
3117 CapsuleFd
.FdName
= self
.__Token
3118 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3121 ## __GetAnyFileStatement() method
3123 # Get AnyFile for capsule
3125 # @param self The object pointer
3126 # @param CapsuleObj for whom AnyFile is got
3127 # @retval True Successfully find a Anyfile statement
3128 # @retval False Not able to find a AnyFile statement
3130 def __GetAnyFileStatement(self
, CapsuleObj
):
3132 if not self
.__IsKeyword
("FILE"):
3135 if not self
.__IsKeyword
("DATA"):
3139 if not self
.__IsToken
("="):
3140 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3142 if not self
.__GetNextToken
():
3143 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3145 AnyFileName
= self
.__Token
3146 AnyFileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AnyFileName
)
3147 if not os
.path
.exists(AnyFileName
):
3148 raise Warning("File %s not exists"%AnyFileName
, self
.FileName
, self
.CurrentLineNumber
)
3150 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3151 CapsuleAnyFile
.FileName
= AnyFileName
3152 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3155 ## __GetRule() method
3157 # Get Rule section contents and store its data into rule list of self.Profile
3159 # @param self The object pointer
3160 # @retval True Successfully find a Rule
3161 # @retval False Not able to find a Rule
3163 def __GetRule(self
):
3165 if not self
.__GetNextToken
():
3168 S
= self
.__Token
.upper()
3169 if S
.startswith("[") and not S
.startswith("[RULE."):
3170 if not S
.startswith("[OPTIONROM."):
3171 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3175 if not self
.__IsToken
("[Rule.", True):
3176 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3177 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3178 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3179 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3181 if not self
.__SkipToToken
("."):
3182 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3184 Arch
= self
.__SkippedChars
.rstrip(".")
3185 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
3186 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3188 ModuleType
= self
.__GetModuleType
()
3191 if self
.__IsToken
("."):
3192 if not self
.__GetNextWord
():
3193 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3194 TemplateName
= self
.__Token
3196 if not self
.__IsToken
( "]"):
3197 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3199 RuleObj
= self
.__GetRuleFileStatements
()
3200 RuleObj
.Arch
= Arch
.upper()
3201 RuleObj
.ModuleType
= ModuleType
3202 RuleObj
.TemplateName
= TemplateName
3203 if TemplateName
== '' :
3204 self
.Profile
.RuleDict
['RULE' + \
3208 ModuleType
.upper() ] = RuleObj
3210 self
.Profile
.RuleDict
['RULE' + \
3214 ModuleType
.upper() + \
3216 TemplateName
.upper() ] = RuleObj
3217 # self.Profile.RuleList.append(rule)
3220 ## __GetModuleType() method
3222 # Return the module type
3224 # @param self The object pointer
3225 # @retval string module type
3227 def __GetModuleType(self
):
3229 if not self
.__GetNextWord
():
3230 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3231 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3232 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3233 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3234 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3235 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3236 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3237 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3240 ## __GetFileExtension() method
3242 # Return the file extension
3244 # @param self The object pointer
3245 # @retval string file name extension
3247 def __GetFileExtension(self
):
3248 if not self
.__IsToken
("."):
3249 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3252 if self
.__GetNextToken
():
3253 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3254 if Pattern
.match(self
.__Token
):
3258 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3261 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3263 ## __GetRuleFileStatement() method
3267 # @param self The object pointer
3268 # @retval Rule Rule object
3270 def __GetRuleFileStatements(self
):
3272 if not self
.__IsKeyword
("FILE"):
3273 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3275 if not self
.__GetNextWord
():
3276 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3278 Type
= self
.__Token
.strip().upper()
3279 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3280 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3281 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3283 if not self
.__IsToken
("="):
3284 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3286 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3287 if not self
.__GetNextWord
():
3288 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3289 if self
.__Token
== 'PCD':
3290 if not self
.__IsToken
( "("):
3291 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3292 PcdPair
= self
.__GetNextPcdName
()
3293 if not self
.__IsToken
( ")"):
3294 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3295 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3297 NameGuid
= self
.__Token
3300 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3301 if self
.__FileCouldHaveRelocFlag
(Type
):
3302 if self
.__Token
== 'RELOCS_STRIPPED':
3307 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3310 if self
.__GetNextToken
():
3311 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3312 if Pattern
.match(self
.__Token
):
3313 KeyStringList
.append(self
.__Token
)
3314 if self
.__IsToken
(","):
3315 while self
.__GetNextToken
():
3316 if not Pattern
.match(self
.__Token
):
3317 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3318 KeyStringList
.append(self
.__Token
)
3320 if not self
.__IsToken
(","):
3328 if self
.__IsKeyword
("Fixed", True):
3332 if self
.__IsKeyword
("CheckSum", True):
3336 if self
.__GetAlignment
():
3337 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3338 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3339 #For FFS, Auto is default option same to ""
3340 if not self
.__Token
== "Auto":
3341 AlignValue
= self
.__Token
3343 if self
.__IsToken
("{"):
3344 # Complex file rule expected
3345 Rule
= RuleComplexFile
.RuleComplexFile()
3346 Rule
.FvFileType
= Type
3347 Rule
.NameGuid
= NameGuid
3348 Rule
.Alignment
= AlignValue
3349 Rule
.CheckSum
= CheckSum
3351 Rule
.KeyStringList
= KeyStringList
3352 if KeepReloc
!= None:
3353 Rule
.KeepReloc
= KeepReloc
3356 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3357 IsLeaf
= self
.__GetEfiSection
(Rule
)
3358 if not IsEncapsulate
and not IsLeaf
:
3361 if not self
.__IsToken
("}"):
3362 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3367 # Simple file rule expected
3368 if not self
.__GetNextWord
():
3369 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3371 SectionName
= self
.__Token
3373 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3374 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3375 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3378 if self
.__IsKeyword
("Fixed", True):
3381 if self
.__IsKeyword
("CheckSum", True):
3385 if self
.__GetAlignment
():
3386 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3387 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3388 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3389 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3390 SectAlignment
= self
.__Token
3393 if self
.__IsToken
('|'):
3394 Ext
= self
.__GetFileExtension
()
3395 elif not self
.__GetNextToken
():
3396 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3398 Rule
= RuleSimpleFile
.RuleSimpleFile()
3399 Rule
.SectionType
= SectionName
3400 Rule
.FvFileType
= Type
3401 Rule
.NameGuid
= NameGuid
3402 Rule
.Alignment
= AlignValue
3403 Rule
.SectAlignment
= SectAlignment
3404 Rule
.CheckSum
= CheckSum
3406 Rule
.KeyStringList
= KeyStringList
3407 if KeepReloc
!= None:
3408 Rule
.KeepReloc
= KeepReloc
3409 Rule
.FileExtension
= Ext
3410 Rule
.FileName
= self
.__Token
3413 ## __GetEfiSection() method
3415 # Get section list for Rule
3417 # @param self The object pointer
3418 # @param Obj for whom section is got
3419 # @retval True Successfully find section statement
3420 # @retval False Not able to find section statement
3422 def __GetEfiSection(self
, Obj
):
3424 OldPos
= self
.GetFileBufferPos()
3425 if not self
.__GetNextWord
():
3427 SectionName
= self
.__Token
3429 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3430 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3434 if SectionName
== "FV_IMAGE":
3435 FvImageSectionObj
= FvImageSection
.FvImageSection()
3436 if self
.__IsKeyword
("FV_IMAGE"):
3438 if self
.__IsToken
( "{"):
3440 self
.__GetDefineStatements
(FvObj
)
3441 self
.__GetBlockStatement
(FvObj
)
3442 self
.__GetSetStatements
(FvObj
)
3443 self
.__GetFvAlignment
(FvObj
)
3444 self
.__GetFvAttributes
(FvObj
)
3445 self
.__GetAprioriSection
(FvObj
)
3446 self
.__GetAprioriSection
(FvObj
)
3449 IsInf
= self
.__GetInfStatement
(FvObj
)
3450 IsFile
= self
.__GetFileStatement
(FvObj
)
3451 if not IsInf
and not IsFile
:
3454 if not self
.__IsToken
( "}"):
3455 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3456 FvImageSectionObj
.Fv
= FvObj
3457 FvImageSectionObj
.FvName
= None
3460 if not self
.__IsKeyword
("FV"):
3461 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3462 FvImageSectionObj
.FvFileType
= self
.__Token
3464 if self
.__GetAlignment
():
3465 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3466 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3467 FvImageSectionObj
.Alignment
= self
.__Token
3469 if self
.__IsToken
('|'):
3470 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3471 elif self
.__GetNextToken
():
3472 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3473 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3474 FvImageSectionObj
.FvFileName
= self
.__Token
3478 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3480 Obj
.SectionList
.append(FvImageSectionObj
)
3483 EfiSectionObj
= EfiSection
.EfiSection()
3484 EfiSectionObj
.SectionType
= SectionName
3486 if not self
.__GetNextToken
():
3487 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3489 if self
.__Token
== "STRING":
3490 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3491 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3493 if not self
.__IsToken
('='):
3494 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3496 if not self
.__GetNextToken
():
3497 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3499 if self
.__GetStringData
():
3500 EfiSectionObj
.StringData
= self
.__Token
3502 if self
.__IsKeyword
("BUILD_NUM"):
3503 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3504 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3506 if not self
.__IsToken
("="):
3507 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3508 if not self
.__GetNextToken
():
3509 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3510 EfiSectionObj
.BuildNum
= self
.__Token
3513 EfiSectionObj
.FileType
= self
.__Token
3514 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3516 if self
.__IsKeyword
("Optional"):
3517 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3518 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3519 EfiSectionObj
.Optional
= True
3521 if self
.__IsKeyword
("BUILD_NUM"):
3522 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3523 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3525 if not self
.__IsToken
("="):
3526 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3527 if not self
.__GetNextToken
():
3528 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3529 EfiSectionObj
.BuildNum
= self
.__Token
3531 if self
.__GetAlignment
():
3532 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3533 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3534 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3535 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3536 EfiSectionObj
.Alignment
= self
.__Token
3538 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3539 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3540 if self
.__Token
== 'RELOCS_STRIPPED':
3541 EfiSectionObj
.KeepReloc
= False
3543 EfiSectionObj
.KeepReloc
= True
3544 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3545 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3547 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3550 if self
.__IsToken
('|'):
3551 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3552 elif self
.__GetNextToken
():
3553 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3554 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3556 if self
.__Token
.startswith('PCD'):
3558 self
.__GetNextWord
()
3560 if self
.__Token
== 'PCD':
3561 if not self
.__IsToken
( "("):
3562 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3563 PcdPair
= self
.__GetNextPcdName
()
3564 if not self
.__IsToken
( ")"):
3565 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3566 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3568 EfiSectionObj
.FileName
= self
.__Token
3573 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3575 Obj
.SectionList
.append(EfiSectionObj
)
3578 ## __RuleSectionCouldBeOptional() method
3580 # Get whether a section could be optional
3582 # @param self The object pointer
3583 # @param SectionType The section type to check
3584 # @retval True section could be optional
3585 # @retval False section never optional
3587 def __RuleSectionCouldBeOptional(self
, SectionType
):
3588 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3593 ## __RuleSectionCouldHaveBuildNum() method
3595 # Get whether a section could have build number information
3597 # @param self The object pointer
3598 # @param SectionType The section type to check
3599 # @retval True section could have build number information
3600 # @retval False section never have build number information
3602 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3603 if SectionType
in ("VERSION"):
3608 ## __RuleSectionCouldHaveString() method
3610 # Get whether a section could have string
3612 # @param self The object pointer
3613 # @param SectionType The section type to check
3614 # @retval True section could have string
3615 # @retval False section never have string
3617 def __RuleSectionCouldHaveString(self
, SectionType
):
3618 if SectionType
in ("UI", "VERSION"):
3623 ## __CheckRuleSectionFileType() method
3625 # Get whether a section matches a file type
3627 # @param self The object pointer
3628 # @param SectionType The section type to check
3629 # @param FileType The file type to check
3631 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3632 if SectionType
== "COMPAT16":
3633 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3634 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3635 elif SectionType
== "PE32":
3636 if FileType
not in ("PE32", "SEC_PE32"):
3637 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3638 elif SectionType
== "PIC":
3639 if FileType
not in ("PIC", "PIC"):
3640 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3641 elif SectionType
== "TE":
3642 if FileType
not in ("TE", "SEC_TE"):
3643 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3644 elif SectionType
== "RAW":
3645 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3646 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3647 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3648 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3649 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3650 elif SectionType
== "UI":
3651 if FileType
not in ("UI", "SEC_UI"):
3652 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3653 elif SectionType
== "VERSION":
3654 if FileType
not in ("VERSION", "SEC_VERSION"):
3655 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3656 elif SectionType
== "PEI_DEPEX":
3657 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3658 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3659 elif SectionType
== "GUID":
3660 if FileType
not in ("PE32", "SEC_GUID"):
3661 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3663 ## __GetRuleEncapsulationSection() method
3665 # Get encapsulation section for Rule
3667 # @param self The object pointer
3668 # @param Rule for whom section is got
3669 # @retval True Successfully find section statement
3670 # @retval False Not able to find section statement
3672 def __GetRuleEncapsulationSection(self
, Rule
):
3674 if self
.__IsKeyword
( "COMPRESS"):
3676 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3679 if not self
.__IsToken
("{"):
3680 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3682 CompressSectionObj
= CompressSection
.CompressSection()
3684 CompressSectionObj
.CompType
= Type
3685 # Recursive sections...
3687 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3688 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3689 if not IsEncapsulate
and not IsLeaf
:
3692 if not self
.__IsToken
( "}"):
3693 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3694 Rule
.SectionList
.append(CompressSectionObj
)
3698 elif self
.__IsKeyword
( "GUIDED"):
3700 if self
.__GetNextGuid
():
3701 GuidValue
= self
.__Token
3703 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3704 GuidValue
= self
.__Token
3706 AttribDict
= self
.__GetGuidAttrib
()
3708 if not self
.__IsToken
("{"):
3709 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3710 GuidSectionObj
= GuidSection
.GuidSection()
3711 GuidSectionObj
.NameGuid
= GuidValue
3712 GuidSectionObj
.SectionType
= "GUIDED"
3713 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3714 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3718 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3719 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3720 if not IsEncapsulate
and not IsLeaf
:
3723 if not self
.__IsToken
( "}"):
3724 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3725 Rule
.SectionList
.append(GuidSectionObj
)
3731 ## __GetVtf() method
3733 # Get VTF section contents and store its data into VTF list of self.Profile
3735 # @param self The object pointer
3736 # @retval True Successfully find a VTF
3737 # @retval False Not able to find a VTF
3741 if not self
.__GetNextToken
():
3744 S
= self
.__Token
.upper()
3745 if S
.startswith("[") and not S
.startswith("[VTF."):
3746 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3747 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3752 if not self
.__IsToken
("[VTF.", True):
3753 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3754 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3755 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3756 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3758 if not self
.__SkipToToken
("."):
3759 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3761 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3762 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3763 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3765 if not self
.__GetNextWord
():
3766 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3767 Name
= self
.__Token
.upper()
3770 VtfObj
.UiName
= Name
3771 VtfObj
.KeyArch
= Arch
3773 if self
.__IsToken
(","):
3774 if not self
.__GetNextWord
():
3775 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3776 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3777 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3778 VtfObj
.ArchList
= self
.__Token
.upper()
3780 if not self
.__IsToken
( "]"):
3781 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3783 if self
.__IsKeyword
("IA32_RST_BIN"):
3784 if not self
.__IsToken
("="):
3785 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3787 if not self
.__GetNextToken
():
3788 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3790 VtfObj
.ResetBin
= self
.__Token
3791 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3792 #check for file path
3793 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3795 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3797 while self
.__GetComponentStatement
(VtfObj
):
3800 self
.Profile
.VtfList
.append(VtfObj
)
3803 ## __GetComponentStatement() method
3805 # Get components in VTF
3807 # @param self The object pointer
3808 # @param VtfObj for whom component is got
3809 # @retval True Successfully find a component
3810 # @retval False Not able to find a component
3812 def __GetComponentStatement(self
, VtfObj
):
3814 if not self
.__IsKeyword
("COMP_NAME"):
3817 if not self
.__IsToken
("="):
3818 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3820 if not self
.__GetNextWord
():
3821 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3823 CompStatementObj
= ComponentStatement
.ComponentStatement()
3824 CompStatementObj
.CompName
= self
.__Token
3826 if not self
.__IsKeyword
("COMP_LOC"):
3827 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3829 if not self
.__IsToken
("="):
3830 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3832 CompStatementObj
.CompLoc
= ""
3833 if self
.__GetNextWord
():
3834 CompStatementObj
.CompLoc
= self
.__Token
3835 if self
.__IsToken
('|'):
3836 if not self
.__GetNextWord
():
3837 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3839 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3840 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3842 CompStatementObj
.FilePos
= self
.__Token
3844 self
.CurrentLineNumber
+= 1
3845 self
.CurrentOffsetWithinLine
= 0
3847 if not self
.__IsKeyword
("COMP_TYPE"):
3848 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3850 if not self
.__IsToken
("="):
3851 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3853 if not self
.__GetNextToken
():
3854 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3855 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3856 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3857 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3858 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3859 CompStatementObj
.CompType
= self
.__Token
3861 if not self
.__IsKeyword
("COMP_VER"):
3862 raise Warning("expected COMP_VER", 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 version", self
.FileName
, self
.CurrentLineNumber
)
3870 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
3871 if Pattern
.match(self
.__Token
) == None:
3872 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3873 CompStatementObj
.CompVer
= self
.__Token
3875 if not self
.__IsKeyword
("COMP_CS"):
3876 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3878 if not self
.__IsToken
("="):
3879 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3881 if not self
.__GetNextToken
():
3882 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3883 if self
.__Token
not in ("1", "0"):
3884 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3885 CompStatementObj
.CompCs
= self
.__Token
3888 if not self
.__IsKeyword
("COMP_BIN"):
3889 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3891 if not self
.__IsToken
("="):
3892 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3894 if not self
.__GetNextToken
():
3895 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3897 CompStatementObj
.CompBin
= self
.__Token
3898 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3899 #check for file path
3900 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3902 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3904 if not self
.__IsKeyword
("COMP_SYM"):
3905 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3907 if not self
.__IsToken
("="):
3908 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3910 if not self
.__GetNextToken
():
3911 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3913 CompStatementObj
.CompSym
= self
.__Token
3914 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
3915 #check for file path
3916 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3918 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3920 if not self
.__IsKeyword
("COMP_SIZE"):
3921 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3923 if not self
.__IsToken
("="):
3924 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3926 if self
.__IsToken
("-"):
3927 CompStatementObj
.CompSize
= self
.__Token
3928 elif self
.__GetNextDecimalNumber
():
3929 CompStatementObj
.CompSize
= self
.__Token
3930 elif self
.__GetNextHexNumber
():
3931 CompStatementObj
.CompSize
= self
.__Token
3933 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3935 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3938 ## __GetOptionRom() method
3940 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3942 # @param self The object pointer
3943 # @retval True Successfully find a OptionROM
3944 # @retval False Not able to find a OptionROM
3946 def __GetOptionRom(self
):
3948 if not self
.__GetNextToken
():
3951 S
= self
.__Token
.upper()
3952 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3953 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3956 if not self
.__IsToken
("[OptionRom.", True):
3957 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3959 OptRomName
= self
.__GetUiName
()
3961 if not self
.__IsToken
( "]"):
3962 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3964 OptRomObj
= OptionRom
.OPTIONROM()
3965 OptRomObj
.DriverName
= OptRomName
3966 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3969 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3970 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3971 if not isInf
and not isFile
:
3976 ## __GetOptRomInfStatement() method
3978 # Get INF statements
3980 # @param self The object pointer
3981 # @param Obj for whom inf statement is got
3982 # @retval True Successfully find inf statement
3983 # @retval False Not able to find inf statement
3985 def __GetOptRomInfStatement(self
, Obj
):
3987 if not self
.__IsKeyword
( "INF"):
3990 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3991 self
.__GetInfOptions
( ffsInf
)
3993 if not self
.__GetNextToken
():
3994 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3995 ffsInf
.InfFileName
= self
.__Token
3996 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3997 #check for file path
3998 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4000 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4002 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4003 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4004 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4005 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4008 self
.__GetOptRomOverrides
(ffsInf
)
4010 Obj
.FfsList
.append(ffsInf
)
4013 ## __GetOptRomOverrides() method
4015 # Get overrides for OptROM INF & FILE
4017 # @param self The object pointer
4018 # @param FfsInfObj for whom overrides is got
4020 def __GetOptRomOverrides(self
, Obj
):
4021 if self
.__IsToken
('{'):
4022 Overrides
= OptionRom
.OverrideAttribs()
4024 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4025 if not self
.__IsToken
( "="):
4026 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4027 if not self
.__GetNextHexNumber
():
4028 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4029 Overrides
.PciVendorId
= self
.__Token
4032 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4033 if not self
.__IsToken
( "="):
4034 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4035 if not self
.__GetNextHexNumber
():
4036 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4037 Overrides
.PciClassCode
= self
.__Token
4040 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4041 if not self
.__IsToken
( "="):
4042 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4043 if not self
.__GetNextHexNumber
():
4044 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4046 Overrides
.PciDeviceId
= self
.__Token
4049 if self
.__IsKeyword
( "PCI_REVISION"):
4050 if not self
.__IsToken
( "="):
4051 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4052 if not self
.__GetNextHexNumber
():
4053 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4054 Overrides
.PciRevision
= self
.__Token
4057 if self
.__IsKeyword
( "PCI_COMPRESS"):
4058 if not self
.__IsToken
( "="):
4059 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4060 if not self
.__GetNextToken
():
4061 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4062 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4065 if self
.__IsToken
( "}"):
4068 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4070 Obj
.OverrideAttribs
= Overrides
4072 ## __GetOptRomFileStatement() method
4074 # Get FILE statements
4076 # @param self The object pointer
4077 # @param Obj for whom FILE statement is got
4078 # @retval True Successfully find FILE statement
4079 # @retval False Not able to find FILE statement
4081 def __GetOptRomFileStatement(self
, Obj
):
4083 if not self
.__IsKeyword
( "FILE"):
4086 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4088 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4089 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4090 FfsFileObj
.FileType
= self
.__Token
4092 if not self
.__GetNextToken
():
4093 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4094 FfsFileObj
.FileName
= self
.__Token
4095 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4096 #check for file path
4097 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4099 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4101 if FfsFileObj
.FileType
== 'EFI':
4102 self
.__GetOptRomOverrides
(FfsFileObj
)
4104 Obj
.FfsList
.append(FfsFileObj
)
4108 ## __GetCapInFd() method
4110 # Get Cap list contained in FD
4112 # @param self The object pointer
4113 # @param FdName FD name
4114 # @retval CapList List of Capsule in FD
4116 def __GetCapInFd (self
, FdName
):
4119 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4120 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4121 for elementRegion
in FdObj
.RegionList
:
4122 if elementRegion
.RegionType
== 'CAPSULE':
4123 for elementRegionData
in elementRegion
.RegionDataList
:
4124 if elementRegionData
.endswith(".cap"):
4126 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
4127 CapList
.append(elementRegionData
.upper())
4130 ## __GetReferencedFdCapTuple() method
4132 # Get FV and FD list referenced by a capsule image
4134 # @param self The object pointer
4135 # @param CapObj Capsule section to be searched
4136 # @param RefFdList referenced FD by section
4137 # @param RefFvList referenced FV by section
4139 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4141 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4142 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4143 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4144 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4145 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4146 elif CapsuleDataObj
.Ffs
!= None:
4147 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4148 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4149 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4150 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4151 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4153 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4155 ## __GetFvInFd() method
4157 # Get FV list contained in FD
4159 # @param self The object pointer
4160 # @param FdName FD name
4161 # @retval FvList list of FV in FD
4163 def __GetFvInFd (self
, FdName
):
4166 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4167 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4168 for elementRegion
in FdObj
.RegionList
:
4169 if elementRegion
.RegionType
== 'FV':
4170 for elementRegionData
in elementRegion
.RegionDataList
:
4171 if elementRegionData
.endswith(".fv"):
4173 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4174 FvList
.append(elementRegionData
.upper())
4177 ## __GetReferencedFdFvTuple() method
4179 # Get FD and FV list referenced by a FFS file
4181 # @param self The object pointer
4182 # @param FfsFile contains sections to be searched
4183 # @param RefFdList referenced FD by section
4184 # @param RefFvList referenced FV by section
4186 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4188 for FfsObj
in FvObj
.FfsList
:
4189 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4190 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4191 RefFvList
.append(FfsObj
.FvName
.upper())
4192 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4193 RefFdList
.append(FfsObj
.FdName
.upper())
4195 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4197 ## __GetReferencedFdFvTupleFromSection() method
4199 # Get FD and FV list referenced by a FFS section
4201 # @param self The object pointer
4202 # @param FfsFile contains sections to be searched
4203 # @param FdList referenced FD by section
4204 # @param FvList referenced FV by section
4206 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4209 SectionStack
.extend(FfsFile
.SectionList
)
4210 while SectionStack
!= []:
4211 SectionObj
= SectionStack
.pop()
4212 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4213 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4214 FvList
.append(SectionObj
.FvName
.upper())
4215 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4216 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4217 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4219 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4220 SectionStack
.extend(SectionObj
.SectionList
)
4222 ## CycleReferenceCheck() method
4224 # Check whether cycle reference exists in FDF
4226 # @param self The object pointer
4227 # @retval True cycle reference exists
4228 # @retval False Not exists cycle reference
4230 def CycleReferenceCheck(self
):
4232 # Check the cycle between FV and FD image
4234 MaxLength
= len (self
.Profile
.FvDict
)
4235 for FvName
in self
.Profile
.FvDict
.keys():
4236 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4238 RefFvStack
.append(FvName
)
4242 while RefFvStack
!= [] and Index
< MaxLength
:
4244 FvNameFromStack
= RefFvStack
.pop()
4245 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4246 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4252 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4254 for RefFdName
in RefFdList
:
4255 if RefFdName
in FdAnalyzedList
:
4258 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4259 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4260 if FvInFdList
!= []:
4261 for FvNameInFd
in FvInFdList
:
4262 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4263 if FvNameInFd
not in RefFvStack
:
4264 RefFvStack
.append(FvNameInFd
)
4266 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4267 EdkLogger
.info(LogStr
)
4269 FdAnalyzedList
.append(RefFdName
)
4271 for RefFvName
in RefFvList
:
4272 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4273 if RefFvName
not in RefFvStack
:
4274 RefFvStack
.append(RefFvName
)
4276 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4277 EdkLogger
.info(LogStr
)
4281 # Check the cycle between Capsule and FD image
4283 MaxLength
= len (self
.Profile
.CapsuleDict
)
4284 for CapName
in self
.Profile
.CapsuleDict
.keys():
4286 # Capsule image to be checked.
4288 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4290 RefCapStack
.append(CapName
)
4295 while RefCapStack
!= [] and Index
< MaxLength
:
4297 CapNameFromStack
= RefCapStack
.pop()
4298 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4299 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4305 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4309 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4310 for RefFdName
in RefFdList
:
4311 if RefFdName
in FdAnalyzedList
:
4314 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4315 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4316 if CapInFdList
!= []:
4317 for CapNameInFd
in CapInFdList
:
4318 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4319 if CapNameInFd
not in RefCapStack
:
4320 RefCapStack
.append(CapNameInFd
)
4322 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4323 EdkLogger
.info(LogStr
)
4326 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4327 if FvInFdList
!= []:
4328 for FvNameInFd
in FvInFdList
:
4329 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4330 if FvNameInFd
not in RefFvList
:
4331 RefFvList
.append(FvNameInFd
)
4333 FdAnalyzedList
.append(RefFdName
)
4335 # the number of the parsed FV and FD image
4337 FvListLength
= len (RefFvList
)
4338 FdListLength
= len (RefFdList
)
4339 for RefFvName
in RefFvList
:
4340 if RefFvName
in FvAnalyzedList
:
4342 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4343 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4344 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4347 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4348 FvAnalyzedList
.append(RefFvName
)
4352 if __name__
== "__main__":
4355 test_file
= sys
.argv
[1]
4356 except IndexError, v
:
4357 print "Usage: %s filename" % sys
.argv
[0]
4360 parser
= FdfParser(test_file
)
4363 parser
.CycleReferenceCheck()