4 # Copyright (c) 2007 - 2016, 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
46 from GenFdsGlobalVariable
import GenFdsGlobalVariable
47 from Common
.BuildToolError
import *
48 from Common
import EdkLogger
49 from Common
.Misc
import PathClass
50 from Common
.String
import NormPath
51 import Common
.GlobalData
as GlobalData
52 from Common
.Expression
import *
53 from Common
import GlobalData
54 from Common
.String
import ReplaceMacro
56 from Common
.Misc
import tdict
57 from Common
.MultipleWorkspace
import MultipleWorkspace
as mws
58 import Common
.LongFilePathOs
as os
59 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
60 from Capsule
import EFI_CERT_TYPE_PKCS7_GUID
61 from Capsule
import EFI_CERT_TYPE_RSA2048_SHA256_GUID
63 ##define T_CHAR_SPACE ' '
64 ##define T_CHAR_NULL '\0'
65 ##define T_CHAR_CR '\r'
66 ##define T_CHAR_TAB '\t'
67 ##define T_CHAR_LF '\n'
68 ##define T_CHAR_SLASH '/'
69 ##define T_CHAR_BACKSLASH '\\'
70 ##define T_CHAR_DOUBLE_QUOTE '\"'
71 ##define T_CHAR_SINGLE_QUOTE '\''
72 ##define T_CHAR_STAR '*'
73 ##define T_CHAR_HASH '#'
75 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
76 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
77 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
79 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
81 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
82 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
83 RegionOffsetPcdPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*$")
84 ShortcutPcdPattern
= re
.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
86 AllIncludeFileList
= []
88 # Get the closest parent
89 def GetParentAtLine (Line
):
90 for Profile
in AllIncludeFileList
:
91 if Profile
.IsLineInFile(Line
):
96 def IsValidInclude (File
, Line
):
97 for Profile
in AllIncludeFileList
:
98 if Profile
.IsLineInFile(Line
) and Profile
.FileName
== File
:
103 def GetRealFileLine (File
, Line
):
106 for Profile
in AllIncludeFileList
:
107 if Profile
.IsLineInFile(Line
):
108 return Profile
.GetLineInFile(Line
)
109 elif Line
>= Profile
.InsertStartLineNumber
and Profile
.Level
== 1:
110 InsertedLines
+= Profile
.GetTotalLines()
112 return (File
, Line
- InsertedLines
)
114 ## The exception class that used to report error messages when parsing FDF
116 # Currently the "ToolName" is set to be "FDF Parser".
118 class Warning (Exception):
121 # @param self The object pointer
122 # @param Str The message to record
123 # @param File The FDF name
124 # @param Line The Line number that error occurs
126 def __init__(self
, Str
, File
= None, Line
= None):
128 FileLineTuple
= GetRealFileLine(File
, Line
)
129 self
.FileName
= FileLineTuple
[0]
130 self
.LineNumber
= FileLineTuple
[1]
131 self
.OriginalLineNumber
= Line
133 self
.ToolName
= 'FdfParser'
138 ## The MACRO class that used to record macro value data when parsing include file
144 # @param self The object pointer
145 # @param FileName The file that to be parsed
147 def __init__(self
, FileName
, Line
):
148 self
.FileName
= FileName
149 self
.DefinedAtLine
= Line
150 self
.MacroName
= None
151 self
.MacroValue
= None
153 ## The Include file content class that used to record file data when parsing include file
155 # May raise Exception when opening file.
157 class IncludeFileProfile
:
160 # @param self The object pointer
161 # @param FileName The file that to be parsed
163 def __init__(self
, FileName
):
164 self
.FileName
= FileName
165 self
.FileLinesList
= []
167 fsock
= open(FileName
, "rb", 0)
169 self
.FileLinesList
= fsock
.readlines()
174 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
176 self
.InsertStartLineNumber
= None
177 self
.InsertAdjust
= 0
178 self
.IncludeFileList
= []
179 self
.Level
= 1 # first level include file
181 def GetTotalLines(self
):
182 TotalLines
= self
.InsertAdjust
+ len(self
.FileLinesList
)
184 for Profile
in self
.IncludeFileList
:
185 TotalLines
+= Profile
.GetTotalLines()
189 def IsLineInFile(self
, Line
):
190 if Line
>= self
.InsertStartLineNumber
and Line
< self
.InsertStartLineNumber
+ self
.GetTotalLines():
195 def GetLineInFile(self
, Line
):
196 if not self
.IsLineInFile (Line
):
197 return (self
.FileName
, -1)
199 InsertedLines
= self
.InsertStartLineNumber
201 for Profile
in self
.IncludeFileList
:
202 if Profile
.IsLineInFile(Line
):
203 return Profile
.GetLineInFile(Line
)
204 elif Line
>= Profile
.InsertStartLineNumber
:
205 InsertedLines
+= Profile
.GetTotalLines()
207 return (self
.FileName
, Line
- InsertedLines
+ 1)
211 ## The FDF content class that used to record file data when parsing FDF
213 # May raise Exception when opening file.
218 # @param self The object pointer
219 # @param FileName The file that to be parsed
221 def __init__(self
, FileName
):
222 self
.FileLinesList
= []
224 fsock
= open(FileName
, "rb", 0)
226 self
.FileLinesList
= fsock
.readlines()
231 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
236 self
.InfDict
= {'ArchTBD':[]}
237 # ECC will use this Dict and List information
238 self
.PcdFileLineDict
= {}
239 self
.InfFileLineList
= []
242 self
.FdNameNotSet
= False
244 self
.CapsuleDict
= {}
248 self
.FmpPayloadDict
= {}
250 ## The syntax parser for FDF
252 # PreprocessFile method should be called prior to ParseFile
253 # CycleReferenceCheck method can detect cycles in FDF contents
255 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
256 # Get*** procedures mean these procedures will make judgement on current token only.
261 # @param self The object pointer
262 # @param FileName The file that to be parsed
264 def __init__(self
, FileName
):
265 self
.Profile
= FileProfile(FileName
)
266 self
.FileName
= FileName
267 self
.CurrentLineNumber
= 1
268 self
.CurrentOffsetWithinLine
= 0
269 self
.CurrentFdName
= None
270 self
.CurrentFvName
= None
272 self
.__SkippedChars
= ""
273 GlobalData
.gFdfParser
= self
275 # Used to section info
276 self
.__CurSection
= []
277 # Key: [section name, UI name, arch]
278 # Value: {MACRO_NAME : MACRO_VALUE}
279 self
.__MacroDict
= tdict(True, 3)
282 self
.__WipeOffArea
= []
283 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
284 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
286 ## __IsWhiteSpace() method
288 # Whether char at current FileBufferPos is whitespace
290 # @param self The object pointer
291 # @param Char The char to test
292 # @retval True The char is a kind of white space
293 # @retval False The char is NOT a kind of white space
295 def __IsWhiteSpace(self
, Char
):
296 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
301 ## __SkipWhiteSpace() method
303 # Skip white spaces from current char, return number of chars skipped
305 # @param self The object pointer
306 # @retval Count The number of chars skipped
308 def __SkipWhiteSpace(self
):
310 while not self
.__EndOfFile
():
312 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
313 self
.__SkippedChars
+= str(self
.__CurrentChar
())
320 ## __EndOfFile() method
322 # Judge current buffer pos is at file end
324 # @param self The object pointer
325 # @retval True Current File buffer position is at file end
326 # @retval False Current File buffer position is NOT at file end
328 def __EndOfFile(self
):
329 NumberOfLines
= len(self
.Profile
.FileLinesList
)
330 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
331 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
333 elif self
.CurrentLineNumber
> NumberOfLines
:
338 ## __EndOfLine() method
340 # Judge current buffer pos is at line end
342 # @param self The object pointer
343 # @retval True Current File buffer position is at line end
344 # @retval False Current File buffer position is NOT at line end
346 def __EndOfLine(self
):
347 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
349 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
350 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
357 # Reset file data buffer to the initial state
359 # @param self The object pointer
360 # @param DestLine Optional new destination line number.
361 # @param DestOffset Optional new destination offset.
363 def Rewind(self
, DestLine
= 1, DestOffset
= 0):
364 self
.CurrentLineNumber
= DestLine
365 self
.CurrentOffsetWithinLine
= DestOffset
367 ## __UndoOneChar() method
369 # Go back one char in the file buffer
371 # @param self The object pointer
372 # @retval True Successfully go back one char
373 # @retval False Not able to go back one char as file beginning reached
375 def __UndoOneChar(self
):
377 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
379 elif self
.CurrentOffsetWithinLine
== 0:
380 self
.CurrentLineNumber
-= 1
381 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
383 self
.CurrentOffsetWithinLine
-= 1
386 ## __GetOneChar() method
388 # Move forward one char in the file buffer
390 # @param self The object pointer
392 def __GetOneChar(self
):
393 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
394 self
.CurrentLineNumber
+= 1
395 self
.CurrentOffsetWithinLine
= 0
397 self
.CurrentOffsetWithinLine
+= 1
399 ## __CurrentChar() method
401 # Get the char pointed to by the file buffer pointer
403 # @param self The object pointer
404 # @retval Char Current char
406 def __CurrentChar(self
):
407 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
409 ## __NextChar() method
411 # Get the one char pass the char pointed to by the file buffer pointer
413 # @param self The object pointer
414 # @retval Char Next char
416 def __NextChar(self
):
417 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
418 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
420 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
422 ## __SetCurrentCharValue() method
424 # Modify the value of current char
426 # @param self The object pointer
427 # @param Value The new value of current char
429 def __SetCurrentCharValue(self
, Value
):
430 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
432 ## __CurrentLine() method
434 # Get the list that contains current line contents
436 # @param self The object pointer
437 # @retval List current line contents
439 def __CurrentLine(self
):
440 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
442 def __StringToList(self
):
443 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
444 self
.Profile
.FileLinesList
[-1].append(' ')
446 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
447 if StartPos
[0] == EndPos
[0]:
449 while Offset
<= EndPos
[1]:
450 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
455 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
456 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
460 while Line
< EndPos
[0]:
462 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
463 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
468 while Offset
<= EndPos
[1]:
469 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
473 def __GetMacroName(self
):
474 if not self
.__GetNextToken
():
475 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
476 MacroName
= self
.__Token
478 if MacroName
.startswith('!'):
480 MacroName
= MacroName
[1:].strip()
482 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
483 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
484 self
.FileName
, self
.CurrentLineNumber
)
485 MacroName
= MacroName
[2:-1]
486 return MacroName
, NotFlag
488 def __SetMacroValue(self
, Macro
, Value
):
489 if not self
.__CurSection
:
493 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
494 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
496 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
497 MacroDict
[Macro
] = Value
499 def __GetMacroValue(self
, Macro
):
501 if Macro
in GlobalData
.gCommandLineDefines
:
502 return GlobalData
.gCommandLineDefines
[Macro
]
503 if Macro
in GlobalData
.gGlobalDefines
:
504 return GlobalData
.gGlobalDefines
[Macro
]
506 if self
.__CurSection
:
507 MacroDict
= self
.__MacroDict
[
508 self
.__CurSection
[0],
509 self
.__CurSection
[1],
512 if MacroDict
and Macro
in MacroDict
:
513 return MacroDict
[Macro
]
516 if Macro
in GlobalData
.gPlatformDefines
:
517 return GlobalData
.gPlatformDefines
[Macro
]
520 def __SectionHeaderParser(self
, Section
):
522 # [FD.UiName]: use dummy instead if UI name is optional
525 # [Rule]: don't take rule section into account, macro is not allowed in this section
526 # [VTF.arch.UiName, arch]
527 # [OptionRom.DriverName]
528 self
.__CurSection
= []
529 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
530 ItemList
= Section
.split('.')
532 if Item
== '' or Item
== 'RULE':
535 if Item
== 'DEFINES':
536 self
.__CurSection
= ['COMMON', 'COMMON', 'COMMON']
537 elif Item
== 'VTF' and len(ItemList
) == 3:
539 Pos
= UiName
.find(',')
541 UiName
= UiName
[:Pos
]
542 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
543 elif len(ItemList
) > 1:
544 self
.__CurSection
= [ItemList
[0], ItemList
[1], 'COMMON']
545 elif len(ItemList
) > 0:
546 self
.__CurSection
= [ItemList
[0], 'DUMMY', 'COMMON']
548 ## PreprocessFile() method
550 # Preprocess file contents, replace comments with spaces.
551 # In the end, rewind the file buffer pointer to the beginning
552 # BUGBUG: No !include statement processing contained in this procedure
553 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
555 # @param self The object pointer
557 def PreprocessFile(self
):
561 DoubleSlashComment
= False
563 # HashComment in quoted string " " is ignored.
566 while not self
.__EndOfFile
():
568 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
569 InString
= not InString
570 # meet new line, then no longer in a comment for // and '#'
571 if self
.__CurrentChar
() == T_CHAR_LF
:
572 self
.CurrentLineNumber
+= 1
573 self
.CurrentOffsetWithinLine
= 0
574 if InComment
and DoubleSlashComment
:
576 DoubleSlashComment
= False
577 if InComment
and HashComment
:
580 # check for */ comment end
581 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
582 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
584 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
587 # set comments to spaces
589 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
591 # check for // comment
592 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
594 DoubleSlashComment
= True
595 # check for '#' comment
596 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
599 # check for /* comment start
600 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
601 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
603 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
609 # restore from ListOfList to ListOfString
610 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
613 ## PreprocessIncludeFile() method
615 # Preprocess file contents, replace !include statements with file contents.
616 # In the end, rewind the file buffer pointer to the beginning
618 # @param self The object pointer
620 def PreprocessIncludeFile(self
):
621 # nested include support
623 while self
.__GetNextToken
():
625 if self
.__Token
== '!include':
627 IncludeLine
= self
.CurrentLineNumber
628 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
629 if not self
.__GetNextToken
():
630 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
631 IncFileName
= self
.__Token
633 for Macro
in ['WORKSPACE', 'ECP_SOURCE', 'EFI_SOURCE', 'EDK_SOURCE']:
634 MacroVal
= self
.__GetMacroValue
(Macro
)
636 __IncludeMacros
[Macro
] = MacroVal
639 IncludedFile
= NormPath(ReplaceMacro(IncFileName
, __IncludeMacros
, RaiseError
=True))
641 raise Warning("only these system environment variables are permitted to start the path of the included file: "
642 "$(WORKSPACE), $(ECP_SOURCE), $(EFI_SOURCE), $(EDK_SOURCE)",
643 self
.FileName
, self
.CurrentLineNumber
)
645 # First search the include file under the same directory as FDF file
647 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
648 ErrorCode
= IncludedFile1
.Validate()[0]
651 # Then search the include file under the same directory as DSC file
654 if GenFdsGlobalVariable
.ActivePlatform
:
655 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
656 elif GlobalData
.gActivePlatform
:
657 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
658 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
659 ErrorCode
= IncludedFile1
.Validate()[0]
662 # Also search file under the WORKSPACE directory
664 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
665 ErrorCode
= IncludedFile1
.Validate()[0]
667 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
),
668 self
.FileName
, self
.CurrentLineNumber
)
670 if not IsValidInclude (IncludedFile1
.Path
, self
.CurrentLineNumber
):
671 raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1
.Path
), self
.FileName
, self
.CurrentLineNumber
)
673 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
675 CurrentLine
= self
.CurrentLineNumber
676 CurrentOffset
= self
.CurrentOffsetWithinLine
677 # list index of the insertion, note that line number is 'CurrentLine + 1'
678 InsertAtLine
= CurrentLine
679 ParentProfile
= GetParentAtLine (CurrentLine
)
680 if ParentProfile
!= None:
681 ParentProfile
.IncludeFileList
.insert(0, IncFileProfile
)
682 IncFileProfile
.Level
= ParentProfile
.Level
+ 1
683 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
684 # deal with remaining portions after "!include filename", if exists.
685 if self
.__GetNextToken
():
686 if self
.CurrentLineNumber
== CurrentLine
:
687 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
688 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
689 IncFileProfile
.InsertAdjust
+= 1
690 self
.CurrentLineNumber
+= 1
691 self
.CurrentOffsetWithinLine
= 0
693 for Line
in IncFileProfile
.FileLinesList
:
694 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
695 self
.CurrentLineNumber
+= 1
698 # reversely sorted to better determine error in file
699 AllIncludeFileList
.insert(0, IncFileProfile
)
701 # comment out the processed include file statement
702 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
703 TempList
.insert(IncludeOffset
, '#')
704 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
705 if Processed
: # Nested and back-to-back support
706 self
.Rewind(DestLine
= IncFileProfile
.InsertStartLineNumber
- 1)
711 def __GetIfListCurrentItemStat(self
, IfList
):
721 ## PreprocessConditionalStatement() method
723 # Preprocess conditional statement.
724 # In the end, rewind the file buffer pointer to the beginning
726 # @param self The object pointer
728 def PreprocessConditionalStatement(self
):
729 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
733 while self
.__GetNextToken
():
734 # Determine section name and the location dependent macro
735 if self
.__GetIfListCurrentItemStat
(IfList
):
736 if self
.__Token
.startswith('['):
737 Header
= self
.__Token
738 if not self
.__Token
.endswith(']'):
739 self
.__SkipToToken
(']')
740 Header
+= self
.__SkippedChars
741 if Header
.find('$(') != -1:
742 raise Warning("macro cannot be used in section header", self
.FileName
, self
.CurrentLineNumber
)
743 self
.__SectionHeaderParser
(Header
)
745 # Replace macros except in RULE section or out of section
746 elif self
.__CurSection
and ReplacedLine
!= self
.CurrentLineNumber
:
747 ReplacedLine
= self
.CurrentLineNumber
749 CurLine
= self
.Profile
.FileLinesList
[ReplacedLine
- 1]
751 StartPos
= CurLine
.find('$(', PreIndex
)
752 EndPos
= CurLine
.find(')', StartPos
+2)
753 while StartPos
!= -1 and EndPos
!= -1 and self
.__Token
not in ['!ifdef', '!ifndef', '!if', '!elseif']:
754 MacroName
= CurLine
[StartPos
+2 : EndPos
]
755 MacorValue
= self
.__GetMacroValue
(MacroName
)
756 if MacorValue
!= None:
757 CurLine
= CurLine
.replace('$(' + MacroName
+ ')', MacorValue
, 1)
758 if MacorValue
.find('$(') != -1:
761 PreIndex
= StartPos
+ len(MacorValue
)
763 PreIndex
= EndPos
+ 1
764 StartPos
= CurLine
.find('$(', PreIndex
)
765 EndPos
= CurLine
.find(')', StartPos
+2)
766 self
.Profile
.FileLinesList
[ReplacedLine
- 1] = CurLine
769 if self
.__Token
== 'DEFINE':
770 if self
.__GetIfListCurrentItemStat
(IfList
):
771 if not self
.__CurSection
:
772 raise Warning("macro cannot be defined in Rule section or out of section", self
.FileName
, self
.CurrentLineNumber
)
773 DefineLine
= self
.CurrentLineNumber
- 1
774 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
775 if not self
.__GetNextToken
():
776 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
778 if not self
.__IsToken
( "="):
779 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
781 Value
= self
.__GetExpression
()
782 self
.__SetMacroValue
(Macro
, Value
)
783 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
784 elif self
.__Token
== 'SET':
785 if not self
.__GetIfListCurrentItemStat
(IfList
):
787 SetLine
= self
.CurrentLineNumber
- 1
788 SetOffset
= self
.CurrentOffsetWithinLine
- len('SET')
789 PcdPair
= self
.__GetNextPcdName
()
790 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
791 if not self
.__IsToken
( "="):
792 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
794 Value
= self
.__GetExpression
()
795 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
797 self
.__PcdDict
[PcdName
] = Value
799 self
.Profile
.PcdDict
[PcdPair
] = Value
800 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
801 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
803 self
.__WipeOffArea
.append(((SetLine
, SetOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
804 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
805 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
806 IfList
.append([IfStartPos
, None, None])
808 CondLabel
= self
.__Token
809 Expression
= self
.__GetExpression
()
811 if CondLabel
== '!if':
812 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
814 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
815 if CondLabel
== '!ifndef':
816 ConditionSatisfied
= not ConditionSatisfied
818 BranchDetermined
= ConditionSatisfied
819 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
820 if ConditionSatisfied
:
821 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
822 elif self
.__Token
in ('!elseif', '!else'):
823 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
825 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
828 IfList
[-1] = [ElseStartPos
, False, True]
829 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
831 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
832 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
833 if self
.__Token
== '!elseif':
834 Expression
= self
.__GetExpression
()
835 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
836 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
840 IfList
[-1][1] = False
843 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
844 elif self
.__Token
== '!endif':
846 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
848 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
850 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
853 elif not IfList
: # Don't use PCDs inside conditional directive
854 if self
.CurrentLineNumber
<= RegionLayoutLine
:
855 # Don't try the same line twice
857 SetPcd
= ShortcutPcdPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
859 self
.__PcdDict
[SetPcd
.group('name')] = SetPcd
.group('value')
860 RegionLayoutLine
= self
.CurrentLineNumber
862 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
864 RegionLayoutLine
= self
.CurrentLineNumber
866 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
867 if not RegionSizeGuid
:
868 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
870 self
.__PcdDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
871 self
.__PcdDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
872 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
875 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
878 def __CollectMacroPcd(self
):
882 MacroDict
.update(GlobalData
.gPlatformPcds
)
883 MacroDict
.update(self
.__PcdDict
)
886 MacroDict
.update(GlobalData
.gPlatformDefines
)
888 if self
.__CurSection
:
890 ScopeMacro
= self
.__MacroDict
['COMMON', 'COMMON', 'COMMON']
892 MacroDict
.update(ScopeMacro
)
895 ScopeMacro
= self
.__MacroDict
[
896 self
.__CurSection
[0],
897 self
.__CurSection
[1],
901 MacroDict
.update(ScopeMacro
)
903 MacroDict
.update(GlobalData
.gGlobalDefines
)
904 MacroDict
.update(GlobalData
.gCommandLineDefines
)
909 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
910 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
911 MacroPcdDict
= self
.__CollectMacroPcd
()
915 return ValueExpression(Expression
, MacroPcdDict
)(True)
917 return ValueExpression(Expression
, MacroPcdDict
)()
918 except WrnExpression
, Excpt
:
920 # Catch expression evaluation warning here. We need to report
921 # the precise number of line and return the evaluation result
923 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
924 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
927 except Exception, Excpt
:
928 if hasattr(Excpt
, 'Pcd'):
929 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
930 Info
= GlobalData
.gPlatformOtherPcds
[Excpt
.Pcd
]
931 raise Warning("Cannot use this PCD (%s) in an expression as"
932 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
933 " of the DSC file (%s), and it is currently defined in this section:"
934 " %s, line #: %d." % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE'], Info
[0], Info
[1]),
937 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE']),
940 raise Warning(str(Excpt
), *FileLineTuple
)
942 if Expression
.startswith('$(') and Expression
[-1] == ')':
943 Expression
= Expression
[2:-1]
944 return Expression
in MacroPcdDict
946 ## __IsToken() method
948 # Check whether input string is found from current char position along
949 # If found, the string value is put into self.__Token
951 # @param self The object pointer
952 # @param String The string to search
953 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
954 # @retval True Successfully find string, file buffer pointer moved forward
955 # @retval False Not able to find string, file buffer pointer not changed
957 def __IsToken(self
, String
, IgnoreCase
= False):
958 self
.__SkipWhiteSpace
()
960 # Only consider the same line, no multi-line token allowed
961 StartPos
= self
.CurrentOffsetWithinLine
964 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
966 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
968 self
.CurrentOffsetWithinLine
+= len(String
)
969 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
973 ## __IsKeyword() method
975 # Check whether input keyword is found from current char position along, whole word only!
976 # If found, the string value is put into self.__Token
978 # @param self The object pointer
979 # @param Keyword The string to search
980 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
981 # @retval True Successfully find string, file buffer pointer moved forward
982 # @retval False Not able to find string, file buffer pointer not changed
984 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
985 self
.__SkipWhiteSpace
()
987 # Only consider the same line, no multi-line token allowed
988 StartPos
= self
.CurrentOffsetWithinLine
991 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
993 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
995 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
996 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
998 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
999 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1003 def __GetExpression(self
):
1004 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
1005 Index
= len(Line
) - 1
1006 while Line
[Index
] in ['\r', '\n']:
1008 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
1009 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
1010 ExpressionString
= ExpressionString
.strip()
1011 return ExpressionString
1013 ## __GetNextWord() method
1015 # Get next C name from file lines
1016 # If found, the string value is put into self.__Token
1018 # @param self The object pointer
1019 # @retval True Successfully find a C name string, file buffer pointer moved forward
1020 # @retval False Not able to find a C name string, file buffer pointer not changed
1022 def __GetNextWord(self
):
1023 self
.__SkipWhiteSpace
()
1024 if self
.__EndOfFile
():
1027 TempChar
= self
.__CurrentChar
()
1028 StartPos
= self
.CurrentOffsetWithinLine
1029 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
1031 while not self
.__EndOfLine
():
1032 TempChar
= self
.__CurrentChar
()
1033 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
1034 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
1040 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1045 ## __GetNextToken() method
1047 # Get next token unit before a seperator
1048 # If found, the string value is put into self.__Token
1050 # @param self The object pointer
1051 # @retval True Successfully find a token unit, file buffer pointer moved forward
1052 # @retval False Not able to find a token unit, file buffer pointer not changed
1054 def __GetNextToken(self
):
1055 # Skip leading spaces, if exist.
1056 self
.__SkipWhiteSpace
()
1057 if self
.__EndOfFile
():
1059 # Record the token start position, the position of the first non-space char.
1060 StartPos
= self
.CurrentOffsetWithinLine
1061 StartLine
= self
.CurrentLineNumber
1062 while StartLine
== self
.CurrentLineNumber
:
1063 TempChar
= self
.__CurrentChar
()
1064 # Try to find the end char that is not a space and not in seperator tuple.
1065 # That is, when we got a space or any char in the tuple, we got the end of token.
1066 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
1068 # if we happen to meet a seperator as the first char, we must proceed to get it.
1069 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1070 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1078 EndPos
= self
.CurrentOffsetWithinLine
1079 if self
.CurrentLineNumber
!= StartLine
:
1080 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
1081 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
1082 if StartPos
!= self
.CurrentOffsetWithinLine
:
1087 def __GetNextOp(self
):
1088 # Skip leading spaces, if exist.
1089 self
.__SkipWhiteSpace
()
1090 if self
.__EndOfFile
():
1092 # Record the token start position, the position of the first non-space char.
1093 StartPos
= self
.CurrentOffsetWithinLine
1094 while not self
.__EndOfLine
():
1095 TempChar
= self
.__CurrentChar
()
1096 # Try to find the end char that is not a space
1097 if not str(TempChar
).isspace():
1104 if StartPos
!= self
.CurrentOffsetWithinLine
:
1105 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1109 ## __GetNextGuid() method
1111 # Get next token unit before a seperator
1112 # If found, the GUID string is put into self.__Token
1114 # @param self The object pointer
1115 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1116 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1118 def __GetNextGuid(self
):
1120 if not self
.__GetNextToken
():
1122 p
= re
.compile('[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')
1123 if p
.match(self
.__Token
) != None:
1129 def __Verify(self
, Name
, Value
, Scope
):
1130 if Scope
in ['UINT64', 'UINT8']:
1133 if Value
.upper().startswith('0X'):
1134 ValueNumber
= int (Value
, 16)
1136 ValueNumber
= int (Value
)
1138 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value is not valid dec or hex number for %s." % Name
)
1140 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value can't be set to negative value for %s." % Name
)
1141 if Scope
== 'UINT64':
1142 if ValueNumber
>= 0x10000000000000000:
1143 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1144 if Scope
== 'UINT8':
1145 if ValueNumber
>= 0x100:
1146 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1149 ## __UndoToken() method
1151 # Go back one token unit in file buffer
1153 # @param self The object pointer
1155 def __UndoToken(self
):
1156 self
.__UndoOneChar
()
1157 while self
.__CurrentChar
().isspace():
1158 if not self
.__UndoOneChar
():
1163 StartPos
= self
.CurrentOffsetWithinLine
1164 CurrentLine
= self
.CurrentLineNumber
1165 while CurrentLine
== self
.CurrentLineNumber
:
1167 TempChar
= self
.__CurrentChar
()
1168 # Try to find the end char that is not a space and not in seperator tuple.
1169 # That is, when we got a space or any char in the tuple, we got the end of token.
1170 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1171 if not self
.__UndoOneChar
():
1173 # if we happen to meet a seperator as the first char, we must proceed to get it.
1174 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1175 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1182 ## __HexDigit() method
1184 # Whether char input is a Hex data bit
1186 # @param self The object pointer
1187 # @param TempChar The char to test
1188 # @retval True The char is a Hex data bit
1189 # @retval False The char is NOT a Hex data bit
1191 def __HexDigit(self
, TempChar
):
1192 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1193 or (TempChar
>= '0' and TempChar
<= '9'):
1198 def __IsHex(self
, HexStr
):
1199 if not HexStr
.upper().startswith("0X"):
1201 if len(self
.__Token
) <= 2:
1203 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1204 if len(charList
) == 0:
1208 ## __GetNextHexNumber() method
1210 # Get next HEX data before a seperator
1211 # If found, the HEX data is put into self.__Token
1213 # @param self The object pointer
1214 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1215 # @retval False Not able to find a HEX data, file buffer pointer not changed
1217 def __GetNextHexNumber(self
):
1218 if not self
.__GetNextToken
():
1220 if self
.__IsHex
(self
.__Token
):
1226 ## __GetNextDecimalNumber() method
1228 # Get next decimal data before a seperator
1229 # If found, the decimal data is put into self.__Token
1231 # @param self The object pointer
1232 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1233 # @retval False Not able to find a decimal data, file buffer pointer not changed
1235 def __GetNextDecimalNumber(self
):
1236 if not self
.__GetNextToken
():
1238 if self
.__Token
.isdigit():
1244 ## __GetNextPcdName() method
1246 # Get next PCD token space C name and PCD C name pair before a seperator
1247 # If found, the decimal data is put into self.__Token
1249 # @param self The object pointer
1250 # @retval Tuple PCD C name and PCD token space C name pair
1252 def __GetNextPcdName(self
):
1253 if not self
.__GetNextWord
():
1254 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1255 pcdTokenSpaceCName
= self
.__Token
1257 if not self
.__IsToken
( "."):
1258 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1260 if not self
.__GetNextWord
():
1261 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1262 pcdCName
= self
.__Token
1264 return (pcdCName
, pcdTokenSpaceCName
)
1266 ## __GetStringData() method
1268 # Get string contents quoted in ""
1269 # If found, the decimal data is put into self.__Token
1271 # @param self The object pointer
1272 # @retval True Successfully find a string data, file buffer pointer moved forward
1273 # @retval False Not able to find a string data, file buffer pointer not changed
1275 def __GetStringData(self
):
1276 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1278 self
.__SkipToToken
("\"")
1279 currentLineNumber
= self
.CurrentLineNumber
1281 if not self
.__SkipToToken
("\""):
1282 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1283 if currentLineNumber
!= self
.CurrentLineNumber
:
1284 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1285 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1288 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1290 self
.__SkipToToken
("\'")
1291 currentLineNumber
= self
.CurrentLineNumber
1293 if not self
.__SkipToToken
("\'"):
1294 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1295 if currentLineNumber
!= self
.CurrentLineNumber
:
1296 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1297 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1303 ## __SkipToToken() method
1305 # Search forward in file buffer for the string
1306 # The skipped chars are put into self.__SkippedChars
1308 # @param self The object pointer
1309 # @param String The string to search
1310 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1311 # @retval True Successfully find the string, file buffer pointer moved forward
1312 # @retval False Not able to find the string, file buffer pointer not changed
1314 def __SkipToToken(self
, String
, IgnoreCase
= False):
1315 StartPos
= self
.GetFileBufferPos()
1317 self
.__SkippedChars
= ""
1318 while not self
.__EndOfFile
():
1321 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1323 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1325 self
.CurrentOffsetWithinLine
+= len(String
)
1326 self
.__SkippedChars
+= String
1328 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1331 self
.SetFileBufferPos( StartPos
)
1332 self
.__SkippedChars
= ""
1335 ## GetFileBufferPos() method
1337 # Return the tuple of current line and offset within the line
1339 # @param self The object pointer
1340 # @retval Tuple Line number and offset pair
1342 def GetFileBufferPos(self
):
1343 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1345 ## SetFileBufferPos() method
1347 # Restore the file buffer position
1349 # @param self The object pointer
1350 # @param Pos The new file buffer position
1352 def SetFileBufferPos(self
, Pos
):
1353 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1355 ## Preprocess() method
1357 # Preprocess comment, conditional directive, include directive, replace macro.
1358 # Exception will be raised if syntax error found
1360 # @param self The object pointer
1362 def Preprocess(self
):
1363 self
.__StringToList
()
1364 self
.PreprocessFile()
1365 self
.PreprocessIncludeFile()
1366 self
.__StringToList
()
1367 self
.PreprocessFile()
1368 self
.PreprocessConditionalStatement()
1369 self
.__StringToList
()
1370 for Pos
in self
.__WipeOffArea
:
1371 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1372 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1374 while self
.__GetDefines
():
1377 ## ParseFile() method
1379 # Parse the file profile buffer to extract fd, fv ... information
1380 # Exception will be raised if syntax error found
1382 # @param self The object pointer
1384 def ParseFile(self
):
1389 # Keep processing sections of the FDF until no new sections or a syntax error is found
1391 while self
.__GetFd
() or self
.__GetFv
() or self
.__GetFmp
() or self
.__GetCapsule
() or self
.__GetVtf
() or self
.__GetRule
() or self
.__GetOptionRom
():
1396 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1397 # At this point, the closest parent would be the included file itself
1398 Profile
= GetParentAtLine(X
.OriginalLineNumber
)
1400 X
.Message
+= ' near line %d, column %d: %s' \
1401 % (X
.LineNumber
, 0, Profile
.FileLinesList
[X
.LineNumber
-1])
1403 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1404 X
.Message
+= ' near line %d, column %d: %s' \
1405 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1408 ## SectionParser() method
1410 # Parse the file section info
1411 # Exception will be raised if syntax error found
1413 # @param self The object pointer
1414 # @param section The section string
1416 def SectionParser(self
, section
):
1418 if not S
.startswith("[DEFINES") and not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1419 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM.") and not S
.startswith('[FMPPAYLOAD.'):
1420 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
)
1422 ## __GetDefines() method
1424 # Get Defines section contents and store its data into AllMacrosList
1426 # @param self The object pointer
1427 # @retval True Successfully find a Defines
1428 # @retval False Not able to find a Defines
1430 def __GetDefines(self
):
1432 if not self
.__GetNextToken
():
1435 S
= self
.__Token
.upper()
1436 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1437 self
.SectionParser(S
)
1442 if not self
.__IsToken
("[DEFINES", True):
1443 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1444 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1445 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1446 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1448 if not self
.__IsToken
( "]"):
1449 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1451 while self
.__GetNextWord
():
1452 # handle the SET statement
1453 if self
.__Token
== 'SET':
1455 self
.__GetSetStatement
(None)
1458 Macro
= self
.__Token
1460 if not self
.__IsToken
("="):
1461 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1462 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1463 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1464 Value
= self
.__Token
1470 # Get FD section contents and store its data into FD dictionary of self.Profile
1472 # @param self The object pointer
1473 # @retval True Successfully find a FD
1474 # @retval False Not able to find a FD
1478 if not self
.__GetNextToken
():
1481 S
= self
.__Token
.upper()
1482 if S
.startswith("[") and not S
.startswith("[FD."):
1483 if not S
.startswith("[FV.") and not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
1484 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1485 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1490 if not self
.__IsToken
("[FD.", True):
1491 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1492 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1493 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1494 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1496 FdName
= self
.__GetUiName
()
1498 if len (self
.Profile
.FdDict
) == 0:
1499 FdName
= GenFdsGlobalVariable
.PlatformName
1500 if FdName
== "" and GlobalData
.gActivePlatform
:
1501 FdName
= GlobalData
.gActivePlatform
.PlatformName
1502 self
.Profile
.FdNameNotSet
= True
1504 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1505 self
.CurrentFdName
= FdName
.upper()
1507 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1508 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1510 if not self
.__IsToken
( "]"):
1511 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1514 FdObj
.FdUiName
= self
.CurrentFdName
1515 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1517 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1518 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1520 Status
= self
.__GetCreateFile
(FdObj
)
1522 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1524 while self
.__GetTokenStatements
(FdObj
):
1526 for Attr
in ("BaseAddress", "Size", "ErasePolarity"):
1527 if getattr(FdObj
, Attr
) == None:
1528 self
.__GetNextToken
()
1529 raise Warning("Keyword %s missing" % Attr
, self
.FileName
, self
.CurrentLineNumber
)
1531 if not FdObj
.BlockSizeList
:
1532 FdObj
.BlockSizeList
.append((1, FdObj
.Size
, None))
1534 self
.__GetDefineStatements
(FdObj
)
1536 self
.__GetSetStatements
(FdObj
)
1538 if not self
.__GetRegionLayout
(FdObj
):
1539 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1541 while self
.__GetRegionLayout
(FdObj
):
1545 ## __GetUiName() method
1547 # Return the UI name of a section
1549 # @param self The object pointer
1550 # @retval FdName UI name
1552 def __GetUiName(self
):
1554 if self
.__GetNextWord
():
1559 ## __GetCreateFile() method
1561 # Return the output file name of object
1563 # @param self The object pointer
1564 # @param Obj object whose data will be stored in file
1565 # @retval FdName UI name
1567 def __GetCreateFile(self
, Obj
):
1569 if self
.__IsKeyword
( "CREATE_FILE"):
1570 if not self
.__IsToken
( "="):
1571 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1573 if not self
.__GetNextToken
():
1574 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1576 FileName
= self
.__Token
1577 Obj
.CreateFileName
= FileName
1581 ## __GetTokenStatements() method
1583 # Get token statements
1585 # @param self The object pointer
1586 # @param Obj for whom token statement is got
1588 def __GetTokenStatements(self
, Obj
):
1589 if self
.__IsKeyword
( "BaseAddress"):
1590 if not self
.__IsToken
( "="):
1591 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1593 if not self
.__GetNextHexNumber
():
1594 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1596 Obj
.BaseAddress
= self
.__Token
1598 if self
.__IsToken
( "|"):
1599 pcdPair
= self
.__GetNextPcdName
()
1600 Obj
.BaseAddressPcd
= pcdPair
1601 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1602 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1603 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1606 if self
.__IsKeyword
( "Size"):
1607 if not self
.__IsToken
( "="):
1608 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1610 if not self
.__GetNextHexNumber
():
1611 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1614 if self
.__IsToken
( "|"):
1615 pcdPair
= self
.__GetNextPcdName
()
1616 Obj
.SizePcd
= pcdPair
1617 self
.Profile
.PcdDict
[pcdPair
] = Size
1618 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1619 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1620 Obj
.Size
= long(Size
, 0)
1623 if self
.__IsKeyword
( "ErasePolarity"):
1624 if not self
.__IsToken
( "="):
1625 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1627 if not self
.__GetNextToken
():
1628 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1630 if self
.__Token
!= "1" and self
.__Token
!= "0":
1631 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1633 Obj
.ErasePolarity
= self
.__Token
1636 return self
.__GetBlockStatements
(Obj
)
1638 ## __GetAddressStatements() method
1640 # Get address statements
1642 # @param self The object pointer
1643 # @param Obj for whom address statement is got
1644 # @retval True Successfully find
1645 # @retval False Not able to find
1647 def __GetAddressStatements(self
, Obj
):
1649 if self
.__IsKeyword
("BsBaseAddress"):
1650 if not self
.__IsToken
( "="):
1651 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1653 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1654 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1656 BsAddress
= long(self
.__Token
, 0)
1657 Obj
.BsBaseAddress
= BsAddress
1659 if self
.__IsKeyword
("RtBaseAddress"):
1660 if not self
.__IsToken
( "="):
1661 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1663 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1664 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1666 RtAddress
= long(self
.__Token
, 0)
1667 Obj
.RtBaseAddress
= RtAddress
1669 ## __GetBlockStatements() method
1671 # Get block statements
1673 # @param self The object pointer
1674 # @param Obj for whom block statement is got
1676 def __GetBlockStatements(self
, Obj
):
1678 while self
.__GetBlockStatement
(Obj
):
1681 Item
= Obj
.BlockSizeList
[-1]
1682 if Item
[0] == None or Item
[1] == None:
1683 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1686 ## __GetBlockStatement() method
1688 # Get block statement
1690 # @param self The object pointer
1691 # @param Obj for whom block statement is got
1692 # @retval True Successfully find
1693 # @retval False Not able to find
1695 def __GetBlockStatement(self
, Obj
):
1696 if not self
.__IsKeyword
( "BlockSize"):
1699 if not self
.__IsToken
( "="):
1700 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1702 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1703 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1705 BlockSize
= self
.__Token
1707 if self
.__IsToken
( "|"):
1708 PcdPair
= self
.__GetNextPcdName
()
1709 BlockSizePcd
= PcdPair
1710 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1711 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1712 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1713 BlockSize
= long(BlockSize
, 0)
1716 if self
.__IsKeyword
( "NumBlocks"):
1717 if not self
.__IsToken
( "="):
1718 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1720 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1721 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1723 BlockNumber
= long(self
.__Token
, 0)
1725 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1728 ## __GetDefineStatements() method
1730 # Get define statements
1732 # @param self The object pointer
1733 # @param Obj for whom define statement is got
1734 # @retval True Successfully find
1735 # @retval False Not able to find
1737 def __GetDefineStatements(self
, Obj
):
1738 while self
.__GetDefineStatement
( Obj
):
1741 ## __GetDefineStatement() method
1743 # Get define statement
1745 # @param self The object pointer
1746 # @param Obj for whom define statement is got
1747 # @retval True Successfully find
1748 # @retval False Not able to find
1750 def __GetDefineStatement(self
, Obj
):
1751 if self
.__IsKeyword
("DEFINE"):
1752 self
.__GetNextToken
()
1753 Macro
= self
.__Token
1754 if not self
.__IsToken
( "="):
1755 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1757 if not self
.__GetNextToken
():
1758 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1760 Value
= self
.__Token
1761 Macro
= '$(' + Macro
+ ')'
1762 Obj
.DefineVarDict
[Macro
] = Value
1767 ## __GetSetStatements() method
1769 # Get set statements
1771 # @param self The object pointer
1772 # @param Obj for whom set statement is got
1773 # @retval True Successfully find
1774 # @retval False Not able to find
1776 def __GetSetStatements(self
, Obj
):
1777 while self
.__GetSetStatement
(Obj
):
1780 ## __GetSetStatement() method
1784 # @param self The object pointer
1785 # @param Obj for whom set statement is got
1786 # @retval True Successfully find
1787 # @retval False Not able to find
1789 def __GetSetStatement(self
, Obj
):
1790 if self
.__IsKeyword
("SET"):
1791 PcdPair
= self
.__GetNextPcdName
()
1793 if not self
.__IsToken
( "="):
1794 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1796 Value
= self
.__GetExpression
()
1797 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1800 Obj
.SetVarDict
[PcdPair
] = Value
1801 self
.Profile
.PcdDict
[PcdPair
] = Value
1802 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1803 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1808 ## __CalcRegionExpr(self)
1810 # Calculate expression for offset or size of a region
1812 # @return: None if invalid expression
1813 # Calculated number if successfully
1815 def __CalcRegionExpr(self
):
1816 StartPos
= self
.GetFileBufferPos()
1819 while not self
.__EndOfFile
():
1820 CurCh
= self
.__CurrentChar
()
1826 if CurCh
in '|\r\n' and PairCount
== 0:
1832 ValueExpression(Expr
,
1833 self
.__CollectMacroPcd
()
1836 self
.SetFileBufferPos(StartPos
)
1839 ## __GetRegionLayout() method
1841 # Get region layout for FD
1843 # @param self The object pointer
1844 # @param Fd for whom region is got
1845 # @retval True Successfully find
1846 # @retval False Not able to find
1848 def __GetRegionLayout(self
, Fd
):
1849 Offset
= self
.__CalcRegionExpr
()
1853 RegionObj
= Region
.Region()
1854 RegionObj
.Offset
= Offset
1855 Fd
.RegionList
.append(RegionObj
)
1857 if not self
.__IsToken
( "|"):
1858 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1860 Size
= self
.__CalcRegionExpr
()
1862 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1863 RegionObj
.Size
= Size
1865 if not self
.__GetNextWord
():
1868 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):
1870 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]
1871 # Or it might be next region's offset described by an expression which starts with a PCD.
1872 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size
1875 IsRegionPcd
= (RegionSizeGuidPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]) or
1876 RegionOffsetPcdPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]))
1878 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1879 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1880 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdOffset
[1], RegionObj
.PcdOffset
[0])] = "0x%x" % RegionObj
.Offset
1881 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1882 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1883 if self
.__IsToken
( "|"):
1884 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1885 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1886 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdSize
[1], RegionObj
.PcdSize
[0])] = "0x%x" % RegionObj
.Size
1887 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1888 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1890 if not self
.__GetNextWord
():
1893 if self
.__Token
== "SET":
1895 self
.__GetSetStatements
( RegionObj
)
1896 if not self
.__GetNextWord
():
1899 elif self
.__Token
== "FV":
1901 self
.__GetRegionFvType
( RegionObj
)
1903 elif self
.__Token
== "CAPSULE":
1905 self
.__GetRegionCapType
( RegionObj
)
1907 elif self
.__Token
== "FILE":
1909 self
.__GetRegionFileType
(RegionObj
)
1911 elif self
.__Token
== "INF":
1913 RegionObj
.RegionType
= "INF"
1914 while self
.__IsKeyword
("INF"):
1916 ffsInf
= self
.__ParseInfStatement
()
1919 RegionObj
.RegionDataList
.append(ffsInf
)
1921 elif self
.__Token
== "DATA":
1923 self
.__GetRegionDataType
(RegionObj
)
1926 if self
.__GetRegionLayout
(Fd
):
1928 raise Warning("A valid region type was not found. "
1929 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",
1930 self
.FileName
, self
.CurrentLineNumber
)
1934 ## __GetRegionFvType() method
1936 # Get region fv data for region
1938 # @param self The object pointer
1939 # @param RegionObj for whom region data is got
1941 def __GetRegionFvType(self
, RegionObj
):
1943 if not self
.__IsKeyword
( "FV"):
1944 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1946 if not self
.__IsToken
( "="):
1947 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1949 if not self
.__GetNextToken
():
1950 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1952 RegionObj
.RegionType
= "FV"
1953 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1955 while self
.__IsKeyword
( "FV"):
1957 if not self
.__IsToken
( "="):
1958 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1960 if not self
.__GetNextToken
():
1961 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1963 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1965 ## __GetRegionCapType() method
1967 # Get region capsule data for region
1969 # @param self The object pointer
1970 # @param RegionObj for whom region data is got
1972 def __GetRegionCapType(self
, RegionObj
):
1974 if not self
.__IsKeyword
("CAPSULE"):
1975 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1977 if not self
.__IsToken
("="):
1978 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1980 if not self
.__GetNextToken
():
1981 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1983 RegionObj
.RegionType
= "CAPSULE"
1984 RegionObj
.RegionDataList
.append(self
.__Token
)
1986 while self
.__IsKeyword
("CAPSULE"):
1988 if not self
.__IsToken
("="):
1989 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1991 if not self
.__GetNextToken
():
1992 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1994 RegionObj
.RegionDataList
.append(self
.__Token
)
1996 ## __GetRegionFileType() method
1998 # Get region file data for region
2000 # @param self The object pointer
2001 # @param RegionObj for whom region data is got
2003 def __GetRegionFileType(self
, RegionObj
):
2005 if not self
.__IsKeyword
( "FILE"):
2006 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
2008 if not self
.__IsToken
( "="):
2009 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2011 if not self
.__GetNextToken
():
2012 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
2014 RegionObj
.RegionType
= "FILE"
2015 RegionObj
.RegionDataList
.append( self
.__Token
)
2017 while self
.__IsKeyword
( "FILE"):
2019 if not self
.__IsToken
( "="):
2020 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2022 if not self
.__GetNextToken
():
2023 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
2025 RegionObj
.RegionDataList
.append(self
.__Token
)
2027 ## __GetRegionDataType() method
2029 # Get region array data for region
2031 # @param self The object pointer
2032 # @param RegionObj for whom region data is got
2034 def __GetRegionDataType(self
, RegionObj
):
2036 if not self
.__IsKeyword
( "DATA"):
2037 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
2039 if not self
.__IsToken
( "="):
2040 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2042 if not self
.__IsToken
( "{"):
2043 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2045 if not self
.__GetNextHexNumber
():
2046 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2048 if len(self
.__Token
) > 18:
2049 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2051 # convert hex string value to byte hex string array
2052 AllString
= self
.__Token
2053 AllStrLen
= len (AllString
)
2055 while AllStrLen
> 4:
2056 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2057 AllStrLen
= AllStrLen
- 2
2058 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2061 if len (self
.__Token
) <= 4:
2062 while self
.__IsToken
(","):
2063 if not self
.__GetNextHexNumber
():
2064 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2065 if len(self
.__Token
) > 4:
2066 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2067 DataString
+= self
.__Token
2070 if not self
.__IsToken
( "}"):
2071 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2073 DataString
= DataString
.rstrip(",")
2074 RegionObj
.RegionType
= "DATA"
2075 RegionObj
.RegionDataList
.append( DataString
)
2077 while self
.__IsKeyword
( "DATA"):
2079 if not self
.__IsToken
( "="):
2080 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2082 if not self
.__IsToken
( "{"):
2083 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2085 if not self
.__GetNextHexNumber
():
2086 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2088 if len(self
.__Token
) > 18:
2089 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2091 # convert hex string value to byte hex string array
2092 AllString
= self
.__Token
2093 AllStrLen
= len (AllString
)
2095 while AllStrLen
> 4:
2096 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2097 AllStrLen
= AllStrLen
- 2
2098 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2101 if len (self
.__Token
) <= 4:
2102 while self
.__IsToken
(","):
2103 if not self
.__GetNextHexNumber
():
2104 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2105 if len(self
.__Token
) > 4:
2106 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2107 DataString
+= self
.__Token
2110 if not self
.__IsToken
( "}"):
2111 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2113 DataString
= DataString
.rstrip(",")
2114 RegionObj
.RegionDataList
.append( DataString
)
2118 # Get FV section contents and store its data into FV dictionary of self.Profile
2120 # @param self The object pointer
2121 # @retval True Successfully find a FV
2122 # @retval False Not able to find a FV
2125 if not self
.__GetNextToken
():
2128 S
= self
.__Token
.upper()
2129 if S
.startswith("[") and not S
.startswith("[FV."):
2130 self
.SectionParser(S
)
2135 if not self
.__IsToken
("[FV.", True):
2136 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2137 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2138 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2139 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2141 FvName
= self
.__GetUiName
()
2142 self
.CurrentFvName
= FvName
.upper()
2144 if not self
.__IsToken
( "]"):
2145 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2148 FvObj
.UiFvName
= self
.CurrentFvName
2149 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
2151 Status
= self
.__GetCreateFile
(FvObj
)
2153 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2155 self
.__GetDefineStatements
(FvObj
)
2157 self
.__GetAddressStatements
(FvObj
)
2159 FvObj
.FvExtEntryTypeValue
= []
2160 FvObj
.FvExtEntryType
= []
2161 FvObj
.FvExtEntryData
= []
2163 self
.__GetSetStatements
(FvObj
)
2165 if not (self
.__GetBlockStatement
(FvObj
) or self
.__GetFvBaseAddress
(FvObj
) or
2166 self
.__GetFvForceRebase
(FvObj
) or self
.__GetFvAlignment
(FvObj
) or
2167 self
.__GetFvAttributes
(FvObj
) or self
.__GetFvNameGuid
(FvObj
) or
2168 self
.__GetFvExtEntryStatement
(FvObj
) or self
.__GetFvNameString
(FvObj
)):
2171 if FvObj
.FvNameString
== 'TRUE' and not FvObj
.FvNameGuid
:
2172 raise Warning("FvNameString found but FvNameGuid was not found", self
.FileName
, self
.CurrentLineNumber
)
2174 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2175 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2178 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2179 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2180 if not isInf
and not isFile
:
2185 ## __GetFvAlignment() method
2187 # Get alignment for FV
2189 # @param self The object pointer
2190 # @param Obj for whom alignment is got
2191 # @retval True Successfully find a alignment statement
2192 # @retval False Not able to find a alignment statement
2194 def __GetFvAlignment(self
, Obj
):
2196 if not self
.__IsKeyword
( "FvAlignment"):
2199 if not self
.__IsToken
( "="):
2200 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2202 if not self
.__GetNextToken
():
2203 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2205 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2206 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2207 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2209 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2210 Obj
.FvAlignment
= self
.__Token
2213 ## __GetFvBaseAddress() method
2215 # Get BaseAddress for FV
2217 # @param self The object pointer
2218 # @param Obj for whom FvBaseAddress is got
2219 # @retval True Successfully find a FvBaseAddress statement
2220 # @retval False Not able to find a FvBaseAddress statement
2222 def __GetFvBaseAddress(self
, Obj
):
2224 if not self
.__IsKeyword
("FvBaseAddress"):
2227 if not self
.__IsToken
( "="):
2228 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2230 if not self
.__GetNextToken
():
2231 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2233 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2235 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2236 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2237 Obj
.FvBaseAddress
= self
.__Token
2240 ## __GetFvForceRebase() method
2242 # Get FvForceRebase for FV
2244 # @param self The object pointer
2245 # @param Obj for whom FvForceRebase is got
2246 # @retval True Successfully find a FvForceRebase statement
2247 # @retval False Not able to find a FvForceRebase statement
2249 def __GetFvForceRebase(self
, Obj
):
2251 if not self
.__IsKeyword
("FvForceRebase"):
2254 if not self
.__IsToken
( "="):
2255 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2257 if not self
.__GetNextToken
():
2258 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2260 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2261 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2263 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2264 Obj
.FvForceRebase
= True
2265 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2266 Obj
.FvForceRebase
= False
2268 Obj
.FvForceRebase
= None
2273 ## __GetFvAttributes() method
2275 # Get attributes for FV
2277 # @param self The object pointer
2278 # @param Obj for whom attribute is got
2281 def __GetFvAttributes(self
, FvObj
):
2283 while self
.__GetNextWord
():
2286 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2287 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2288 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2289 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2290 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2291 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"):
2295 if not self
.__IsToken
( "="):
2296 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2298 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2299 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2301 FvObj
.FvAttributeDict
[name
] = self
.__Token
2305 ## __GetFvNameGuid() method
2307 # Get FV GUID for FV
2309 # @param self The object pointer
2310 # @param Obj for whom GUID is got
2313 def __GetFvNameGuid(self
, FvObj
):
2315 if not self
.__IsKeyword
( "FvNameGuid"):
2318 if not self
.__IsToken
( "="):
2319 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2321 if not self
.__GetNextGuid
():
2322 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2324 FvObj
.FvNameGuid
= self
.__Token
2328 def __GetFvNameString(self
, FvObj
):
2330 if not self
.__IsKeyword
( "FvNameString"):
2333 if not self
.__IsToken
( "="):
2334 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2336 if not self
.__GetNextToken
() or self
.__Token
not in ('TRUE', 'FALSE'):
2337 raise Warning("expected TRUE or FALSE for FvNameString", self
.FileName
, self
.CurrentLineNumber
)
2339 FvObj
.FvNameString
= self
.__Token
2343 def __GetFvExtEntryStatement(self
, FvObj
):
2345 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2348 if not self
.__IsKeyword
("TYPE"):
2349 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2351 if not self
.__IsToken
( "="):
2352 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2354 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2355 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2357 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2359 if not self
.__IsToken
( "{"):
2360 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2362 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2363 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2365 FvObj
.FvExtEntryType
+= [self
.__Token
]
2367 if self
.__Token
== 'DATA':
2369 if not self
.__IsToken
( "="):
2370 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2372 if not self
.__IsToken
( "{"):
2373 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2375 if not self
.__GetNextHexNumber
():
2376 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2378 if len(self
.__Token
) > 4:
2379 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2381 DataString
= self
.__Token
2384 while self
.__IsToken
(","):
2385 if not self
.__GetNextHexNumber
():
2386 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2387 if len(self
.__Token
) > 4:
2388 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2389 DataString
+= self
.__Token
2392 if not self
.__IsToken
( "}"):
2393 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2395 if not self
.__IsToken
( "}"):
2396 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2398 DataString
= DataString
.rstrip(",")
2399 FvObj
.FvExtEntryData
+= [DataString
]
2401 if self
.__Token
== 'FILE':
2403 if not self
.__IsToken
( "="):
2404 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2406 if not self
.__GetNextToken
():
2407 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2409 FvObj
.FvExtEntryData
+= [self
.__Token
]
2411 if not self
.__IsToken
( "}"):
2412 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2416 ## __GetAprioriSection() method
2418 # Get token statements
2420 # @param self The object pointer
2421 # @param FvObj for whom apriori is got
2422 # @param MacroDict dictionary used to replace macro
2423 # @retval True Successfully find apriori statement
2424 # @retval False Not able to find apriori statement
2426 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2428 if not self
.__IsKeyword
( "APRIORI"):
2431 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2432 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2433 AprType
= self
.__Token
2435 if not self
.__IsToken
( "{"):
2436 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2438 AprSectionObj
= AprioriSection
.AprioriSection()
2439 AprSectionObj
.AprioriType
= AprType
2441 self
.__GetDefineStatements
(AprSectionObj
)
2442 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2445 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2446 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2447 if not IsInf
and not IsFile
:
2450 if not self
.__IsToken
( "}"):
2451 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2453 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2456 def __ParseInfStatement(self
):
2457 if not self
.__IsKeyword
("INF"):
2460 ffsInf
= FfsInfStatement
.FfsInfStatement()
2461 self
.__GetInfOptions
(ffsInf
)
2463 if not self
.__GetNextToken
():
2464 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2465 ffsInf
.InfFileName
= self
.__Token
2467 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2468 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2470 #Replace $(SAPCE) with real space
2471 ffsInf
.InfFileName
= ffsInf
.InfFileName
.replace('$(SPACE)', ' ')
2473 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2474 #do case sensitive check for file path
2475 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2477 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2479 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2480 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2481 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2482 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2484 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
2485 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
2487 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
2489 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
2491 if self
.__IsToken
('|'):
2492 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2493 ffsInf
.KeepReloc
= False
2494 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2495 ffsInf
.KeepReloc
= True
2497 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2500 ## __GetInfStatement() method
2502 # Get INF statements
2504 # @param self The object pointer
2505 # @param Obj for whom inf statement is got
2506 # @param MacroDict dictionary used to replace macro
2507 # @retval True Successfully find inf statement
2508 # @retval False Not able to find inf statement
2510 def __GetInfStatement(self
, Obj
, ForCapsule
=False, MacroDict
={}):
2511 ffsInf
= self
.__ParseInfStatement
()
2516 capsuleFfs
= CapsuleData
.CapsuleFfs()
2517 capsuleFfs
.Ffs
= ffsInf
2518 Obj
.CapsuleDataList
.append(capsuleFfs
)
2520 Obj
.FfsList
.append(ffsInf
)
2523 ## __GetInfOptions() method
2525 # Get options for INF
2527 # @param self The object pointer
2528 # @param FfsInfObj for whom option is got
2530 def __GetInfOptions(self
, FfsInfObj
):
2531 if self
.__IsKeyword
("FILE_GUID"):
2532 if not self
.__IsToken
("="):
2533 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2534 if not self
.__GetNextGuid
():
2535 raise Warning("expected GUID value", self
.FileName
, self
.CurrentLineNumber
)
2536 FfsInfObj
.OverrideGuid
= self
.__Token
2538 if self
.__IsKeyword
( "RuleOverride"):
2539 if not self
.__IsToken
( "="):
2540 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2541 if not self
.__GetNextToken
():
2542 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2543 FfsInfObj
.Rule
= self
.__Token
2545 if self
.__IsKeyword
( "VERSION"):
2546 if not self
.__IsToken
( "="):
2547 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2548 if not self
.__GetNextToken
():
2549 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2551 if self
.__GetStringData
():
2552 FfsInfObj
.Version
= self
.__Token
2554 if self
.__IsKeyword
( "UI"):
2555 if not self
.__IsToken
( "="):
2556 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2557 if not self
.__GetNextToken
():
2558 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2560 if self
.__GetStringData
():
2561 FfsInfObj
.Ui
= self
.__Token
2563 if self
.__IsKeyword
( "USE"):
2564 if not self
.__IsToken
( "="):
2565 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2566 if not self
.__GetNextToken
():
2567 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2568 FfsInfObj
.UseArch
= self
.__Token
2571 if self
.__GetNextToken
():
2572 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')
2573 if p
.match(self
.__Token
) and p
.match(self
.__Token
).span()[1] == len(self
.__Token
):
2574 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2575 if not self
.__IsToken
(","):
2581 while self
.__GetNextToken
():
2582 if not p
.match(self
.__Token
):
2583 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2584 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2586 if not self
.__IsToken
(","):
2589 ## __GetFileStatement() method
2591 # Get FILE statements
2593 # @param self The object pointer
2594 # @param Obj for whom FILE statement is got
2595 # @param MacroDict dictionary used to replace macro
2596 # @retval True Successfully find FILE statement
2597 # @retval False Not able to find FILE statement
2599 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2601 if not self
.__IsKeyword
( "FILE"):
2604 if not self
.__GetNextWord
():
2605 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2607 if ForCapsule
and self
.__Token
== 'DATA':
2612 FfsFileObj
= FfsFileStatement
.FileStatement()
2613 FfsFileObj
.FvFileType
= self
.__Token
2615 if not self
.__IsToken
( "="):
2616 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2618 if not self
.__GetNextGuid
():
2619 if not self
.__GetNextWord
():
2620 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2621 if self
.__Token
== 'PCD':
2622 if not self
.__IsToken
( "("):
2623 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2624 PcdPair
= self
.__GetNextPcdName
()
2625 if not self
.__IsToken
( ")"):
2626 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2627 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2629 FfsFileObj
.NameGuid
= self
.__Token
2631 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2634 capsuleFfs
= CapsuleData
.CapsuleFfs()
2635 capsuleFfs
.Ffs
= FfsFileObj
2636 Obj
.CapsuleDataList
.append(capsuleFfs
)
2638 Obj
.FfsList
.append(FfsFileObj
)
2642 ## __FileCouldHaveRelocFlag() method
2644 # Check whether reloc strip flag can be set for a file type.
2646 # @param self The object pointer
2647 # @param FileType The file type to check with
2648 # @retval True This type could have relocation strip flag
2649 # @retval False No way to have it
2652 def __FileCouldHaveRelocFlag (self
, FileType
):
2653 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2658 ## __SectionCouldHaveRelocFlag() method
2660 # Check whether reloc strip flag can be set for a section type.
2662 # @param self The object pointer
2663 # @param SectionType The section type to check with
2664 # @retval True This type could have relocation strip flag
2665 # @retval False No way to have it
2668 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2669 if SectionType
in ('TE', 'PE32'):
2674 ## __GetFilePart() method
2676 # Get components for FILE statement
2678 # @param self The object pointer
2679 # @param FfsFileObj for whom component is got
2680 # @param MacroDict dictionary used to replace macro
2682 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2684 self
.__GetFileOpts
( FfsFileObj
)
2686 if not self
.__IsToken
("{"):
2687 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2688 if self
.__FileCouldHaveRelocFlag
(FfsFileObj
.FvFileType
):
2689 if self
.__Token
== 'RELOCS_STRIPPED':
2690 FfsFileObj
.KeepReloc
= False
2692 FfsFileObj
.KeepReloc
= True
2694 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj
.FvFileType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2696 if not self
.__IsToken
("{"):
2697 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2699 if not self
.__GetNextToken
():
2700 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2702 if self
.__Token
== "FV":
2703 if not self
.__IsToken
( "="):
2704 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2705 if not self
.__GetNextToken
():
2706 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2707 FfsFileObj
.FvName
= self
.__Token
2709 elif self
.__Token
== "FD":
2710 if not self
.__IsToken
( "="):
2711 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2712 if not self
.__GetNextToken
():
2713 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2714 FfsFileObj
.FdName
= self
.__Token
2716 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2718 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2720 elif hasattr(FfsFileObj
, 'FvFileType') and FfsFileObj
.FvFileType
== 'RAW':
2722 self
.__GetRAWData
(FfsFileObj
, MacroDict
)
2725 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2726 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2727 FfsFileObj
.FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2728 self
.__VerifyFile
(FfsFileObj
.FileName
)
2730 if not self
.__IsToken
( "}"):
2731 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2733 ## __GetRAWData() method
2735 # Get RAW data for FILE statement
2737 # @param self The object pointer
2738 # @param FfsFileObj for whom section is got
2739 # @param MacroDict dictionary used to replace macro
2741 def __GetRAWData(self
, FfsFileObj
, MacroDict
= {}):
2742 FfsFileObj
.FileName
= []
2743 FfsFileObj
.SubAlignment
= []
2746 if self
.__GetAlignment
():
2747 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2748 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2749 #For FFS, Auto is default option same to ""
2750 if not self
.__Token
== "Auto":
2751 AlignValue
= self
.__Token
2752 if not self
.__GetNextToken
():
2753 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2755 FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2758 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2760 self
.__VerifyFile
(FileName
)
2761 File
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
)
2762 FfsFileObj
.FileName
.append(File
.Path
)
2763 FfsFileObj
.SubAlignment
.append(AlignValue
)
2765 if self
.__IsToken
( "}"):
2769 if len(FfsFileObj
.SubAlignment
) == 1:
2770 FfsFileObj
.SubAlignment
= FfsFileObj
.SubAlignment
[0]
2771 if len(FfsFileObj
.FileName
) == 1:
2772 FfsFileObj
.FileName
= FfsFileObj
.FileName
[0]
2774 ## __GetFileOpts() method
2776 # Get options for FILE statement
2778 # @param self The object pointer
2779 # @param FfsFileObj for whom options is got
2781 def __GetFileOpts(self
, FfsFileObj
):
2783 if self
.__GetNextToken
():
2784 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2785 if Pattern
.match(self
.__Token
):
2786 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2787 if self
.__IsToken
(","):
2788 while self
.__GetNextToken
():
2789 if not Pattern
.match(self
.__Token
):
2790 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2791 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2793 if not self
.__IsToken
(","):
2799 if self
.__IsKeyword
( "FIXED", True):
2800 FfsFileObj
.Fixed
= True
2802 if self
.__IsKeyword
( "CHECKSUM", True):
2803 FfsFileObj
.CheckSum
= True
2805 if self
.__GetAlignment
():
2806 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2807 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2808 #For FFS, Auto is default option same to ""
2809 if not self
.__Token
== "Auto":
2810 FfsFileObj
.Alignment
= self
.__Token
2812 ## __GetAlignment() method
2814 # Return the alignment value
2816 # @param self The object pointer
2817 # @retval True Successfully find alignment
2818 # @retval False Not able to find alignment
2820 def __GetAlignment(self
):
2821 if self
.__IsKeyword
( "Align", True):
2822 if not self
.__IsToken
( "="):
2823 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2825 if not self
.__GetNextToken
():
2826 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2831 ## __GetFilePart() method
2833 # Get section data for FILE statement
2835 # @param self The object pointer
2836 # @param FfsFileObj for whom section is got
2837 # @param MacroDict dictionary used to replace macro
2839 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2841 Dict
.update(MacroDict
)
2843 self
.__GetDefineStatements
(FfsFileObj
)
2845 Dict
.update(FfsFileObj
.DefineVarDict
)
2846 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2847 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2850 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2851 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2852 if not IsLeafSection
and not IsEncapSection
:
2855 ## __GetLeafSection() method
2857 # Get leaf section for Obj
2859 # @param self The object pointer
2860 # @param Obj for whom leaf section is got
2861 # @param MacroDict dictionary used to replace macro
2862 # @retval True Successfully find section statement
2863 # @retval False Not able to find section statement
2865 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2867 OldPos
= self
.GetFileBufferPos()
2869 if not self
.__IsKeyword
( "SECTION"):
2870 if len(Obj
.SectionList
) == 0:
2871 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2876 if self
.__GetAlignment
():
2877 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2878 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2879 AlignValue
= self
.__Token
2882 if self
.__IsKeyword
( "BUILD_NUM"):
2883 if not self
.__IsToken
( "="):
2884 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2886 if not self
.__GetNextToken
():
2887 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2889 BuildNum
= self
.__Token
2891 if self
.__IsKeyword
( "VERSION"):
2892 if AlignValue
== 'Auto':
2893 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2894 if not self
.__IsToken
( "="):
2895 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2896 if not self
.__GetNextToken
():
2897 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2898 VerSectionObj
= VerSection
.VerSection()
2899 VerSectionObj
.Alignment
= AlignValue
2900 VerSectionObj
.BuildNum
= BuildNum
2901 if self
.__GetStringData
():
2902 VerSectionObj
.StringData
= self
.__Token
2904 VerSectionObj
.FileName
= self
.__Token
2905 Obj
.SectionList
.append(VerSectionObj
)
2907 elif self
.__IsKeyword
( "UI"):
2908 if AlignValue
== 'Auto':
2909 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2910 if not self
.__IsToken
( "="):
2911 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2912 if not self
.__GetNextToken
():
2913 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2914 UiSectionObj
= UiSection
.UiSection()
2915 UiSectionObj
.Alignment
= AlignValue
2916 if self
.__GetStringData
():
2917 UiSectionObj
.StringData
= self
.__Token
2919 UiSectionObj
.FileName
= self
.__Token
2920 Obj
.SectionList
.append(UiSectionObj
)
2922 elif self
.__IsKeyword
( "FV_IMAGE"):
2923 if AlignValue
== 'Auto':
2924 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2925 if not self
.__IsToken
( "="):
2926 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2927 if not self
.__GetNextToken
():
2928 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2930 FvName
= self
.__Token
2933 if self
.__IsToken
( "{"):
2935 FvObj
.UiFvName
= FvName
.upper()
2936 self
.__GetDefineStatements
(FvObj
)
2937 MacroDict
.update(FvObj
.DefineVarDict
)
2938 self
.__GetBlockStatement
(FvObj
)
2939 self
.__GetSetStatements
(FvObj
)
2940 self
.__GetFvAlignment
(FvObj
)
2941 self
.__GetFvAttributes
(FvObj
)
2942 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2943 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2946 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2947 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2948 if not IsInf
and not IsFile
:
2951 if not self
.__IsToken
( "}"):
2952 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2954 FvImageSectionObj
= FvImageSection
.FvImageSection()
2955 FvImageSectionObj
.Alignment
= AlignValue
2957 FvImageSectionObj
.Fv
= FvObj
2958 FvImageSectionObj
.FvName
= None
2960 FvImageSectionObj
.FvName
= FvName
.upper()
2961 FvImageSectionObj
.FvFileName
= FvName
2963 Obj
.SectionList
.append(FvImageSectionObj
)
2965 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2966 if AlignValue
== 'Auto':
2967 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2968 DepexSectionObj
= DepexSection
.DepexSection()
2969 DepexSectionObj
.Alignment
= AlignValue
2970 DepexSectionObj
.DepexType
= self
.__Token
2972 if not self
.__IsToken
( "="):
2973 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2974 if not self
.__IsToken
( "{"):
2975 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2976 if not self
.__SkipToToken
( "}"):
2977 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2979 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2980 Obj
.SectionList
.append(DepexSectionObj
)
2983 if not self
.__GetNextWord
():
2984 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2986 # Encapsulation section appear, UndoToken and return
2987 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2988 self
.SetFileBufferPos(OldPos
)
2991 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2992 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2993 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2994 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2995 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2998 DataSectionObj
= DataSection
.DataSection()
2999 DataSectionObj
.Alignment
= AlignValue
3000 DataSectionObj
.SecType
= self
.__Token
3002 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3003 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
3004 if self
.__Token
== 'RELOCS_STRIPPED':
3005 DataSectionObj
.KeepReloc
= False
3007 DataSectionObj
.KeepReloc
= True
3009 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
)
3011 if self
.__IsToken
("="):
3012 if not self
.__GetNextToken
():
3013 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
3014 DataSectionObj
.SectFileName
= self
.__Token
3015 self
.__VerifyFile
(DataSectionObj
.SectFileName
)
3017 if not self
.__GetCglSection
(DataSectionObj
):
3020 Obj
.SectionList
.append(DataSectionObj
)
3026 # Check if file exists or not:
3027 # If current phase if GenFds, the file must exist;
3028 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist
3029 # @param FileName: File path to be verified.
3031 def __VerifyFile(self
, FileName
):
3032 if FileName
.replace('$(WORKSPACE)', '').find('$') != -1:
3034 if not GlobalData
.gAutoGenPhase
or not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FileName
:
3035 ErrorCode
, ErrorInfo
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3037 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3039 ## __GetCglSection() method
3041 # Get compressed or GUIDed section for Obj
3043 # @param self The object pointer
3044 # @param Obj for whom leaf section is got
3045 # @param AlignValue alignment value for complex section
3046 # @retval True Successfully find section statement
3047 # @retval False Not able to find section statement
3049 def __GetCglSection(self
, Obj
, AlignValue
= None):
3051 if self
.__IsKeyword
( "COMPRESS"):
3053 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3056 if not self
.__IsToken
("{"):
3057 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3059 CompressSectionObj
= CompressSection
.CompressSection()
3060 CompressSectionObj
.Alignment
= AlignValue
3061 CompressSectionObj
.CompType
= type
3062 # Recursive sections...
3064 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
3065 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
3066 if not IsLeafSection
and not IsEncapSection
:
3070 if not self
.__IsToken
( "}"):
3071 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3072 Obj
.SectionList
.append(CompressSectionObj
)
3075 # raise Warning("Compress type not known")
3079 elif self
.__IsKeyword
( "GUIDED"):
3081 if self
.__GetNextGuid
():
3082 GuidValue
= self
.__Token
3084 AttribDict
= self
.__GetGuidAttrib
()
3085 if not self
.__IsToken
("{"):
3086 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3087 GuidSectionObj
= GuidSection
.GuidSection()
3088 GuidSectionObj
.Alignment
= AlignValue
3089 GuidSectionObj
.NameGuid
= GuidValue
3090 GuidSectionObj
.SectionType
= "GUIDED"
3091 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3092 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3093 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
3094 # Recursive sections...
3096 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
3097 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
3098 if not IsLeafSection
and not IsEncapSection
:
3101 if not self
.__IsToken
( "}"):
3102 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3103 Obj
.SectionList
.append(GuidSectionObj
)
3109 ## __GetGuidAttri() method
3111 # Get attributes for GUID section
3113 # @param self The object pointer
3114 # @retval AttribDict Dictionary of key-value pair of section attributes
3116 def __GetGuidAttrib(self
):
3119 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
3120 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
3121 AttribDict
["EXTRA_HEADER_SIZE"] = -1
3122 while self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID") \
3123 or self
.__IsKeyword
("EXTRA_HEADER_SIZE"):
3124 AttribKey
= self
.__Token
3126 if not self
.__IsToken
("="):
3127 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3129 if not self
.__GetNextToken
():
3130 raise Warning("expected TRUE(1)/FALSE(0)/Number", self
.FileName
, self
.CurrentLineNumber
)
3131 elif AttribKey
== "EXTRA_HEADER_SIZE":
3133 if self
.__Token
[0:2].upper() == "0X":
3136 AttribDict
[AttribKey
] = int(self
.__Token
, Base
)
3139 raise Warning("expected Number", self
.FileName
, self
.CurrentLineNumber
)
3140 elif self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
3141 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
3142 AttribDict
[AttribKey
] = self
.__Token
3146 ## __GetEncapsulationSec() method
3148 # Get encapsulation section for FILE
3150 # @param self The object pointer
3151 # @param FfsFile for whom section is got
3152 # @retval True Successfully find section statement
3153 # @retval False Not able to find section statement
3155 def __GetEncapsulationSec(self
, FfsFileObj
):
3157 OldPos
= self
.GetFileBufferPos()
3158 if not self
.__IsKeyword
( "SECTION"):
3159 if len(FfsFileObj
.SectionList
) == 0:
3160 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
3165 if self
.__GetAlignment
():
3166 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3167 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3168 AlignValue
= self
.__Token
3170 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
3171 self
.SetFileBufferPos(OldPos
)
3177 if not self
.__GetNextToken
():
3179 S
= self
.__Token
.upper()
3180 if S
.startswith("[") and not S
.startswith("[FMPPAYLOAD."):
3181 self
.SectionParser(S
)
3186 self
.__SkipToToken
("[FMPPAYLOAD.", True)
3187 FmpUiName
= self
.__GetUiName
().upper()
3188 if FmpUiName
in self
.Profile
.FmpPayloadDict
:
3189 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName
, self
.FileName
, self
.CurrentLineNumber
)
3191 FmpData
= CapsuleData
.CapsulePayload()
3192 FmpData
.UiName
= FmpUiName
3194 if not self
.__IsToken
( "]"):
3195 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3197 if not self
.__GetNextToken
():
3198 raise Warning("The FMP payload section is empty!", self
.FileName
, self
.CurrentLineNumber
)
3199 FmpKeyList
= ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']
3200 while self
.__Token
in FmpKeyList
:
3202 FmpKeyList
.remove(Name
)
3203 if not self
.__IsToken
("="):
3204 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3205 if Name
== 'IMAGE_TYPE_ID':
3206 if not self
.__GetNextGuid
():
3207 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self
.FileName
, self
.CurrentLineNumber
)
3208 FmpData
.ImageTypeId
= self
.__Token
3209 elif Name
== 'CERTIFICATE_GUID':
3210 if not self
.__GetNextGuid
():
3211 raise Warning("expected GUID value for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3212 FmpData
.Certificate_Guid
= self
.__Token
3213 if uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_RSA2048_SHA256_GUID
and uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_PKCS7_GUID
:
3214 raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3216 if not self
.__GetNextToken
():
3217 raise Warning("expected value of %s" % Name
, self
.FileName
, self
.CurrentLineNumber
)
3218 Value
= self
.__Token
3219 if Name
== 'IMAGE_HEADER_INIT_VERSION':
3220 if self
.__Verify
(Name
, Value
, 'UINT8'):
3221 FmpData
.Version
= Value
3222 elif Name
== 'IMAGE_INDEX':
3223 if self
.__Verify
(Name
, Value
, 'UINT8'):
3224 FmpData
.ImageIndex
= Value
3225 elif Name
== 'HARDWARE_INSTANCE':
3226 if self
.__Verify
(Name
, Value
, 'UINT8'):
3227 FmpData
.HardwareInstance
= Value
3228 elif Name
== 'MONOTONIC_COUNT':
3229 if self
.__Verify
(Name
, Value
, 'UINT64'):
3230 FmpData
.MonotonicCount
= Value
3231 if FmpData
.MonotonicCount
.upper().startswith('0X'):
3232 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
, 16)
3234 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
)
3235 if not self
.__GetNextToken
():
3240 if (FmpData
.MonotonicCount
and not FmpData
.Certificate_Guid
) or (not FmpData
.MonotonicCount
and FmpData
.Certificate_Guid
):
3241 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")
3242 # remove CERTIFICATE_GUID and MONOTONIC_COUNT from FmpKeyList, since these keys are optional
3243 if 'CERTIFICATE_GUID' in FmpKeyList
:
3244 FmpKeyList
.remove('CERTIFICATE_GUID')
3245 if 'MONOTONIC_COUNT' in FmpKeyList
:
3246 FmpKeyList
.remove('MONOTONIC_COUNT')
3248 raise Warning("Missing keywords %s in FMP payload section." % ', '.join(FmpKeyList
), self
.FileName
, self
.CurrentLineNumber
)
3249 # get the Image file and Vendor code file
3250 self
.__GetFMPCapsuleData
(FmpData
)
3251 if not FmpData
.ImageFile
:
3252 raise Warning("Missing image file in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3253 # check whether more than one Vendor code file
3254 if len(FmpData
.VendorCodeFile
) > 1:
3255 raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3256 self
.Profile
.FmpPayloadDict
[FmpUiName
] = FmpData
3259 ## __GetCapsule() method
3261 # Get capsule section contents and store its data into capsule list of self.Profile
3263 # @param self The object pointer
3264 # @retval True Successfully find a capsule
3265 # @retval False Not able to find a capsule
3267 def __GetCapsule(self
):
3269 if not self
.__GetNextToken
():
3272 S
= self
.__Token
.upper()
3273 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
3274 self
.SectionParser(S
)
3279 if not self
.__IsToken
("[CAPSULE.", True):
3280 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3281 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3282 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3283 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
3285 CapsuleObj
= Capsule
.Capsule()
3287 CapsuleName
= self
.__GetUiName
()
3289 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
3291 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
3293 if not self
.__IsToken
( "]"):
3294 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3296 if self
.__IsKeyword
("CREATE_FILE"):
3297 if not self
.__IsToken
( "="):
3298 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3300 if not self
.__GetNextToken
():
3301 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
3303 CapsuleObj
.CreateFile
= self
.__Token
3305 self
.__GetCapsuleStatements
(CapsuleObj
)
3306 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3309 ## __GetCapsuleStatements() method
3311 # Get statements for capsule
3313 # @param self The object pointer
3314 # @param Obj for whom statements are got
3316 def __GetCapsuleStatements(self
, Obj
):
3317 self
.__GetCapsuleTokens
(Obj
)
3318 self
.__GetDefineStatements
(Obj
)
3319 self
.__GetSetStatements
(Obj
)
3320 self
.__GetCapsuleData
(Obj
)
3322 ## __GetCapsuleTokens() method
3324 # Get token statements for capsule
3326 # @param self The object pointer
3327 # @param Obj for whom token statements are got
3329 def __GetCapsuleTokens(self
, Obj
):
3330 if not self
.__GetNextToken
():
3332 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):
3333 Name
= self
.__Token
.strip()
3334 if not self
.__IsToken
("="):
3335 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3336 if not self
.__GetNextToken
():
3337 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3338 if Name
== 'CAPSULE_FLAGS':
3339 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3340 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3341 Value
= self
.__Token
.strip()
3342 while self
.__IsToken
(","):
3344 if not self
.__GetNextToken
():
3345 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3346 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3347 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3348 Value
+= self
.__Token
.strip()
3349 elif Name
== 'OEM_CAPSULE_FLAGS':
3350 Value
= self
.__Token
.strip()
3351 if not Value
.upper().startswith('0X'):
3352 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3354 Value
= int(Value
, 0)
3356 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3357 if not 0x0000 <= Value
<= 0xFFFF:
3358 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3359 Value
= self
.__Token
.strip()
3361 Value
= self
.__Token
.strip()
3362 Obj
.TokensDict
[Name
] = Value
3363 if not self
.__GetNextToken
():
3367 ## __GetCapsuleData() method
3369 # Get capsule data for capsule
3371 # @param self The object pointer
3372 # @param Obj for whom capsule data are got
3374 def __GetCapsuleData(self
, Obj
):
3377 IsInf
= self
.__GetInfStatement
(Obj
, True)
3378 IsFile
= self
.__GetFileStatement
(Obj
, True)
3379 IsFv
= self
.__GetFvStatement
(Obj
)
3380 IsFd
= self
.__GetFdStatement
(Obj
)
3381 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3382 IsAfile
= self
.__GetAfileStatement
(Obj
)
3383 IsFmp
= self
.__GetFmpStatement
(Obj
)
3384 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
or IsAfile
or IsFmp
):
3387 ## __GetFMPCapsuleData() method
3389 # Get capsule data for FMP capsule
3391 # @param self The object pointer
3392 # @param Obj for whom capsule data are got
3394 def __GetFMPCapsuleData(self
, Obj
):
3397 IsFv
= self
.__GetFvStatement
(Obj
, True)
3398 IsFd
= self
.__GetFdStatement
(Obj
, True)
3399 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
, True)
3400 if not (IsFv
or IsFd
or IsAnyFile
):
3403 ## __GetFvStatement() method
3405 # Get FV for capsule
3407 # @param self The object pointer
3408 # @param CapsuleObj for whom FV is got
3409 # @retval True Successfully find a FV statement
3410 # @retval False Not able to find a FV statement
3412 def __GetFvStatement(self
, CapsuleObj
, FMPCapsule
= False):
3414 if not self
.__IsKeyword
("FV"):
3417 if not self
.__IsToken
("="):
3418 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3420 if not self
.__GetNextToken
():
3421 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3423 if self
.__Token
.upper() not in self
.Profile
.FvDict
.keys():
3424 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3426 CapsuleFv
= CapsuleData
.CapsuleFv()
3427 CapsuleFv
.FvName
= self
.__Token
3429 if not CapsuleObj
.ImageFile
:
3430 CapsuleObj
.ImageFile
.append(CapsuleFv
)
3432 CapsuleObj
.VendorCodeFile
.append(CapsuleFv
)
3434 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3437 ## __GetFdStatement() method
3439 # Get FD for capsule
3441 # @param self The object pointer
3442 # @param CapsuleObj for whom FD is got
3443 # @retval True Successfully find a FD statement
3444 # @retval False Not able to find a FD statement
3446 def __GetFdStatement(self
, CapsuleObj
, FMPCapsule
= False):
3448 if not self
.__IsKeyword
("FD"):
3451 if not self
.__IsToken
("="):
3452 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3454 if not self
.__GetNextToken
():
3455 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3457 if self
.__Token
.upper() not in self
.Profile
.FdDict
.keys():
3458 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3460 CapsuleFd
= CapsuleData
.CapsuleFd()
3461 CapsuleFd
.FdName
= self
.__Token
3463 if not CapsuleObj
.ImageFile
:
3464 CapsuleObj
.ImageFile
.append(CapsuleFd
)
3466 CapsuleObj
.VendorCodeFile
.append(CapsuleFd
)
3468 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3471 def __GetFmpStatement(self
, CapsuleObj
):
3472 if not self
.__IsKeyword
("FMP_PAYLOAD"):
3473 if not self
.__IsKeyword
("FMP"):
3476 if not self
.__IsKeyword
("PAYLOAD"):
3480 if not self
.__IsToken
("="):
3481 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3483 if not self
.__GetNextToken
():
3484 raise Warning("expected payload name after FMP_PAYLOAD =", self
.FileName
, self
.CurrentLineNumber
)
3485 Payload
= self
.__Token
.upper()
3486 if Payload
not in self
.Profile
.FmpPayloadDict
:
3487 raise Warning("This FMP Payload does not exist: %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3488 CapsuleObj
.FmpPayloadList
.append(self
.Profile
.FmpPayloadDict
[Payload
])
3491 def __ParseRawFileStatement(self
):
3492 if not self
.__IsKeyword
("FILE"):
3495 if not self
.__IsKeyword
("DATA"):
3499 if not self
.__IsToken
("="):
3500 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3502 if not self
.__GetNextToken
():
3503 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3505 AnyFileName
= self
.__Token
3506 self
.__VerifyFile
(AnyFileName
)
3508 if not os
.path
.isabs(AnyFileName
):
3509 AnyFileName
= mws
.join(GenFdsGlobalVariable
.WorkSpaceDir
, AnyFileName
)
3513 ## __GetAnyFileStatement() method
3515 # Get AnyFile for capsule
3517 # @param self The object pointer
3518 # @param CapsuleObj for whom AnyFile is got
3519 # @retval True Successfully find a Anyfile statement
3520 # @retval False Not able to find a AnyFile statement
3522 def __GetAnyFileStatement(self
, CapsuleObj
, FMPCapsule
= False):
3523 AnyFileName
= self
.__ParseRawFileStatement
()
3527 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3528 CapsuleAnyFile
.FileName
= AnyFileName
3530 if not CapsuleObj
.ImageFile
:
3531 CapsuleObj
.ImageFile
.append(CapsuleAnyFile
)
3533 CapsuleObj
.VendorCodeFile
.append(CapsuleAnyFile
)
3535 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3538 ## __GetAfileStatement() method
3540 # Get Afile for capsule
3542 # @param self The object pointer
3543 # @param CapsuleObj for whom Afile is got
3544 # @retval True Successfully find a Afile statement
3545 # @retval False Not able to find a Afile statement
3547 def __GetAfileStatement(self
, CapsuleObj
):
3549 if not self
.__IsKeyword
("APPEND"):
3552 if not self
.__IsToken
("="):
3553 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3555 if not self
.__GetNextToken
():
3556 raise Warning("expected Afile name", self
.FileName
, self
.CurrentLineNumber
)
3558 AfileName
= self
.__Token
3559 AfileBaseName
= os
.path
.basename(AfileName
)
3561 if os
.path
.splitext(AfileBaseName
)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:
3562 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \
3563 self
.FileName
, self
.CurrentLineNumber
)
3565 if not os
.path
.isabs(AfileName
):
3566 AfileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AfileName
)
3567 self
.__VerifyFile
(AfileName
)
3569 if not os
.path
.exists(AfileName
):
3570 raise Warning('%s does not exist' % AfileName
, self
.FileName
, self
.CurrentLineNumber
)
3574 CapsuleAfile
= CapsuleData
.CapsuleAfile()
3575 CapsuleAfile
.FileName
= AfileName
3576 CapsuleObj
.CapsuleDataList
.append(CapsuleAfile
)
3579 ## __GetRule() method
3581 # Get Rule section contents and store its data into rule list of self.Profile
3583 # @param self The object pointer
3584 # @retval True Successfully find a Rule
3585 # @retval False Not able to find a Rule
3587 def __GetRule(self
):
3589 if not self
.__GetNextToken
():
3592 S
= self
.__Token
.upper()
3593 if S
.startswith("[") and not S
.startswith("[RULE."):
3594 self
.SectionParser(S
)
3598 if not self
.__IsToken
("[Rule.", True):
3599 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3600 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3601 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3602 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3604 if not self
.__SkipToToken
("."):
3605 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3607 Arch
= self
.__SkippedChars
.rstrip(".")
3608 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
3609 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3611 ModuleType
= self
.__GetModuleType
()
3614 if self
.__IsToken
("."):
3615 if not self
.__GetNextWord
():
3616 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3617 TemplateName
= self
.__Token
3619 if not self
.__IsToken
( "]"):
3620 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3622 RuleObj
= self
.__GetRuleFileStatements
()
3623 RuleObj
.Arch
= Arch
.upper()
3624 RuleObj
.ModuleType
= ModuleType
3625 RuleObj
.TemplateName
= TemplateName
3626 if TemplateName
== '' :
3627 self
.Profile
.RuleDict
['RULE' + \
3631 ModuleType
.upper() ] = RuleObj
3633 self
.Profile
.RuleDict
['RULE' + \
3637 ModuleType
.upper() + \
3639 TemplateName
.upper() ] = RuleObj
3640 # self.Profile.RuleList.append(rule)
3643 ## __GetModuleType() method
3645 # Return the module type
3647 # @param self The object pointer
3648 # @retval string module type
3650 def __GetModuleType(self
):
3652 if not self
.__GetNextWord
():
3653 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3654 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3655 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3656 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3657 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3658 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3659 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3660 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3663 ## __GetFileExtension() method
3665 # Return the file extension
3667 # @param self The object pointer
3668 # @retval string file name extension
3670 def __GetFileExtension(self
):
3671 if not self
.__IsToken
("."):
3672 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3675 if self
.__GetNextToken
():
3676 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3677 if Pattern
.match(self
.__Token
):
3681 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3684 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3686 ## __GetRuleFileStatement() method
3690 # @param self The object pointer
3691 # @retval Rule Rule object
3693 def __GetRuleFileStatements(self
):
3695 if not self
.__IsKeyword
("FILE"):
3696 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3698 if not self
.__GetNextWord
():
3699 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3701 Type
= self
.__Token
.strip().upper()
3702 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3703 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3704 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3706 if not self
.__IsToken
("="):
3707 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3709 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3710 if not self
.__GetNextWord
():
3711 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3712 if self
.__Token
== 'PCD':
3713 if not self
.__IsToken
( "("):
3714 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3715 PcdPair
= self
.__GetNextPcdName
()
3716 if not self
.__IsToken
( ")"):
3717 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3718 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3720 NameGuid
= self
.__Token
3723 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3724 if self
.__FileCouldHaveRelocFlag
(Type
):
3725 if self
.__Token
== 'RELOCS_STRIPPED':
3730 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3733 if self
.__GetNextToken
():
3734 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3735 if Pattern
.match(self
.__Token
):
3736 KeyStringList
.append(self
.__Token
)
3737 if self
.__IsToken
(","):
3738 while self
.__GetNextToken
():
3739 if not Pattern
.match(self
.__Token
):
3740 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3741 KeyStringList
.append(self
.__Token
)
3743 if not self
.__IsToken
(","):
3751 if self
.__IsKeyword
("Fixed", True):
3755 if self
.__IsKeyword
("CheckSum", True):
3759 if self
.__GetAlignment
():
3760 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3761 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3762 #For FFS, Auto is default option same to ""
3763 if not self
.__Token
== "Auto":
3764 AlignValue
= self
.__Token
3766 if self
.__IsToken
("{"):
3767 # Complex file rule expected
3768 Rule
= RuleComplexFile
.RuleComplexFile()
3769 Rule
.FvFileType
= Type
3770 Rule
.NameGuid
= NameGuid
3771 Rule
.Alignment
= AlignValue
3772 Rule
.CheckSum
= CheckSum
3774 Rule
.KeyStringList
= KeyStringList
3775 if KeepReloc
!= None:
3776 Rule
.KeepReloc
= KeepReloc
3779 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3780 IsLeaf
= self
.__GetEfiSection
(Rule
)
3781 if not IsEncapsulate
and not IsLeaf
:
3784 if not self
.__IsToken
("}"):
3785 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3790 # Simple file rule expected
3791 if not self
.__GetNextWord
():
3792 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3794 SectionName
= self
.__Token
3796 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3797 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3798 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3801 if self
.__IsKeyword
("Fixed", True):
3804 if self
.__IsKeyword
("CheckSum", True):
3808 if self
.__GetAlignment
():
3809 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3810 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3811 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3812 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3813 SectAlignment
= self
.__Token
3816 if self
.__IsToken
('|'):
3817 Ext
= self
.__GetFileExtension
()
3818 elif not self
.__GetNextToken
():
3819 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3821 Rule
= RuleSimpleFile
.RuleSimpleFile()
3822 Rule
.SectionType
= SectionName
3823 Rule
.FvFileType
= Type
3824 Rule
.NameGuid
= NameGuid
3825 Rule
.Alignment
= AlignValue
3826 Rule
.SectAlignment
= SectAlignment
3827 Rule
.CheckSum
= CheckSum
3829 Rule
.KeyStringList
= KeyStringList
3830 if KeepReloc
!= None:
3831 Rule
.KeepReloc
= KeepReloc
3832 Rule
.FileExtension
= Ext
3833 Rule
.FileName
= self
.__Token
3836 ## __GetEfiSection() method
3838 # Get section list for Rule
3840 # @param self The object pointer
3841 # @param Obj for whom section is got
3842 # @retval True Successfully find section statement
3843 # @retval False Not able to find section statement
3845 def __GetEfiSection(self
, Obj
):
3847 OldPos
= self
.GetFileBufferPos()
3848 if not self
.__GetNextWord
():
3850 SectionName
= self
.__Token
3852 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3853 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3857 if SectionName
== "FV_IMAGE":
3858 FvImageSectionObj
= FvImageSection
.FvImageSection()
3859 if self
.__IsKeyword
("FV_IMAGE"):
3861 if self
.__IsToken
( "{"):
3863 self
.__GetDefineStatements
(FvObj
)
3864 self
.__GetBlockStatement
(FvObj
)
3865 self
.__GetSetStatements
(FvObj
)
3866 self
.__GetFvAlignment
(FvObj
)
3867 self
.__GetFvAttributes
(FvObj
)
3868 self
.__GetAprioriSection
(FvObj
)
3869 self
.__GetAprioriSection
(FvObj
)
3872 IsInf
= self
.__GetInfStatement
(FvObj
)
3873 IsFile
= self
.__GetFileStatement
(FvObj
)
3874 if not IsInf
and not IsFile
:
3877 if not self
.__IsToken
( "}"):
3878 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3879 FvImageSectionObj
.Fv
= FvObj
3880 FvImageSectionObj
.FvName
= None
3883 if not self
.__IsKeyword
("FV"):
3884 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3885 FvImageSectionObj
.FvFileType
= self
.__Token
3887 if self
.__GetAlignment
():
3888 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3889 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3890 FvImageSectionObj
.Alignment
= self
.__Token
3892 if self
.__IsToken
('|'):
3893 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3894 elif self
.__GetNextToken
():
3895 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3896 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3897 FvImageSectionObj
.FvFileName
= self
.__Token
3901 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3903 Obj
.SectionList
.append(FvImageSectionObj
)
3906 EfiSectionObj
= EfiSection
.EfiSection()
3907 EfiSectionObj
.SectionType
= SectionName
3909 if not self
.__GetNextToken
():
3910 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3912 if self
.__Token
== "STRING":
3913 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3914 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3916 if not self
.__IsToken
('='):
3917 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3919 if not self
.__GetNextToken
():
3920 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3922 if self
.__GetStringData
():
3923 EfiSectionObj
.StringData
= self
.__Token
3925 if self
.__IsKeyword
("BUILD_NUM"):
3926 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3927 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3929 if not self
.__IsToken
("="):
3930 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3931 if not self
.__GetNextToken
():
3932 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3933 EfiSectionObj
.BuildNum
= self
.__Token
3936 EfiSectionObj
.FileType
= self
.__Token
3937 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3939 if self
.__IsKeyword
("Optional"):
3940 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3941 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3942 EfiSectionObj
.Optional
= True
3944 if self
.__IsKeyword
("BUILD_NUM"):
3945 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3946 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3948 if not self
.__IsToken
("="):
3949 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3950 if not self
.__GetNextToken
():
3951 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3952 EfiSectionObj
.BuildNum
= self
.__Token
3954 if self
.__GetAlignment
():
3955 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3956 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3957 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3958 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3959 EfiSectionObj
.Alignment
= self
.__Token
3961 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3962 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3963 if self
.__Token
== 'RELOCS_STRIPPED':
3964 EfiSectionObj
.KeepReloc
= False
3966 EfiSectionObj
.KeepReloc
= True
3967 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3968 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3970 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3973 if self
.__IsToken
('|'):
3974 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3975 elif self
.__GetNextToken
():
3976 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3977 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3979 if self
.__Token
.startswith('PCD'):
3981 self
.__GetNextWord
()
3983 if self
.__Token
== 'PCD':
3984 if not self
.__IsToken
( "("):
3985 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3986 PcdPair
= self
.__GetNextPcdName
()
3987 if not self
.__IsToken
( ")"):
3988 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3989 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3991 EfiSectionObj
.FileName
= self
.__Token
3996 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3998 Obj
.SectionList
.append(EfiSectionObj
)
4001 ## __RuleSectionCouldBeOptional() method
4003 # Get whether a section could be optional
4005 # @param self The object pointer
4006 # @param SectionType The section type to check
4007 # @retval True section could be optional
4008 # @retval False section never optional
4010 def __RuleSectionCouldBeOptional(self
, SectionType
):
4011 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
4016 ## __RuleSectionCouldHaveBuildNum() method
4018 # Get whether a section could have build number information
4020 # @param self The object pointer
4021 # @param SectionType The section type to check
4022 # @retval True section could have build number information
4023 # @retval False section never have build number information
4025 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
4026 if SectionType
in ("VERSION"):
4031 ## __RuleSectionCouldHaveString() method
4033 # Get whether a section could have string
4035 # @param self The object pointer
4036 # @param SectionType The section type to check
4037 # @retval True section could have string
4038 # @retval False section never have string
4040 def __RuleSectionCouldHaveString(self
, SectionType
):
4041 if SectionType
in ("UI", "VERSION"):
4046 ## __CheckRuleSectionFileType() method
4048 # Get whether a section matches a file type
4050 # @param self The object pointer
4051 # @param SectionType The section type to check
4052 # @param FileType The file type to check
4054 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
4055 if SectionType
== "COMPAT16":
4056 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
4057 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4058 elif SectionType
== "PE32":
4059 if FileType
not in ("PE32", "SEC_PE32"):
4060 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4061 elif SectionType
== "PIC":
4062 if FileType
not in ("PIC", "PIC"):
4063 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4064 elif SectionType
== "TE":
4065 if FileType
not in ("TE", "SEC_TE"):
4066 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4067 elif SectionType
== "RAW":
4068 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
4069 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4070 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
4071 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
4072 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4073 elif SectionType
== "UI":
4074 if FileType
not in ("UI", "SEC_UI"):
4075 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4076 elif SectionType
== "VERSION":
4077 if FileType
not in ("VERSION", "SEC_VERSION"):
4078 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4079 elif SectionType
== "PEI_DEPEX":
4080 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
4081 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4082 elif SectionType
== "GUID":
4083 if FileType
not in ("PE32", "SEC_GUID"):
4084 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4086 ## __GetRuleEncapsulationSection() method
4088 # Get encapsulation section for Rule
4090 # @param self The object pointer
4091 # @param Rule for whom section is got
4092 # @retval True Successfully find section statement
4093 # @retval False Not able to find section statement
4095 def __GetRuleEncapsulationSection(self
, Rule
):
4097 if self
.__IsKeyword
( "COMPRESS"):
4099 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
4102 if not self
.__IsToken
("{"):
4103 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4105 CompressSectionObj
= CompressSection
.CompressSection()
4107 CompressSectionObj
.CompType
= Type
4108 # Recursive sections...
4110 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
4111 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
4112 if not IsEncapsulate
and not IsLeaf
:
4115 if not self
.__IsToken
( "}"):
4116 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4117 Rule
.SectionList
.append(CompressSectionObj
)
4121 elif self
.__IsKeyword
( "GUIDED"):
4123 if self
.__GetNextGuid
():
4124 GuidValue
= self
.__Token
4126 if self
.__IsKeyword
( "$(NAMED_GUID)"):
4127 GuidValue
= self
.__Token
4129 AttribDict
= self
.__GetGuidAttrib
()
4131 if not self
.__IsToken
("{"):
4132 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4133 GuidSectionObj
= GuidSection
.GuidSection()
4134 GuidSectionObj
.NameGuid
= GuidValue
4135 GuidSectionObj
.SectionType
= "GUIDED"
4136 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
4137 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
4138 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
4142 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
4143 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
4144 if not IsEncapsulate
and not IsLeaf
:
4147 if not self
.__IsToken
( "}"):
4148 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4149 Rule
.SectionList
.append(GuidSectionObj
)
4155 ## __GetVtf() method
4157 # Get VTF section contents and store its data into VTF list of self.Profile
4159 # @param self The object pointer
4160 # @retval True Successfully find a VTF
4161 # @retval False Not able to find a VTF
4165 if not self
.__GetNextToken
():
4168 S
= self
.__Token
.upper()
4169 if S
.startswith("[") and not S
.startswith("[VTF."):
4170 self
.SectionParser(S
)
4175 if not self
.__IsToken
("[VTF.", True):
4176 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4177 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
4178 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
4179 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
4181 if not self
.__SkipToToken
("."):
4182 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
4184 Arch
= self
.__SkippedChars
.rstrip(".").upper()
4185 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4186 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
4188 if not self
.__GetNextWord
():
4189 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
4190 Name
= self
.__Token
.upper()
4193 VtfObj
.UiName
= Name
4194 VtfObj
.KeyArch
= Arch
4196 if self
.__IsToken
(","):
4197 if not self
.__GetNextWord
():
4198 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
4199 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4200 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4201 VtfObj
.ArchList
= self
.__Token
.upper()
4203 if not self
.__IsToken
( "]"):
4204 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4206 if self
.__IsKeyword
("IA32_RST_BIN"):
4207 if not self
.__IsToken
("="):
4208 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4210 if not self
.__GetNextToken
():
4211 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
4213 VtfObj
.ResetBin
= self
.__Token
4214 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4215 #check for file path
4216 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4218 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4220 while self
.__GetComponentStatement
(VtfObj
):
4223 self
.Profile
.VtfList
.append(VtfObj
)
4226 ## __GetComponentStatement() method
4228 # Get components in VTF
4230 # @param self The object pointer
4231 # @param VtfObj for whom component is got
4232 # @retval True Successfully find a component
4233 # @retval False Not able to find a component
4235 def __GetComponentStatement(self
, VtfObj
):
4237 if not self
.__IsKeyword
("COMP_NAME"):
4240 if not self
.__IsToken
("="):
4241 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4243 if not self
.__GetNextWord
():
4244 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
4246 CompStatementObj
= ComponentStatement
.ComponentStatement()
4247 CompStatementObj
.CompName
= self
.__Token
4249 if not self
.__IsKeyword
("COMP_LOC"):
4250 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
4252 if not self
.__IsToken
("="):
4253 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4255 CompStatementObj
.CompLoc
= ""
4256 if self
.__GetNextWord
():
4257 CompStatementObj
.CompLoc
= self
.__Token
4258 if self
.__IsToken
('|'):
4259 if not self
.__GetNextWord
():
4260 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
4262 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
4263 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4265 CompStatementObj
.FilePos
= self
.__Token
4267 self
.CurrentLineNumber
+= 1
4268 self
.CurrentOffsetWithinLine
= 0
4270 if not self
.__IsKeyword
("COMP_TYPE"):
4271 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
4273 if not self
.__IsToken
("="):
4274 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4276 if not self
.__GetNextToken
():
4277 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
4278 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
4279 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
4280 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
4281 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4282 CompStatementObj
.CompType
= self
.__Token
4284 if not self
.__IsKeyword
("COMP_VER"):
4285 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
4287 if not self
.__IsToken
("="):
4288 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4290 if not self
.__GetNextToken
():
4291 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
4293 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
4294 if Pattern
.match(self
.__Token
) == None:
4295 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4296 CompStatementObj
.CompVer
= self
.__Token
4298 if not self
.__IsKeyword
("COMP_CS"):
4299 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
4301 if not self
.__IsToken
("="):
4302 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4304 if not self
.__GetNextToken
():
4305 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
4306 if self
.__Token
not in ("1", "0"):
4307 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4308 CompStatementObj
.CompCs
= self
.__Token
4311 if not self
.__IsKeyword
("COMP_BIN"):
4312 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
4314 if not self
.__IsToken
("="):
4315 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4317 if not self
.__GetNextToken
():
4318 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
4320 CompStatementObj
.CompBin
= self
.__Token
4321 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4322 #check for file path
4323 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4325 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4327 if not self
.__IsKeyword
("COMP_SYM"):
4328 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
4330 if not self
.__IsToken
("="):
4331 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4333 if not self
.__GetNextToken
():
4334 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
4336 CompStatementObj
.CompSym
= self
.__Token
4337 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
4338 #check for file path
4339 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4341 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4343 if not self
.__IsKeyword
("COMP_SIZE"):
4344 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
4346 if not self
.__IsToken
("="):
4347 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4349 if self
.__IsToken
("-"):
4350 CompStatementObj
.CompSize
= self
.__Token
4351 elif self
.__GetNextDecimalNumber
():
4352 CompStatementObj
.CompSize
= self
.__Token
4353 elif self
.__GetNextHexNumber
():
4354 CompStatementObj
.CompSize
= self
.__Token
4356 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4358 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
4361 ## __GetOptionRom() method
4363 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
4365 # @param self The object pointer
4366 # @retval True Successfully find a OptionROM
4367 # @retval False Not able to find a OptionROM
4369 def __GetOptionRom(self
):
4371 if not self
.__GetNextToken
():
4374 S
= self
.__Token
.upper()
4375 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
4376 self
.SectionParser(S
)
4381 if not self
.__IsToken
("[OptionRom.", True):
4382 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4384 OptRomName
= self
.__GetUiName
()
4386 if not self
.__IsToken
( "]"):
4387 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4389 OptRomObj
= OptionRom
.OPTIONROM()
4390 OptRomObj
.DriverName
= OptRomName
4391 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
4394 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
4395 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
4396 if not isInf
and not isFile
:
4401 ## __GetOptRomInfStatement() method
4403 # Get INF statements
4405 # @param self The object pointer
4406 # @param Obj for whom inf statement is got
4407 # @retval True Successfully find inf statement
4408 # @retval False Not able to find inf statement
4410 def __GetOptRomInfStatement(self
, Obj
):
4412 if not self
.__IsKeyword
( "INF"):
4415 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
4416 self
.__GetInfOptions
( ffsInf
)
4418 if not self
.__GetNextToken
():
4419 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
4420 ffsInf
.InfFileName
= self
.__Token
4421 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4422 #check for file path
4423 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4425 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4427 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4428 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4429 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4430 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4432 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
4433 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
4435 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
4437 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
4440 self
.__GetOptRomOverrides
(ffsInf
)
4442 Obj
.FfsList
.append(ffsInf
)
4445 ## __GetOptRomOverrides() method
4447 # Get overrides for OptROM INF & FILE
4449 # @param self The object pointer
4450 # @param FfsInfObj for whom overrides is got
4452 def __GetOptRomOverrides(self
, Obj
):
4453 if self
.__IsToken
('{'):
4454 Overrides
= OptionRom
.OverrideAttribs()
4456 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4457 if not self
.__IsToken
( "="):
4458 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4459 if not self
.__GetNextHexNumber
():
4460 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4461 Overrides
.PciVendorId
= self
.__Token
4464 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4465 if not self
.__IsToken
( "="):
4466 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4467 if not self
.__GetNextHexNumber
():
4468 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4469 Overrides
.PciClassCode
= self
.__Token
4472 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4473 if not self
.__IsToken
( "="):
4474 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4475 if not self
.__GetNextHexNumber
():
4476 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4478 Overrides
.PciDeviceId
= self
.__Token
4481 if self
.__IsKeyword
( "PCI_REVISION"):
4482 if not self
.__IsToken
( "="):
4483 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4484 if not self
.__GetNextHexNumber
():
4485 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4486 Overrides
.PciRevision
= self
.__Token
4489 if self
.__IsKeyword
( "PCI_COMPRESS"):
4490 if not self
.__IsToken
( "="):
4491 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4492 if not self
.__GetNextToken
():
4493 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4494 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4497 if self
.__IsToken
( "}"):
4500 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4502 Obj
.OverrideAttribs
= Overrides
4504 ## __GetOptRomFileStatement() method
4506 # Get FILE statements
4508 # @param self The object pointer
4509 # @param Obj for whom FILE statement is got
4510 # @retval True Successfully find FILE statement
4511 # @retval False Not able to find FILE statement
4513 def __GetOptRomFileStatement(self
, Obj
):
4515 if not self
.__IsKeyword
( "FILE"):
4518 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4520 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4521 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4522 FfsFileObj
.FileType
= self
.__Token
4524 if not self
.__GetNextToken
():
4525 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4526 FfsFileObj
.FileName
= self
.__Token
4527 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4528 #check for file path
4529 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4531 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4533 if FfsFileObj
.FileType
== 'EFI':
4534 self
.__GetOptRomOverrides
(FfsFileObj
)
4536 Obj
.FfsList
.append(FfsFileObj
)
4540 ## __GetCapInFd() method
4542 # Get Cap list contained in FD
4544 # @param self The object pointer
4545 # @param FdName FD name
4546 # @retval CapList List of Capsule in FD
4548 def __GetCapInFd (self
, FdName
):
4551 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4552 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4553 for elementRegion
in FdObj
.RegionList
:
4554 if elementRegion
.RegionType
== 'CAPSULE':
4555 for elementRegionData
in elementRegion
.RegionDataList
:
4556 if elementRegionData
.endswith(".cap"):
4558 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
4559 CapList
.append(elementRegionData
.upper())
4562 ## __GetReferencedFdCapTuple() method
4564 # Get FV and FD list referenced by a capsule image
4566 # @param self The object pointer
4567 # @param CapObj Capsule section to be searched
4568 # @param RefFdList referenced FD by section
4569 # @param RefFvList referenced FV by section
4571 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4573 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4574 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4575 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4576 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4577 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4578 elif CapsuleDataObj
.Ffs
!= None:
4579 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4580 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4581 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4582 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4583 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4585 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4587 ## __GetFvInFd() method
4589 # Get FV list contained in FD
4591 # @param self The object pointer
4592 # @param FdName FD name
4593 # @retval FvList list of FV in FD
4595 def __GetFvInFd (self
, FdName
):
4598 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4599 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4600 for elementRegion
in FdObj
.RegionList
:
4601 if elementRegion
.RegionType
== 'FV':
4602 for elementRegionData
in elementRegion
.RegionDataList
:
4603 if elementRegionData
.endswith(".fv"):
4605 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4606 FvList
.append(elementRegionData
.upper())
4609 ## __GetReferencedFdFvTuple() method
4611 # Get FD and FV list referenced by a FFS file
4613 # @param self The object pointer
4614 # @param FfsFile contains sections to be searched
4615 # @param RefFdList referenced FD by section
4616 # @param RefFvList referenced FV by section
4618 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4620 for FfsObj
in FvObj
.FfsList
:
4621 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4622 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4623 RefFvList
.append(FfsObj
.FvName
.upper())
4624 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4625 RefFdList
.append(FfsObj
.FdName
.upper())
4627 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4629 ## __GetReferencedFdFvTupleFromSection() method
4631 # Get FD and FV list referenced by a FFS section
4633 # @param self The object pointer
4634 # @param FfsFile contains sections to be searched
4635 # @param FdList referenced FD by section
4636 # @param FvList referenced FV by section
4638 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4641 SectionStack
.extend(FfsFile
.SectionList
)
4642 while SectionStack
!= []:
4643 SectionObj
= SectionStack
.pop()
4644 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4645 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4646 FvList
.append(SectionObj
.FvName
.upper())
4647 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4648 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4649 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4651 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4652 SectionStack
.extend(SectionObj
.SectionList
)
4654 ## CycleReferenceCheck() method
4656 # Check whether cycle reference exists in FDF
4658 # @param self The object pointer
4659 # @retval True cycle reference exists
4660 # @retval False Not exists cycle reference
4662 def CycleReferenceCheck(self
):
4664 # Check the cycle between FV and FD image
4666 MaxLength
= len (self
.Profile
.FvDict
)
4667 for FvName
in self
.Profile
.FvDict
.keys():
4668 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4670 RefFvStack
.append(FvName
)
4674 while RefFvStack
!= [] and Index
< MaxLength
:
4676 FvNameFromStack
= RefFvStack
.pop()
4677 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4678 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4684 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4686 for RefFdName
in RefFdList
:
4687 if RefFdName
in FdAnalyzedList
:
4690 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4691 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4692 if FvInFdList
!= []:
4693 for FvNameInFd
in FvInFdList
:
4694 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4695 if FvNameInFd
not in RefFvStack
:
4696 RefFvStack
.append(FvNameInFd
)
4698 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4699 EdkLogger
.info(LogStr
)
4701 FdAnalyzedList
.append(RefFdName
)
4703 for RefFvName
in RefFvList
:
4704 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4705 if RefFvName
not in RefFvStack
:
4706 RefFvStack
.append(RefFvName
)
4708 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4709 EdkLogger
.info(LogStr
)
4713 # Check the cycle between Capsule and FD image
4715 MaxLength
= len (self
.Profile
.CapsuleDict
)
4716 for CapName
in self
.Profile
.CapsuleDict
.keys():
4718 # Capsule image to be checked.
4720 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4722 RefCapStack
.append(CapName
)
4727 while RefCapStack
!= [] and Index
< MaxLength
:
4729 CapNameFromStack
= RefCapStack
.pop()
4730 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4731 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4737 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4741 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4742 for RefFdName
in RefFdList
:
4743 if RefFdName
in FdAnalyzedList
:
4746 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4747 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4748 if CapInFdList
!= []:
4749 for CapNameInFd
in CapInFdList
:
4750 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4751 if CapNameInFd
not in RefCapStack
:
4752 RefCapStack
.append(CapNameInFd
)
4754 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4755 EdkLogger
.info(LogStr
)
4758 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4759 if FvInFdList
!= []:
4760 for FvNameInFd
in FvInFdList
:
4761 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4762 if FvNameInFd
not in RefFvList
:
4763 RefFvList
.append(FvNameInFd
)
4765 FdAnalyzedList
.append(RefFdName
)
4767 # the number of the parsed FV and FD image
4769 FvListLength
= len (RefFvList
)
4770 FdListLength
= len (RefFdList
)
4771 for RefFvName
in RefFvList
:
4772 if RefFvName
in FvAnalyzedList
:
4774 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4775 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4776 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4779 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4780 FvAnalyzedList
.append(RefFvName
)
4784 if __name__
== "__main__":
4787 test_file
= sys
.argv
[1]
4788 except IndexError, v
:
4789 print "Usage: %s filename" % sys
.argv
[0]
4792 parser
= FdfParser(test_file
)
4795 parser
.CycleReferenceCheck()