4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
5 # Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>
7 # This program and the accompanying materials
8 # are licensed and made available under the terms and conditions of the BSD License
9 # which accompanies this distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
25 import FfsInfStatement
26 import FfsFileStatement
32 import CompressSection
37 import RuleComplexFile
41 import ComponentStatement
43 import OptRomInfStatement
44 import OptRomFileStatement
47 from GenFdsGlobalVariable
import GenFdsGlobalVariable
48 from Common
.BuildToolError
import *
49 from Common
import EdkLogger
50 from Common
.Misc
import PathClass
51 from Common
.String
import NormPath
52 import Common
.GlobalData
as GlobalData
53 from Common
.Expression
import *
54 from Common
import GlobalData
55 from Common
.String
import ReplaceMacro
57 from Common
.Misc
import tdict
58 from Common
.MultipleWorkspace
import MultipleWorkspace
as mws
59 import Common
.LongFilePathOs
as os
60 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
61 from Capsule
import EFI_CERT_TYPE_PKCS7_GUID
62 from Capsule
import EFI_CERT_TYPE_RSA2048_SHA256_GUID
63 from Common
.RangeExpression
import RangeExpression
65 ##define T_CHAR_SPACE ' '
66 ##define T_CHAR_NULL '\0'
67 ##define T_CHAR_CR '\r'
68 ##define T_CHAR_TAB '\t'
69 ##define T_CHAR_LF '\n'
70 ##define T_CHAR_SLASH '/'
71 ##define T_CHAR_BACKSLASH '\\'
72 ##define T_CHAR_DOUBLE_QUOTE '\"'
73 ##define T_CHAR_SINGLE_QUOTE '\''
74 ##define T_CHAR_STAR '*'
75 ##define T_CHAR_HASH '#'
77 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
78 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
79 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
81 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
83 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
84 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
85 RegionOffsetPcdPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*$")
86 ShortcutPcdPattern
= re
.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
87 BaseAddrValuePattern
= re
.compile('^0[xX][0-9a-fA-F]+')
88 FileExtensionPattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
89 TokenFindPattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
91 AllIncludeFileList
= []
93 # Get the closest parent
94 def GetParentAtLine (Line
):
95 for Profile
in AllIncludeFileList
:
96 if Profile
.IsLineInFile(Line
):
101 def IsValidInclude (File
, Line
):
102 for Profile
in AllIncludeFileList
:
103 if Profile
.IsLineInFile(Line
) and Profile
.FileName
== File
:
108 def GetRealFileLine (File
, Line
):
111 for Profile
in AllIncludeFileList
:
112 if Profile
.IsLineInFile(Line
):
113 return Profile
.GetLineInFile(Line
)
114 elif Line
>= Profile
.InsertStartLineNumber
and Profile
.Level
== 1:
115 InsertedLines
+= Profile
.GetTotalLines()
117 return (File
, Line
- InsertedLines
)
119 ## The exception class that used to report error messages when parsing FDF
121 # Currently the "ToolName" is set to be "FDF Parser".
123 class Warning (Exception):
126 # @param self The object pointer
127 # @param Str The message to record
128 # @param File The FDF name
129 # @param Line The Line number that error occurs
131 def __init__(self
, Str
, File
= None, Line
= None):
133 FileLineTuple
= GetRealFileLine(File
, Line
)
134 self
.FileName
= FileLineTuple
[0]
135 self
.LineNumber
= FileLineTuple
[1]
136 self
.OriginalLineNumber
= Line
138 self
.ToolName
= 'FdfParser'
143 ## The Include file content class that used to record file data when parsing include file
145 # May raise Exception when opening file.
147 class IncludeFileProfile
:
150 # @param self The object pointer
151 # @param FileName The file that to be parsed
153 def __init__(self
, FileName
):
154 self
.FileName
= FileName
155 self
.FileLinesList
= []
157 fsock
= open(FileName
, "rb", 0)
159 self
.FileLinesList
= fsock
.readlines()
160 for index
, line
in enumerate(self
.FileLinesList
):
161 if not line
.endswith('\n'):
162 self
.FileLinesList
[index
] += '\n'
168 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
170 self
.InsertStartLineNumber
= None
171 self
.InsertAdjust
= 0
172 self
.IncludeFileList
= []
173 self
.Level
= 1 # first level include file
175 def GetTotalLines(self
):
176 TotalLines
= self
.InsertAdjust
+ len(self
.FileLinesList
)
178 for Profile
in self
.IncludeFileList
:
179 TotalLines
+= Profile
.GetTotalLines()
183 def IsLineInFile(self
, Line
):
184 if Line
>= self
.InsertStartLineNumber
and Line
< self
.InsertStartLineNumber
+ self
.GetTotalLines():
189 def GetLineInFile(self
, Line
):
190 if not self
.IsLineInFile (Line
):
191 return (self
.FileName
, -1)
193 InsertedLines
= self
.InsertStartLineNumber
195 for Profile
in self
.IncludeFileList
:
196 if Profile
.IsLineInFile(Line
):
197 return Profile
.GetLineInFile(Line
)
198 elif Line
>= Profile
.InsertStartLineNumber
:
199 InsertedLines
+= Profile
.GetTotalLines()
201 return (self
.FileName
, Line
- InsertedLines
+ 1)
205 ## The FDF content class that used to record file data when parsing FDF
207 # May raise Exception when opening file.
212 # @param self The object pointer
213 # @param FileName The file that to be parsed
215 def __init__(self
, FileName
):
216 self
.FileLinesList
= []
218 fsock
= open(FileName
, "rb", 0)
220 self
.FileLinesList
= fsock
.readlines()
225 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
230 self
.InfDict
= {'ArchTBD':[]}
231 # ECC will use this Dict and List information
232 self
.PcdFileLineDict
= {}
233 self
.InfFileLineList
= []
236 self
.FdNameNotSet
= False
238 self
.CapsuleDict
= {}
242 self
.FmpPayloadDict
= {}
244 ## The syntax parser for FDF
246 # PreprocessFile method should be called prior to ParseFile
247 # CycleReferenceCheck method can detect cycles in FDF contents
249 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
250 # Get*** procedures mean these procedures will make judgement on current token only.
255 # @param self The object pointer
256 # @param FileName The file that to be parsed
258 def __init__(self
, FileName
):
259 self
.Profile
= FileProfile(FileName
)
260 self
.FileName
= FileName
261 self
.CurrentLineNumber
= 1
262 self
.CurrentOffsetWithinLine
= 0
263 self
.CurrentFdName
= None
264 self
.CurrentFvName
= None
266 self
.__SkippedChars
= ""
267 GlobalData
.gFdfParser
= self
269 # Used to section info
270 self
.__CurSection
= []
271 # Key: [section name, UI name, arch]
272 # Value: {MACRO_NAME : MACRO_VALUE}
273 self
.__MacroDict
= tdict(True, 3)
276 self
.__WipeOffArea
= []
277 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
278 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
280 ## __SkipWhiteSpace() method
282 # Skip white spaces from current char, return number of chars skipped
284 # @param self The object pointer
285 # @retval Count The number of chars skipped
287 def __SkipWhiteSpace(self
):
289 while not self
.__EndOfFile
():
291 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
292 self
.__SkippedChars
+= str(self
.__CurrentChar
())
299 ## __EndOfFile() method
301 # Judge current buffer pos is at file end
303 # @param self The object pointer
304 # @retval True Current File buffer position is at file end
305 # @retval False Current File buffer position is NOT at file end
307 def __EndOfFile(self
):
308 NumberOfLines
= len(self
.Profile
.FileLinesList
)
309 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
310 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
312 elif self
.CurrentLineNumber
> NumberOfLines
:
317 ## __EndOfLine() method
319 # Judge current buffer pos is at line end
321 # @param self The object pointer
322 # @retval True Current File buffer position is at line end
323 # @retval False Current File buffer position is NOT at line end
325 def __EndOfLine(self
):
326 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
328 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
329 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
336 # Reset file data buffer to the initial state
338 # @param self The object pointer
339 # @param DestLine Optional new destination line number.
340 # @param DestOffset Optional new destination offset.
342 def Rewind(self
, DestLine
= 1, DestOffset
= 0):
343 self
.CurrentLineNumber
= DestLine
344 self
.CurrentOffsetWithinLine
= DestOffset
346 ## __UndoOneChar() method
348 # Go back one char in the file buffer
350 # @param self The object pointer
351 # @retval True Successfully go back one char
352 # @retval False Not able to go back one char as file beginning reached
354 def __UndoOneChar(self
):
356 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
358 elif self
.CurrentOffsetWithinLine
== 0:
359 self
.CurrentLineNumber
-= 1
360 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
362 self
.CurrentOffsetWithinLine
-= 1
365 ## __GetOneChar() method
367 # Move forward one char in the file buffer
369 # @param self The object pointer
371 def __GetOneChar(self
):
372 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
373 self
.CurrentLineNumber
+= 1
374 self
.CurrentOffsetWithinLine
= 0
376 self
.CurrentOffsetWithinLine
+= 1
378 ## __CurrentChar() method
380 # Get the char pointed to by the file buffer pointer
382 # @param self The object pointer
383 # @retval Char Current char
385 def __CurrentChar(self
):
386 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
388 ## __NextChar() method
390 # Get the one char pass the char pointed to by the file buffer pointer
392 # @param self The object pointer
393 # @retval Char Next char
395 def __NextChar(self
):
396 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
397 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
399 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
401 ## __SetCurrentCharValue() method
403 # Modify the value of current char
405 # @param self The object pointer
406 # @param Value The new value of current char
408 def __SetCurrentCharValue(self
, Value
):
409 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
411 ## __CurrentLine() method
413 # Get the list that contains current line contents
415 # @param self The object pointer
416 # @retval List current line contents
418 def __CurrentLine(self
):
419 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
421 def __StringToList(self
):
422 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
423 self
.Profile
.FileLinesList
[-1].append(' ')
425 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
426 if StartPos
[0] == EndPos
[0]:
428 while Offset
<= EndPos
[1]:
429 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
434 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
435 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
439 while Line
< EndPos
[0]:
441 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
442 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
447 while Offset
<= EndPos
[1]:
448 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
452 def __GetMacroName(self
):
453 if not self
.__GetNextToken
():
454 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
455 MacroName
= self
.__Token
457 if MacroName
.startswith('!'):
459 MacroName
= MacroName
[1:].strip()
461 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
462 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
463 self
.FileName
, self
.CurrentLineNumber
)
464 MacroName
= MacroName
[2:-1]
465 return MacroName
, NotFlag
467 def __SetMacroValue(self
, Macro
, Value
):
468 if not self
.__CurSection
:
472 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
473 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
475 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
476 MacroDict
[Macro
] = Value
478 def __GetMacroValue(self
, Macro
):
480 if Macro
in GlobalData
.gCommandLineDefines
:
481 return GlobalData
.gCommandLineDefines
[Macro
]
482 if Macro
in GlobalData
.gGlobalDefines
:
483 return GlobalData
.gGlobalDefines
[Macro
]
485 if self
.__CurSection
:
486 MacroDict
= self
.__MacroDict
[
487 self
.__CurSection
[0],
488 self
.__CurSection
[1],
491 if MacroDict
and Macro
in MacroDict
:
492 return MacroDict
[Macro
]
495 if Macro
in GlobalData
.gPlatformDefines
:
496 return GlobalData
.gPlatformDefines
[Macro
]
499 def __SectionHeaderParser(self
, Section
):
501 # [FD.UiName]: use dummy instead if UI name is optional
504 # [Rule]: don't take rule section into account, macro is not allowed in this section
505 # [VTF.arch.UiName, arch]
506 # [OptionRom.DriverName]
507 self
.__CurSection
= []
508 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
509 ItemList
= Section
.split('.')
511 if Item
== '' or Item
== 'RULE':
514 if Item
== 'DEFINES':
515 self
.__CurSection
= ['COMMON', 'COMMON', 'COMMON']
516 elif Item
== 'VTF' and len(ItemList
) == 3:
518 Pos
= UiName
.find(',')
520 UiName
= UiName
[:Pos
]
521 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
522 elif len(ItemList
) > 1:
523 self
.__CurSection
= [ItemList
[0], ItemList
[1], 'COMMON']
524 elif len(ItemList
) > 0:
525 self
.__CurSection
= [ItemList
[0], 'DUMMY', 'COMMON']
527 ## PreprocessFile() method
529 # Preprocess file contents, replace comments with spaces.
530 # In the end, rewind the file buffer pointer to the beginning
531 # BUGBUG: No !include statement processing contained in this procedure
532 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
534 # @param self The object pointer
536 def PreprocessFile(self
):
540 DoubleSlashComment
= False
542 # HashComment in quoted string " " is ignored.
545 while not self
.__EndOfFile
():
547 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
548 InString
= not InString
549 # meet new line, then no longer in a comment for // and '#'
550 if self
.__CurrentChar
() == T_CHAR_LF
:
551 self
.CurrentLineNumber
+= 1
552 self
.CurrentOffsetWithinLine
= 0
553 if InComment
and DoubleSlashComment
:
555 DoubleSlashComment
= False
556 if InComment
and HashComment
:
559 # check for */ comment end
560 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
561 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
563 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
566 # set comments to spaces
568 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
570 # check for // comment
571 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
573 DoubleSlashComment
= True
574 # check for '#' comment
575 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
578 # check for /* comment start
579 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
580 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
582 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
588 # restore from ListOfList to ListOfString
589 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
592 ## PreprocessIncludeFile() method
594 # Preprocess file contents, replace !include statements with file contents.
595 # In the end, rewind the file buffer pointer to the beginning
597 # @param self The object pointer
599 def PreprocessIncludeFile(self
):
600 # nested include support
603 while self
.__GetNextToken
():
605 if self
.__Token
== 'DEFINE':
606 if not self
.__GetNextToken
():
607 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
609 if not self
.__IsToken
( "="):
610 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
611 Value
= self
.__GetExpression
()
612 MacroDict
[Macro
] = Value
614 elif self
.__Token
== '!include':
616 IncludeLine
= self
.CurrentLineNumber
617 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
618 if not self
.__GetNextToken
():
619 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
620 IncFileName
= self
.__Token
622 StartPos
= IncFileName
.find('$(', PreIndex
)
623 EndPos
= IncFileName
.find(')', StartPos
+2)
624 while StartPos
!= -1 and EndPos
!= -1:
625 Macro
= IncFileName
[StartPos
+2 : EndPos
]
626 MacroVal
= self
.__GetMacroValue
(Macro
)
628 if Macro
in MacroDict
:
629 MacroVal
= MacroDict
[Macro
]
630 if MacroVal
is not None:
631 IncFileName
= IncFileName
.replace('$(' + Macro
+ ')', MacroVal
, 1)
632 if MacroVal
.find('$(') != -1:
635 PreIndex
= StartPos
+ len(MacroVal
)
637 raise Warning("The Macro %s is not defined" %Macro
, self
.FileName
, self
.CurrentLineNumber
)
638 StartPos
= IncFileName
.find('$(', PreIndex
)
639 EndPos
= IncFileName
.find(')', StartPos
+2)
641 IncludedFile
= NormPath(IncFileName
)
643 # First search the include file under the same directory as FDF file
645 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
646 ErrorCode
= IncludedFile1
.Validate()[0]
649 # Then search the include file under the same directory as DSC file
652 if GenFdsGlobalVariable
.ActivePlatform
:
653 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
654 elif GlobalData
.gActivePlatform
:
655 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
656 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
657 ErrorCode
= IncludedFile1
.Validate()[0]
660 # Also search file under the WORKSPACE directory
662 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
663 ErrorCode
= IncludedFile1
.Validate()[0]
665 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
),
666 self
.FileName
, self
.CurrentLineNumber
)
668 if not IsValidInclude (IncludedFile1
.Path
, self
.CurrentLineNumber
):
669 raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1
.Path
), self
.FileName
, self
.CurrentLineNumber
)
671 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
673 CurrentLine
= self
.CurrentLineNumber
674 CurrentOffset
= self
.CurrentOffsetWithinLine
675 # list index of the insertion, note that line number is 'CurrentLine + 1'
676 InsertAtLine
= CurrentLine
677 ParentProfile
= GetParentAtLine (CurrentLine
)
678 if ParentProfile
is not None:
679 ParentProfile
.IncludeFileList
.insert(0, IncFileProfile
)
680 IncFileProfile
.Level
= ParentProfile
.Level
+ 1
681 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
682 # deal with remaining portions after "!include filename", if exists.
683 if self
.__GetNextToken
():
684 if self
.CurrentLineNumber
== CurrentLine
:
685 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
686 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
687 IncFileProfile
.InsertAdjust
+= 1
688 self
.CurrentLineNumber
+= 1
689 self
.CurrentOffsetWithinLine
= 0
691 for Line
in IncFileProfile
.FileLinesList
:
692 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
693 self
.CurrentLineNumber
+= 1
696 # reversely sorted to better determine error in file
697 AllIncludeFileList
.insert(0, IncFileProfile
)
699 # comment out the processed include file statement
700 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
701 TempList
.insert(IncludeOffset
, '#')
702 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
703 if Processed
: # Nested and back-to-back support
704 self
.Rewind(DestLine
= IncFileProfile
.InsertStartLineNumber
- 1)
710 def __GetIfListCurrentItemStat(IfList
):
720 ## PreprocessConditionalStatement() method
722 # Preprocess conditional statement.
723 # In the end, rewind the file buffer pointer to the beginning
725 # @param self The object pointer
727 def PreprocessConditionalStatement(self
):
728 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
732 while self
.__GetNextToken
():
733 # Determine section name and the location dependent macro
734 if self
.__GetIfListCurrentItemStat
(IfList
):
735 if self
.__Token
.startswith('['):
736 Header
= self
.__Token
737 if not self
.__Token
.endswith(']'):
738 self
.__SkipToToken
(']')
739 Header
+= self
.__SkippedChars
740 if Header
.find('$(') != -1:
741 raise Warning("macro cannot be used in section header", self
.FileName
, self
.CurrentLineNumber
)
742 self
.__SectionHeaderParser
(Header
)
744 # Replace macros except in RULE section or out of section
745 elif self
.__CurSection
and ReplacedLine
!= self
.CurrentLineNumber
:
746 ReplacedLine
= self
.CurrentLineNumber
748 CurLine
= self
.Profile
.FileLinesList
[ReplacedLine
- 1]
750 StartPos
= CurLine
.find('$(', PreIndex
)
751 EndPos
= CurLine
.find(')', StartPos
+2)
752 while StartPos
!= -1 and EndPos
!= -1 and self
.__Token
not in ['!ifdef', '!ifndef', '!if', '!elseif']:
753 MacroName
= CurLine
[StartPos
+2 : EndPos
]
754 MacorValue
= self
.__GetMacroValue
(MacroName
)
755 if MacorValue
is not None:
756 CurLine
= CurLine
.replace('$(' + MacroName
+ ')', MacorValue
, 1)
757 if MacorValue
.find('$(') != -1:
760 PreIndex
= StartPos
+ len(MacorValue
)
762 PreIndex
= EndPos
+ 1
763 StartPos
= CurLine
.find('$(', PreIndex
)
764 EndPos
= CurLine
.find(')', StartPos
+2)
765 self
.Profile
.FileLinesList
[ReplacedLine
- 1] = CurLine
768 if self
.__Token
== 'DEFINE':
769 if self
.__GetIfListCurrentItemStat
(IfList
):
770 if not self
.__CurSection
:
771 raise Warning("macro cannot be defined in Rule section or out of section", self
.FileName
, self
.CurrentLineNumber
)
772 DefineLine
= self
.CurrentLineNumber
- 1
773 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
774 if not self
.__GetNextToken
():
775 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
777 if not self
.__IsToken
( "="):
778 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
780 Value
= self
.__GetExpression
()
781 self
.__SetMacroValue
(Macro
, Value
)
782 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
783 elif self
.__Token
== 'SET':
784 if not self
.__GetIfListCurrentItemStat
(IfList
):
786 SetLine
= self
.CurrentLineNumber
- 1
787 SetOffset
= self
.CurrentOffsetWithinLine
- len('SET')
788 PcdPair
= self
.__GetNextPcdName
()
789 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
790 if not self
.__IsToken
( "="):
791 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
793 Value
= self
.__GetExpression
()
794 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
796 self
.__PcdDict
[PcdName
] = Value
798 self
.Profile
.PcdDict
[PcdPair
] = Value
799 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
800 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
802 self
.__WipeOffArea
.append(((SetLine
, SetOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
803 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
804 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
805 IfList
.append([IfStartPos
, None, None])
807 CondLabel
= self
.__Token
808 Expression
= self
.__GetExpression
()
810 if CondLabel
== '!if':
811 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
813 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
814 if CondLabel
== '!ifndef':
815 ConditionSatisfied
= not ConditionSatisfied
817 BranchDetermined
= ConditionSatisfied
818 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
819 if ConditionSatisfied
:
820 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
821 elif self
.__Token
in ('!elseif', '!else'):
822 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
824 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
827 IfList
[-1] = [ElseStartPos
, False, True]
828 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
830 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
831 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
832 if self
.__Token
== '!elseif':
833 Expression
= self
.__GetExpression
()
834 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
835 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
839 IfList
[-1][1] = False
842 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
843 elif self
.__Token
== '!endif':
845 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
847 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
849 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
852 elif not IfList
: # Don't use PCDs inside conditional directive
853 if self
.CurrentLineNumber
<= RegionLayoutLine
:
854 # Don't try the same line twice
856 SetPcd
= ShortcutPcdPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
858 self
.__PcdDict
[SetPcd
.group('name')] = SetPcd
.group('value')
859 RegionLayoutLine
= self
.CurrentLineNumber
861 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
863 RegionLayoutLine
= self
.CurrentLineNumber
865 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
866 if not RegionSizeGuid
:
867 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
869 self
.__PcdDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
870 self
.__PcdDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
871 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
874 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
877 def __CollectMacroPcd(self
):
881 MacroDict
.update(GlobalData
.gPlatformPcds
)
882 MacroDict
.update(self
.__PcdDict
)
885 MacroDict
.update(GlobalData
.gPlatformDefines
)
887 if self
.__CurSection
:
889 ScopeMacro
= self
.__MacroDict
['COMMON', 'COMMON', 'COMMON']
891 MacroDict
.update(ScopeMacro
)
894 ScopeMacro
= self
.__MacroDict
[
895 self
.__CurSection
[0],
896 self
.__CurSection
[1],
900 MacroDict
.update(ScopeMacro
)
902 MacroDict
.update(GlobalData
.gGlobalDefines
)
903 MacroDict
.update(GlobalData
.gCommandLineDefines
)
904 if GlobalData
.BuildOptionPcd
:
905 for Item
in GlobalData
.BuildOptionPcd
:
906 if type(Item
) is tuple:
908 PcdName
, TmpValue
= Item
.split("=")
909 TmpValue
= BuildOptionValue(TmpValue
, {})
910 MacroDict
[PcdName
.strip()] = TmpValue
915 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
916 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
917 MacroPcdDict
= self
.__CollectMacroPcd
()
921 return ValueExpression(Expression
, MacroPcdDict
)(True)
923 return ValueExpression(Expression
, MacroPcdDict
)()
924 except WrnExpression
, Excpt
:
926 # Catch expression evaluation warning here. We need to report
927 # the precise number of line and return the evaluation result
929 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
930 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
933 except Exception, Excpt
:
934 if hasattr(Excpt
, 'Pcd'):
935 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
936 Info
= GlobalData
.gPlatformOtherPcds
[Excpt
.Pcd
]
937 raise Warning("Cannot use this PCD (%s) in an expression as"
938 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
939 " of the DSC file (%s), and it is currently defined in this section:"
940 " %s, line #: %d." % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE'], Info
[0], Info
[1]),
943 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE']),
946 raise Warning(str(Excpt
), *FileLineTuple
)
948 if Expression
.startswith('$(') and Expression
[-1] == ')':
949 Expression
= Expression
[2:-1]
950 return Expression
in MacroPcdDict
952 ## __IsToken() method
954 # Check whether input string is found from current char position along
955 # If found, the string value is put into self.__Token
957 # @param self The object pointer
958 # @param String The string to search
959 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
960 # @retval True Successfully find string, file buffer pointer moved forward
961 # @retval False Not able to find string, file buffer pointer not changed
963 def __IsToken(self
, String
, IgnoreCase
= False):
964 self
.__SkipWhiteSpace
()
966 # Only consider the same line, no multi-line token allowed
967 StartPos
= self
.CurrentOffsetWithinLine
970 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
972 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
974 self
.CurrentOffsetWithinLine
+= len(String
)
975 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
979 ## __IsKeyword() method
981 # Check whether input keyword is found from current char position along, whole word only!
982 # If found, the string value is put into self.__Token
984 # @param self The object pointer
985 # @param Keyword The string to search
986 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
987 # @retval True Successfully find string, file buffer pointer moved forward
988 # @retval False Not able to find string, file buffer pointer not changed
990 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
991 self
.__SkipWhiteSpace
()
993 # Only consider the same line, no multi-line token allowed
994 StartPos
= self
.CurrentOffsetWithinLine
997 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
999 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
1001 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
1002 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
1004 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
1005 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1009 def __GetExpression(self
):
1010 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
1011 Index
= len(Line
) - 1
1012 while Line
[Index
] in ['\r', '\n']:
1014 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
1015 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
1016 ExpressionString
= ExpressionString
.strip()
1017 return ExpressionString
1019 ## __GetNextWord() method
1021 # Get next C name from file lines
1022 # If found, the string value is put into self.__Token
1024 # @param self The object pointer
1025 # @retval True Successfully find a C name string, file buffer pointer moved forward
1026 # @retval False Not able to find a C name string, file buffer pointer not changed
1028 def __GetNextWord(self
):
1029 self
.__SkipWhiteSpace
()
1030 if self
.__EndOfFile
():
1033 TempChar
= self
.__CurrentChar
()
1034 StartPos
= self
.CurrentOffsetWithinLine
1035 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
1037 while not self
.__EndOfLine
():
1038 TempChar
= self
.__CurrentChar
()
1039 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
1040 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
1046 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1051 ## __GetNextToken() method
1053 # Get next token unit before a seperator
1054 # If found, the string value is put into self.__Token
1056 # @param self The object pointer
1057 # @retval True Successfully find a token unit, file buffer pointer moved forward
1058 # @retval False Not able to find a token unit, file buffer pointer not changed
1060 def __GetNextToken(self
):
1061 # Skip leading spaces, if exist.
1062 self
.__SkipWhiteSpace
()
1063 if self
.__EndOfFile
():
1065 # Record the token start position, the position of the first non-space char.
1066 StartPos
= self
.CurrentOffsetWithinLine
1067 StartLine
= self
.CurrentLineNumber
1068 while StartLine
== self
.CurrentLineNumber
:
1069 TempChar
= self
.__CurrentChar
()
1070 # Try to find the end char that is not a space and not in seperator tuple.
1071 # That is, when we got a space or any char in the tuple, we got the end of token.
1072 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
1074 # if we happen to meet a seperator as the first char, we must proceed to get it.
1075 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1076 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1084 EndPos
= self
.CurrentOffsetWithinLine
1085 if self
.CurrentLineNumber
!= StartLine
:
1086 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
1087 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
1088 if StartPos
!= self
.CurrentOffsetWithinLine
:
1093 def __GetNextOp(self
):
1094 # Skip leading spaces, if exist.
1095 self
.__SkipWhiteSpace
()
1096 if self
.__EndOfFile
():
1098 # Record the token start position, the position of the first non-space char.
1099 StartPos
= self
.CurrentOffsetWithinLine
1100 while not self
.__EndOfLine
():
1101 TempChar
= self
.__CurrentChar
()
1102 # Try to find the end char that is not a space
1103 if not str(TempChar
).isspace():
1110 if StartPos
!= self
.CurrentOffsetWithinLine
:
1111 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1115 ## __GetNextGuid() method
1117 # Get next token unit before a seperator
1118 # If found, the GUID string is put into self.__Token
1120 # @param self The object pointer
1121 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1122 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1124 def __GetNextGuid(self
):
1126 if not self
.__GetNextToken
():
1128 if gGuidPattern
.match(self
.__Token
) is not None:
1134 def __Verify(self
, Name
, Value
, Scope
):
1135 if Scope
in ['UINT64', 'UINT8']:
1138 ValueNumber
= int (Value
, 0)
1140 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value is not valid dec or hex number for %s." % Name
)
1142 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value can't be set to negative value for %s." % Name
)
1143 if Scope
== 'UINT64':
1144 if ValueNumber
>= 0x10000000000000000:
1145 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1146 if Scope
== 'UINT8':
1147 if ValueNumber
>= 0x100:
1148 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1151 ## __UndoToken() method
1153 # Go back one token unit in file buffer
1155 # @param self The object pointer
1157 def __UndoToken(self
):
1158 self
.__UndoOneChar
()
1159 while self
.__CurrentChar
().isspace():
1160 if not self
.__UndoOneChar
():
1165 StartPos
= self
.CurrentOffsetWithinLine
1166 CurrentLine
= self
.CurrentLineNumber
1167 while CurrentLine
== self
.CurrentLineNumber
:
1169 TempChar
= self
.__CurrentChar
()
1170 # Try to find the end char that is not a space and not in seperator tuple.
1171 # That is, when we got a space or any char in the tuple, we got the end of token.
1172 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1173 if not self
.__UndoOneChar
():
1175 # if we happen to meet a seperator as the first char, we must proceed to get it.
1176 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1177 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1184 def __IsHex(self
, HexStr
):
1185 if not HexStr
.upper().startswith("0X"):
1187 if len(self
.__Token
) <= 2:
1189 return True if all(x
in string
.hexdigits
for x
in HexStr
[2:]) else False
1191 ## __GetNextHexNumber() method
1193 # Get next HEX data before a seperator
1194 # If found, the HEX data is put into self.__Token
1196 # @param self The object pointer
1197 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1198 # @retval False Not able to find a HEX data, file buffer pointer not changed
1200 def __GetNextHexNumber(self
):
1201 if not self
.__GetNextToken
():
1203 if self
.__IsHex
(self
.__Token
):
1209 ## __GetNextDecimalNumber() method
1211 # Get next decimal data before a seperator
1212 # If found, the decimal data is put into self.__Token
1214 # @param self The object pointer
1215 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1216 # @retval False Not able to find a decimal data, file buffer pointer not changed
1218 def __GetNextDecimalNumber(self
):
1219 if not self
.__GetNextToken
():
1221 if self
.__Token
.isdigit():
1227 ## __GetNextPcdName() method
1229 # Get next PCD token space C name and PCD C name pair before a seperator
1230 # If found, the decimal data is put into self.__Token
1232 # @param self The object pointer
1233 # @retval Tuple PCD C name and PCD token space C name pair
1235 def __GetNextPcdName(self
):
1236 if not self
.__GetNextWord
():
1237 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1238 pcdTokenSpaceCName
= self
.__Token
1240 if not self
.__IsToken
( "."):
1241 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1243 if not self
.__GetNextWord
():
1244 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1245 pcdCName
= self
.__Token
1247 return (pcdCName
, pcdTokenSpaceCName
)
1249 ## __GetStringData() method
1251 # Get string contents quoted in ""
1252 # If found, the decimal data is put into self.__Token
1254 # @param self The object pointer
1255 # @retval True Successfully find a string data, file buffer pointer moved forward
1256 # @retval False Not able to find a string data, file buffer pointer not changed
1258 def __GetStringData(self
):
1259 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1261 self
.__SkipToToken
("\"")
1262 currentLineNumber
= self
.CurrentLineNumber
1264 if not self
.__SkipToToken
("\""):
1265 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1266 if currentLineNumber
!= self
.CurrentLineNumber
:
1267 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1268 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1271 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1273 self
.__SkipToToken
("\'")
1274 currentLineNumber
= self
.CurrentLineNumber
1276 if not self
.__SkipToToken
("\'"):
1277 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1278 if currentLineNumber
!= self
.CurrentLineNumber
:
1279 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1280 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1286 ## __SkipToToken() method
1288 # Search forward in file buffer for the string
1289 # The skipped chars are put into self.__SkippedChars
1291 # @param self The object pointer
1292 # @param String The string to search
1293 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1294 # @retval True Successfully find the string, file buffer pointer moved forward
1295 # @retval False Not able to find the string, file buffer pointer not changed
1297 def __SkipToToken(self
, String
, IgnoreCase
= False):
1298 StartPos
= self
.GetFileBufferPos()
1300 self
.__SkippedChars
= ""
1301 while not self
.__EndOfFile
():
1304 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1306 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1308 self
.CurrentOffsetWithinLine
+= len(String
)
1309 self
.__SkippedChars
+= String
1311 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1314 self
.SetFileBufferPos( StartPos
)
1315 self
.__SkippedChars
= ""
1318 ## GetFileBufferPos() method
1320 # Return the tuple of current line and offset within the line
1322 # @param self The object pointer
1323 # @retval Tuple Line number and offset pair
1325 def GetFileBufferPos(self
):
1326 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1328 ## SetFileBufferPos() method
1330 # Restore the file buffer position
1332 # @param self The object pointer
1333 # @param Pos The new file buffer position
1335 def SetFileBufferPos(self
, Pos
):
1336 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1338 ## Preprocess() method
1340 # Preprocess comment, conditional directive, include directive, replace macro.
1341 # Exception will be raised if syntax error found
1343 # @param self The object pointer
1345 def Preprocess(self
):
1346 self
.__StringToList
()
1347 self
.PreprocessFile()
1348 self
.PreprocessIncludeFile()
1349 self
.__StringToList
()
1350 self
.PreprocessFile()
1351 self
.PreprocessConditionalStatement()
1352 self
.__StringToList
()
1353 for Pos
in self
.__WipeOffArea
:
1354 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1355 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1357 while self
.__GetDefines
():
1360 ## ParseFile() method
1362 # Parse the file profile buffer to extract fd, fv ... information
1363 # Exception will be raised if syntax error found
1365 # @param self The object pointer
1367 def ParseFile(self
):
1372 # Keep processing sections of the FDF until no new sections or a syntax error is found
1374 while self
.__GetFd
() or self
.__GetFv
() or self
.__GetFmp
() or self
.__GetCapsule
() or self
.__GetVtf
() or self
.__GetRule
() or self
.__GetOptionRom
():
1379 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1380 # At this point, the closest parent would be the included file itself
1381 Profile
= GetParentAtLine(X
.OriginalLineNumber
)
1382 if Profile
is not None:
1383 X
.Message
+= ' near line %d, column %d: %s' \
1384 % (X
.LineNumber
, 0, Profile
.FileLinesList
[X
.LineNumber
-1])
1386 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1387 X
.Message
+= ' near line %d, column %d: %s' \
1388 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1391 ## SectionParser() method
1393 # Parse the file section info
1394 # Exception will be raised if syntax error found
1396 # @param self The object pointer
1397 # @param section The section string
1399 def SectionParser(self
, section
):
1401 if not S
.startswith("[DEFINES") and not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1402 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM.") and not S
.startswith('[FMPPAYLOAD.'):
1403 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self
.FileName
, self
.CurrentLineNumber
)
1405 ## __GetDefines() method
1407 # Get Defines section contents and store its data into AllMacrosList
1409 # @param self The object pointer
1410 # @retval True Successfully find a Defines
1411 # @retval False Not able to find a Defines
1413 def __GetDefines(self
):
1415 if not self
.__GetNextToken
():
1418 S
= self
.__Token
.upper()
1419 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1420 self
.SectionParser(S
)
1425 if not self
.__IsToken
("[DEFINES", True):
1426 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1427 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1428 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1429 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1431 if not self
.__IsToken
( "]"):
1432 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1434 while self
.__GetNextWord
():
1435 # handle the SET statement
1436 if self
.__Token
== 'SET':
1438 self
.__GetSetStatement
(None)
1441 Macro
= self
.__Token
1443 if not self
.__IsToken
("="):
1444 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1445 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1446 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1447 Value
= self
.__Token
1453 # Get FD section contents and store its data into FD dictionary of self.Profile
1455 # @param self The object pointer
1456 # @retval True Successfully find a FD
1457 # @retval False Not able to find a FD
1461 if not self
.__GetNextToken
():
1464 S
= self
.__Token
.upper()
1465 if S
.startswith("[") and not S
.startswith("[FD."):
1466 if not S
.startswith("[FV.") and not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
1467 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1468 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1473 if not self
.__IsToken
("[FD.", True):
1474 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1475 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1476 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1477 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1479 FdName
= self
.__GetUiName
()
1481 if len (self
.Profile
.FdDict
) == 0:
1482 FdName
= GenFdsGlobalVariable
.PlatformName
1483 if FdName
== "" and GlobalData
.gActivePlatform
:
1484 FdName
= GlobalData
.gActivePlatform
.PlatformName
1485 self
.Profile
.FdNameNotSet
= True
1487 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1488 self
.CurrentFdName
= FdName
.upper()
1490 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1491 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1493 if not self
.__IsToken
( "]"):
1494 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1497 FdObj
.FdUiName
= self
.CurrentFdName
1498 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1500 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1501 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1503 Status
= self
.__GetCreateFile
(FdObj
)
1505 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1507 while self
.__GetTokenStatements
(FdObj
):
1509 for Attr
in ("BaseAddress", "Size", "ErasePolarity"):
1510 if getattr(FdObj
, Attr
) is None:
1511 self
.__GetNextToken
()
1512 raise Warning("Keyword %s missing" % Attr
, self
.FileName
, self
.CurrentLineNumber
)
1514 if not FdObj
.BlockSizeList
:
1515 FdObj
.BlockSizeList
.append((1, FdObj
.Size
, None))
1517 self
.__GetDefineStatements
(FdObj
)
1519 self
.__GetSetStatements
(FdObj
)
1521 if not self
.__GetRegionLayout
(FdObj
):
1522 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1524 while self
.__GetRegionLayout
(FdObj
):
1528 ## __GetUiName() method
1530 # Return the UI name of a section
1532 # @param self The object pointer
1533 # @retval FdName UI name
1535 def __GetUiName(self
):
1537 if self
.__GetNextWord
():
1542 ## __GetCreateFile() method
1544 # Return the output file name of object
1546 # @param self The object pointer
1547 # @param Obj object whose data will be stored in file
1548 # @retval FdName UI name
1550 def __GetCreateFile(self
, Obj
):
1552 if self
.__IsKeyword
( "CREATE_FILE"):
1553 if not self
.__IsToken
( "="):
1554 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1556 if not self
.__GetNextToken
():
1557 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1559 FileName
= self
.__Token
1560 Obj
.CreateFileName
= FileName
1564 ## __GetTokenStatements() method
1566 # Get token statements
1568 # @param self The object pointer
1569 # @param Obj for whom token statement is got
1571 def __GetTokenStatements(self
, Obj
):
1572 if self
.__IsKeyword
( "BaseAddress"):
1573 if not self
.__IsToken
( "="):
1574 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1576 if not self
.__GetNextHexNumber
():
1577 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1579 Obj
.BaseAddress
= self
.__Token
1581 if self
.__IsToken
( "|"):
1582 pcdPair
= self
.__GetNextPcdName
()
1583 Obj
.BaseAddressPcd
= pcdPair
1584 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1585 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1586 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1589 if self
.__IsKeyword
( "Size"):
1590 if not self
.__IsToken
( "="):
1591 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1593 if not self
.__GetNextHexNumber
():
1594 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1597 if self
.__IsToken
( "|"):
1598 pcdPair
= self
.__GetNextPcdName
()
1599 Obj
.SizePcd
= pcdPair
1600 self
.Profile
.PcdDict
[pcdPair
] = Size
1601 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1602 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1603 Obj
.Size
= long(Size
, 0)
1606 if self
.__IsKeyword
( "ErasePolarity"):
1607 if not self
.__IsToken
( "="):
1608 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1610 if not self
.__GetNextToken
():
1611 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1613 if self
.__Token
!= "1" and self
.__Token
!= "0":
1614 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1616 Obj
.ErasePolarity
= self
.__Token
1619 return self
.__GetBlockStatements
(Obj
)
1621 ## __GetAddressStatements() method
1623 # Get address statements
1625 # @param self The object pointer
1626 # @param Obj for whom address statement is got
1627 # @retval True Successfully find
1628 # @retval False Not able to find
1630 def __GetAddressStatements(self
, Obj
):
1632 if self
.__IsKeyword
("BsBaseAddress"):
1633 if not self
.__IsToken
( "="):
1634 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1636 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1637 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1639 BsAddress
= long(self
.__Token
, 0)
1640 Obj
.BsBaseAddress
= BsAddress
1642 if self
.__IsKeyword
("RtBaseAddress"):
1643 if not self
.__IsToken
( "="):
1644 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1646 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1647 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1649 RtAddress
= long(self
.__Token
, 0)
1650 Obj
.RtBaseAddress
= RtAddress
1652 ## __GetBlockStatements() method
1654 # Get block statements
1656 # @param self The object pointer
1657 # @param Obj for whom block statement is got
1659 def __GetBlockStatements(self
, Obj
):
1661 while self
.__GetBlockStatement
(Obj
):
1664 Item
= Obj
.BlockSizeList
[-1]
1665 if Item
[0] is None or Item
[1] is None:
1666 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1669 ## __GetBlockStatement() method
1671 # Get block statement
1673 # @param self The object pointer
1674 # @param Obj for whom block statement is got
1675 # @retval True Successfully find
1676 # @retval False Not able to find
1678 def __GetBlockStatement(self
, Obj
):
1679 if not self
.__IsKeyword
( "BlockSize"):
1682 if not self
.__IsToken
( "="):
1683 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1685 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1686 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1688 BlockSize
= self
.__Token
1690 if self
.__IsToken
( "|"):
1691 PcdPair
= self
.__GetNextPcdName
()
1692 BlockSizePcd
= PcdPair
1693 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1694 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1695 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1696 BlockSize
= long(BlockSize
, 0)
1699 if self
.__IsKeyword
( "NumBlocks"):
1700 if not self
.__IsToken
( "="):
1701 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1703 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1704 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1706 BlockNumber
= long(self
.__Token
, 0)
1708 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1711 ## __GetDefineStatements() method
1713 # Get define statements
1715 # @param self The object pointer
1716 # @param Obj for whom define statement is got
1717 # @retval True Successfully find
1718 # @retval False Not able to find
1720 def __GetDefineStatements(self
, Obj
):
1721 while self
.__GetDefineStatement
( Obj
):
1724 ## __GetDefineStatement() method
1726 # Get define statement
1728 # @param self The object pointer
1729 # @param Obj for whom define statement is got
1730 # @retval True Successfully find
1731 # @retval False Not able to find
1733 def __GetDefineStatement(self
, Obj
):
1734 if self
.__IsKeyword
("DEFINE"):
1735 self
.__GetNextToken
()
1736 Macro
= self
.__Token
1737 if not self
.__IsToken
( "="):
1738 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1740 if not self
.__GetNextToken
():
1741 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1743 Value
= self
.__Token
1744 Macro
= '$(' + Macro
+ ')'
1745 Obj
.DefineVarDict
[Macro
] = Value
1750 ## __GetSetStatements() method
1752 # Get set statements
1754 # @param self The object pointer
1755 # @param Obj for whom set statement is got
1756 # @retval True Successfully find
1757 # @retval False Not able to find
1759 def __GetSetStatements(self
, Obj
):
1760 while self
.__GetSetStatement
(Obj
):
1763 ## __GetSetStatement() method
1767 # @param self The object pointer
1768 # @param Obj for whom set statement is got
1769 # @retval True Successfully find
1770 # @retval False Not able to find
1772 def __GetSetStatement(self
, Obj
):
1773 if self
.__IsKeyword
("SET"):
1774 PcdPair
= self
.__GetNextPcdName
()
1776 if not self
.__IsToken
( "="):
1777 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1779 Value
= self
.__GetExpression
()
1780 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1783 Obj
.SetVarDict
[PcdPair
] = Value
1784 self
.Profile
.PcdDict
[PcdPair
] = Value
1785 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1786 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1791 ## __CalcRegionExpr(self)
1793 # Calculate expression for offset or size of a region
1795 # @return: None if invalid expression
1796 # Calculated number if successfully
1798 def __CalcRegionExpr(self
):
1799 StartPos
= self
.GetFileBufferPos()
1802 while not self
.__EndOfFile
():
1803 CurCh
= self
.__CurrentChar
()
1809 if CurCh
in '|\r\n' and PairCount
== 0:
1815 ValueExpression(Expr
,
1816 self
.__CollectMacroPcd
()
1819 self
.SetFileBufferPos(StartPos
)
1822 ## __GetRegionLayout() method
1824 # Get region layout for FD
1826 # @param self The object pointer
1827 # @param Fd for whom region is got
1828 # @retval True Successfully find
1829 # @retval False Not able to find
1831 def __GetRegionLayout(self
, Fd
):
1832 Offset
= self
.__CalcRegionExpr
()
1836 RegionObj
= Region
.Region()
1837 RegionObj
.Offset
= Offset
1838 Fd
.RegionList
.append(RegionObj
)
1840 if not self
.__IsToken
( "|"):
1841 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1843 Size
= self
.__CalcRegionExpr
()
1845 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1846 RegionObj
.Size
= Size
1848 if not self
.__GetNextWord
():
1851 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):
1853 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]
1854 # Or it might be next region's offset described by an expression which starts with a PCD.
1855 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size
1858 IsRegionPcd
= (RegionSizeGuidPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]) or
1859 RegionOffsetPcdPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]))
1861 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1862 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1863 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdOffset
[1], RegionObj
.PcdOffset
[0])] = "0x%x" % RegionObj
.Offset
1864 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1865 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1866 if self
.__IsToken
( "|"):
1867 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1868 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1869 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdSize
[1], RegionObj
.PcdSize
[0])] = "0x%x" % RegionObj
.Size
1870 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1871 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1873 if not self
.__GetNextWord
():
1876 if self
.__Token
== "SET":
1878 self
.__GetSetStatements
( RegionObj
)
1879 if not self
.__GetNextWord
():
1882 elif self
.__Token
== "FV":
1884 self
.__GetRegionFvType
( RegionObj
)
1886 elif self
.__Token
== "CAPSULE":
1888 self
.__GetRegionCapType
( RegionObj
)
1890 elif self
.__Token
== "FILE":
1892 self
.__GetRegionFileType
(RegionObj
)
1894 elif self
.__Token
== "INF":
1896 RegionObj
.RegionType
= "INF"
1897 while self
.__IsKeyword
("INF"):
1899 ffsInf
= self
.__ParseInfStatement
()
1902 RegionObj
.RegionDataList
.append(ffsInf
)
1904 elif self
.__Token
== "DATA":
1906 self
.__GetRegionDataType
(RegionObj
)
1909 if self
.__GetRegionLayout
(Fd
):
1911 raise Warning("A valid region type was not found. "
1912 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",
1913 self
.FileName
, self
.CurrentLineNumber
)
1917 ## __GetRegionFvType() method
1919 # Get region fv data for region
1921 # @param self The object pointer
1922 # @param RegionObj for whom region data is got
1924 def __GetRegionFvType(self
, RegionObj
):
1926 if not self
.__IsKeyword
( "FV"):
1927 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1929 if not self
.__IsToken
( "="):
1930 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1932 if not self
.__GetNextToken
():
1933 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1935 RegionObj
.RegionType
= "FV"
1936 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1938 while self
.__IsKeyword
( "FV"):
1940 if not self
.__IsToken
( "="):
1941 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1943 if not self
.__GetNextToken
():
1944 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1946 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1948 ## __GetRegionCapType() method
1950 # Get region capsule data for region
1952 # @param self The object pointer
1953 # @param RegionObj for whom region data is got
1955 def __GetRegionCapType(self
, RegionObj
):
1957 if not self
.__IsKeyword
("CAPSULE"):
1958 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1960 if not self
.__IsToken
("="):
1961 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1963 if not self
.__GetNextToken
():
1964 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1966 RegionObj
.RegionType
= "CAPSULE"
1967 RegionObj
.RegionDataList
.append(self
.__Token
)
1969 while self
.__IsKeyword
("CAPSULE"):
1971 if not self
.__IsToken
("="):
1972 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1974 if not self
.__GetNextToken
():
1975 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1977 RegionObj
.RegionDataList
.append(self
.__Token
)
1979 ## __GetRegionFileType() method
1981 # Get region file data for region
1983 # @param self The object pointer
1984 # @param RegionObj for whom region data is got
1986 def __GetRegionFileType(self
, RegionObj
):
1988 if not self
.__IsKeyword
( "FILE"):
1989 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1991 if not self
.__IsToken
( "="):
1992 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1994 if not self
.__GetNextToken
():
1995 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1997 RegionObj
.RegionType
= "FILE"
1998 RegionObj
.RegionDataList
.append( self
.__Token
)
2000 while self
.__IsKeyword
( "FILE"):
2002 if not self
.__IsToken
( "="):
2003 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2005 if not self
.__GetNextToken
():
2006 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
2008 RegionObj
.RegionDataList
.append(self
.__Token
)
2010 ## __GetRegionDataType() method
2012 # Get region array data for region
2014 # @param self The object pointer
2015 # @param RegionObj for whom region data is got
2017 def __GetRegionDataType(self
, RegionObj
):
2019 if not self
.__IsKeyword
( "DATA"):
2020 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
2022 if not self
.__IsToken
( "="):
2023 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2025 if not self
.__IsToken
( "{"):
2026 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2028 if not self
.__GetNextHexNumber
():
2029 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2031 if len(self
.__Token
) > 18:
2032 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2034 # convert hex string value to byte hex string array
2035 AllString
= self
.__Token
2036 AllStrLen
= len (AllString
)
2038 while AllStrLen
> 4:
2039 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2040 AllStrLen
= AllStrLen
- 2
2041 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2044 if len (self
.__Token
) <= 4:
2045 while self
.__IsToken
(","):
2046 if not self
.__GetNextHexNumber
():
2047 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2048 if len(self
.__Token
) > 4:
2049 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2050 DataString
+= self
.__Token
2053 if not self
.__IsToken
( "}"):
2054 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2056 DataString
= DataString
.rstrip(",")
2057 RegionObj
.RegionType
= "DATA"
2058 RegionObj
.RegionDataList
.append( DataString
)
2060 while self
.__IsKeyword
( "DATA"):
2062 if not self
.__IsToken
( "="):
2063 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2065 if not self
.__IsToken
( "{"):
2066 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2068 if not self
.__GetNextHexNumber
():
2069 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2071 if len(self
.__Token
) > 18:
2072 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2074 # convert hex string value to byte hex string array
2075 AllString
= self
.__Token
2076 AllStrLen
= len (AllString
)
2078 while AllStrLen
> 4:
2079 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2080 AllStrLen
= AllStrLen
- 2
2081 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2084 if len (self
.__Token
) <= 4:
2085 while self
.__IsToken
(","):
2086 if not self
.__GetNextHexNumber
():
2087 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2088 if len(self
.__Token
) > 4:
2089 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2090 DataString
+= self
.__Token
2093 if not self
.__IsToken
( "}"):
2094 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2096 DataString
= DataString
.rstrip(",")
2097 RegionObj
.RegionDataList
.append( DataString
)
2101 # Get FV section contents and store its data into FV dictionary of self.Profile
2103 # @param self The object pointer
2104 # @retval True Successfully find a FV
2105 # @retval False Not able to find a FV
2108 if not self
.__GetNextToken
():
2111 S
= self
.__Token
.upper()
2112 if S
.startswith("[") and not S
.startswith("[FV."):
2113 self
.SectionParser(S
)
2118 if not self
.__IsToken
("[FV.", True):
2119 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2120 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2121 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2122 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2124 FvName
= self
.__GetUiName
()
2125 self
.CurrentFvName
= FvName
.upper()
2127 if not self
.__IsToken
( "]"):
2128 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2131 FvObj
.UiFvName
= self
.CurrentFvName
2132 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
2134 Status
= self
.__GetCreateFile
(FvObj
)
2136 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2138 self
.__GetDefineStatements
(FvObj
)
2140 self
.__GetAddressStatements
(FvObj
)
2142 FvObj
.FvExtEntryTypeValue
= []
2143 FvObj
.FvExtEntryType
= []
2144 FvObj
.FvExtEntryData
= []
2146 self
.__GetSetStatements
(FvObj
)
2148 if not (self
.__GetBlockStatement
(FvObj
) or self
.__GetFvBaseAddress
(FvObj
) or
2149 self
.__GetFvForceRebase
(FvObj
) or self
.__GetFvAlignment
(FvObj
) or
2150 self
.__GetFvAttributes
(FvObj
) or self
.__GetFvNameGuid
(FvObj
) or
2151 self
.__GetFvExtEntryStatement
(FvObj
) or self
.__GetFvNameString
(FvObj
)):
2154 if FvObj
.FvNameString
== 'TRUE' and not FvObj
.FvNameGuid
:
2155 raise Warning("FvNameString found but FvNameGuid was not found", self
.FileName
, self
.CurrentLineNumber
)
2157 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2158 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2161 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2162 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2163 if not isInf
and not isFile
:
2168 ## __GetFvAlignment() method
2170 # Get alignment for FV
2172 # @param self The object pointer
2173 # @param Obj for whom alignment is got
2174 # @retval True Successfully find a alignment statement
2175 # @retval False Not able to find a alignment statement
2177 def __GetFvAlignment(self
, Obj
):
2179 if not self
.__IsKeyword
( "FvAlignment"):
2182 if not self
.__IsToken
( "="):
2183 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2185 if not self
.__GetNextToken
():
2186 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2188 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2189 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2190 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2192 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2193 Obj
.FvAlignment
= self
.__Token
2196 ## __GetFvBaseAddress() method
2198 # Get BaseAddress for FV
2200 # @param self The object pointer
2201 # @param Obj for whom FvBaseAddress is got
2202 # @retval True Successfully find a FvBaseAddress statement
2203 # @retval False Not able to find a FvBaseAddress statement
2205 def __GetFvBaseAddress(self
, Obj
):
2207 if not self
.__IsKeyword
("FvBaseAddress"):
2210 if not self
.__IsToken
( "="):
2211 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2213 if not self
.__GetNextToken
():
2214 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2216 if not BaseAddrValuePattern
.match(self
.__Token
.upper()):
2217 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2218 Obj
.FvBaseAddress
= self
.__Token
2221 ## __GetFvForceRebase() method
2223 # Get FvForceRebase for FV
2225 # @param self The object pointer
2226 # @param Obj for whom FvForceRebase is got
2227 # @retval True Successfully find a FvForceRebase statement
2228 # @retval False Not able to find a FvForceRebase statement
2230 def __GetFvForceRebase(self
, Obj
):
2232 if not self
.__IsKeyword
("FvForceRebase"):
2235 if not self
.__IsToken
( "="):
2236 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2238 if not self
.__GetNextToken
():
2239 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2241 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2242 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2244 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2245 Obj
.FvForceRebase
= True
2246 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2247 Obj
.FvForceRebase
= False
2249 Obj
.FvForceRebase
= None
2254 ## __GetFvAttributes() method
2256 # Get attributes for FV
2258 # @param self The object pointer
2259 # @param Obj for whom attribute is got
2262 def __GetFvAttributes(self
, FvObj
):
2264 while self
.__GetNextWord
():
2267 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2268 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2269 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2270 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2271 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2272 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):
2276 if not self
.__IsToken
( "="):
2277 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2279 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2280 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2282 FvObj
.FvAttributeDict
[name
] = self
.__Token
2286 ## __GetFvNameGuid() method
2288 # Get FV GUID for FV
2290 # @param self The object pointer
2291 # @param Obj for whom GUID is got
2294 def __GetFvNameGuid(self
, FvObj
):
2296 if not self
.__IsKeyword
( "FvNameGuid"):
2299 if not self
.__IsToken
( "="):
2300 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2302 if not self
.__GetNextGuid
():
2303 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2305 FvObj
.FvNameGuid
= self
.__Token
2309 def __GetFvNameString(self
, FvObj
):
2311 if not self
.__IsKeyword
( "FvNameString"):
2314 if not self
.__IsToken
( "="):
2315 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2317 if not self
.__GetNextToken
() or self
.__Token
not in ('TRUE', 'FALSE'):
2318 raise Warning("expected TRUE or FALSE for FvNameString", self
.FileName
, self
.CurrentLineNumber
)
2320 FvObj
.FvNameString
= self
.__Token
2324 def __GetFvExtEntryStatement(self
, FvObj
):
2326 if not (self
.__IsKeyword
( "FV_EXT_ENTRY") or self
.__IsKeyword
( "FV_EXT_ENTRY_TYPE")):
2329 if not self
.__IsKeyword
("TYPE"):
2330 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2332 if not self
.__IsToken
( "="):
2333 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2335 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2336 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2338 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2340 if not self
.__IsToken
( "{"):
2341 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2343 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2344 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2346 FvObj
.FvExtEntryType
+= [self
.__Token
]
2348 if self
.__Token
== 'DATA':
2350 if not self
.__IsToken
( "="):
2351 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2353 if not self
.__IsToken
( "{"):
2354 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2356 if not self
.__GetNextHexNumber
():
2357 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2359 if len(self
.__Token
) > 4:
2360 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2362 DataString
= self
.__Token
2365 while self
.__IsToken
(","):
2366 if not self
.__GetNextHexNumber
():
2367 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2368 if len(self
.__Token
) > 4:
2369 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2370 DataString
+= self
.__Token
2373 if not self
.__IsToken
( "}"):
2374 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2376 if not self
.__IsToken
( "}"):
2377 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2379 DataString
= DataString
.rstrip(",")
2380 FvObj
.FvExtEntryData
+= [DataString
]
2382 if self
.__Token
== 'FILE':
2384 if not self
.__IsToken
( "="):
2385 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2387 if not self
.__GetNextToken
():
2388 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2390 FvObj
.FvExtEntryData
+= [self
.__Token
]
2392 if not self
.__IsToken
( "}"):
2393 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2397 ## __GetAprioriSection() method
2399 # Get token statements
2401 # @param self The object pointer
2402 # @param FvObj for whom apriori is got
2403 # @param MacroDict dictionary used to replace macro
2404 # @retval True Successfully find apriori statement
2405 # @retval False Not able to find apriori statement
2407 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2409 if not self
.__IsKeyword
( "APRIORI"):
2412 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2413 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2414 AprType
= self
.__Token
2416 if not self
.__IsToken
( "{"):
2417 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2419 AprSectionObj
= AprioriSection
.AprioriSection()
2420 AprSectionObj
.AprioriType
= AprType
2422 self
.__GetDefineStatements
(AprSectionObj
)
2423 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2426 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2427 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2428 if not IsInf
and not IsFile
:
2431 if not self
.__IsToken
( "}"):
2432 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2434 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2437 def __ParseInfStatement(self
):
2438 if not self
.__IsKeyword
("INF"):
2441 ffsInf
= FfsInfStatement
.FfsInfStatement()
2442 self
.__GetInfOptions
(ffsInf
)
2444 if not self
.__GetNextToken
():
2445 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2446 ffsInf
.InfFileName
= self
.__Token
2447 if not ffsInf
.InfFileName
.endswith('.inf'):
2448 raise Warning("expected .inf file path", self
.FileName
, self
.CurrentLineNumber
)
2450 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2451 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2453 #Replace $(SAPCE) with real space
2454 ffsInf
.InfFileName
= ffsInf
.InfFileName
.replace('$(SPACE)', ' ')
2456 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2457 #do case sensitive check for file path
2458 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2460 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2462 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2463 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2464 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2465 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2467 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
2468 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
2470 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
2472 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
2474 if self
.__IsToken
('|'):
2475 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2476 ffsInf
.KeepReloc
= False
2477 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2478 ffsInf
.KeepReloc
= True
2480 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2483 ## __GetInfStatement() method
2485 # Get INF statements
2487 # @param self The object pointer
2488 # @param Obj for whom inf statement is got
2489 # @param MacroDict dictionary used to replace macro
2490 # @retval True Successfully find inf statement
2491 # @retval False Not able to find inf statement
2493 def __GetInfStatement(self
, Obj
, ForCapsule
=False, MacroDict
={}):
2494 ffsInf
= self
.__ParseInfStatement
()
2499 capsuleFfs
= CapsuleData
.CapsuleFfs()
2500 capsuleFfs
.Ffs
= ffsInf
2501 Obj
.CapsuleDataList
.append(capsuleFfs
)
2503 Obj
.FfsList
.append(ffsInf
)
2506 ## __GetInfOptions() method
2508 # Get options for INF
2510 # @param self The object pointer
2511 # @param FfsInfObj for whom option is got
2513 def __GetInfOptions(self
, FfsInfObj
):
2514 if self
.__IsKeyword
("FILE_GUID"):
2515 if not self
.__IsToken
("="):
2516 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2517 if not self
.__GetNextGuid
():
2518 raise Warning("expected GUID value", self
.FileName
, self
.CurrentLineNumber
)
2519 FfsInfObj
.OverrideGuid
= self
.__Token
2521 if self
.__IsKeyword
( "RuleOverride"):
2522 if not self
.__IsToken
( "="):
2523 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2524 if not self
.__GetNextToken
():
2525 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2526 FfsInfObj
.Rule
= self
.__Token
2528 if self
.__IsKeyword
( "VERSION"):
2529 if not self
.__IsToken
( "="):
2530 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2531 if not self
.__GetNextToken
():
2532 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2534 if self
.__GetStringData
():
2535 FfsInfObj
.Version
= self
.__Token
2537 if self
.__IsKeyword
( "UI"):
2538 if not self
.__IsToken
( "="):
2539 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2540 if not self
.__GetNextToken
():
2541 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2543 if self
.__GetStringData
():
2544 FfsInfObj
.Ui
= self
.__Token
2546 if self
.__IsKeyword
( "USE"):
2547 if not self
.__IsToken
( "="):
2548 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2549 if not self
.__GetNextToken
():
2550 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2551 FfsInfObj
.UseArch
= self
.__Token
2554 if self
.__GetNextToken
():
2555 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')
2556 if p
.match(self
.__Token
) and p
.match(self
.__Token
).span()[1] == len(self
.__Token
):
2557 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2558 if not self
.__IsToken
(","):
2564 while self
.__GetNextToken
():
2565 if not p
.match(self
.__Token
):
2566 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2567 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2569 if not self
.__IsToken
(","):
2572 ## __GetFileStatement() method
2574 # Get FILE statements
2576 # @param self The object pointer
2577 # @param Obj for whom FILE statement is got
2578 # @param MacroDict dictionary used to replace macro
2579 # @retval True Successfully find FILE statement
2580 # @retval False Not able to find FILE statement
2582 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2584 if not self
.__IsKeyword
( "FILE"):
2587 if not self
.__GetNextWord
():
2588 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2590 if ForCapsule
and self
.__Token
== 'DATA':
2595 FfsFileObj
= FfsFileStatement
.FileStatement()
2596 FfsFileObj
.FvFileType
= self
.__Token
2598 if not self
.__IsToken
( "="):
2599 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2601 if not self
.__GetNextGuid
():
2602 if not self
.__GetNextWord
():
2603 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2604 if self
.__Token
== 'PCD':
2605 if not self
.__IsToken
( "("):
2606 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2607 PcdPair
= self
.__GetNextPcdName
()
2608 if not self
.__IsToken
( ")"):
2609 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2610 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2612 FfsFileObj
.NameGuid
= self
.__Token
2614 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2617 capsuleFfs
= CapsuleData
.CapsuleFfs()
2618 capsuleFfs
.Ffs
= FfsFileObj
2619 Obj
.CapsuleDataList
.append(capsuleFfs
)
2621 Obj
.FfsList
.append(FfsFileObj
)
2625 ## __FileCouldHaveRelocFlag() method
2627 # Check whether reloc strip flag can be set for a file type.
2629 # @param FileType The file type to check with
2630 # @retval True This type could have relocation strip flag
2631 # @retval False No way to have it
2634 def __FileCouldHaveRelocFlag (FileType
):
2635 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2640 ## __SectionCouldHaveRelocFlag() method
2642 # Check whether reloc strip flag can be set for a section type.
2644 # @param SectionType The section type to check with
2645 # @retval True This type could have relocation strip flag
2646 # @retval False No way to have it
2649 def __SectionCouldHaveRelocFlag (SectionType
):
2650 if SectionType
in ('TE', 'PE32'):
2655 ## __GetFilePart() method
2657 # Get components for FILE statement
2659 # @param self The object pointer
2660 # @param FfsFileObj for whom component is got
2661 # @param MacroDict dictionary used to replace macro
2663 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2665 self
.__GetFileOpts
( FfsFileObj
)
2667 if not self
.__IsToken
("{"):
2668 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2669 if self
.__FileCouldHaveRelocFlag
(FfsFileObj
.FvFileType
):
2670 if self
.__Token
== 'RELOCS_STRIPPED':
2671 FfsFileObj
.KeepReloc
= False
2673 FfsFileObj
.KeepReloc
= True
2675 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj
.FvFileType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2677 if not self
.__IsToken
("{"):
2678 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2680 if not self
.__GetNextToken
():
2681 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2683 if self
.__Token
== "FV":
2684 if not self
.__IsToken
( "="):
2685 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2686 if not self
.__GetNextToken
():
2687 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2688 FfsFileObj
.FvName
= self
.__Token
2690 elif self
.__Token
== "FD":
2691 if not self
.__IsToken
( "="):
2692 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2693 if not self
.__GetNextToken
():
2694 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2695 FfsFileObj
.FdName
= self
.__Token
2697 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2699 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2701 elif hasattr(FfsFileObj
, 'FvFileType') and FfsFileObj
.FvFileType
== 'RAW':
2703 self
.__GetRAWData
(FfsFileObj
, MacroDict
)
2706 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2707 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2708 FfsFileObj
.FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2709 self
.__VerifyFile
(FfsFileObj
.FileName
)
2711 if not self
.__IsToken
( "}"):
2712 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2714 ## __GetRAWData() method
2716 # Get RAW data for FILE statement
2718 # @param self The object pointer
2719 # @param FfsFileObj for whom section is got
2720 # @param MacroDict dictionary used to replace macro
2722 def __GetRAWData(self
, FfsFileObj
, MacroDict
= {}):
2723 FfsFileObj
.FileName
= []
2724 FfsFileObj
.SubAlignment
= []
2727 if self
.__GetAlignment
():
2728 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2729 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2730 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2731 #For FFS, Auto is default option same to ""
2732 if not self
.__Token
== "Auto":
2733 AlignValue
= self
.__Token
2734 if not self
.__GetNextToken
():
2735 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2737 FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2740 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2742 self
.__VerifyFile
(FileName
)
2743 File
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
)
2744 FfsFileObj
.FileName
.append(File
.Path
)
2745 FfsFileObj
.SubAlignment
.append(AlignValue
)
2747 if self
.__IsToken
( "}"):
2751 if len(FfsFileObj
.SubAlignment
) == 1:
2752 FfsFileObj
.SubAlignment
= FfsFileObj
.SubAlignment
[0]
2753 if len(FfsFileObj
.FileName
) == 1:
2754 FfsFileObj
.FileName
= FfsFileObj
.FileName
[0]
2756 ## __GetFileOpts() method
2758 # Get options for FILE statement
2760 # @param self The object pointer
2761 # @param FfsFileObj for whom options is got
2763 def __GetFileOpts(self
, FfsFileObj
):
2765 if self
.__GetNextToken
():
2766 if TokenFindPattern
.match(self
.__Token
):
2767 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2768 if self
.__IsToken
(","):
2769 while self
.__GetNextToken
():
2770 if not TokenFindPattern
.match(self
.__Token
):
2771 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2772 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2774 if not self
.__IsToken
(","):
2780 if self
.__IsKeyword
( "FIXED", True):
2781 FfsFileObj
.Fixed
= True
2783 if self
.__IsKeyword
( "CHECKSUM", True):
2784 FfsFileObj
.CheckSum
= True
2786 if self
.__GetAlignment
():
2787 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2788 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2789 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2790 #For FFS, Auto is default option same to ""
2791 if not self
.__Token
== "Auto":
2792 FfsFileObj
.Alignment
= self
.__Token
2794 ## __GetAlignment() method
2796 # Return the alignment value
2798 # @param self The object pointer
2799 # @retval True Successfully find alignment
2800 # @retval False Not able to find alignment
2802 def __GetAlignment(self
):
2803 if self
.__IsKeyword
( "Align", True):
2804 if not self
.__IsToken
( "="):
2805 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2807 if not self
.__GetNextToken
():
2808 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2813 ## __GetFilePart() method
2815 # Get section data for FILE statement
2817 # @param self The object pointer
2818 # @param FfsFileObj for whom section is got
2819 # @param MacroDict dictionary used to replace macro
2821 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2823 Dict
.update(MacroDict
)
2825 self
.__GetDefineStatements
(FfsFileObj
)
2827 Dict
.update(FfsFileObj
.DefineVarDict
)
2828 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2829 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2832 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2833 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2834 if not IsLeafSection
and not IsEncapSection
:
2837 ## __GetLeafSection() method
2839 # Get leaf section for Obj
2841 # @param self The object pointer
2842 # @param Obj for whom leaf section is got
2843 # @param MacroDict dictionary used to replace macro
2844 # @retval True Successfully find section statement
2845 # @retval False Not able to find section statement
2847 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2849 OldPos
= self
.GetFileBufferPos()
2851 if not self
.__IsKeyword
( "SECTION"):
2852 if len(Obj
.SectionList
) == 0:
2853 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2858 if self
.__GetAlignment
():
2859 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2860 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2861 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2862 AlignValue
= self
.__Token
2865 if self
.__IsKeyword
( "BUILD_NUM"):
2866 if not self
.__IsToken
( "="):
2867 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2869 if not self
.__GetNextToken
():
2870 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2872 BuildNum
= self
.__Token
2874 if self
.__IsKeyword
( "VERSION"):
2875 if AlignValue
== 'Auto':
2876 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2877 if not self
.__IsToken
( "="):
2878 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2879 if not self
.__GetNextToken
():
2880 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2881 VerSectionObj
= VerSection
.VerSection()
2882 VerSectionObj
.Alignment
= AlignValue
2883 VerSectionObj
.BuildNum
= BuildNum
2884 if self
.__GetStringData
():
2885 VerSectionObj
.StringData
= self
.__Token
2887 VerSectionObj
.FileName
= self
.__Token
2888 Obj
.SectionList
.append(VerSectionObj
)
2890 elif self
.__IsKeyword
( "UI"):
2891 if AlignValue
== 'Auto':
2892 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2893 if not self
.__IsToken
( "="):
2894 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2895 if not self
.__GetNextToken
():
2896 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2897 UiSectionObj
= UiSection
.UiSection()
2898 UiSectionObj
.Alignment
= AlignValue
2899 if self
.__GetStringData
():
2900 UiSectionObj
.StringData
= self
.__Token
2902 UiSectionObj
.FileName
= self
.__Token
2903 Obj
.SectionList
.append(UiSectionObj
)
2905 elif self
.__IsKeyword
( "FV_IMAGE"):
2906 if AlignValue
== 'Auto':
2907 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2908 if not self
.__IsToken
( "="):
2909 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2910 if not self
.__GetNextToken
():
2911 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2913 FvName
= self
.__Token
2916 if self
.__IsToken
( "{"):
2918 FvObj
.UiFvName
= FvName
.upper()
2919 self
.__GetDefineStatements
(FvObj
)
2920 MacroDict
.update(FvObj
.DefineVarDict
)
2921 self
.__GetBlockStatement
(FvObj
)
2922 self
.__GetSetStatements
(FvObj
)
2923 self
.__GetFvAlignment
(FvObj
)
2924 self
.__GetFvAttributes
(FvObj
)
2925 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2926 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2929 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2930 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2931 if not IsInf
and not IsFile
:
2934 if not self
.__IsToken
( "}"):
2935 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2937 FvImageSectionObj
= FvImageSection
.FvImageSection()
2938 FvImageSectionObj
.Alignment
= AlignValue
2939 if FvObj
is not None:
2940 FvImageSectionObj
.Fv
= FvObj
2941 FvImageSectionObj
.FvName
= None
2943 FvImageSectionObj
.FvName
= FvName
.upper()
2944 FvImageSectionObj
.FvFileName
= FvName
2946 Obj
.SectionList
.append(FvImageSectionObj
)
2948 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2949 if AlignValue
== 'Auto':
2950 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2951 DepexSectionObj
= DepexSection
.DepexSection()
2952 DepexSectionObj
.Alignment
= AlignValue
2953 DepexSectionObj
.DepexType
= self
.__Token
2955 if not self
.__IsToken
( "="):
2956 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2957 if not self
.__IsToken
( "{"):
2958 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2959 if not self
.__SkipToToken
( "}"):
2960 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2962 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2963 Obj
.SectionList
.append(DepexSectionObj
)
2966 if not self
.__GetNextWord
():
2967 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2969 # Encapsulation section appear, UndoToken and return
2970 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2971 self
.SetFileBufferPos(OldPos
)
2974 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2975 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2976 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2977 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2978 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2981 DataSectionObj
= DataSection
.DataSection()
2982 DataSectionObj
.Alignment
= AlignValue
2983 DataSectionObj
.SecType
= self
.__Token
2985 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2986 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2987 if self
.__Token
== 'RELOCS_STRIPPED':
2988 DataSectionObj
.KeepReloc
= False
2990 DataSectionObj
.KeepReloc
= True
2992 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
)
2994 if self
.__IsToken
("="):
2995 if not self
.__GetNextToken
():
2996 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2997 DataSectionObj
.SectFileName
= self
.__Token
2998 self
.__VerifyFile
(DataSectionObj
.SectFileName
)
3000 if not self
.__GetCglSection
(DataSectionObj
):
3003 Obj
.SectionList
.append(DataSectionObj
)
3009 # Check if file exists or not:
3010 # If current phase if GenFds, the file must exist;
3011 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist
3012 # @param FileName: File path to be verified.
3014 def __VerifyFile(self
, FileName
):
3015 if FileName
.replace('$(WORKSPACE)', '').find('$') != -1:
3017 if not GlobalData
.gAutoGenPhase
or not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FileName
:
3018 ErrorCode
, ErrorInfo
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3020 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3022 ## __GetCglSection() method
3024 # Get compressed or GUIDed section for Obj
3026 # @param self The object pointer
3027 # @param Obj for whom leaf section is got
3028 # @param AlignValue alignment value for complex section
3029 # @retval True Successfully find section statement
3030 # @retval False Not able to find section statement
3032 def __GetCglSection(self
, Obj
, AlignValue
= None):
3034 if self
.__IsKeyword
( "COMPRESS"):
3036 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3039 if not self
.__IsToken
("{"):
3040 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3042 CompressSectionObj
= CompressSection
.CompressSection()
3043 CompressSectionObj
.Alignment
= AlignValue
3044 CompressSectionObj
.CompType
= type
3045 # Recursive sections...
3047 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
3048 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
3049 if not IsLeafSection
and not IsEncapSection
:
3053 if not self
.__IsToken
( "}"):
3054 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3055 Obj
.SectionList
.append(CompressSectionObj
)
3058 # raise Warning("Compress type not known")
3062 elif self
.__IsKeyword
( "GUIDED"):
3064 if self
.__GetNextGuid
():
3065 GuidValue
= self
.__Token
3067 AttribDict
= self
.__GetGuidAttrib
()
3068 if not self
.__IsToken
("{"):
3069 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3070 GuidSectionObj
= GuidSection
.GuidSection()
3071 GuidSectionObj
.Alignment
= AlignValue
3072 GuidSectionObj
.NameGuid
= GuidValue
3073 GuidSectionObj
.SectionType
= "GUIDED"
3074 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3075 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3076 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
3077 # Recursive sections...
3079 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
3080 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
3081 if not IsLeafSection
and not IsEncapSection
:
3084 if not self
.__IsToken
( "}"):
3085 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3086 Obj
.SectionList
.append(GuidSectionObj
)
3092 ## __GetGuidAttri() method
3094 # Get attributes for GUID section
3096 # @param self The object pointer
3097 # @retval AttribDict Dictionary of key-value pair of section attributes
3099 def __GetGuidAttrib(self
):
3102 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
3103 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
3104 AttribDict
["EXTRA_HEADER_SIZE"] = -1
3105 while self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID") \
3106 or self
.__IsKeyword
("EXTRA_HEADER_SIZE"):
3107 AttribKey
= self
.__Token
3109 if not self
.__IsToken
("="):
3110 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3112 if not self
.__GetNextToken
():
3113 raise Warning("expected TRUE(1)/FALSE(0)/Number", self
.FileName
, self
.CurrentLineNumber
)
3114 elif AttribKey
== "EXTRA_HEADER_SIZE":
3116 if self
.__Token
[0:2].upper() == "0X":
3119 AttribDict
[AttribKey
] = int(self
.__Token
, Base
)
3122 raise Warning("expected Number", self
.FileName
, self
.CurrentLineNumber
)
3123 elif self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
3124 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
3125 AttribDict
[AttribKey
] = self
.__Token
3129 ## __GetEncapsulationSec() method
3131 # Get encapsulation section for FILE
3133 # @param self The object pointer
3134 # @param FfsFile for whom section is got
3135 # @retval True Successfully find section statement
3136 # @retval False Not able to find section statement
3138 def __GetEncapsulationSec(self
, FfsFileObj
):
3140 OldPos
= self
.GetFileBufferPos()
3141 if not self
.__IsKeyword
( "SECTION"):
3142 if len(FfsFileObj
.SectionList
) == 0:
3143 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
3148 if self
.__GetAlignment
():
3149 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3150 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3151 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3152 AlignValue
= self
.__Token
3154 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
3155 self
.SetFileBufferPos(OldPos
)
3161 if not self
.__GetNextToken
():
3163 S
= self
.__Token
.upper()
3164 if S
.startswith("[") and not S
.startswith("[FMPPAYLOAD."):
3165 self
.SectionParser(S
)
3170 self
.__SkipToToken
("[FMPPAYLOAD.", True)
3171 FmpUiName
= self
.__GetUiName
().upper()
3172 if FmpUiName
in self
.Profile
.FmpPayloadDict
:
3173 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName
, self
.FileName
, self
.CurrentLineNumber
)
3175 FmpData
= CapsuleData
.CapsulePayload()
3176 FmpData
.UiName
= FmpUiName
3178 if not self
.__IsToken
( "]"):
3179 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3181 if not self
.__GetNextToken
():
3182 raise Warning("The FMP payload section is empty!", self
.FileName
, self
.CurrentLineNumber
)
3183 FmpKeyList
= ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']
3184 while self
.__Token
in FmpKeyList
:
3186 FmpKeyList
.remove(Name
)
3187 if not self
.__IsToken
("="):
3188 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3189 if Name
== 'IMAGE_TYPE_ID':
3190 if not self
.__GetNextGuid
():
3191 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self
.FileName
, self
.CurrentLineNumber
)
3192 FmpData
.ImageTypeId
= self
.__Token
3193 elif Name
== 'CERTIFICATE_GUID':
3194 if not self
.__GetNextGuid
():
3195 raise Warning("expected GUID value for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3196 FmpData
.Certificate_Guid
= self
.__Token
3197 if uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_RSA2048_SHA256_GUID
and uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_PKCS7_GUID
:
3198 raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3200 if not self
.__GetNextToken
():
3201 raise Warning("expected value of %s" % Name
, self
.FileName
, self
.CurrentLineNumber
)
3202 Value
= self
.__Token
3203 if Name
== 'IMAGE_HEADER_INIT_VERSION':
3204 if self
.__Verify
(Name
, Value
, 'UINT8'):
3205 FmpData
.Version
= Value
3206 elif Name
== 'IMAGE_INDEX':
3207 if self
.__Verify
(Name
, Value
, 'UINT8'):
3208 FmpData
.ImageIndex
= Value
3209 elif Name
== 'HARDWARE_INSTANCE':
3210 if self
.__Verify
(Name
, Value
, 'UINT8'):
3211 FmpData
.HardwareInstance
= Value
3212 elif Name
== 'MONOTONIC_COUNT':
3213 if self
.__Verify
(Name
, Value
, 'UINT64'):
3214 FmpData
.MonotonicCount
= Value
3215 if FmpData
.MonotonicCount
.upper().startswith('0X'):
3216 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
, 16)
3218 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
)
3219 if not self
.__GetNextToken
():
3224 if (FmpData
.MonotonicCount
and not FmpData
.Certificate_Guid
) or (not FmpData
.MonotonicCount
and FmpData
.Certificate_Guid
):
3225 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")
3227 # Only the IMAGE_TYPE_ID is required item
3228 if FmpKeyList
and 'IMAGE_TYPE_ID' in FmpKeyList
:
3229 raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3230 # get the Image file and Vendor code file
3231 self
.__GetFMPCapsuleData
(FmpData
)
3232 if not FmpData
.ImageFile
:
3233 raise Warning("Missing image file in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3234 # check whether more than one Vendor code file
3235 if len(FmpData
.VendorCodeFile
) > 1:
3236 raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3237 self
.Profile
.FmpPayloadDict
[FmpUiName
] = FmpData
3240 ## __GetCapsule() method
3242 # Get capsule section contents and store its data into capsule list of self.Profile
3244 # @param self The object pointer
3245 # @retval True Successfully find a capsule
3246 # @retval False Not able to find a capsule
3248 def __GetCapsule(self
):
3250 if not self
.__GetNextToken
():
3253 S
= self
.__Token
.upper()
3254 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
3255 self
.SectionParser(S
)
3260 if not self
.__IsToken
("[CAPSULE.", True):
3261 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3262 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3263 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3264 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
3266 CapsuleObj
= Capsule
.Capsule()
3268 CapsuleName
= self
.__GetUiName
()
3270 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
3272 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
3274 if not self
.__IsToken
( "]"):
3275 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3277 if self
.__IsKeyword
("CREATE_FILE"):
3278 if not self
.__IsToken
( "="):
3279 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3281 if not self
.__GetNextToken
():
3282 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
3284 CapsuleObj
.CreateFile
= self
.__Token
3286 self
.__GetCapsuleStatements
(CapsuleObj
)
3287 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3290 ## __GetCapsuleStatements() method
3292 # Get statements for capsule
3294 # @param self The object pointer
3295 # @param Obj for whom statements are got
3297 def __GetCapsuleStatements(self
, Obj
):
3298 self
.__GetCapsuleTokens
(Obj
)
3299 self
.__GetDefineStatements
(Obj
)
3300 self
.__GetSetStatements
(Obj
)
3301 self
.__GetCapsuleData
(Obj
)
3303 ## __GetCapsuleTokens() method
3305 # Get token statements for capsule
3307 # @param self The object pointer
3308 # @param Obj for whom token statements are got
3310 def __GetCapsuleTokens(self
, Obj
):
3311 if not self
.__GetNextToken
():
3313 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):
3314 Name
= self
.__Token
.strip()
3315 if not self
.__IsToken
("="):
3316 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3317 if not self
.__GetNextToken
():
3318 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3319 if Name
== 'CAPSULE_FLAGS':
3320 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3321 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3322 Value
= self
.__Token
.strip()
3323 while self
.__IsToken
(","):
3325 if not self
.__GetNextToken
():
3326 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3327 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3328 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3329 Value
+= self
.__Token
.strip()
3330 elif Name
== 'OEM_CAPSULE_FLAGS':
3331 Value
= self
.__Token
.strip()
3332 if not Value
.upper().startswith('0X'):
3333 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3335 Value
= int(Value
, 0)
3337 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3338 if not 0x0000 <= Value
<= 0xFFFF:
3339 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3340 Value
= self
.__Token
.strip()
3342 Value
= self
.__Token
.strip()
3343 Obj
.TokensDict
[Name
] = Value
3344 if not self
.__GetNextToken
():
3348 ## __GetCapsuleData() method
3350 # Get capsule data for capsule
3352 # @param self The object pointer
3353 # @param Obj for whom capsule data are got
3355 def __GetCapsuleData(self
, Obj
):
3358 IsInf
= self
.__GetInfStatement
(Obj
, True)
3359 IsFile
= self
.__GetFileStatement
(Obj
, True)
3360 IsFv
= self
.__GetFvStatement
(Obj
)
3361 IsFd
= self
.__GetFdStatement
(Obj
)
3362 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3363 IsAfile
= self
.__GetAfileStatement
(Obj
)
3364 IsFmp
= self
.__GetFmpStatement
(Obj
)
3365 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
or IsAfile
or IsFmp
):
3368 ## __GetFMPCapsuleData() method
3370 # Get capsule data for FMP capsule
3372 # @param self The object pointer
3373 # @param Obj for whom capsule data are got
3375 def __GetFMPCapsuleData(self
, Obj
):
3378 IsFv
= self
.__GetFvStatement
(Obj
, True)
3379 IsFd
= self
.__GetFdStatement
(Obj
, True)
3380 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
, True)
3381 if not (IsFv
or IsFd
or IsAnyFile
):
3384 ## __GetFvStatement() method
3386 # Get FV for capsule
3388 # @param self The object pointer
3389 # @param CapsuleObj for whom FV is got
3390 # @retval True Successfully find a FV statement
3391 # @retval False Not able to find a FV statement
3393 def __GetFvStatement(self
, CapsuleObj
, FMPCapsule
= False):
3395 if not self
.__IsKeyword
("FV"):
3398 if not self
.__IsToken
("="):
3399 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3401 if not self
.__GetNextToken
():
3402 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3404 if self
.__Token
.upper() not in self
.Profile
.FvDict
.keys():
3405 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3407 CapsuleFv
= CapsuleData
.CapsuleFv()
3408 CapsuleFv
.FvName
= self
.__Token
3410 if not CapsuleObj
.ImageFile
:
3411 CapsuleObj
.ImageFile
.append(CapsuleFv
)
3413 CapsuleObj
.VendorCodeFile
.append(CapsuleFv
)
3415 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3418 ## __GetFdStatement() method
3420 # Get FD for capsule
3422 # @param self The object pointer
3423 # @param CapsuleObj for whom FD is got
3424 # @retval True Successfully find a FD statement
3425 # @retval False Not able to find a FD statement
3427 def __GetFdStatement(self
, CapsuleObj
, FMPCapsule
= False):
3429 if not self
.__IsKeyword
("FD"):
3432 if not self
.__IsToken
("="):
3433 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3435 if not self
.__GetNextToken
():
3436 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3438 if self
.__Token
.upper() not in self
.Profile
.FdDict
.keys():
3439 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3441 CapsuleFd
= CapsuleData
.CapsuleFd()
3442 CapsuleFd
.FdName
= self
.__Token
3444 if not CapsuleObj
.ImageFile
:
3445 CapsuleObj
.ImageFile
.append(CapsuleFd
)
3447 CapsuleObj
.VendorCodeFile
.append(CapsuleFd
)
3449 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3452 def __GetFmpStatement(self
, CapsuleObj
):
3453 if not self
.__IsKeyword
("FMP_PAYLOAD"):
3454 if not self
.__IsKeyword
("FMP"):
3457 if not self
.__IsKeyword
("PAYLOAD"):
3461 if not self
.__IsToken
("="):
3462 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3464 if not self
.__GetNextToken
():
3465 raise Warning("expected payload name after FMP_PAYLOAD =", self
.FileName
, self
.CurrentLineNumber
)
3466 Payload
= self
.__Token
.upper()
3467 if Payload
not in self
.Profile
.FmpPayloadDict
:
3468 raise Warning("This FMP Payload does not exist: %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3469 CapsuleObj
.FmpPayloadList
.append(self
.Profile
.FmpPayloadDict
[Payload
])
3472 def __ParseRawFileStatement(self
):
3473 if not self
.__IsKeyword
("FILE"):
3476 if not self
.__IsKeyword
("DATA"):
3480 if not self
.__IsToken
("="):
3481 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3483 if not self
.__GetNextToken
():
3484 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3486 AnyFileName
= self
.__Token
3487 self
.__VerifyFile
(AnyFileName
)
3489 if not os
.path
.isabs(AnyFileName
):
3490 AnyFileName
= mws
.join(GenFdsGlobalVariable
.WorkSpaceDir
, AnyFileName
)
3494 ## __GetAnyFileStatement() method
3496 # Get AnyFile for capsule
3498 # @param self The object pointer
3499 # @param CapsuleObj for whom AnyFile is got
3500 # @retval True Successfully find a Anyfile statement
3501 # @retval False Not able to find a AnyFile statement
3503 def __GetAnyFileStatement(self
, CapsuleObj
, FMPCapsule
= False):
3504 AnyFileName
= self
.__ParseRawFileStatement
()
3508 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3509 CapsuleAnyFile
.FileName
= AnyFileName
3511 if not CapsuleObj
.ImageFile
:
3512 CapsuleObj
.ImageFile
.append(CapsuleAnyFile
)
3514 CapsuleObj
.VendorCodeFile
.append(CapsuleAnyFile
)
3516 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3519 ## __GetAfileStatement() method
3521 # Get Afile for capsule
3523 # @param self The object pointer
3524 # @param CapsuleObj for whom Afile is got
3525 # @retval True Successfully find a Afile statement
3526 # @retval False Not able to find a Afile statement
3528 def __GetAfileStatement(self
, CapsuleObj
):
3530 if not self
.__IsKeyword
("APPEND"):
3533 if not self
.__IsToken
("="):
3534 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3536 if not self
.__GetNextToken
():
3537 raise Warning("expected Afile name", self
.FileName
, self
.CurrentLineNumber
)
3539 AfileName
= self
.__Token
3540 AfileBaseName
= os
.path
.basename(AfileName
)
3542 if os
.path
.splitext(AfileBaseName
)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:
3543 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \
3544 self
.FileName
, self
.CurrentLineNumber
)
3546 if not os
.path
.isabs(AfileName
):
3547 AfileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AfileName
)
3548 self
.__VerifyFile
(AfileName
)
3550 if not os
.path
.exists(AfileName
):
3551 raise Warning('%s does not exist' % AfileName
, self
.FileName
, self
.CurrentLineNumber
)
3555 CapsuleAfile
= CapsuleData
.CapsuleAfile()
3556 CapsuleAfile
.FileName
= AfileName
3557 CapsuleObj
.CapsuleDataList
.append(CapsuleAfile
)
3560 ## __GetRule() method
3562 # Get Rule section contents and store its data into rule list of self.Profile
3564 # @param self The object pointer
3565 # @retval True Successfully find a Rule
3566 # @retval False Not able to find a Rule
3568 def __GetRule(self
):
3570 if not self
.__GetNextToken
():
3573 S
= self
.__Token
.upper()
3574 if S
.startswith("[") and not S
.startswith("[RULE."):
3575 self
.SectionParser(S
)
3579 if not self
.__IsToken
("[Rule.", True):
3580 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3581 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3582 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3583 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3585 if not self
.__SkipToToken
("."):
3586 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3588 Arch
= self
.__SkippedChars
.rstrip(".")
3589 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
3590 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3592 ModuleType
= self
.__GetModuleType
()
3595 if self
.__IsToken
("."):
3596 if not self
.__GetNextWord
():
3597 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3598 TemplateName
= self
.__Token
3600 if not self
.__IsToken
( "]"):
3601 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3603 RuleObj
= self
.__GetRuleFileStatements
()
3604 RuleObj
.Arch
= Arch
.upper()
3605 RuleObj
.ModuleType
= ModuleType
3606 RuleObj
.TemplateName
= TemplateName
3607 if TemplateName
== '' :
3608 self
.Profile
.RuleDict
['RULE' + \
3612 ModuleType
.upper() ] = RuleObj
3614 self
.Profile
.RuleDict
['RULE' + \
3618 ModuleType
.upper() + \
3620 TemplateName
.upper() ] = RuleObj
3621 # self.Profile.RuleList.append(rule)
3624 ## __GetModuleType() method
3626 # Return the module type
3628 # @param self The object pointer
3629 # @retval string module type
3631 def __GetModuleType(self
):
3633 if not self
.__GetNextWord
():
3634 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3635 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3636 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3637 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3638 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3639 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3640 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
3641 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3644 ## __GetFileExtension() method
3646 # Return the file extension
3648 # @param self The object pointer
3649 # @retval string file name extension
3651 def __GetFileExtension(self
):
3652 if not self
.__IsToken
("."):
3653 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3656 if self
.__GetNextToken
():
3657 if FileExtensionPattern
.match(self
.__Token
):
3661 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3664 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3666 ## __GetRuleFileStatement() method
3670 # @param self The object pointer
3671 # @retval Rule Rule object
3673 def __GetRuleFileStatements(self
):
3675 if not self
.__IsKeyword
("FILE"):
3676 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3678 if not self
.__GetNextWord
():
3679 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3681 Type
= self
.__Token
.strip().upper()
3682 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3683 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
3684 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3686 if not self
.__IsToken
("="):
3687 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3689 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3690 if not self
.__GetNextWord
():
3691 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3692 if self
.__Token
== 'PCD':
3693 if not self
.__IsToken
( "("):
3694 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3695 PcdPair
= self
.__GetNextPcdName
()
3696 if not self
.__IsToken
( ")"):
3697 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3698 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3700 NameGuid
= self
.__Token
3703 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3704 if self
.__FileCouldHaveRelocFlag
(Type
):
3705 if self
.__Token
== 'RELOCS_STRIPPED':
3710 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3713 if self
.__GetNextToken
():
3714 if TokenFindPattern
.match(self
.__Token
):
3715 KeyStringList
.append(self
.__Token
)
3716 if self
.__IsToken
(","):
3717 while self
.__GetNextToken
():
3718 if not TokenFindPattern
.match(self
.__Token
):
3719 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3720 KeyStringList
.append(self
.__Token
)
3722 if not self
.__IsToken
(","):
3730 if self
.__IsKeyword
("Fixed", True):
3734 if self
.__IsKeyword
("CheckSum", True):
3738 if self
.__GetAlignment
():
3739 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3740 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3741 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3742 #For FFS, Auto is default option same to ""
3743 if not self
.__Token
== "Auto":
3744 AlignValue
= self
.__Token
3746 if self
.__IsToken
("{"):
3747 # Complex file rule expected
3748 Rule
= RuleComplexFile
.RuleComplexFile()
3749 Rule
.FvFileType
= Type
3750 Rule
.NameGuid
= NameGuid
3751 Rule
.Alignment
= AlignValue
3752 Rule
.CheckSum
= CheckSum
3754 Rule
.KeyStringList
= KeyStringList
3755 if KeepReloc
is not None:
3756 Rule
.KeepReloc
= KeepReloc
3759 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3760 IsLeaf
= self
.__GetEfiSection
(Rule
)
3761 if not IsEncapsulate
and not IsLeaf
:
3764 if not self
.__IsToken
("}"):
3765 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3770 # Simple file rule expected
3771 if not self
.__GetNextWord
():
3772 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3774 SectionName
= self
.__Token
3776 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3777 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3778 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3781 if self
.__IsKeyword
("Fixed", True):
3784 if self
.__IsKeyword
("CheckSum", True):
3788 if self
.__GetAlignment
():
3789 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3790 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3791 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3792 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3793 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3794 SectAlignment
= self
.__Token
3797 if self
.__IsToken
('|'):
3798 Ext
= self
.__GetFileExtension
()
3799 elif not self
.__GetNextToken
():
3800 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3802 Rule
= RuleSimpleFile
.RuleSimpleFile()
3803 Rule
.SectionType
= SectionName
3804 Rule
.FvFileType
= Type
3805 Rule
.NameGuid
= NameGuid
3806 Rule
.Alignment
= AlignValue
3807 Rule
.SectAlignment
= SectAlignment
3808 Rule
.CheckSum
= CheckSum
3810 Rule
.KeyStringList
= KeyStringList
3811 if KeepReloc
is not None:
3812 Rule
.KeepReloc
= KeepReloc
3813 Rule
.FileExtension
= Ext
3814 Rule
.FileName
= self
.__Token
3817 ## __GetEfiSection() method
3819 # Get section list for Rule
3821 # @param self The object pointer
3822 # @param Obj for whom section is got
3823 # @retval True Successfully find section statement
3824 # @retval False Not able to find section statement
3826 def __GetEfiSection(self
, Obj
):
3828 OldPos
= self
.GetFileBufferPos()
3829 if not self
.__GetNextWord
():
3831 SectionName
= self
.__Token
3833 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3834 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3838 if SectionName
== "FV_IMAGE":
3839 FvImageSectionObj
= FvImageSection
.FvImageSection()
3840 if self
.__IsKeyword
("FV_IMAGE"):
3842 if self
.__IsToken
( "{"):
3844 self
.__GetDefineStatements
(FvObj
)
3845 self
.__GetBlockStatement
(FvObj
)
3846 self
.__GetSetStatements
(FvObj
)
3847 self
.__GetFvAlignment
(FvObj
)
3848 self
.__GetFvAttributes
(FvObj
)
3849 self
.__GetAprioriSection
(FvObj
)
3850 self
.__GetAprioriSection
(FvObj
)
3853 IsInf
= self
.__GetInfStatement
(FvObj
)
3854 IsFile
= self
.__GetFileStatement
(FvObj
)
3855 if not IsInf
and not IsFile
:
3858 if not self
.__IsToken
( "}"):
3859 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3860 FvImageSectionObj
.Fv
= FvObj
3861 FvImageSectionObj
.FvName
= None
3864 if not self
.__IsKeyword
("FV"):
3865 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3866 FvImageSectionObj
.FvFileType
= self
.__Token
3868 if self
.__GetAlignment
():
3869 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3870 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3871 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3872 FvImageSectionObj
.Alignment
= self
.__Token
3874 if self
.__IsToken
('|'):
3875 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3876 elif self
.__GetNextToken
():
3877 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3878 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3879 FvImageSectionObj
.FvFileName
= self
.__Token
3883 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3885 Obj
.SectionList
.append(FvImageSectionObj
)
3888 EfiSectionObj
= EfiSection
.EfiSection()
3889 EfiSectionObj
.SectionType
= SectionName
3891 if not self
.__GetNextToken
():
3892 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3894 if self
.__Token
== "STRING":
3895 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3896 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3898 if not self
.__IsToken
('='):
3899 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3901 if not self
.__GetNextToken
():
3902 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3904 if self
.__GetStringData
():
3905 EfiSectionObj
.StringData
= self
.__Token
3907 if self
.__IsKeyword
("BUILD_NUM"):
3908 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3909 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3911 if not self
.__IsToken
("="):
3912 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3913 if not self
.__GetNextToken
():
3914 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3915 EfiSectionObj
.BuildNum
= self
.__Token
3918 EfiSectionObj
.FileType
= self
.__Token
3919 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3921 if self
.__IsKeyword
("Optional"):
3922 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3923 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3924 EfiSectionObj
.Optional
= True
3926 if self
.__IsKeyword
("BUILD_NUM"):
3927 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3928 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3930 if not self
.__IsToken
("="):
3931 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3932 if not self
.__GetNextToken
():
3933 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3934 EfiSectionObj
.BuildNum
= self
.__Token
3936 if self
.__GetAlignment
():
3937 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3938 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3939 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3940 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3941 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3942 EfiSectionObj
.Alignment
= self
.__Token
3944 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3945 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3946 if self
.__Token
== 'RELOCS_STRIPPED':
3947 EfiSectionObj
.KeepReloc
= False
3949 EfiSectionObj
.KeepReloc
= True
3950 if Obj
.KeepReloc
is not None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3951 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3953 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3956 if self
.__IsToken
('|'):
3957 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3958 elif self
.__GetNextToken
():
3959 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3960 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3962 if self
.__Token
.startswith('PCD'):
3964 self
.__GetNextWord
()
3966 if self
.__Token
== 'PCD':
3967 if not self
.__IsToken
( "("):
3968 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3969 PcdPair
= self
.__GetNextPcdName
()
3970 if not self
.__IsToken
( ")"):
3971 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3972 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3974 EfiSectionObj
.FileName
= self
.__Token
3979 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3981 Obj
.SectionList
.append(EfiSectionObj
)
3984 ## __RuleSectionCouldBeOptional() method
3986 # Get whether a section could be optional
3988 # @param SectionType The section type to check
3989 # @retval True section could be optional
3990 # @retval False section never optional
3993 def __RuleSectionCouldBeOptional(SectionType
):
3994 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3999 ## __RuleSectionCouldHaveBuildNum() method
4001 # Get whether a section could have build number information
4003 # @param SectionType The section type to check
4004 # @retval True section could have build number information
4005 # @retval False section never have build number information
4008 def __RuleSectionCouldHaveBuildNum(SectionType
):
4009 if SectionType
in ("VERSION"):
4014 ## __RuleSectionCouldHaveString() method
4016 # Get whether a section could have string
4018 # @param SectionType The section type to check
4019 # @retval True section could have string
4020 # @retval False section never have string
4023 def __RuleSectionCouldHaveString(SectionType
):
4024 if SectionType
in ("UI", "VERSION"):
4029 ## __CheckRuleSectionFileType() method
4031 # Get whether a section matches a file type
4033 # @param self The object pointer
4034 # @param SectionType The section type to check
4035 # @param FileType The file type to check
4037 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
4038 if SectionType
== "COMPAT16":
4039 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
4040 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4041 elif SectionType
== "PE32":
4042 if FileType
not in ("PE32", "SEC_PE32"):
4043 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4044 elif SectionType
== "PIC":
4045 if FileType
not in ("PIC", "PIC"):
4046 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4047 elif SectionType
== "TE":
4048 if FileType
not in ("TE", "SEC_TE"):
4049 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4050 elif SectionType
== "RAW":
4051 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
4052 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4053 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
4054 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
4055 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4056 elif SectionType
== "UI":
4057 if FileType
not in ("UI", "SEC_UI"):
4058 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4059 elif SectionType
== "VERSION":
4060 if FileType
not in ("VERSION", "SEC_VERSION"):
4061 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4062 elif SectionType
== "PEI_DEPEX":
4063 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
4064 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4065 elif SectionType
== "GUID":
4066 if FileType
not in ("PE32", "SEC_GUID"):
4067 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4069 ## __GetRuleEncapsulationSection() method
4071 # Get encapsulation section for Rule
4073 # @param self The object pointer
4074 # @param Rule for whom section is got
4075 # @retval True Successfully find section statement
4076 # @retval False Not able to find section statement
4078 def __GetRuleEncapsulationSection(self
, Rule
):
4080 if self
.__IsKeyword
( "COMPRESS"):
4082 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
4085 if not self
.__IsToken
("{"):
4086 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4088 CompressSectionObj
= CompressSection
.CompressSection()
4090 CompressSectionObj
.CompType
= Type
4091 # Recursive sections...
4093 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
4094 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
4095 if not IsEncapsulate
and not IsLeaf
:
4098 if not self
.__IsToken
( "}"):
4099 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4100 Rule
.SectionList
.append(CompressSectionObj
)
4104 elif self
.__IsKeyword
( "GUIDED"):
4106 if self
.__GetNextGuid
():
4107 GuidValue
= self
.__Token
4109 if self
.__IsKeyword
( "$(NAMED_GUID)"):
4110 GuidValue
= self
.__Token
4112 AttribDict
= self
.__GetGuidAttrib
()
4114 if not self
.__IsToken
("{"):
4115 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4116 GuidSectionObj
= GuidSection
.GuidSection()
4117 GuidSectionObj
.NameGuid
= GuidValue
4118 GuidSectionObj
.SectionType
= "GUIDED"
4119 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
4120 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
4121 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
4125 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
4126 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
4127 if not IsEncapsulate
and not IsLeaf
:
4130 if not self
.__IsToken
( "}"):
4131 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4132 Rule
.SectionList
.append(GuidSectionObj
)
4138 ## __GetVtf() method
4140 # Get VTF section contents and store its data into VTF list of self.Profile
4142 # @param self The object pointer
4143 # @retval True Successfully find a VTF
4144 # @retval False Not able to find a VTF
4148 if not self
.__GetNextToken
():
4151 S
= self
.__Token
.upper()
4152 if S
.startswith("[") and not S
.startswith("[VTF."):
4153 self
.SectionParser(S
)
4158 if not self
.__IsToken
("[VTF.", True):
4159 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4160 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
4161 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
4162 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
4164 if not self
.__SkipToToken
("."):
4165 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
4167 Arch
= self
.__SkippedChars
.rstrip(".").upper()
4168 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4169 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
4171 if not self
.__GetNextWord
():
4172 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
4173 Name
= self
.__Token
.upper()
4176 VtfObj
.UiName
= Name
4177 VtfObj
.KeyArch
= Arch
4179 if self
.__IsToken
(","):
4180 if not self
.__GetNextWord
():
4181 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
4182 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4183 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4184 VtfObj
.ArchList
= self
.__Token
.upper()
4186 if not self
.__IsToken
( "]"):
4187 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4189 if self
.__IsKeyword
("IA32_RST_BIN"):
4190 if not self
.__IsToken
("="):
4191 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4193 if not self
.__GetNextToken
():
4194 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
4196 VtfObj
.ResetBin
= self
.__Token
4197 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4198 #check for file path
4199 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4201 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4203 while self
.__GetComponentStatement
(VtfObj
):
4206 self
.Profile
.VtfList
.append(VtfObj
)
4209 ## __GetComponentStatement() method
4211 # Get components in VTF
4213 # @param self The object pointer
4214 # @param VtfObj for whom component is got
4215 # @retval True Successfully find a component
4216 # @retval False Not able to find a component
4218 def __GetComponentStatement(self
, VtfObj
):
4220 if not self
.__IsKeyword
("COMP_NAME"):
4223 if not self
.__IsToken
("="):
4224 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4226 if not self
.__GetNextWord
():
4227 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
4229 CompStatementObj
= ComponentStatement
.ComponentStatement()
4230 CompStatementObj
.CompName
= self
.__Token
4232 if not self
.__IsKeyword
("COMP_LOC"):
4233 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
4235 if not self
.__IsToken
("="):
4236 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4238 CompStatementObj
.CompLoc
= ""
4239 if self
.__GetNextWord
():
4240 CompStatementObj
.CompLoc
= self
.__Token
4241 if self
.__IsToken
('|'):
4242 if not self
.__GetNextWord
():
4243 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
4245 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
4246 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4248 CompStatementObj
.FilePos
= self
.__Token
4250 self
.CurrentLineNumber
+= 1
4251 self
.CurrentOffsetWithinLine
= 0
4253 if not self
.__IsKeyword
("COMP_TYPE"):
4254 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
4256 if not self
.__IsToken
("="):
4257 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4259 if not self
.__GetNextToken
():
4260 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
4261 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
4262 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
4263 not self
.__Token
[2] in string
.hexdigits
or not self
.__Token
[-1] in string
.hexdigits
:
4264 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4265 CompStatementObj
.CompType
= self
.__Token
4267 if not self
.__IsKeyword
("COMP_VER"):
4268 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
4270 if not self
.__IsToken
("="):
4271 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4273 if not self
.__GetNextToken
():
4274 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
4276 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
4277 if Pattern
.match(self
.__Token
) is None:
4278 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4279 CompStatementObj
.CompVer
= self
.__Token
4281 if not self
.__IsKeyword
("COMP_CS"):
4282 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
4284 if not self
.__IsToken
("="):
4285 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4287 if not self
.__GetNextToken
():
4288 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
4289 if self
.__Token
not in ("1", "0"):
4290 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4291 CompStatementObj
.CompCs
= self
.__Token
4294 if not self
.__IsKeyword
("COMP_BIN"):
4295 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
4297 if not self
.__IsToken
("="):
4298 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4300 if not self
.__GetNextToken
():
4301 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
4303 CompStatementObj
.CompBin
= self
.__Token
4304 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4305 #check for file path
4306 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4308 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4310 if not self
.__IsKeyword
("COMP_SYM"):
4311 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
4313 if not self
.__IsToken
("="):
4314 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4316 if not self
.__GetNextToken
():
4317 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
4319 CompStatementObj
.CompSym
= self
.__Token
4320 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
4321 #check for file path
4322 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4324 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4326 if not self
.__IsKeyword
("COMP_SIZE"):
4327 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
4329 if not self
.__IsToken
("="):
4330 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4332 if self
.__IsToken
("-"):
4333 CompStatementObj
.CompSize
= self
.__Token
4334 elif self
.__GetNextDecimalNumber
():
4335 CompStatementObj
.CompSize
= self
.__Token
4336 elif self
.__GetNextHexNumber
():
4337 CompStatementObj
.CompSize
= self
.__Token
4339 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4341 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
4344 ## __GetOptionRom() method
4346 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
4348 # @param self The object pointer
4349 # @retval True Successfully find a OptionROM
4350 # @retval False Not able to find a OptionROM
4352 def __GetOptionRom(self
):
4354 if not self
.__GetNextToken
():
4357 S
= self
.__Token
.upper()
4358 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
4359 self
.SectionParser(S
)
4364 if not self
.__IsToken
("[OptionRom.", True):
4365 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4367 OptRomName
= self
.__GetUiName
()
4369 if not self
.__IsToken
( "]"):
4370 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4372 OptRomObj
= OptionRom
.OPTIONROM()
4373 OptRomObj
.DriverName
= OptRomName
4374 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
4377 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
4378 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
4379 if not isInf
and not isFile
:
4384 ## __GetOptRomInfStatement() method
4386 # Get INF statements
4388 # @param self The object pointer
4389 # @param Obj for whom inf statement is got
4390 # @retval True Successfully find inf statement
4391 # @retval False Not able to find inf statement
4393 def __GetOptRomInfStatement(self
, Obj
):
4395 if not self
.__IsKeyword
( "INF"):
4398 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
4399 self
.__GetInfOptions
( ffsInf
)
4401 if not self
.__GetNextToken
():
4402 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
4403 ffsInf
.InfFileName
= self
.__Token
4404 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4405 #check for file path
4406 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4408 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4410 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4411 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4412 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4413 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4415 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
4416 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
4418 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
4420 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
4423 self
.__GetOptRomOverrides
(ffsInf
)
4425 Obj
.FfsList
.append(ffsInf
)
4428 ## __GetOptRomOverrides() method
4430 # Get overrides for OptROM INF & FILE
4432 # @param self The object pointer
4433 # @param FfsInfObj for whom overrides is got
4435 def __GetOptRomOverrides(self
, Obj
):
4436 if self
.__IsToken
('{'):
4437 Overrides
= OptionRom
.OverrideAttribs()
4439 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4440 if not self
.__IsToken
( "="):
4441 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4442 if not self
.__GetNextHexNumber
():
4443 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4444 Overrides
.PciVendorId
= self
.__Token
4447 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4448 if not self
.__IsToken
( "="):
4449 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4450 if not self
.__GetNextHexNumber
():
4451 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4452 Overrides
.PciClassCode
= self
.__Token
4455 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4456 if not self
.__IsToken
( "="):
4457 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4458 if not self
.__GetNextHexNumber
():
4459 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4461 Overrides
.PciDeviceId
= self
.__Token
4464 if self
.__IsKeyword
( "PCI_REVISION"):
4465 if not self
.__IsToken
( "="):
4466 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4467 if not self
.__GetNextHexNumber
():
4468 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4469 Overrides
.PciRevision
= self
.__Token
4472 if self
.__IsKeyword
( "PCI_COMPRESS"):
4473 if not self
.__IsToken
( "="):
4474 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4475 if not self
.__GetNextToken
():
4476 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4477 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4480 if self
.__IsToken
( "}"):
4483 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4485 Obj
.OverrideAttribs
= Overrides
4487 ## __GetOptRomFileStatement() method
4489 # Get FILE statements
4491 # @param self The object pointer
4492 # @param Obj for whom FILE statement is got
4493 # @retval True Successfully find FILE statement
4494 # @retval False Not able to find FILE statement
4496 def __GetOptRomFileStatement(self
, Obj
):
4498 if not self
.__IsKeyword
( "FILE"):
4501 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4503 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4504 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4505 FfsFileObj
.FileType
= self
.__Token
4507 if not self
.__GetNextToken
():
4508 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4509 FfsFileObj
.FileName
= self
.__Token
4510 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4511 #check for file path
4512 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4514 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4516 if FfsFileObj
.FileType
== 'EFI':
4517 self
.__GetOptRomOverrides
(FfsFileObj
)
4519 Obj
.FfsList
.append(FfsFileObj
)
4523 ## __GetCapInFd() method
4525 # Get Cap list contained in FD
4527 # @param self The object pointer
4528 # @param FdName FD name
4529 # @retval CapList List of Capsule in FD
4531 def __GetCapInFd (self
, FdName
):
4534 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4535 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4536 for elementRegion
in FdObj
.RegionList
:
4537 if elementRegion
.RegionType
== 'CAPSULE':
4538 for elementRegionData
in elementRegion
.RegionDataList
:
4539 if elementRegionData
.endswith(".cap"):
4541 if elementRegionData
is not None and elementRegionData
.upper() not in CapList
:
4542 CapList
.append(elementRegionData
.upper())
4545 ## __GetReferencedFdCapTuple() method
4547 # Get FV and FD list referenced by a capsule image
4549 # @param self The object pointer
4550 # @param CapObj Capsule section to be searched
4551 # @param RefFdList referenced FD by section
4552 # @param RefFvList referenced FV by section
4554 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4556 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4557 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
is not None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4558 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4559 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
is not None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4560 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4561 elif CapsuleDataObj
.Ffs
is not None:
4562 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4563 if CapsuleDataObj
.Ffs
.FvName
is not None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4564 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4565 elif CapsuleDataObj
.Ffs
.FdName
is not None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4566 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4568 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4570 ## __GetFvInFd() method
4572 # Get FV list contained in FD
4574 # @param self The object pointer
4575 # @param FdName FD name
4576 # @retval FvList list of FV in FD
4578 def __GetFvInFd (self
, FdName
):
4581 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4582 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4583 for elementRegion
in FdObj
.RegionList
:
4584 if elementRegion
.RegionType
== 'FV':
4585 for elementRegionData
in elementRegion
.RegionDataList
:
4586 if elementRegionData
.endswith(".fv"):
4588 if elementRegionData
is not None and elementRegionData
.upper() not in FvList
:
4589 FvList
.append(elementRegionData
.upper())
4592 ## __GetReferencedFdFvTuple() method
4594 # Get FD and FV list referenced by a FFS file
4596 # @param self The object pointer
4597 # @param FfsFile contains sections to be searched
4598 # @param RefFdList referenced FD by section
4599 # @param RefFvList referenced FV by section
4601 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4603 for FfsObj
in FvObj
.FfsList
:
4604 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4605 if FfsObj
.FvName
is not None and FfsObj
.FvName
.upper() not in RefFvList
:
4606 RefFvList
.append(FfsObj
.FvName
.upper())
4607 elif FfsObj
.FdName
is not None and FfsObj
.FdName
.upper() not in RefFdList
:
4608 RefFdList
.append(FfsObj
.FdName
.upper())
4610 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4612 ## __GetReferencedFdFvTupleFromSection() method
4614 # Get FD and FV list referenced by a FFS section
4616 # @param self The object pointer
4617 # @param FfsFile contains sections to be searched
4618 # @param FdList referenced FD by section
4619 # @param FvList referenced FV by section
4621 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4624 SectionStack
.extend(FfsFile
.SectionList
)
4625 while SectionStack
!= []:
4626 SectionObj
= SectionStack
.pop()
4627 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4628 if SectionObj
.FvName
is not None and SectionObj
.FvName
.upper() not in FvList
:
4629 FvList
.append(SectionObj
.FvName
.upper())
4630 if SectionObj
.Fv
is not None and SectionObj
.Fv
.UiFvName
is not None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4631 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4632 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4634 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4635 SectionStack
.extend(SectionObj
.SectionList
)
4637 ## CycleReferenceCheck() method
4639 # Check whether cycle reference exists in FDF
4641 # @param self The object pointer
4642 # @retval True cycle reference exists
4643 # @retval False Not exists cycle reference
4645 def CycleReferenceCheck(self
):
4647 # Check the cycle between FV and FD image
4649 MaxLength
= len (self
.Profile
.FvDict
)
4650 for FvName
in self
.Profile
.FvDict
.keys():
4651 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4653 RefFvStack
.append(FvName
)
4657 while RefFvStack
!= [] and Index
< MaxLength
:
4659 FvNameFromStack
= RefFvStack
.pop()
4660 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4661 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4667 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4669 for RefFdName
in RefFdList
:
4670 if RefFdName
in FdAnalyzedList
:
4673 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4674 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4675 if FvInFdList
!= []:
4676 for FvNameInFd
in FvInFdList
:
4677 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4678 if FvNameInFd
not in RefFvStack
:
4679 RefFvStack
.append(FvNameInFd
)
4681 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4682 EdkLogger
.info(LogStr
)
4684 FdAnalyzedList
.append(RefFdName
)
4686 for RefFvName
in RefFvList
:
4687 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4688 if RefFvName
not in RefFvStack
:
4689 RefFvStack
.append(RefFvName
)
4691 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4692 EdkLogger
.info(LogStr
)
4696 # Check the cycle between Capsule and FD image
4698 MaxLength
= len (self
.Profile
.CapsuleDict
)
4699 for CapName
in self
.Profile
.CapsuleDict
.keys():
4701 # Capsule image to be checked.
4703 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4705 RefCapStack
.append(CapName
)
4710 while RefCapStack
!= [] and Index
< MaxLength
:
4712 CapNameFromStack
= RefCapStack
.pop()
4713 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4714 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4720 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4724 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4725 for RefFdName
in RefFdList
:
4726 if RefFdName
in FdAnalyzedList
:
4729 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4730 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4731 if CapInFdList
!= []:
4732 for CapNameInFd
in CapInFdList
:
4733 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4734 if CapNameInFd
not in RefCapStack
:
4735 RefCapStack
.append(CapNameInFd
)
4737 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4738 EdkLogger
.info(LogStr
)
4741 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4742 if FvInFdList
!= []:
4743 for FvNameInFd
in FvInFdList
:
4744 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4745 if FvNameInFd
not in RefFvList
:
4746 RefFvList
.append(FvNameInFd
)
4748 FdAnalyzedList
.append(RefFdName
)
4750 # the number of the parsed FV and FD image
4752 FvListLength
= len (RefFvList
)
4753 FdListLength
= len (RefFdList
)
4754 for RefFvName
in RefFvList
:
4755 if RefFvName
in FvAnalyzedList
:
4757 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4758 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4759 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4762 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4763 FvAnalyzedList
.append(RefFvName
)
4767 def GetAllIncludedFile (self
):
4768 global AllIncludeFileList
4769 return AllIncludeFileList
4771 if __name__
== "__main__":
4774 test_file
= sys
.argv
[1]
4775 except IndexError, v
:
4776 print "Usage: %s filename" % sys
.argv
[0]
4779 parser
= FdfParser(test_file
)
4782 parser
.CycleReferenceCheck()