4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
5 # Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>
7 # This program and the accompanying materials
8 # are licensed and made available under the terms and conditions of the BSD License
9 # which accompanies this distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
25 import FfsInfStatement
26 import FfsFileStatement
32 import CompressSection
37 import RuleComplexFile
41 import ComponentStatement
43 import OptRomInfStatement
44 import OptRomFileStatement
47 from GenFdsGlobalVariable
import GenFdsGlobalVariable
48 from Common
.BuildToolError
import *
49 from Common
import EdkLogger
50 from Common
.Misc
import PathClass
51 from Common
.String
import NormPath
52 import Common
.GlobalData
as GlobalData
53 from Common
.Expression
import *
54 from Common
import GlobalData
55 from Common
.DataType
import *
56 from Common
.String
import ReplaceMacro
58 from Common
.Misc
import tdict
59 from Common
.MultipleWorkspace
import MultipleWorkspace
as mws
60 import Common
.LongFilePathOs
as os
61 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
62 from Capsule
import EFI_CERT_TYPE_PKCS7_GUID
63 from Capsule
import EFI_CERT_TYPE_RSA2048_SHA256_GUID
64 from Common
.RangeExpression
import RangeExpression
66 ##define T_CHAR_SPACE ' '
67 ##define T_CHAR_NULL '\0'
68 ##define T_CHAR_CR '\r'
69 ##define T_CHAR_TAB '\t'
70 ##define T_CHAR_LF '\n'
71 ##define T_CHAR_SLASH '/'
72 ##define T_CHAR_BACKSLASH '\\'
73 ##define T_CHAR_DOUBLE_QUOTE '\"'
74 ##define T_CHAR_SINGLE_QUOTE '\''
75 ##define T_CHAR_STAR '*'
76 ##define T_CHAR_HASH '#'
78 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
79 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
80 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
82 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
84 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
85 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
86 RegionOffsetPcdPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*$")
87 ShortcutPcdPattern
= re
.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
88 BaseAddrValuePattern
= re
.compile('^0[xX][0-9a-fA-F]+')
89 FileExtensionPattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
90 TokenFindPattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
92 AllIncludeFileList
= []
94 # Get the closest parent
95 def GetParentAtLine (Line
):
96 for Profile
in AllIncludeFileList
:
97 if Profile
.IsLineInFile(Line
):
102 def IsValidInclude (File
, Line
):
103 for Profile
in AllIncludeFileList
:
104 if Profile
.IsLineInFile(Line
) and Profile
.FileName
== File
:
109 def GetRealFileLine (File
, Line
):
112 for Profile
in AllIncludeFileList
:
113 if Profile
.IsLineInFile(Line
):
114 return Profile
.GetLineInFile(Line
)
115 elif Line
>= Profile
.InsertStartLineNumber
and Profile
.Level
== 1:
116 InsertedLines
+= Profile
.GetTotalLines()
118 return (File
, Line
- InsertedLines
)
120 ## The exception class that used to report error messages when parsing FDF
122 # Currently the "ToolName" is set to be "FDF Parser".
124 class Warning (Exception):
127 # @param self The object pointer
128 # @param Str The message to record
129 # @param File The FDF name
130 # @param Line The Line number that error occurs
132 def __init__(self
, Str
, File
= None, Line
= None):
134 FileLineTuple
= GetRealFileLine(File
, Line
)
135 self
.FileName
= FileLineTuple
[0]
136 self
.LineNumber
= FileLineTuple
[1]
137 self
.OriginalLineNumber
= Line
139 self
.ToolName
= 'FdfParser'
144 ## The Include file content class that used to record file data when parsing include file
146 # May raise Exception when opening file.
148 class IncludeFileProfile
:
151 # @param self The object pointer
152 # @param FileName The file that to be parsed
154 def __init__(self
, FileName
):
155 self
.FileName
= FileName
156 self
.FileLinesList
= []
158 fsock
= open(FileName
, "rb", 0)
160 self
.FileLinesList
= fsock
.readlines()
161 for index
, line
in enumerate(self
.FileLinesList
):
162 if not line
.endswith('\n'):
163 self
.FileLinesList
[index
] += '\n'
169 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
171 self
.InsertStartLineNumber
= None
172 self
.InsertAdjust
= 0
173 self
.IncludeFileList
= []
174 self
.Level
= 1 # first level include file
176 def GetTotalLines(self
):
177 TotalLines
= self
.InsertAdjust
+ len(self
.FileLinesList
)
179 for Profile
in self
.IncludeFileList
:
180 TotalLines
+= Profile
.GetTotalLines()
184 def IsLineInFile(self
, Line
):
185 if Line
>= self
.InsertStartLineNumber
and Line
< self
.InsertStartLineNumber
+ self
.GetTotalLines():
190 def GetLineInFile(self
, Line
):
191 if not self
.IsLineInFile (Line
):
192 return (self
.FileName
, -1)
194 InsertedLines
= self
.InsertStartLineNumber
196 for Profile
in self
.IncludeFileList
:
197 if Profile
.IsLineInFile(Line
):
198 return Profile
.GetLineInFile(Line
)
199 elif Line
>= Profile
.InsertStartLineNumber
:
200 InsertedLines
+= Profile
.GetTotalLines()
202 return (self
.FileName
, Line
- InsertedLines
+ 1)
206 ## The FDF content class that used to record file data when parsing FDF
208 # May raise Exception when opening file.
213 # @param self The object pointer
214 # @param FileName The file that to be parsed
216 def __init__(self
, FileName
):
217 self
.FileLinesList
= []
219 fsock
= open(FileName
, "rb", 0)
221 self
.FileLinesList
= fsock
.readlines()
226 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
231 self
.InfDict
= {'ArchTBD':[]}
232 # ECC will use this Dict and List information
233 self
.PcdFileLineDict
= {}
234 self
.InfFileLineList
= []
237 self
.FdNameNotSet
= False
239 self
.CapsuleDict
= {}
243 self
.FmpPayloadDict
= {}
245 ## The syntax parser for FDF
247 # PreprocessFile method should be called prior to ParseFile
248 # CycleReferenceCheck method can detect cycles in FDF contents
250 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
251 # Get*** procedures mean these procedures will make judgement on current token only.
256 # @param self The object pointer
257 # @param FileName The file that to be parsed
259 def __init__(self
, FileName
):
260 self
.Profile
= FileProfile(FileName
)
261 self
.FileName
= FileName
262 self
.CurrentLineNumber
= 1
263 self
.CurrentOffsetWithinLine
= 0
264 self
.CurrentFdName
= None
265 self
.CurrentFvName
= None
267 self
.__SkippedChars
= ""
268 GlobalData
.gFdfParser
= self
270 # Used to section info
271 self
.__CurSection
= []
272 # Key: [section name, UI name, arch]
273 # Value: {MACRO_NAME : MACRO_VALUE}
274 self
.__MacroDict
= tdict(True, 3)
277 self
.__WipeOffArea
= []
278 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
279 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
281 ## __SkipWhiteSpace() method
283 # Skip white spaces from current char, return number of chars skipped
285 # @param self The object pointer
286 # @retval Count The number of chars skipped
288 def __SkipWhiteSpace(self
):
290 while not self
.__EndOfFile
():
292 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
293 self
.__SkippedChars
+= str(self
.__CurrentChar
())
300 ## __EndOfFile() method
302 # Judge current buffer pos is at file end
304 # @param self The object pointer
305 # @retval True Current File buffer position is at file end
306 # @retval False Current File buffer position is NOT at file end
308 def __EndOfFile(self
):
309 NumberOfLines
= len(self
.Profile
.FileLinesList
)
310 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
311 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
313 elif self
.CurrentLineNumber
> NumberOfLines
:
318 ## __EndOfLine() method
320 # Judge current buffer pos is at line end
322 # @param self The object pointer
323 # @retval True Current File buffer position is at line end
324 # @retval False Current File buffer position is NOT at line end
326 def __EndOfLine(self
):
327 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
329 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
330 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
337 # Reset file data buffer to the initial state
339 # @param self The object pointer
340 # @param DestLine Optional new destination line number.
341 # @param DestOffset Optional new destination offset.
343 def Rewind(self
, DestLine
= 1, DestOffset
= 0):
344 self
.CurrentLineNumber
= DestLine
345 self
.CurrentOffsetWithinLine
= DestOffset
347 ## __UndoOneChar() method
349 # Go back one char in the file buffer
351 # @param self The object pointer
352 # @retval True Successfully go back one char
353 # @retval False Not able to go back one char as file beginning reached
355 def __UndoOneChar(self
):
357 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
359 elif self
.CurrentOffsetWithinLine
== 0:
360 self
.CurrentLineNumber
-= 1
361 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
363 self
.CurrentOffsetWithinLine
-= 1
366 ## __GetOneChar() method
368 # Move forward one char in the file buffer
370 # @param self The object pointer
372 def __GetOneChar(self
):
373 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
374 self
.CurrentLineNumber
+= 1
375 self
.CurrentOffsetWithinLine
= 0
377 self
.CurrentOffsetWithinLine
+= 1
379 ## __CurrentChar() method
381 # Get the char pointed to by the file buffer pointer
383 # @param self The object pointer
384 # @retval Char Current char
386 def __CurrentChar(self
):
387 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
389 ## __NextChar() method
391 # Get the one char pass the char pointed to by the file buffer pointer
393 # @param self The object pointer
394 # @retval Char Next char
396 def __NextChar(self
):
397 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
398 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
400 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
402 ## __SetCurrentCharValue() method
404 # Modify the value of current char
406 # @param self The object pointer
407 # @param Value The new value of current char
409 def __SetCurrentCharValue(self
, Value
):
410 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
412 ## __CurrentLine() method
414 # Get the list that contains current line contents
416 # @param self The object pointer
417 # @retval List current line contents
419 def __CurrentLine(self
):
420 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
422 def __StringToList(self
):
423 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
424 self
.Profile
.FileLinesList
[-1].append(' ')
426 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
427 if StartPos
[0] == EndPos
[0]:
429 while Offset
<= EndPos
[1]:
430 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
435 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
436 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
440 while Line
< EndPos
[0]:
442 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
443 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
448 while Offset
<= EndPos
[1]:
449 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
453 def __GetMacroName(self
):
454 if not self
.__GetNextToken
():
455 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
456 MacroName
= self
.__Token
458 if MacroName
.startswith('!'):
460 MacroName
= MacroName
[1:].strip()
462 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
463 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
464 self
.FileName
, self
.CurrentLineNumber
)
465 MacroName
= MacroName
[2:-1]
466 return MacroName
, NotFlag
468 def __SetMacroValue(self
, Macro
, Value
):
469 if not self
.__CurSection
:
473 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
474 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
476 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
477 MacroDict
[Macro
] = Value
479 def __GetMacroValue(self
, Macro
):
481 if Macro
in GlobalData
.gCommandLineDefines
:
482 return GlobalData
.gCommandLineDefines
[Macro
]
483 if Macro
in GlobalData
.gGlobalDefines
:
484 return GlobalData
.gGlobalDefines
[Macro
]
486 if self
.__CurSection
:
487 MacroDict
= self
.__MacroDict
[
488 self
.__CurSection
[0],
489 self
.__CurSection
[1],
492 if MacroDict
and Macro
in MacroDict
:
493 return MacroDict
[Macro
]
496 if Macro
in GlobalData
.gPlatformDefines
:
497 return GlobalData
.gPlatformDefines
[Macro
]
500 def __SectionHeaderParser(self
, Section
):
502 # [FD.UiName]: use dummy instead if UI name is optional
505 # [Rule]: don't take rule section into account, macro is not allowed in this section
506 # [VTF.arch.UiName, arch]
507 # [OptionRom.DriverName]
508 self
.__CurSection
= []
509 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
510 ItemList
= Section
.split('.')
512 if Item
== '' or Item
== 'RULE':
515 if Item
== TAB_COMMON_DEFINES
.upper():
516 self
.__CurSection
= [TAB_COMMON
, TAB_COMMON
, TAB_COMMON
]
517 elif Item
== 'VTF' and len(ItemList
) == 3:
519 Pos
= UiName
.find(',')
521 UiName
= UiName
[:Pos
]
522 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
523 elif len(ItemList
) > 1:
524 self
.__CurSection
= [ItemList
[0], ItemList
[1], TAB_COMMON
]
525 elif len(ItemList
) > 0:
526 self
.__CurSection
= [ItemList
[0], 'DUMMY', TAB_COMMON
]
528 ## PreprocessFile() method
530 # Preprocess file contents, replace comments with spaces.
531 # In the end, rewind the file buffer pointer to the beginning
532 # BUGBUG: No !include statement processing contained in this procedure
533 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
535 # @param self The object pointer
537 def PreprocessFile(self
):
541 DoubleSlashComment
= False
543 # HashComment in quoted string " " is ignored.
546 while not self
.__EndOfFile
():
548 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
549 InString
= not InString
550 # meet new line, then no longer in a comment for // and '#'
551 if self
.__CurrentChar
() == T_CHAR_LF
:
552 self
.CurrentLineNumber
+= 1
553 self
.CurrentOffsetWithinLine
= 0
554 if InComment
and DoubleSlashComment
:
556 DoubleSlashComment
= False
557 if InComment
and HashComment
:
560 # check for */ comment end
561 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
562 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
564 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
567 # set comments to spaces
569 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
571 # check for // comment
572 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
574 DoubleSlashComment
= True
575 # check for '#' comment
576 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
579 # check for /* comment start
580 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
581 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
583 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
589 # restore from ListOfList to ListOfString
590 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
593 ## PreprocessIncludeFile() method
595 # Preprocess file contents, replace !include statements with file contents.
596 # In the end, rewind the file buffer pointer to the beginning
598 # @param self The object pointer
600 def PreprocessIncludeFile(self
):
601 # nested include support
604 while self
.__GetNextToken
():
606 if self
.__Token
== 'DEFINE':
607 if not self
.__GetNextToken
():
608 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
610 if not self
.__IsToken
( "="):
611 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
612 Value
= self
.__GetExpression
()
613 MacroDict
[Macro
] = Value
615 elif self
.__Token
== '!include':
617 IncludeLine
= self
.CurrentLineNumber
618 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
619 if not self
.__GetNextToken
():
620 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
621 IncFileName
= self
.__Token
623 StartPos
= IncFileName
.find('$(', PreIndex
)
624 EndPos
= IncFileName
.find(')', StartPos
+2)
625 while StartPos
!= -1 and EndPos
!= -1:
626 Macro
= IncFileName
[StartPos
+2 : EndPos
]
627 MacroVal
= self
.__GetMacroValue
(Macro
)
629 if Macro
in MacroDict
:
630 MacroVal
= MacroDict
[Macro
]
631 if MacroVal
is not None:
632 IncFileName
= IncFileName
.replace('$(' + Macro
+ ')', MacroVal
, 1)
633 if MacroVal
.find('$(') != -1:
636 PreIndex
= StartPos
+ len(MacroVal
)
638 raise Warning("The Macro %s is not defined" %Macro
, self
.FileName
, self
.CurrentLineNumber
)
639 StartPos
= IncFileName
.find('$(', PreIndex
)
640 EndPos
= IncFileName
.find(')', StartPos
+2)
642 IncludedFile
= NormPath(IncFileName
)
644 # First search the include file under the same directory as FDF file
646 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
647 ErrorCode
= IncludedFile1
.Validate()[0]
650 # Then search the include file under the same directory as DSC file
653 if GenFdsGlobalVariable
.ActivePlatform
:
654 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
655 elif GlobalData
.gActivePlatform
:
656 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
657 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
658 ErrorCode
= IncludedFile1
.Validate()[0]
661 # Also search file under the WORKSPACE directory
663 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
664 ErrorCode
= IncludedFile1
.Validate()[0]
666 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
),
667 self
.FileName
, self
.CurrentLineNumber
)
669 if not IsValidInclude (IncludedFile1
.Path
, self
.CurrentLineNumber
):
670 raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1
.Path
), self
.FileName
, self
.CurrentLineNumber
)
672 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
674 CurrentLine
= self
.CurrentLineNumber
675 CurrentOffset
= self
.CurrentOffsetWithinLine
676 # list index of the insertion, note that line number is 'CurrentLine + 1'
677 InsertAtLine
= CurrentLine
678 ParentProfile
= GetParentAtLine (CurrentLine
)
679 if ParentProfile
is not None:
680 ParentProfile
.IncludeFileList
.insert(0, IncFileProfile
)
681 IncFileProfile
.Level
= ParentProfile
.Level
+ 1
682 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
683 # deal with remaining portions after "!include filename", if exists.
684 if self
.__GetNextToken
():
685 if self
.CurrentLineNumber
== CurrentLine
:
686 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
687 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
688 IncFileProfile
.InsertAdjust
+= 1
689 self
.CurrentLineNumber
+= 1
690 self
.CurrentOffsetWithinLine
= 0
692 for Line
in IncFileProfile
.FileLinesList
:
693 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
694 self
.CurrentLineNumber
+= 1
697 # reversely sorted to better determine error in file
698 AllIncludeFileList
.insert(0, IncFileProfile
)
700 # comment out the processed include file statement
701 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
702 TempList
.insert(IncludeOffset
, '#')
703 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
704 if Processed
: # Nested and back-to-back support
705 self
.Rewind(DestLine
= IncFileProfile
.InsertStartLineNumber
- 1)
711 def __GetIfListCurrentItemStat(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
is not 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
[TAB_COMMON
, TAB_COMMON
, TAB_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
)
905 if GlobalData
.BuildOptionPcd
:
906 for Item
in GlobalData
.BuildOptionPcd
:
907 if type(Item
) is tuple:
909 PcdName
, TmpValue
= Item
.split("=")
910 TmpValue
= BuildOptionValue(TmpValue
, {})
911 MacroDict
[PcdName
.strip()] = TmpValue
916 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
917 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
918 MacroPcdDict
= self
.__CollectMacroPcd
()
922 return ValueExpression(Expression
, MacroPcdDict
)(True)
924 return ValueExpression(Expression
, MacroPcdDict
)()
925 except WrnExpression
, Excpt
:
927 # Catch expression evaluation warning here. We need to report
928 # the precise number of line and return the evaluation result
930 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
931 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
934 except Exception, Excpt
:
935 if hasattr(Excpt
, 'Pcd'):
936 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
937 Info
= GlobalData
.gPlatformOtherPcds
[Excpt
.Pcd
]
938 raise Warning("Cannot use this PCD (%s) in an expression as"
939 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
940 " of the DSC file (%s), and it is currently defined in this section:"
941 " %s, line #: %d." % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE'], Info
[0], Info
[1]),
944 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE']),
947 raise Warning(str(Excpt
), *FileLineTuple
)
949 if Expression
.startswith('$(') and Expression
[-1] == ')':
950 Expression
= Expression
[2:-1]
951 return Expression
in MacroPcdDict
953 ## __IsToken() method
955 # Check whether input string is found from current char position along
956 # If found, the string value is put into self.__Token
958 # @param self The object pointer
959 # @param String The string to search
960 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
961 # @retval True Successfully find string, file buffer pointer moved forward
962 # @retval False Not able to find string, file buffer pointer not changed
964 def __IsToken(self
, String
, IgnoreCase
= False):
965 self
.__SkipWhiteSpace
()
967 # Only consider the same line, no multi-line token allowed
968 StartPos
= self
.CurrentOffsetWithinLine
971 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
973 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
975 self
.CurrentOffsetWithinLine
+= len(String
)
976 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
980 ## __IsKeyword() method
982 # Check whether input keyword is found from current char position along, whole word only!
983 # If found, the string value is put into self.__Token
985 # @param self The object pointer
986 # @param Keyword The string to search
987 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
988 # @retval True Successfully find string, file buffer pointer moved forward
989 # @retval False Not able to find string, file buffer pointer not changed
991 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
992 self
.__SkipWhiteSpace
()
994 # Only consider the same line, no multi-line token allowed
995 StartPos
= self
.CurrentOffsetWithinLine
998 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
1000 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
1002 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
1003 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
1005 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
1006 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1010 def __GetExpression(self
):
1011 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
1012 Index
= len(Line
) - 1
1013 while Line
[Index
] in ['\r', '\n']:
1015 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
1016 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
1017 ExpressionString
= ExpressionString
.strip()
1018 return ExpressionString
1020 ## __GetNextWord() method
1022 # Get next C name from file lines
1023 # If found, the string value is put into self.__Token
1025 # @param self The object pointer
1026 # @retval True Successfully find a C name string, file buffer pointer moved forward
1027 # @retval False Not able to find a C name string, file buffer pointer not changed
1029 def __GetNextWord(self
):
1030 self
.__SkipWhiteSpace
()
1031 if self
.__EndOfFile
():
1034 TempChar
= self
.__CurrentChar
()
1035 StartPos
= self
.CurrentOffsetWithinLine
1036 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
1038 while not self
.__EndOfLine
():
1039 TempChar
= self
.__CurrentChar
()
1040 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
1041 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
1047 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1052 ## __GetNextToken() method
1054 # Get next token unit before a seperator
1055 # If found, the string value is put into self.__Token
1057 # @param self The object pointer
1058 # @retval True Successfully find a token unit, file buffer pointer moved forward
1059 # @retval False Not able to find a token unit, file buffer pointer not changed
1061 def __GetNextToken(self
):
1062 # Skip leading spaces, if exist.
1063 self
.__SkipWhiteSpace
()
1064 if self
.__EndOfFile
():
1066 # Record the token start position, the position of the first non-space char.
1067 StartPos
= self
.CurrentOffsetWithinLine
1068 StartLine
= self
.CurrentLineNumber
1069 while StartLine
== self
.CurrentLineNumber
:
1070 TempChar
= self
.__CurrentChar
()
1071 # Try to find the end char that is not a space and not in seperator tuple.
1072 # That is, when we got a space or any char in the tuple, we got the end of token.
1073 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
1075 # if we happen to meet a seperator as the first char, we must proceed to get it.
1076 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1077 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1085 EndPos
= self
.CurrentOffsetWithinLine
1086 if self
.CurrentLineNumber
!= StartLine
:
1087 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
1088 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
1089 if StartPos
!= self
.CurrentOffsetWithinLine
:
1094 def __GetNextOp(self
):
1095 # Skip leading spaces, if exist.
1096 self
.__SkipWhiteSpace
()
1097 if self
.__EndOfFile
():
1099 # Record the token start position, the position of the first non-space char.
1100 StartPos
= self
.CurrentOffsetWithinLine
1101 while not self
.__EndOfLine
():
1102 TempChar
= self
.__CurrentChar
()
1103 # Try to find the end char that is not a space
1104 if not str(TempChar
).isspace():
1111 if StartPos
!= self
.CurrentOffsetWithinLine
:
1112 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1116 ## __GetNextGuid() method
1118 # Get next token unit before a seperator
1119 # If found, the GUID string is put into self.__Token
1121 # @param self The object pointer
1122 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1123 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1125 def __GetNextGuid(self
):
1127 if not self
.__GetNextToken
():
1129 if gGuidPattern
.match(self
.__Token
) is not None:
1136 def __Verify(Name
, Value
, Scope
):
1137 if Scope
in [TAB_UINT64
, TAB_UINT8
]:
1140 ValueNumber
= int (Value
, 0)
1142 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value is not valid dec or hex number for %s." % Name
)
1144 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value can't be set to negative value for %s." % Name
)
1145 if Scope
== TAB_UINT64
:
1146 if ValueNumber
>= 0x10000000000000000:
1147 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1148 if Scope
== TAB_UINT8
:
1149 if ValueNumber
>= 0x100:
1150 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1153 ## __UndoToken() method
1155 # Go back one token unit in file buffer
1157 # @param self The object pointer
1159 def __UndoToken(self
):
1160 self
.__UndoOneChar
()
1161 while self
.__CurrentChar
().isspace():
1162 if not self
.__UndoOneChar
():
1167 StartPos
= self
.CurrentOffsetWithinLine
1168 CurrentLine
= self
.CurrentLineNumber
1169 while CurrentLine
== self
.CurrentLineNumber
:
1171 TempChar
= self
.__CurrentChar
()
1172 # Try to find the end char that is not a space and not in seperator tuple.
1173 # That is, when we got a space or any char in the tuple, we got the end of token.
1174 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1175 if not self
.__UndoOneChar
():
1177 # if we happen to meet a seperator as the first char, we must proceed to get it.
1178 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1179 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1186 ## __GetNextHexNumber() method
1188 # Get next HEX data before a seperator
1189 # If found, the HEX data is put into self.__Token
1191 # @param self The object pointer
1192 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1193 # @retval False Not able to find a HEX data, file buffer pointer not changed
1195 def __GetNextHexNumber(self
):
1196 if not self
.__GetNextToken
():
1198 if gHexPatternAll
.match(self
.__Token
):
1204 ## __GetNextDecimalNumber() method
1206 # Get next decimal data before a seperator
1207 # If found, the decimal data is put into self.__Token
1209 # @param self The object pointer
1210 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1211 # @retval False Not able to find a decimal data, file buffer pointer not changed
1213 def __GetNextDecimalNumber(self
):
1214 if not self
.__GetNextToken
():
1216 if self
.__Token
.isdigit():
1222 ## __GetNextPcdName() method
1224 # Get next PCD token space C name and PCD C name pair before a seperator
1225 # If found, the decimal data is put into self.__Token
1227 # @param self The object pointer
1228 # @retval Tuple PCD C name and PCD token space C name pair
1230 def __GetNextPcdName(self
):
1231 if not self
.__GetNextWord
():
1232 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1233 pcdTokenSpaceCName
= self
.__Token
1235 if not self
.__IsToken
( "."):
1236 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1238 if not self
.__GetNextWord
():
1239 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1240 pcdCName
= self
.__Token
1242 return (pcdCName
, pcdTokenSpaceCName
)
1244 ## __GetStringData() method
1246 # Get string contents quoted in ""
1247 # If found, the decimal data is put into self.__Token
1249 # @param self The object pointer
1250 # @retval True Successfully find a string data, file buffer pointer moved forward
1251 # @retval False Not able to find a string data, file buffer pointer not changed
1253 def __GetStringData(self
):
1254 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1256 self
.__SkipToToken
("\"")
1257 currentLineNumber
= self
.CurrentLineNumber
1259 if not self
.__SkipToToken
("\""):
1260 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1261 if currentLineNumber
!= self
.CurrentLineNumber
:
1262 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1263 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1266 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1268 self
.__SkipToToken
("\'")
1269 currentLineNumber
= self
.CurrentLineNumber
1271 if not self
.__SkipToToken
("\'"):
1272 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1273 if currentLineNumber
!= self
.CurrentLineNumber
:
1274 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1275 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1281 ## __SkipToToken() method
1283 # Search forward in file buffer for the string
1284 # The skipped chars are put into self.__SkippedChars
1286 # @param self The object pointer
1287 # @param String The string to search
1288 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1289 # @retval True Successfully find the string, file buffer pointer moved forward
1290 # @retval False Not able to find the string, file buffer pointer not changed
1292 def __SkipToToken(self
, String
, IgnoreCase
= False):
1293 StartPos
= self
.GetFileBufferPos()
1295 self
.__SkippedChars
= ""
1296 while not self
.__EndOfFile
():
1299 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1301 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1303 self
.CurrentOffsetWithinLine
+= len(String
)
1304 self
.__SkippedChars
+= String
1306 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1309 self
.SetFileBufferPos( StartPos
)
1310 self
.__SkippedChars
= ""
1313 ## GetFileBufferPos() method
1315 # Return the tuple of current line and offset within the line
1317 # @param self The object pointer
1318 # @retval Tuple Line number and offset pair
1320 def GetFileBufferPos(self
):
1321 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1323 ## SetFileBufferPos() method
1325 # Restore the file buffer position
1327 # @param self The object pointer
1328 # @param Pos The new file buffer position
1330 def SetFileBufferPos(self
, Pos
):
1331 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1333 ## Preprocess() method
1335 # Preprocess comment, conditional directive, include directive, replace macro.
1336 # Exception will be raised if syntax error found
1338 # @param self The object pointer
1340 def Preprocess(self
):
1341 self
.__StringToList
()
1342 self
.PreprocessFile()
1343 self
.PreprocessIncludeFile()
1344 self
.__StringToList
()
1345 self
.PreprocessFile()
1346 self
.PreprocessConditionalStatement()
1347 self
.__StringToList
()
1348 for Pos
in self
.__WipeOffArea
:
1349 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1350 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1352 while self
.__GetDefines
():
1355 ## ParseFile() method
1357 # Parse the file profile buffer to extract fd, fv ... information
1358 # Exception will be raised if syntax error found
1360 # @param self The object pointer
1362 def ParseFile(self
):
1367 # Keep processing sections of the FDF until no new sections or a syntax error is found
1369 while self
.__GetFd
() or self
.__GetFv
() or self
.__GetFmp
() or self
.__GetCapsule
() or self
.__GetVtf
() or self
.__GetRule
() or self
.__GetOptionRom
():
1374 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1375 # At this point, the closest parent would be the included file itself
1376 Profile
= GetParentAtLine(X
.OriginalLineNumber
)
1377 if Profile
is not None:
1378 X
.Message
+= ' near line %d, column %d: %s' \
1379 % (X
.LineNumber
, 0, Profile
.FileLinesList
[X
.LineNumber
-1])
1381 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1382 X
.Message
+= ' near line %d, column %d: %s' \
1383 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1386 ## SectionParser() method
1388 # Parse the file section info
1389 # Exception will be raised if syntax error found
1391 # @param self The object pointer
1392 # @param section The section string
1394 def SectionParser(self
, section
):
1396 if not S
.startswith("[DEFINES") and not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1397 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM.") and not S
.startswith('[FMPPAYLOAD.'):
1398 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
)
1400 ## __GetDefines() method
1402 # Get Defines section contents and store its data into AllMacrosList
1404 # @param self The object pointer
1405 # @retval True Successfully find a Defines
1406 # @retval False Not able to find a Defines
1408 def __GetDefines(self
):
1410 if not self
.__GetNextToken
():
1413 S
= self
.__Token
.upper()
1414 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1415 self
.SectionParser(S
)
1420 if not self
.__IsToken
("[DEFINES", True):
1421 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1422 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1423 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1424 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1426 if not self
.__IsToken
( "]"):
1427 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1429 while self
.__GetNextWord
():
1430 # handle the SET statement
1431 if self
.__Token
== 'SET':
1433 self
.__GetSetStatement
(None)
1436 Macro
= self
.__Token
1438 if not self
.__IsToken
("="):
1439 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1440 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1441 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1442 Value
= self
.__Token
1448 # Get FD section contents and store its data into FD dictionary of self.Profile
1450 # @param self The object pointer
1451 # @retval True Successfully find a FD
1452 # @retval False Not able to find a FD
1456 if not self
.__GetNextToken
():
1459 S
= self
.__Token
.upper()
1460 if S
.startswith("[") and not S
.startswith("[FD."):
1461 if not S
.startswith("[FV.") and not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
1462 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1463 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1468 if not self
.__IsToken
("[FD.", True):
1469 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1470 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1471 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1472 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1474 FdName
= self
.__GetUiName
()
1476 if len (self
.Profile
.FdDict
) == 0:
1477 FdName
= GenFdsGlobalVariable
.PlatformName
1478 if FdName
== "" and GlobalData
.gActivePlatform
:
1479 FdName
= GlobalData
.gActivePlatform
.PlatformName
1480 self
.Profile
.FdNameNotSet
= True
1482 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1483 self
.CurrentFdName
= FdName
.upper()
1485 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1486 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1488 if not self
.__IsToken
( "]"):
1489 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1492 FdObj
.FdUiName
= self
.CurrentFdName
1493 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1495 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1496 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1498 Status
= self
.__GetCreateFile
(FdObj
)
1500 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1502 while self
.__GetTokenStatements
(FdObj
):
1504 for Attr
in ("BaseAddress", "Size", "ErasePolarity"):
1505 if getattr(FdObj
, Attr
) is None:
1506 self
.__GetNextToken
()
1507 raise Warning("Keyword %s missing" % Attr
, self
.FileName
, self
.CurrentLineNumber
)
1509 if not FdObj
.BlockSizeList
:
1510 FdObj
.BlockSizeList
.append((1, FdObj
.Size
, None))
1512 self
.__GetDefineStatements
(FdObj
)
1514 self
.__GetSetStatements
(FdObj
)
1516 if not self
.__GetRegionLayout
(FdObj
):
1517 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1519 while self
.__GetRegionLayout
(FdObj
):
1523 ## __GetUiName() method
1525 # Return the UI name of a section
1527 # @param self The object pointer
1528 # @retval FdName UI name
1530 def __GetUiName(self
):
1532 if self
.__GetNextWord
():
1537 ## __GetCreateFile() method
1539 # Return the output file name of object
1541 # @param self The object pointer
1542 # @param Obj object whose data will be stored in file
1543 # @retval FdName UI name
1545 def __GetCreateFile(self
, Obj
):
1547 if self
.__IsKeyword
( "CREATE_FILE"):
1548 if not self
.__IsToken
( "="):
1549 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1551 if not self
.__GetNextToken
():
1552 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1554 FileName
= self
.__Token
1555 Obj
.CreateFileName
= FileName
1559 ## __GetTokenStatements() method
1561 # Get token statements
1563 # @param self The object pointer
1564 # @param Obj for whom token statement is got
1566 def __GetTokenStatements(self
, Obj
):
1567 if self
.__IsKeyword
( "BaseAddress"):
1568 if not self
.__IsToken
( "="):
1569 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1571 if not self
.__GetNextHexNumber
():
1572 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1574 Obj
.BaseAddress
= self
.__Token
1576 if self
.__IsToken
( "|"):
1577 pcdPair
= self
.__GetNextPcdName
()
1578 Obj
.BaseAddressPcd
= pcdPair
1579 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1580 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1581 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1584 if self
.__IsKeyword
( "Size"):
1585 if not self
.__IsToken
( "="):
1586 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1588 if not self
.__GetNextHexNumber
():
1589 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1592 if self
.__IsToken
( "|"):
1593 pcdPair
= self
.__GetNextPcdName
()
1594 Obj
.SizePcd
= pcdPair
1595 self
.Profile
.PcdDict
[pcdPair
] = Size
1596 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1597 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1598 Obj
.Size
= long(Size
, 0)
1601 if self
.__IsKeyword
( "ErasePolarity"):
1602 if not self
.__IsToken
( "="):
1603 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1605 if not self
.__GetNextToken
():
1606 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1608 if self
.__Token
!= "1" and self
.__Token
!= "0":
1609 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1611 Obj
.ErasePolarity
= self
.__Token
1614 return self
.__GetBlockStatements
(Obj
)
1616 ## __GetAddressStatements() method
1618 # Get address statements
1620 # @param self The object pointer
1621 # @param Obj for whom address statement is got
1622 # @retval True Successfully find
1623 # @retval False Not able to find
1625 def __GetAddressStatements(self
, Obj
):
1627 if self
.__IsKeyword
("BsBaseAddress"):
1628 if not self
.__IsToken
( "="):
1629 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1631 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1632 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1634 BsAddress
= long(self
.__Token
, 0)
1635 Obj
.BsBaseAddress
= BsAddress
1637 if self
.__IsKeyword
("RtBaseAddress"):
1638 if not self
.__IsToken
( "="):
1639 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1641 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1642 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1644 RtAddress
= long(self
.__Token
, 0)
1645 Obj
.RtBaseAddress
= RtAddress
1647 ## __GetBlockStatements() method
1649 # Get block statements
1651 # @param self The object pointer
1652 # @param Obj for whom block statement is got
1654 def __GetBlockStatements(self
, Obj
):
1656 while self
.__GetBlockStatement
(Obj
):
1659 Item
= Obj
.BlockSizeList
[-1]
1660 if Item
[0] is None or Item
[1] is None:
1661 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1664 ## __GetBlockStatement() method
1666 # Get block statement
1668 # @param self The object pointer
1669 # @param Obj for whom block statement is got
1670 # @retval True Successfully find
1671 # @retval False Not able to find
1673 def __GetBlockStatement(self
, Obj
):
1674 if not self
.__IsKeyword
( "BlockSize"):
1677 if not self
.__IsToken
( "="):
1678 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1680 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1681 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1683 BlockSize
= self
.__Token
1685 if self
.__IsToken
( "|"):
1686 PcdPair
= self
.__GetNextPcdName
()
1687 BlockSizePcd
= PcdPair
1688 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1689 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1690 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1691 BlockSize
= long(BlockSize
, 0)
1694 if self
.__IsKeyword
( "NumBlocks"):
1695 if not self
.__IsToken
( "="):
1696 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1698 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1699 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1701 BlockNumber
= long(self
.__Token
, 0)
1703 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1706 ## __GetDefineStatements() method
1708 # Get define statements
1710 # @param self The object pointer
1711 # @param Obj for whom define statement is got
1712 # @retval True Successfully find
1713 # @retval False Not able to find
1715 def __GetDefineStatements(self
, Obj
):
1716 while self
.__GetDefineStatement
( Obj
):
1719 ## __GetDefineStatement() method
1721 # Get define statement
1723 # @param self The object pointer
1724 # @param Obj for whom define statement is got
1725 # @retval True Successfully find
1726 # @retval False Not able to find
1728 def __GetDefineStatement(self
, Obj
):
1729 if self
.__IsKeyword
("DEFINE"):
1730 self
.__GetNextToken
()
1731 Macro
= self
.__Token
1732 if not self
.__IsToken
( "="):
1733 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1735 if not self
.__GetNextToken
():
1736 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1738 Value
= self
.__Token
1739 Macro
= '$(' + Macro
+ ')'
1740 Obj
.DefineVarDict
[Macro
] = Value
1745 ## __GetSetStatements() method
1747 # Get set statements
1749 # @param self The object pointer
1750 # @param Obj for whom set statement is got
1751 # @retval True Successfully find
1752 # @retval False Not able to find
1754 def __GetSetStatements(self
, Obj
):
1755 while self
.__GetSetStatement
(Obj
):
1758 ## __GetSetStatement() method
1762 # @param self The object pointer
1763 # @param Obj for whom set statement is got
1764 # @retval True Successfully find
1765 # @retval False Not able to find
1767 def __GetSetStatement(self
, Obj
):
1768 if self
.__IsKeyword
("SET"):
1769 PcdPair
= self
.__GetNextPcdName
()
1771 if not self
.__IsToken
( "="):
1772 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1774 Value
= self
.__GetExpression
()
1775 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1778 Obj
.SetVarDict
[PcdPair
] = Value
1779 self
.Profile
.PcdDict
[PcdPair
] = Value
1780 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1781 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1786 ## __CalcRegionExpr(self)
1788 # Calculate expression for offset or size of a region
1790 # @return: None if invalid expression
1791 # Calculated number if successfully
1793 def __CalcRegionExpr(self
):
1794 StartPos
= self
.GetFileBufferPos()
1797 while not self
.__EndOfFile
():
1798 CurCh
= self
.__CurrentChar
()
1804 if CurCh
in '|\r\n' and PairCount
== 0:
1810 ValueExpression(Expr
,
1811 self
.__CollectMacroPcd
()
1814 self
.SetFileBufferPos(StartPos
)
1817 ## __GetRegionLayout() method
1819 # Get region layout for FD
1821 # @param self The object pointer
1822 # @param Fd for whom region is got
1823 # @retval True Successfully find
1824 # @retval False Not able to find
1826 def __GetRegionLayout(self
, Fd
):
1827 Offset
= self
.__CalcRegionExpr
()
1831 RegionObj
= Region
.Region()
1832 RegionObj
.Offset
= Offset
1833 Fd
.RegionList
.append(RegionObj
)
1835 if not self
.__IsToken
( "|"):
1836 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1838 Size
= self
.__CalcRegionExpr
()
1840 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1841 RegionObj
.Size
= Size
1843 if not self
.__GetNextWord
():
1846 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):
1848 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]
1849 # Or it might be next region's offset described by an expression which starts with a PCD.
1850 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size
1853 IsRegionPcd
= (RegionSizeGuidPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]) or
1854 RegionOffsetPcdPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]))
1856 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1857 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1858 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdOffset
[1], RegionObj
.PcdOffset
[0])] = "0x%x" % RegionObj
.Offset
1859 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1860 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1861 if self
.__IsToken
( "|"):
1862 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1863 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1864 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdSize
[1], RegionObj
.PcdSize
[0])] = "0x%x" % RegionObj
.Size
1865 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1866 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1868 if not self
.__GetNextWord
():
1871 if self
.__Token
== "SET":
1873 self
.__GetSetStatements
( RegionObj
)
1874 if not self
.__GetNextWord
():
1877 elif self
.__Token
== "FV":
1879 self
.__GetRegionFvType
( RegionObj
)
1881 elif self
.__Token
== "CAPSULE":
1883 self
.__GetRegionCapType
( RegionObj
)
1885 elif self
.__Token
== "FILE":
1887 self
.__GetRegionFileType
(RegionObj
)
1889 elif self
.__Token
== "INF":
1891 RegionObj
.RegionType
= "INF"
1892 while self
.__IsKeyword
("INF"):
1894 ffsInf
= self
.__ParseInfStatement
()
1897 RegionObj
.RegionDataList
.append(ffsInf
)
1899 elif self
.__Token
== "DATA":
1901 self
.__GetRegionDataType
(RegionObj
)
1904 if self
.__GetRegionLayout
(Fd
):
1906 raise Warning("A valid region type was not found. "
1907 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",
1908 self
.FileName
, self
.CurrentLineNumber
)
1912 ## __GetRegionFvType() method
1914 # Get region fv data for region
1916 # @param self The object pointer
1917 # @param RegionObj for whom region data is got
1919 def __GetRegionFvType(self
, RegionObj
):
1921 if not self
.__IsKeyword
( "FV"):
1922 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1924 if not self
.__IsToken
( "="):
1925 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1927 if not self
.__GetNextToken
():
1928 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1930 RegionObj
.RegionType
= "FV"
1931 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1933 while self
.__IsKeyword
( "FV"):
1935 if not self
.__IsToken
( "="):
1936 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1938 if not self
.__GetNextToken
():
1939 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1941 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1943 ## __GetRegionCapType() method
1945 # Get region capsule data for region
1947 # @param self The object pointer
1948 # @param RegionObj for whom region data is got
1950 def __GetRegionCapType(self
, RegionObj
):
1952 if not self
.__IsKeyword
("CAPSULE"):
1953 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1955 if not self
.__IsToken
("="):
1956 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1958 if not self
.__GetNextToken
():
1959 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1961 RegionObj
.RegionType
= "CAPSULE"
1962 RegionObj
.RegionDataList
.append(self
.__Token
)
1964 while self
.__IsKeyword
("CAPSULE"):
1966 if not self
.__IsToken
("="):
1967 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1969 if not self
.__GetNextToken
():
1970 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1972 RegionObj
.RegionDataList
.append(self
.__Token
)
1974 ## __GetRegionFileType() method
1976 # Get region file data for region
1978 # @param self The object pointer
1979 # @param RegionObj for whom region data is got
1981 def __GetRegionFileType(self
, RegionObj
):
1983 if not self
.__IsKeyword
( "FILE"):
1984 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1986 if not self
.__IsToken
( "="):
1987 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1989 if not self
.__GetNextToken
():
1990 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1992 RegionObj
.RegionType
= "FILE"
1993 RegionObj
.RegionDataList
.append( self
.__Token
)
1995 while self
.__IsKeyword
( "FILE"):
1997 if not self
.__IsToken
( "="):
1998 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2000 if not self
.__GetNextToken
():
2001 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
2003 RegionObj
.RegionDataList
.append(self
.__Token
)
2005 ## __GetRegionDataType() method
2007 # Get region array data for region
2009 # @param self The object pointer
2010 # @param RegionObj for whom region data is got
2012 def __GetRegionDataType(self
, RegionObj
):
2014 if not self
.__IsKeyword
( "DATA"):
2015 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
2017 if not self
.__IsToken
( "="):
2018 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2020 if not self
.__IsToken
( "{"):
2021 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2023 if not self
.__GetNextHexNumber
():
2024 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2026 if len(self
.__Token
) > 18:
2027 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2029 # convert hex string value to byte hex string array
2030 AllString
= self
.__Token
2031 AllStrLen
= len (AllString
)
2033 while AllStrLen
> 4:
2034 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2035 AllStrLen
= AllStrLen
- 2
2036 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2039 if len (self
.__Token
) <= 4:
2040 while self
.__IsToken
(","):
2041 if not self
.__GetNextHexNumber
():
2042 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2043 if len(self
.__Token
) > 4:
2044 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2045 DataString
+= self
.__Token
2048 if not self
.__IsToken
( "}"):
2049 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2051 DataString
= DataString
.rstrip(",")
2052 RegionObj
.RegionType
= "DATA"
2053 RegionObj
.RegionDataList
.append( DataString
)
2055 while self
.__IsKeyword
( "DATA"):
2057 if not self
.__IsToken
( "="):
2058 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2060 if not self
.__IsToken
( "{"):
2061 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2063 if not self
.__GetNextHexNumber
():
2064 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2066 if len(self
.__Token
) > 18:
2067 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2069 # convert hex string value to byte hex string array
2070 AllString
= self
.__Token
2071 AllStrLen
= len (AllString
)
2073 while AllStrLen
> 4:
2074 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2075 AllStrLen
= AllStrLen
- 2
2076 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2079 if len (self
.__Token
) <= 4:
2080 while self
.__IsToken
(","):
2081 if not self
.__GetNextHexNumber
():
2082 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2083 if len(self
.__Token
) > 4:
2084 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2085 DataString
+= self
.__Token
2088 if not self
.__IsToken
( "}"):
2089 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2091 DataString
= DataString
.rstrip(",")
2092 RegionObj
.RegionDataList
.append( DataString
)
2096 # Get FV section contents and store its data into FV dictionary of self.Profile
2098 # @param self The object pointer
2099 # @retval True Successfully find a FV
2100 # @retval False Not able to find a FV
2103 if not self
.__GetNextToken
():
2106 S
= self
.__Token
.upper()
2107 if S
.startswith("[") and not S
.startswith("[FV."):
2108 self
.SectionParser(S
)
2113 if not self
.__IsToken
("[FV.", True):
2114 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2115 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2116 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2117 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2119 FvName
= self
.__GetUiName
()
2120 self
.CurrentFvName
= FvName
.upper()
2122 if not self
.__IsToken
( "]"):
2123 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2126 FvObj
.UiFvName
= self
.CurrentFvName
2127 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
2129 Status
= self
.__GetCreateFile
(FvObj
)
2131 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2133 self
.__GetDefineStatements
(FvObj
)
2135 self
.__GetAddressStatements
(FvObj
)
2137 FvObj
.FvExtEntryTypeValue
= []
2138 FvObj
.FvExtEntryType
= []
2139 FvObj
.FvExtEntryData
= []
2141 self
.__GetSetStatements
(FvObj
)
2143 if not (self
.__GetBlockStatement
(FvObj
) or self
.__GetFvBaseAddress
(FvObj
) or
2144 self
.__GetFvForceRebase
(FvObj
) or self
.__GetFvAlignment
(FvObj
) or
2145 self
.__GetFvAttributes
(FvObj
) or self
.__GetFvNameGuid
(FvObj
) or
2146 self
.__GetFvExtEntryStatement
(FvObj
) or self
.__GetFvNameString
(FvObj
)):
2149 if FvObj
.FvNameString
== 'TRUE' and not FvObj
.FvNameGuid
:
2150 raise Warning("FvNameString found but FvNameGuid was not found", self
.FileName
, self
.CurrentLineNumber
)
2152 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2153 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2156 isInf
= self
.__GetInfStatement
(FvObj
)
2157 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2158 if not isInf
and not isFile
:
2163 ## __GetFvAlignment() method
2165 # Get alignment for FV
2167 # @param self The object pointer
2168 # @param Obj for whom alignment is got
2169 # @retval True Successfully find a alignment statement
2170 # @retval False Not able to find a alignment statement
2172 def __GetFvAlignment(self
, Obj
):
2174 if not self
.__IsKeyword
( "FvAlignment"):
2177 if not self
.__IsToken
( "="):
2178 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2180 if not self
.__GetNextToken
():
2181 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2183 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2184 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2185 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2187 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2188 Obj
.FvAlignment
= self
.__Token
2191 ## __GetFvBaseAddress() method
2193 # Get BaseAddress for FV
2195 # @param self The object pointer
2196 # @param Obj for whom FvBaseAddress is got
2197 # @retval True Successfully find a FvBaseAddress statement
2198 # @retval False Not able to find a FvBaseAddress statement
2200 def __GetFvBaseAddress(self
, Obj
):
2202 if not self
.__IsKeyword
("FvBaseAddress"):
2205 if not self
.__IsToken
( "="):
2206 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2208 if not self
.__GetNextToken
():
2209 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2211 if not BaseAddrValuePattern
.match(self
.__Token
.upper()):
2212 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2213 Obj
.FvBaseAddress
= self
.__Token
2216 ## __GetFvForceRebase() method
2218 # Get FvForceRebase for FV
2220 # @param self The object pointer
2221 # @param Obj for whom FvForceRebase is got
2222 # @retval True Successfully find a FvForceRebase statement
2223 # @retval False Not able to find a FvForceRebase statement
2225 def __GetFvForceRebase(self
, Obj
):
2227 if not self
.__IsKeyword
("FvForceRebase"):
2230 if not self
.__IsToken
( "="):
2231 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2233 if not self
.__GetNextToken
():
2234 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2236 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2237 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2239 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2240 Obj
.FvForceRebase
= True
2241 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2242 Obj
.FvForceRebase
= False
2244 Obj
.FvForceRebase
= None
2249 ## __GetFvAttributes() method
2251 # Get attributes for FV
2253 # @param self The object pointer
2254 # @param Obj for whom attribute is got
2257 def __GetFvAttributes(self
, FvObj
):
2259 while self
.__GetNextWord
():
2262 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2263 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2264 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2265 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2266 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2267 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):
2271 if not self
.__IsToken
( "="):
2272 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2274 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2275 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2277 FvObj
.FvAttributeDict
[name
] = self
.__Token
2281 ## __GetFvNameGuid() method
2283 # Get FV GUID for FV
2285 # @param self The object pointer
2286 # @param Obj for whom GUID is got
2289 def __GetFvNameGuid(self
, FvObj
):
2291 if not self
.__IsKeyword
( "FvNameGuid"):
2294 if not self
.__IsToken
( "="):
2295 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2297 if not self
.__GetNextGuid
():
2298 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2300 FvObj
.FvNameGuid
= self
.__Token
2304 def __GetFvNameString(self
, FvObj
):
2306 if not self
.__IsKeyword
( "FvNameString"):
2309 if not self
.__IsToken
( "="):
2310 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2312 if not self
.__GetNextToken
() or self
.__Token
not in ('TRUE', 'FALSE'):
2313 raise Warning("expected TRUE or FALSE for FvNameString", self
.FileName
, self
.CurrentLineNumber
)
2315 FvObj
.FvNameString
= self
.__Token
2319 def __GetFvExtEntryStatement(self
, FvObj
):
2321 if not (self
.__IsKeyword
( "FV_EXT_ENTRY") or self
.__IsKeyword
( "FV_EXT_ENTRY_TYPE")):
2324 if not self
.__IsKeyword
("TYPE"):
2325 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2327 if not self
.__IsToken
( "="):
2328 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2330 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2331 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2333 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2335 if not self
.__IsToken
( "{"):
2336 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2338 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2339 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2341 FvObj
.FvExtEntryType
+= [self
.__Token
]
2343 if self
.__Token
== 'DATA':
2345 if not self
.__IsToken
( "="):
2346 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2348 if not self
.__IsToken
( "{"):
2349 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2351 if not self
.__GetNextHexNumber
():
2352 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2354 if len(self
.__Token
) > 4:
2355 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2357 DataString
= self
.__Token
2360 while self
.__IsToken
(","):
2361 if not self
.__GetNextHexNumber
():
2362 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2363 if len(self
.__Token
) > 4:
2364 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2365 DataString
+= self
.__Token
2368 if not self
.__IsToken
( "}"):
2369 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2371 if not self
.__IsToken
( "}"):
2372 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2374 DataString
= DataString
.rstrip(",")
2375 FvObj
.FvExtEntryData
+= [DataString
]
2377 if self
.__Token
== 'FILE':
2379 if not self
.__IsToken
( "="):
2380 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2382 if not self
.__GetNextToken
():
2383 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2385 FvObj
.FvExtEntryData
+= [self
.__Token
]
2387 if not self
.__IsToken
( "}"):
2388 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2392 ## __GetAprioriSection() method
2394 # Get token statements
2396 # @param self The object pointer
2397 # @param FvObj for whom apriori is got
2398 # @param MacroDict dictionary used to replace macro
2399 # @retval True Successfully find apriori statement
2400 # @retval False Not able to find apriori statement
2402 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2404 if not self
.__IsKeyword
( "APRIORI"):
2407 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2408 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2409 AprType
= self
.__Token
2411 if not self
.__IsToken
( "{"):
2412 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2414 AprSectionObj
= AprioriSection
.AprioriSection()
2415 AprSectionObj
.AprioriType
= AprType
2417 self
.__GetDefineStatements
(AprSectionObj
)
2418 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2421 IsInf
= self
.__GetInfStatement
(AprSectionObj
)
2422 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2423 if not IsInf
and not IsFile
:
2426 if not self
.__IsToken
( "}"):
2427 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2429 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2432 def __ParseInfStatement(self
):
2433 if not self
.__IsKeyword
("INF"):
2436 ffsInf
= FfsInfStatement
.FfsInfStatement()
2437 self
.__GetInfOptions
(ffsInf
)
2439 if not self
.__GetNextToken
():
2440 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2441 ffsInf
.InfFileName
= self
.__Token
2442 if not ffsInf
.InfFileName
.endswith('.inf'):
2443 raise Warning("expected .inf file path", self
.FileName
, self
.CurrentLineNumber
)
2445 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2446 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2448 #Replace $(SAPCE) with real space
2449 ffsInf
.InfFileName
= ffsInf
.InfFileName
.replace('$(SPACE)', ' ')
2451 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2452 #do case sensitive check for file path
2453 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2455 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2457 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2458 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2459 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2460 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2462 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
2463 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
2465 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
2467 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
2469 if self
.__IsToken
('|'):
2470 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2471 ffsInf
.KeepReloc
= False
2472 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2473 ffsInf
.KeepReloc
= True
2475 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2478 ## __GetInfStatement() method
2480 # Get INF statements
2482 # @param self The object pointer
2483 # @param Obj for whom inf statement is got
2484 # @retval True Successfully find inf statement
2485 # @retval False Not able to find inf statement
2487 def __GetInfStatement(self
, Obj
, ForCapsule
=False):
2488 ffsInf
= self
.__ParseInfStatement
()
2493 capsuleFfs
= CapsuleData
.CapsuleFfs()
2494 capsuleFfs
.Ffs
= ffsInf
2495 Obj
.CapsuleDataList
.append(capsuleFfs
)
2497 Obj
.FfsList
.append(ffsInf
)
2500 ## __GetInfOptions() method
2502 # Get options for INF
2504 # @param self The object pointer
2505 # @param FfsInfObj for whom option is got
2507 def __GetInfOptions(self
, FfsInfObj
):
2508 if self
.__IsKeyword
("FILE_GUID"):
2509 if not self
.__IsToken
("="):
2510 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2511 if not self
.__GetNextGuid
():
2512 raise Warning("expected GUID value", self
.FileName
, self
.CurrentLineNumber
)
2513 FfsInfObj
.OverrideGuid
= self
.__Token
2515 if self
.__IsKeyword
( "RuleOverride"):
2516 if not self
.__IsToken
( "="):
2517 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2518 if not self
.__GetNextToken
():
2519 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2520 FfsInfObj
.Rule
= self
.__Token
2522 if self
.__IsKeyword
( "VERSION"):
2523 if not self
.__IsToken
( "="):
2524 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2525 if not self
.__GetNextToken
():
2526 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2528 if self
.__GetStringData
():
2529 FfsInfObj
.Version
= self
.__Token
2531 if self
.__IsKeyword
( "UI"):
2532 if not self
.__IsToken
( "="):
2533 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2534 if not self
.__GetNextToken
():
2535 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2537 if self
.__GetStringData
():
2538 FfsInfObj
.Ui
= self
.__Token
2540 if self
.__IsKeyword
( "USE"):
2541 if not self
.__IsToken
( "="):
2542 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2543 if not self
.__GetNextToken
():
2544 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2545 FfsInfObj
.UseArch
= self
.__Token
2548 if self
.__GetNextToken
():
2549 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')
2550 if p
.match(self
.__Token
) and p
.match(self
.__Token
).span()[1] == len(self
.__Token
):
2551 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2552 if not self
.__IsToken
(","):
2558 while self
.__GetNextToken
():
2559 if not p
.match(self
.__Token
):
2560 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2561 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2563 if not self
.__IsToken
(","):
2566 ## __GetFileStatement() method
2568 # Get FILE statements
2570 # @param self The object pointer
2571 # @param Obj for whom FILE statement is got
2572 # @param MacroDict dictionary used to replace macro
2573 # @retval True Successfully find FILE statement
2574 # @retval False Not able to find FILE statement
2576 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2578 if not self
.__IsKeyword
( "FILE"):
2581 if not self
.__GetNextWord
():
2582 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2584 if ForCapsule
and self
.__Token
== 'DATA':
2589 FfsFileObj
= FfsFileStatement
.FileStatement()
2590 FfsFileObj
.FvFileType
= self
.__Token
2592 if not self
.__IsToken
( "="):
2593 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2595 if not self
.__GetNextGuid
():
2596 if not self
.__GetNextWord
():
2597 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2598 if self
.__Token
== 'PCD':
2599 if not self
.__IsToken
( "("):
2600 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2601 PcdPair
= self
.__GetNextPcdName
()
2602 if not self
.__IsToken
( ")"):
2603 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2604 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2606 FfsFileObj
.NameGuid
= self
.__Token
2608 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2611 capsuleFfs
= CapsuleData
.CapsuleFfs()
2612 capsuleFfs
.Ffs
= FfsFileObj
2613 Obj
.CapsuleDataList
.append(capsuleFfs
)
2615 Obj
.FfsList
.append(FfsFileObj
)
2619 ## __FileCouldHaveRelocFlag() method
2621 # Check whether reloc strip flag can be set for a file type.
2623 # @param FileType The file type to check with
2624 # @retval True This type could have relocation strip flag
2625 # @retval False No way to have it
2628 def __FileCouldHaveRelocFlag (FileType
):
2629 if FileType
in (SUP_MODULE_SEC
, SUP_MODULE_PEI_CORE
, SUP_MODULE_PEIM
, 'PEI_DXE_COMBO'):
2634 ## __SectionCouldHaveRelocFlag() method
2636 # Check whether reloc strip flag can be set for a section type.
2638 # @param SectionType The section type to check with
2639 # @retval True This type could have relocation strip flag
2640 # @retval False No way to have it
2643 def __SectionCouldHaveRelocFlag (SectionType
):
2644 if SectionType
in ('TE', 'PE32'):
2649 ## __GetFilePart() method
2651 # Get components for FILE statement
2653 # @param self The object pointer
2654 # @param FfsFileObj for whom component is got
2655 # @param MacroDict dictionary used to replace macro
2657 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2659 self
.__GetFileOpts
( FfsFileObj
)
2661 if not self
.__IsToken
("{"):
2662 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2663 if self
.__FileCouldHaveRelocFlag
(FfsFileObj
.FvFileType
):
2664 if self
.__Token
== 'RELOCS_STRIPPED':
2665 FfsFileObj
.KeepReloc
= False
2667 FfsFileObj
.KeepReloc
= True
2669 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj
.FvFileType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2671 if not self
.__IsToken
("{"):
2672 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2674 if not self
.__GetNextToken
():
2675 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2677 if self
.__Token
== "FV":
2678 if not self
.__IsToken
( "="):
2679 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2680 if not self
.__GetNextToken
():
2681 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2682 FfsFileObj
.FvName
= self
.__Token
2684 elif self
.__Token
== "FD":
2685 if not self
.__IsToken
( "="):
2686 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2687 if not self
.__GetNextToken
():
2688 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2689 FfsFileObj
.FdName
= self
.__Token
2691 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2693 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2695 elif hasattr(FfsFileObj
, 'FvFileType') and FfsFileObj
.FvFileType
== 'RAW':
2697 self
.__GetRAWData
(FfsFileObj
, MacroDict
)
2700 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2701 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2702 FfsFileObj
.FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2703 self
.__VerifyFile
(FfsFileObj
.FileName
)
2705 if not self
.__IsToken
( "}"):
2706 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2708 ## __GetRAWData() method
2710 # Get RAW data for FILE statement
2712 # @param self The object pointer
2713 # @param FfsFileObj for whom section is got
2714 # @param MacroDict dictionary used to replace macro
2716 def __GetRAWData(self
, FfsFileObj
, MacroDict
= {}):
2717 FfsFileObj
.FileName
= []
2718 FfsFileObj
.SubAlignment
= []
2721 if self
.__GetAlignment
():
2722 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2723 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2724 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2725 #For FFS, Auto is default option same to ""
2726 if not self
.__Token
== "Auto":
2727 AlignValue
= self
.__Token
2728 if not self
.__GetNextToken
():
2729 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2731 FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2734 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2736 self
.__VerifyFile
(FileName
)
2737 File
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
)
2738 FfsFileObj
.FileName
.append(File
.Path
)
2739 FfsFileObj
.SubAlignment
.append(AlignValue
)
2741 if self
.__IsToken
( "}"):
2745 if len(FfsFileObj
.SubAlignment
) == 1:
2746 FfsFileObj
.SubAlignment
= FfsFileObj
.SubAlignment
[0]
2747 if len(FfsFileObj
.FileName
) == 1:
2748 FfsFileObj
.FileName
= FfsFileObj
.FileName
[0]
2750 ## __GetFileOpts() method
2752 # Get options for FILE statement
2754 # @param self The object pointer
2755 # @param FfsFileObj for whom options is got
2757 def __GetFileOpts(self
, FfsFileObj
):
2759 if self
.__GetNextToken
():
2760 if TokenFindPattern
.match(self
.__Token
):
2761 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2762 if self
.__IsToken
(","):
2763 while self
.__GetNextToken
():
2764 if not TokenFindPattern
.match(self
.__Token
):
2765 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2766 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2768 if not self
.__IsToken
(","):
2774 if self
.__IsKeyword
( "FIXED", True):
2775 FfsFileObj
.Fixed
= True
2777 if self
.__IsKeyword
( "CHECKSUM", True):
2778 FfsFileObj
.CheckSum
= True
2780 if self
.__GetAlignment
():
2781 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2782 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2783 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2784 #For FFS, Auto is default option same to ""
2785 if not self
.__Token
== "Auto":
2786 FfsFileObj
.Alignment
= self
.__Token
2788 ## __GetAlignment() method
2790 # Return the alignment value
2792 # @param self The object pointer
2793 # @retval True Successfully find alignment
2794 # @retval False Not able to find alignment
2796 def __GetAlignment(self
):
2797 if self
.__IsKeyword
( "Align", True):
2798 if not self
.__IsToken
( "="):
2799 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2801 if not self
.__GetNextToken
():
2802 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2807 ## __GetFilePart() method
2809 # Get section data for FILE statement
2811 # @param self The object pointer
2812 # @param FfsFileObj for whom section is got
2813 # @param MacroDict dictionary used to replace macro
2815 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2817 Dict
.update(MacroDict
)
2819 self
.__GetDefineStatements
(FfsFileObj
)
2821 Dict
.update(FfsFileObj
.DefineVarDict
)
2822 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2823 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2826 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2827 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2828 if not IsLeafSection
and not IsEncapSection
:
2831 ## __GetLeafSection() method
2833 # Get leaf section for Obj
2835 # @param self The object pointer
2836 # @param Obj for whom leaf section is got
2837 # @param MacroDict dictionary used to replace macro
2838 # @retval True Successfully find section statement
2839 # @retval False Not able to find section statement
2841 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2843 OldPos
= self
.GetFileBufferPos()
2845 if not self
.__IsKeyword
( "SECTION"):
2846 if len(Obj
.SectionList
) == 0:
2847 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2852 if self
.__GetAlignment
():
2853 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
2854 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2855 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2856 AlignValue
= self
.__Token
2859 if self
.__IsKeyword
( "BUILD_NUM"):
2860 if not self
.__IsToken
( "="):
2861 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2863 if not self
.__GetNextToken
():
2864 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2866 BuildNum
= self
.__Token
2868 if self
.__IsKeyword
( "VERSION"):
2869 if AlignValue
== 'Auto':
2870 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2871 if not self
.__IsToken
( "="):
2872 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2873 if not self
.__GetNextToken
():
2874 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2875 VerSectionObj
= VerSection
.VerSection()
2876 VerSectionObj
.Alignment
= AlignValue
2877 VerSectionObj
.BuildNum
= BuildNum
2878 if self
.__GetStringData
():
2879 VerSectionObj
.StringData
= self
.__Token
2881 VerSectionObj
.FileName
= self
.__Token
2882 Obj
.SectionList
.append(VerSectionObj
)
2884 elif self
.__IsKeyword
( "UI"):
2885 if AlignValue
== 'Auto':
2886 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2887 if not self
.__IsToken
( "="):
2888 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2889 if not self
.__GetNextToken
():
2890 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2891 UiSectionObj
= UiSection
.UiSection()
2892 UiSectionObj
.Alignment
= AlignValue
2893 if self
.__GetStringData
():
2894 UiSectionObj
.StringData
= self
.__Token
2896 UiSectionObj
.FileName
= self
.__Token
2897 Obj
.SectionList
.append(UiSectionObj
)
2899 elif self
.__IsKeyword
( "FV_IMAGE"):
2900 if AlignValue
== 'Auto':
2901 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2902 if not self
.__IsToken
( "="):
2903 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2904 if not self
.__GetNextToken
():
2905 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2907 FvName
= self
.__Token
2910 if self
.__IsToken
( "{"):
2912 FvObj
.UiFvName
= FvName
.upper()
2913 self
.__GetDefineStatements
(FvObj
)
2914 MacroDict
.update(FvObj
.DefineVarDict
)
2915 self
.__GetBlockStatement
(FvObj
)
2916 self
.__GetSetStatements
(FvObj
)
2917 self
.__GetFvAlignment
(FvObj
)
2918 self
.__GetFvAttributes
(FvObj
)
2919 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2920 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2923 IsInf
= self
.__GetInfStatement
(FvObj
)
2924 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2925 if not IsInf
and not IsFile
:
2928 if not self
.__IsToken
( "}"):
2929 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2931 FvImageSectionObj
= FvImageSection
.FvImageSection()
2932 FvImageSectionObj
.Alignment
= AlignValue
2933 if FvObj
is not None:
2934 FvImageSectionObj
.Fv
= FvObj
2935 FvImageSectionObj
.FvName
= None
2937 FvImageSectionObj
.FvName
= FvName
.upper()
2938 FvImageSectionObj
.FvFileName
= FvName
2940 Obj
.SectionList
.append(FvImageSectionObj
)
2942 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2943 if AlignValue
== 'Auto':
2944 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2945 DepexSectionObj
= DepexSection
.DepexSection()
2946 DepexSectionObj
.Alignment
= AlignValue
2947 DepexSectionObj
.DepexType
= self
.__Token
2949 if not self
.__IsToken
( "="):
2950 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2951 if not self
.__IsToken
( "{"):
2952 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2953 if not self
.__SkipToToken
( "}"):
2954 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2956 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2957 Obj
.SectionList
.append(DepexSectionObj
)
2960 if not self
.__GetNextWord
():
2961 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2963 # Encapsulation section appear, UndoToken and return
2964 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2965 self
.SetFileBufferPos(OldPos
)
2968 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2969 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2970 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2971 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2972 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2975 DataSectionObj
= DataSection
.DataSection()
2976 DataSectionObj
.Alignment
= AlignValue
2977 DataSectionObj
.SecType
= self
.__Token
2979 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2980 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2981 if self
.__Token
== 'RELOCS_STRIPPED':
2982 DataSectionObj
.KeepReloc
= False
2984 DataSectionObj
.KeepReloc
= True
2986 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
)
2988 if self
.__IsToken
("="):
2989 if not self
.__GetNextToken
():
2990 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2991 DataSectionObj
.SectFileName
= self
.__Token
2992 self
.__VerifyFile
(DataSectionObj
.SectFileName
)
2994 if not self
.__GetCglSection
(DataSectionObj
):
2997 Obj
.SectionList
.append(DataSectionObj
)
3003 # Check if file exists or not:
3004 # If current phase if GenFds, the file must exist;
3005 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist
3006 # @param FileName: File path to be verified.
3008 def __VerifyFile(self
, FileName
):
3009 if FileName
.replace('$(WORKSPACE)', '').find('$') != -1:
3011 if not GlobalData
.gAutoGenPhase
or not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FileName
:
3012 ErrorCode
, ErrorInfo
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3014 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3016 ## __GetCglSection() method
3018 # Get compressed or GUIDed section for Obj
3020 # @param self The object pointer
3021 # @param Obj for whom leaf section is got
3022 # @param AlignValue alignment value for complex section
3023 # @retval True Successfully find section statement
3024 # @retval False Not able to find section statement
3026 def __GetCglSection(self
, Obj
, AlignValue
= None):
3028 if self
.__IsKeyword
( "COMPRESS"):
3030 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3033 if not self
.__IsToken
("{"):
3034 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3036 CompressSectionObj
= CompressSection
.CompressSection()
3037 CompressSectionObj
.Alignment
= AlignValue
3038 CompressSectionObj
.CompType
= type
3039 # Recursive sections...
3041 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
3042 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
3043 if not IsLeafSection
and not IsEncapSection
:
3047 if not self
.__IsToken
( "}"):
3048 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3049 Obj
.SectionList
.append(CompressSectionObj
)
3052 # raise Warning("Compress type not known")
3056 elif self
.__IsKeyword
( "GUIDED"):
3058 if self
.__GetNextGuid
():
3059 GuidValue
= self
.__Token
3061 AttribDict
= self
.__GetGuidAttrib
()
3062 if not self
.__IsToken
("{"):
3063 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3064 GuidSectionObj
= GuidSection
.GuidSection()
3065 GuidSectionObj
.Alignment
= AlignValue
3066 GuidSectionObj
.NameGuid
= GuidValue
3067 GuidSectionObj
.SectionType
= "GUIDED"
3068 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3069 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3070 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
3071 # Recursive sections...
3073 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
3074 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
3075 if not IsLeafSection
and not IsEncapSection
:
3078 if not self
.__IsToken
( "}"):
3079 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3080 Obj
.SectionList
.append(GuidSectionObj
)
3086 ## __GetGuidAttri() method
3088 # Get attributes for GUID section
3090 # @param self The object pointer
3091 # @retval AttribDict Dictionary of key-value pair of section attributes
3093 def __GetGuidAttrib(self
):
3096 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
3097 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
3098 AttribDict
["EXTRA_HEADER_SIZE"] = -1
3099 while self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID") \
3100 or self
.__IsKeyword
("EXTRA_HEADER_SIZE"):
3101 AttribKey
= self
.__Token
3103 if not self
.__IsToken
("="):
3104 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3106 if not self
.__GetNextToken
():
3107 raise Warning("expected TRUE(1)/FALSE(0)/Number", self
.FileName
, self
.CurrentLineNumber
)
3108 elif AttribKey
== "EXTRA_HEADER_SIZE":
3110 if self
.__Token
[0:2].upper() == "0X":
3113 AttribDict
[AttribKey
] = int(self
.__Token
, Base
)
3116 raise Warning("expected Number", self
.FileName
, self
.CurrentLineNumber
)
3117 elif self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
3118 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
3119 AttribDict
[AttribKey
] = self
.__Token
3123 ## __GetEncapsulationSec() method
3125 # Get encapsulation section for FILE
3127 # @param self The object pointer
3128 # @param FfsFile for whom section is got
3129 # @retval True Successfully find section statement
3130 # @retval False Not able to find section statement
3132 def __GetEncapsulationSec(self
, FfsFileObj
):
3134 OldPos
= self
.GetFileBufferPos()
3135 if not self
.__IsKeyword
( "SECTION"):
3136 if len(FfsFileObj
.SectionList
) == 0:
3137 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
3142 if self
.__GetAlignment
():
3143 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3144 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3145 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3146 AlignValue
= self
.__Token
3148 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
3149 self
.SetFileBufferPos(OldPos
)
3155 if not self
.__GetNextToken
():
3157 S
= self
.__Token
.upper()
3158 if S
.startswith("[") and not S
.startswith("[FMPPAYLOAD."):
3159 self
.SectionParser(S
)
3164 self
.__SkipToToken
("[FMPPAYLOAD.", True)
3165 FmpUiName
= self
.__GetUiName
().upper()
3166 if FmpUiName
in self
.Profile
.FmpPayloadDict
:
3167 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName
, self
.FileName
, self
.CurrentLineNumber
)
3169 FmpData
= CapsuleData
.CapsulePayload()
3170 FmpData
.UiName
= FmpUiName
3172 if not self
.__IsToken
( "]"):
3173 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3175 if not self
.__GetNextToken
():
3176 raise Warning("The FMP payload section is empty!", self
.FileName
, self
.CurrentLineNumber
)
3177 FmpKeyList
= ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']
3178 while self
.__Token
in FmpKeyList
:
3180 FmpKeyList
.remove(Name
)
3181 if not self
.__IsToken
("="):
3182 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3183 if Name
== 'IMAGE_TYPE_ID':
3184 if not self
.__GetNextGuid
():
3185 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self
.FileName
, self
.CurrentLineNumber
)
3186 FmpData
.ImageTypeId
= self
.__Token
3187 elif Name
== 'CERTIFICATE_GUID':
3188 if not self
.__GetNextGuid
():
3189 raise Warning("expected GUID value for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3190 FmpData
.Certificate_Guid
= self
.__Token
3191 if uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_RSA2048_SHA256_GUID
and uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_PKCS7_GUID
:
3192 raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3194 if not self
.__GetNextToken
():
3195 raise Warning("expected value of %s" % Name
, self
.FileName
, self
.CurrentLineNumber
)
3196 Value
= self
.__Token
3197 if Name
== 'IMAGE_HEADER_INIT_VERSION':
3198 if FdfParser
.__Verify
(Name
, Value
, 'UINT8'):
3199 FmpData
.Version
= Value
3200 elif Name
== 'IMAGE_INDEX':
3201 if FdfParser
.__Verify
(Name
, Value
, 'UINT8'):
3202 FmpData
.ImageIndex
= Value
3203 elif Name
== 'HARDWARE_INSTANCE':
3204 if FdfParser
.__Verify
(Name
, Value
, 'UINT8'):
3205 FmpData
.HardwareInstance
= Value
3206 elif Name
== 'MONOTONIC_COUNT':
3207 if FdfParser
.__Verify
(Name
, Value
, 'UINT64'):
3208 FmpData
.MonotonicCount
= Value
3209 if FmpData
.MonotonicCount
.upper().startswith('0X'):
3210 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
, 16)
3212 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
)
3213 if not self
.__GetNextToken
():
3218 if (FmpData
.MonotonicCount
and not FmpData
.Certificate_Guid
) or (not FmpData
.MonotonicCount
and FmpData
.Certificate_Guid
):
3219 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")
3221 # Only the IMAGE_TYPE_ID is required item
3222 if FmpKeyList
and 'IMAGE_TYPE_ID' in FmpKeyList
:
3223 raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3224 # get the Image file and Vendor code file
3225 self
.__GetFMPCapsuleData
(FmpData
)
3226 if not FmpData
.ImageFile
:
3227 raise Warning("Missing image file in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3228 # check whether more than one Vendor code file
3229 if len(FmpData
.VendorCodeFile
) > 1:
3230 raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3231 self
.Profile
.FmpPayloadDict
[FmpUiName
] = FmpData
3234 ## __GetCapsule() method
3236 # Get capsule section contents and store its data into capsule list of self.Profile
3238 # @param self The object pointer
3239 # @retval True Successfully find a capsule
3240 # @retval False Not able to find a capsule
3242 def __GetCapsule(self
):
3244 if not self
.__GetNextToken
():
3247 S
= self
.__Token
.upper()
3248 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
3249 self
.SectionParser(S
)
3254 if not self
.__IsToken
("[CAPSULE.", True):
3255 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3256 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3257 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3258 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
3260 CapsuleObj
= Capsule
.Capsule()
3262 CapsuleName
= self
.__GetUiName
()
3264 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
3266 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
3268 if not self
.__IsToken
( "]"):
3269 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3271 if self
.__IsKeyword
("CREATE_FILE"):
3272 if not self
.__IsToken
( "="):
3273 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3275 if not self
.__GetNextToken
():
3276 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
3278 CapsuleObj
.CreateFile
= self
.__Token
3280 self
.__GetCapsuleStatements
(CapsuleObj
)
3281 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3284 ## __GetCapsuleStatements() method
3286 # Get statements for capsule
3288 # @param self The object pointer
3289 # @param Obj for whom statements are got
3291 def __GetCapsuleStatements(self
, Obj
):
3292 self
.__GetCapsuleTokens
(Obj
)
3293 self
.__GetDefineStatements
(Obj
)
3294 self
.__GetSetStatements
(Obj
)
3295 self
.__GetCapsuleData
(Obj
)
3297 ## __GetCapsuleTokens() method
3299 # Get token statements for capsule
3301 # @param self The object pointer
3302 # @param Obj for whom token statements are got
3304 def __GetCapsuleTokens(self
, Obj
):
3305 if not self
.__GetNextToken
():
3307 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):
3308 Name
= self
.__Token
.strip()
3309 if not self
.__IsToken
("="):
3310 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3311 if not self
.__GetNextToken
():
3312 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3313 if Name
== 'CAPSULE_FLAGS':
3314 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3315 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3316 Value
= self
.__Token
.strip()
3317 while self
.__IsToken
(","):
3319 if not self
.__GetNextToken
():
3320 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3321 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3322 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3323 Value
+= self
.__Token
.strip()
3324 elif Name
== 'OEM_CAPSULE_FLAGS':
3325 Value
= self
.__Token
.strip()
3326 if not Value
.upper().startswith('0X'):
3327 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3329 Value
= int(Value
, 0)
3331 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3332 if not 0x0000 <= Value
<= 0xFFFF:
3333 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3334 Value
= self
.__Token
.strip()
3336 Value
= self
.__Token
.strip()
3337 Obj
.TokensDict
[Name
] = Value
3338 if not self
.__GetNextToken
():
3342 ## __GetCapsuleData() method
3344 # Get capsule data for capsule
3346 # @param self The object pointer
3347 # @param Obj for whom capsule data are got
3349 def __GetCapsuleData(self
, Obj
):
3352 IsInf
= self
.__GetInfStatement
(Obj
, True)
3353 IsFile
= self
.__GetFileStatement
(Obj
, True)
3354 IsFv
= self
.__GetFvStatement
(Obj
)
3355 IsFd
= self
.__GetFdStatement
(Obj
)
3356 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3357 IsAfile
= self
.__GetAfileStatement
(Obj
)
3358 IsFmp
= self
.__GetFmpStatement
(Obj
)
3359 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
or IsAfile
or IsFmp
):
3362 ## __GetFMPCapsuleData() method
3364 # Get capsule data for FMP capsule
3366 # @param self The object pointer
3367 # @param Obj for whom capsule data are got
3369 def __GetFMPCapsuleData(self
, Obj
):
3372 IsFv
= self
.__GetFvStatement
(Obj
, True)
3373 IsFd
= self
.__GetFdStatement
(Obj
, True)
3374 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
, True)
3375 if not (IsFv
or IsFd
or IsAnyFile
):
3378 ## __GetFvStatement() method
3380 # Get FV for capsule
3382 # @param self The object pointer
3383 # @param CapsuleObj for whom FV is got
3384 # @retval True Successfully find a FV statement
3385 # @retval False Not able to find a FV statement
3387 def __GetFvStatement(self
, CapsuleObj
, FMPCapsule
= False):
3389 if not self
.__IsKeyword
("FV"):
3392 if not self
.__IsToken
("="):
3393 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3395 if not self
.__GetNextToken
():
3396 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3398 if self
.__Token
.upper() not in self
.Profile
.FvDict
:
3399 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3401 CapsuleFv
= CapsuleData
.CapsuleFv()
3402 CapsuleFv
.FvName
= self
.__Token
3404 if not CapsuleObj
.ImageFile
:
3405 CapsuleObj
.ImageFile
.append(CapsuleFv
)
3407 CapsuleObj
.VendorCodeFile
.append(CapsuleFv
)
3409 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3412 ## __GetFdStatement() method
3414 # Get FD for capsule
3416 # @param self The object pointer
3417 # @param CapsuleObj for whom FD is got
3418 # @retval True Successfully find a FD statement
3419 # @retval False Not able to find a FD statement
3421 def __GetFdStatement(self
, CapsuleObj
, FMPCapsule
= False):
3423 if not self
.__IsKeyword
("FD"):
3426 if not self
.__IsToken
("="):
3427 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3429 if not self
.__GetNextToken
():
3430 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3432 if self
.__Token
.upper() not in self
.Profile
.FdDict
:
3433 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3435 CapsuleFd
= CapsuleData
.CapsuleFd()
3436 CapsuleFd
.FdName
= self
.__Token
3438 if not CapsuleObj
.ImageFile
:
3439 CapsuleObj
.ImageFile
.append(CapsuleFd
)
3441 CapsuleObj
.VendorCodeFile
.append(CapsuleFd
)
3443 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3446 def __GetFmpStatement(self
, CapsuleObj
):
3447 if not self
.__IsKeyword
("FMP_PAYLOAD"):
3448 if not self
.__IsKeyword
("FMP"):
3451 if not self
.__IsKeyword
("PAYLOAD"):
3455 if not self
.__IsToken
("="):
3456 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3458 if not self
.__GetNextToken
():
3459 raise Warning("expected payload name after FMP_PAYLOAD =", self
.FileName
, self
.CurrentLineNumber
)
3460 Payload
= self
.__Token
.upper()
3461 if Payload
not in self
.Profile
.FmpPayloadDict
:
3462 raise Warning("This FMP Payload does not exist: %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3463 CapsuleObj
.FmpPayloadList
.append(self
.Profile
.FmpPayloadDict
[Payload
])
3466 def __ParseRawFileStatement(self
):
3467 if not self
.__IsKeyword
("FILE"):
3470 if not self
.__IsKeyword
("DATA"):
3474 if not self
.__IsToken
("="):
3475 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3477 if not self
.__GetNextToken
():
3478 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3480 AnyFileName
= self
.__Token
3481 self
.__VerifyFile
(AnyFileName
)
3483 if not os
.path
.isabs(AnyFileName
):
3484 AnyFileName
= mws
.join(GenFdsGlobalVariable
.WorkSpaceDir
, AnyFileName
)
3488 ## __GetAnyFileStatement() method
3490 # Get AnyFile for capsule
3492 # @param self The object pointer
3493 # @param CapsuleObj for whom AnyFile is got
3494 # @retval True Successfully find a Anyfile statement
3495 # @retval False Not able to find a AnyFile statement
3497 def __GetAnyFileStatement(self
, CapsuleObj
, FMPCapsule
= False):
3498 AnyFileName
= self
.__ParseRawFileStatement
()
3502 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3503 CapsuleAnyFile
.FileName
= AnyFileName
3505 if not CapsuleObj
.ImageFile
:
3506 CapsuleObj
.ImageFile
.append(CapsuleAnyFile
)
3508 CapsuleObj
.VendorCodeFile
.append(CapsuleAnyFile
)
3510 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3513 ## __GetAfileStatement() method
3515 # Get Afile for capsule
3517 # @param self The object pointer
3518 # @param CapsuleObj for whom Afile is got
3519 # @retval True Successfully find a Afile statement
3520 # @retval False Not able to find a Afile statement
3522 def __GetAfileStatement(self
, CapsuleObj
):
3524 if not self
.__IsKeyword
("APPEND"):
3527 if not self
.__IsToken
("="):
3528 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3530 if not self
.__GetNextToken
():
3531 raise Warning("expected Afile name", self
.FileName
, self
.CurrentLineNumber
)
3533 AfileName
= self
.__Token
3534 AfileBaseName
= os
.path
.basename(AfileName
)
3536 if os
.path
.splitext(AfileBaseName
)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:
3537 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \
3538 self
.FileName
, self
.CurrentLineNumber
)
3540 if not os
.path
.isabs(AfileName
):
3541 AfileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AfileName
)
3542 self
.__VerifyFile
(AfileName
)
3544 if not os
.path
.exists(AfileName
):
3545 raise Warning('%s does not exist' % AfileName
, self
.FileName
, self
.CurrentLineNumber
)
3549 CapsuleAfile
= CapsuleData
.CapsuleAfile()
3550 CapsuleAfile
.FileName
= AfileName
3551 CapsuleObj
.CapsuleDataList
.append(CapsuleAfile
)
3554 ## __GetRule() method
3556 # Get Rule section contents and store its data into rule list of self.Profile
3558 # @param self The object pointer
3559 # @retval True Successfully find a Rule
3560 # @retval False Not able to find a Rule
3562 def __GetRule(self
):
3564 if not self
.__GetNextToken
():
3567 S
= self
.__Token
.upper()
3568 if S
.startswith("[") and not S
.startswith("[RULE."):
3569 self
.SectionParser(S
)
3573 if not self
.__IsToken
("[Rule.", True):
3574 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3575 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3576 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3577 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3579 if not self
.__SkipToToken
("."):
3580 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3582 Arch
= self
.__SkippedChars
.rstrip(".")
3583 if Arch
.upper() not in ARCH_SET_FULL
:
3584 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3586 ModuleType
= self
.__GetModuleType
()
3589 if self
.__IsToken
("."):
3590 if not self
.__GetNextWord
():
3591 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3592 TemplateName
= self
.__Token
3594 if not self
.__IsToken
( "]"):
3595 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3597 RuleObj
= self
.__GetRuleFileStatements
()
3598 RuleObj
.Arch
= Arch
.upper()
3599 RuleObj
.ModuleType
= ModuleType
3600 RuleObj
.TemplateName
= TemplateName
3601 if TemplateName
== '' :
3602 self
.Profile
.RuleDict
['RULE' + \
3606 ModuleType
.upper() ] = RuleObj
3608 self
.Profile
.RuleDict
['RULE' + \
3612 ModuleType
.upper() + \
3614 TemplateName
.upper() ] = RuleObj
3615 # self.Profile.RuleList.append(rule)
3618 ## __GetModuleType() method
3620 # Return the module type
3622 # @param self The object pointer
3623 # @retval string module type
3625 def __GetModuleType(self
):
3627 if not self
.__GetNextWord
():
3628 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3629 if self
.__Token
.upper() not in (SUP_MODULE_SEC
, SUP_MODULE_PEI_CORE
, SUP_MODULE_PEIM
, SUP_MODULE_DXE_CORE
, \
3630 SUP_MODULE_DXE_DRIVER
, SUP_MODULE_DXE_SAL_DRIVER
, \
3631 SUP_MODULE_DXE_SMM_DRIVER
, SUP_MODULE_DXE_RUNTIME_DRIVER
, \
3632 SUP_MODULE_UEFI_DRIVER
, SUP_MODULE_UEFI_APPLICATION
, SUP_MODULE_USER_DEFINED
, "DEFAULT", SUP_MODULE_BASE
, \
3633 EDK_COMPONENT_TYPE_SECURITY_CORE
, EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER
, EDK_COMPONENT_TYPE_PIC_PEIM
, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM
, \
3634 "PE32_PEIM", EDK_COMPONENT_TYPE_BS_DRIVER
, EDK_COMPONENT_TYPE_RT_DRIVER
, EDK_COMPONENT_TYPE_SAL_RT_DRIVER
, EDK_COMPONENT_TYPE_APPLICATION
, "ACPITABLE", SUP_MODULE_SMM_CORE
, SUP_MODULE_MM_STANDALONE
, SUP_MODULE_MM_CORE_STANDALONE
):
3635 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3638 ## __GetFileExtension() method
3640 # Return the file extension
3642 # @param self The object pointer
3643 # @retval string file name extension
3645 def __GetFileExtension(self
):
3646 if not self
.__IsToken
("."):
3647 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3650 if self
.__GetNextToken
():
3651 if FileExtensionPattern
.match(self
.__Token
):
3655 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3658 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3660 ## __GetRuleFileStatement() method
3664 # @param self The object pointer
3665 # @retval Rule Rule object
3667 def __GetRuleFileStatements(self
):
3669 if not self
.__IsKeyword
("FILE"):
3670 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3672 if not self
.__GetNextWord
():
3673 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3675 Type
= self
.__Token
.strip().upper()
3676 if Type
not in ("RAW", "FREEFORM", SUP_MODULE_SEC
, SUP_MODULE_PEI_CORE
, SUP_MODULE_PEIM
,\
3677 "PEI_DXE_COMBO", "DRIVER", SUP_MODULE_DXE_CORE
, EDK_COMPONENT_TYPE_APPLICATION
, "FV_IMAGE", "SMM", SUP_MODULE_SMM_CORE
, SUP_MODULE_MM_STANDALONE
, SUP_MODULE_MM_CORE_STANDALONE
):
3678 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3680 if not self
.__IsToken
("="):
3681 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3683 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3684 if not self
.__GetNextWord
():
3685 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3686 if self
.__Token
== 'PCD':
3687 if not self
.__IsToken
( "("):
3688 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3689 PcdPair
= self
.__GetNextPcdName
()
3690 if not self
.__IsToken
( ")"):
3691 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3692 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3694 NameGuid
= self
.__Token
3697 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3698 if self
.__FileCouldHaveRelocFlag
(Type
):
3699 if self
.__Token
== 'RELOCS_STRIPPED':
3704 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3707 if self
.__GetNextToken
():
3708 if TokenFindPattern
.match(self
.__Token
):
3709 KeyStringList
.append(self
.__Token
)
3710 if self
.__IsToken
(","):
3711 while self
.__GetNextToken
():
3712 if not TokenFindPattern
.match(self
.__Token
):
3713 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3714 KeyStringList
.append(self
.__Token
)
3716 if not self
.__IsToken
(","):
3724 if self
.__IsKeyword
("Fixed", True):
3728 if self
.__IsKeyword
("CheckSum", True):
3732 if self
.__GetAlignment
():
3733 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3734 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3735 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3736 #For FFS, Auto is default option same to ""
3737 if not self
.__Token
== "Auto":
3738 AlignValue
= self
.__Token
3740 if self
.__IsToken
("{"):
3741 # Complex file rule expected
3742 Rule
= RuleComplexFile
.RuleComplexFile()
3743 Rule
.FvFileType
= Type
3744 Rule
.NameGuid
= NameGuid
3745 Rule
.Alignment
= AlignValue
3746 Rule
.CheckSum
= CheckSum
3748 Rule
.KeyStringList
= KeyStringList
3749 if KeepReloc
is not None:
3750 Rule
.KeepReloc
= KeepReloc
3753 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3754 IsLeaf
= self
.__GetEfiSection
(Rule
)
3755 if not IsEncapsulate
and not IsLeaf
:
3758 if not self
.__IsToken
("}"):
3759 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3764 # Simple file rule expected
3765 if not self
.__GetNextWord
():
3766 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3768 SectionName
= self
.__Token
3770 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3771 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3772 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3775 if self
.__IsKeyword
("Fixed", True):
3778 if self
.__IsKeyword
("CheckSum", True):
3782 if self
.__GetAlignment
():
3783 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3784 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3785 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3786 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3787 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3788 SectAlignment
= self
.__Token
3791 if self
.__IsToken
('|'):
3792 Ext
= self
.__GetFileExtension
()
3793 elif not self
.__GetNextToken
():
3794 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3796 Rule
= RuleSimpleFile
.RuleSimpleFile()
3797 Rule
.SectionType
= SectionName
3798 Rule
.FvFileType
= Type
3799 Rule
.NameGuid
= NameGuid
3800 Rule
.Alignment
= AlignValue
3801 Rule
.SectAlignment
= SectAlignment
3802 Rule
.CheckSum
= CheckSum
3804 Rule
.KeyStringList
= KeyStringList
3805 if KeepReloc
is not None:
3806 Rule
.KeepReloc
= KeepReloc
3807 Rule
.FileExtension
= Ext
3808 Rule
.FileName
= self
.__Token
3811 ## __GetEfiSection() method
3813 # Get section list for Rule
3815 # @param self The object pointer
3816 # @param Obj for whom section is got
3817 # @retval True Successfully find section statement
3818 # @retval False Not able to find section statement
3820 def __GetEfiSection(self
, Obj
):
3822 OldPos
= self
.GetFileBufferPos()
3823 if not self
.__GetNextWord
():
3825 SectionName
= self
.__Token
3827 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3828 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3832 if SectionName
== "FV_IMAGE":
3833 FvImageSectionObj
= FvImageSection
.FvImageSection()
3834 if self
.__IsKeyword
("FV_IMAGE"):
3836 if self
.__IsToken
( "{"):
3838 self
.__GetDefineStatements
(FvObj
)
3839 self
.__GetBlockStatement
(FvObj
)
3840 self
.__GetSetStatements
(FvObj
)
3841 self
.__GetFvAlignment
(FvObj
)
3842 self
.__GetFvAttributes
(FvObj
)
3843 self
.__GetAprioriSection
(FvObj
)
3844 self
.__GetAprioriSection
(FvObj
)
3847 IsInf
= self
.__GetInfStatement
(FvObj
)
3848 IsFile
= self
.__GetFileStatement
(FvObj
)
3849 if not IsInf
and not IsFile
:
3852 if not self
.__IsToken
( "}"):
3853 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3854 FvImageSectionObj
.Fv
= FvObj
3855 FvImageSectionObj
.FvName
= None
3858 if not self
.__IsKeyword
("FV"):
3859 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3860 FvImageSectionObj
.FvFileType
= self
.__Token
3862 if self
.__GetAlignment
():
3863 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3864 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3865 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3866 FvImageSectionObj
.Alignment
= self
.__Token
3868 if self
.__IsToken
('|'):
3869 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3870 elif self
.__GetNextToken
():
3871 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3872 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3873 FvImageSectionObj
.FvFileName
= self
.__Token
3877 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3879 Obj
.SectionList
.append(FvImageSectionObj
)
3882 EfiSectionObj
= EfiSection
.EfiSection()
3883 EfiSectionObj
.SectionType
= SectionName
3885 if not self
.__GetNextToken
():
3886 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3888 if self
.__Token
== "STRING":
3889 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3890 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3892 if not self
.__IsToken
('='):
3893 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3895 if not self
.__GetNextToken
():
3896 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3898 if self
.__GetStringData
():
3899 EfiSectionObj
.StringData
= self
.__Token
3901 if self
.__IsKeyword
("BUILD_NUM"):
3902 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3903 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3905 if not self
.__IsToken
("="):
3906 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3907 if not self
.__GetNextToken
():
3908 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3909 EfiSectionObj
.BuildNum
= self
.__Token
3912 EfiSectionObj
.FileType
= self
.__Token
3913 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3915 if self
.__IsKeyword
("Optional"):
3916 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3917 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3918 EfiSectionObj
.Optional
= True
3920 if self
.__IsKeyword
("BUILD_NUM"):
3921 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3922 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3924 if not self
.__IsToken
("="):
3925 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3926 if not self
.__GetNextToken
():
3927 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3928 EfiSectionObj
.BuildNum
= self
.__Token
3930 if self
.__GetAlignment
():
3931 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
3932 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3933 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3934 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3935 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3936 EfiSectionObj
.Alignment
= self
.__Token
3938 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3939 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3940 if self
.__Token
== 'RELOCS_STRIPPED':
3941 EfiSectionObj
.KeepReloc
= False
3943 EfiSectionObj
.KeepReloc
= True
3944 if Obj
.KeepReloc
is not None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3945 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3947 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3950 if self
.__IsToken
('|'):
3951 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3952 elif self
.__GetNextToken
():
3953 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3954 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3956 if self
.__Token
.startswith('PCD'):
3958 self
.__GetNextWord
()
3960 if self
.__Token
== 'PCD':
3961 if not self
.__IsToken
( "("):
3962 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3963 PcdPair
= self
.__GetNextPcdName
()
3964 if not self
.__IsToken
( ")"):
3965 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3966 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3968 EfiSectionObj
.FileName
= self
.__Token
3973 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3975 Obj
.SectionList
.append(EfiSectionObj
)
3978 ## __RuleSectionCouldBeOptional() method
3980 # Get whether a section could be optional
3982 # @param SectionType The section type to check
3983 # @retval True section could be optional
3984 # @retval False section never optional
3987 def __RuleSectionCouldBeOptional(SectionType
):
3988 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3993 ## __RuleSectionCouldHaveBuildNum() method
3995 # Get whether a section could have build number information
3997 # @param SectionType The section type to check
3998 # @retval True section could have build number information
3999 # @retval False section never have build number information
4002 def __RuleSectionCouldHaveBuildNum(SectionType
):
4003 if SectionType
in ("VERSION"):
4008 ## __RuleSectionCouldHaveString() method
4010 # Get whether a section could have string
4012 # @param SectionType The section type to check
4013 # @retval True section could have string
4014 # @retval False section never have string
4017 def __RuleSectionCouldHaveString(SectionType
):
4018 if SectionType
in ("UI", "VERSION"):
4023 ## __CheckRuleSectionFileType() method
4025 # Get whether a section matches a file type
4027 # @param self The object pointer
4028 # @param SectionType The section type to check
4029 # @param FileType The file type to check
4031 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
4032 if SectionType
== "COMPAT16":
4033 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
4034 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4035 elif SectionType
== "PE32":
4036 if FileType
not in ("PE32", "SEC_PE32"):
4037 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4038 elif SectionType
== "PIC":
4039 if FileType
not in ("PIC", "PIC"):
4040 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4041 elif SectionType
== "TE":
4042 if FileType
not in ("TE", "SEC_TE"):
4043 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4044 elif SectionType
== "RAW":
4045 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
4046 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4047 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
4048 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
4049 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4050 elif SectionType
== "UI":
4051 if FileType
not in ("UI", "SEC_UI"):
4052 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4053 elif SectionType
== "VERSION":
4054 if FileType
not in ("VERSION", "SEC_VERSION"):
4055 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4056 elif SectionType
== "PEI_DEPEX":
4057 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
4058 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4059 elif SectionType
== "GUID":
4060 if FileType
not in ("PE32", "SEC_GUID"):
4061 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4063 ## __GetRuleEncapsulationSection() method
4065 # Get encapsulation section for Rule
4067 # @param self The object pointer
4068 # @param Rule for whom section is got
4069 # @retval True Successfully find section statement
4070 # @retval False Not able to find section statement
4072 def __GetRuleEncapsulationSection(self
, Rule
):
4074 if self
.__IsKeyword
( "COMPRESS"):
4076 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
4079 if not self
.__IsToken
("{"):
4080 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4082 CompressSectionObj
= CompressSection
.CompressSection()
4084 CompressSectionObj
.CompType
= Type
4085 # Recursive sections...
4087 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
4088 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
4089 if not IsEncapsulate
and not IsLeaf
:
4092 if not self
.__IsToken
( "}"):
4093 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4094 Rule
.SectionList
.append(CompressSectionObj
)
4098 elif self
.__IsKeyword
( "GUIDED"):
4100 if self
.__GetNextGuid
():
4101 GuidValue
= self
.__Token
4103 if self
.__IsKeyword
( "$(NAMED_GUID)"):
4104 GuidValue
= self
.__Token
4106 AttribDict
= self
.__GetGuidAttrib
()
4108 if not self
.__IsToken
("{"):
4109 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4110 GuidSectionObj
= GuidSection
.GuidSection()
4111 GuidSectionObj
.NameGuid
= GuidValue
4112 GuidSectionObj
.SectionType
= "GUIDED"
4113 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
4114 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
4115 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
4119 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
4120 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
4121 if not IsEncapsulate
and not IsLeaf
:
4124 if not self
.__IsToken
( "}"):
4125 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4126 Rule
.SectionList
.append(GuidSectionObj
)
4132 ## __GetVtf() method
4134 # Get VTF section contents and store its data into VTF list of self.Profile
4136 # @param self The object pointer
4137 # @retval True Successfully find a VTF
4138 # @retval False Not able to find a VTF
4142 if not self
.__GetNextToken
():
4145 S
= self
.__Token
.upper()
4146 if S
.startswith("[") and not S
.startswith("[VTF."):
4147 self
.SectionParser(S
)
4152 if not self
.__IsToken
("[VTF.", True):
4153 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4154 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
4155 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
4156 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
4158 if not self
.__SkipToToken
("."):
4159 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
4161 Arch
= self
.__SkippedChars
.rstrip(".").upper()
4162 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4163 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
4165 if not self
.__GetNextWord
():
4166 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
4167 Name
= self
.__Token
.upper()
4170 VtfObj
.UiName
= Name
4171 VtfObj
.KeyArch
= Arch
4173 if self
.__IsToken
(","):
4174 if not self
.__GetNextWord
():
4175 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
4176 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4177 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4178 VtfObj
.ArchList
= self
.__Token
.upper()
4180 if not self
.__IsToken
( "]"):
4181 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4183 if self
.__IsKeyword
("IA32_RST_BIN"):
4184 if not self
.__IsToken
("="):
4185 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4187 if not self
.__GetNextToken
():
4188 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
4190 VtfObj
.ResetBin
= self
.__Token
4191 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4192 #check for file path
4193 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4195 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4197 while self
.__GetComponentStatement
(VtfObj
):
4200 self
.Profile
.VtfList
.append(VtfObj
)
4203 ## __GetComponentStatement() method
4205 # Get components in VTF
4207 # @param self The object pointer
4208 # @param VtfObj for whom component is got
4209 # @retval True Successfully find a component
4210 # @retval False Not able to find a component
4212 def __GetComponentStatement(self
, VtfObj
):
4214 if not self
.__IsKeyword
("COMP_NAME"):
4217 if not self
.__IsToken
("="):
4218 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4220 if not self
.__GetNextWord
():
4221 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
4223 CompStatementObj
= ComponentStatement
.ComponentStatement()
4224 CompStatementObj
.CompName
= self
.__Token
4226 if not self
.__IsKeyword
("COMP_LOC"):
4227 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
4229 if not self
.__IsToken
("="):
4230 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4232 CompStatementObj
.CompLoc
= ""
4233 if self
.__GetNextWord
():
4234 CompStatementObj
.CompLoc
= self
.__Token
4235 if self
.__IsToken
('|'):
4236 if not self
.__GetNextWord
():
4237 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
4239 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
4240 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4242 CompStatementObj
.FilePos
= self
.__Token
4244 self
.CurrentLineNumber
+= 1
4245 self
.CurrentOffsetWithinLine
= 0
4247 if not self
.__IsKeyword
("COMP_TYPE"):
4248 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
4250 if not self
.__IsToken
("="):
4251 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4253 if not self
.__GetNextToken
():
4254 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
4255 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
4256 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
4257 not self
.__Token
[2] in string
.hexdigits
or not self
.__Token
[-1] in string
.hexdigits
:
4258 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4259 CompStatementObj
.CompType
= self
.__Token
4261 if not self
.__IsKeyword
("COMP_VER"):
4262 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
4264 if not self
.__IsToken
("="):
4265 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4267 if not self
.__GetNextToken
():
4268 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
4270 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
4271 if Pattern
.match(self
.__Token
) is None:
4272 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4273 CompStatementObj
.CompVer
= self
.__Token
4275 if not self
.__IsKeyword
("COMP_CS"):
4276 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
4278 if not self
.__IsToken
("="):
4279 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4281 if not self
.__GetNextToken
():
4282 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
4283 if self
.__Token
not in ("1", "0"):
4284 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4285 CompStatementObj
.CompCs
= self
.__Token
4288 if not self
.__IsKeyword
("COMP_BIN"):
4289 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
4291 if not self
.__IsToken
("="):
4292 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4294 if not self
.__GetNextToken
():
4295 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
4297 CompStatementObj
.CompBin
= self
.__Token
4298 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4299 #check for file path
4300 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4302 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4304 if not self
.__IsKeyword
("COMP_SYM"):
4305 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
4307 if not self
.__IsToken
("="):
4308 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4310 if not self
.__GetNextToken
():
4311 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
4313 CompStatementObj
.CompSym
= self
.__Token
4314 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
4315 #check for file path
4316 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4318 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4320 if not self
.__IsKeyword
("COMP_SIZE"):
4321 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
4323 if not self
.__IsToken
("="):
4324 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4326 if self
.__IsToken
("-"):
4327 CompStatementObj
.CompSize
= self
.__Token
4328 elif self
.__GetNextDecimalNumber
():
4329 CompStatementObj
.CompSize
= self
.__Token
4330 elif self
.__GetNextHexNumber
():
4331 CompStatementObj
.CompSize
= self
.__Token
4333 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4335 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
4338 ## __GetOptionRom() method
4340 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
4342 # @param self The object pointer
4343 # @retval True Successfully find a OptionROM
4344 # @retval False Not able to find a OptionROM
4346 def __GetOptionRom(self
):
4348 if not self
.__GetNextToken
():
4351 S
= self
.__Token
.upper()
4352 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
4353 self
.SectionParser(S
)
4358 if not self
.__IsToken
("[OptionRom.", True):
4359 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4361 OptRomName
= self
.__GetUiName
()
4363 if not self
.__IsToken
( "]"):
4364 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4366 OptRomObj
= OptionRom
.OPTIONROM()
4367 OptRomObj
.DriverName
= OptRomName
4368 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
4371 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
4372 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
4373 if not isInf
and not isFile
:
4378 ## __GetOptRomInfStatement() method
4380 # Get INF statements
4382 # @param self The object pointer
4383 # @param Obj for whom inf statement is got
4384 # @retval True Successfully find inf statement
4385 # @retval False Not able to find inf statement
4387 def __GetOptRomInfStatement(self
, Obj
):
4389 if not self
.__IsKeyword
( "INF"):
4392 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
4393 self
.__GetInfOptions
( ffsInf
)
4395 if not self
.__GetNextToken
():
4396 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
4397 ffsInf
.InfFileName
= self
.__Token
4398 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4399 #check for file path
4400 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4402 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4404 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4405 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4406 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4407 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4409 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
4410 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
4412 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
4414 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
4417 self
.__GetOptRomOverrides
(ffsInf
)
4419 Obj
.FfsList
.append(ffsInf
)
4422 ## __GetOptRomOverrides() method
4424 # Get overrides for OptROM INF & FILE
4426 # @param self The object pointer
4427 # @param FfsInfObj for whom overrides is got
4429 def __GetOptRomOverrides(self
, Obj
):
4430 if self
.__IsToken
('{'):
4431 Overrides
= OptionRom
.OverrideAttribs()
4433 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4434 if not self
.__IsToken
( "="):
4435 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4436 if not self
.__GetNextHexNumber
():
4437 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4438 Overrides
.PciVendorId
= self
.__Token
4441 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4442 if not self
.__IsToken
( "="):
4443 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4444 if not self
.__GetNextHexNumber
():
4445 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4446 Overrides
.PciClassCode
= self
.__Token
4449 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4450 if not self
.__IsToken
( "="):
4451 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4452 if not self
.__GetNextHexNumber
():
4453 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4455 Overrides
.PciDeviceId
= self
.__Token
4458 if self
.__IsKeyword
( "PCI_REVISION"):
4459 if not self
.__IsToken
( "="):
4460 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4461 if not self
.__GetNextHexNumber
():
4462 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4463 Overrides
.PciRevision
= self
.__Token
4466 if self
.__IsKeyword
( "PCI_COMPRESS"):
4467 if not self
.__IsToken
( "="):
4468 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4469 if not self
.__GetNextToken
():
4470 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4471 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4474 if self
.__IsToken
( "}"):
4477 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4479 Obj
.OverrideAttribs
= Overrides
4481 ## __GetOptRomFileStatement() method
4483 # Get FILE statements
4485 # @param self The object pointer
4486 # @param Obj for whom FILE statement is got
4487 # @retval True Successfully find FILE statement
4488 # @retval False Not able to find FILE statement
4490 def __GetOptRomFileStatement(self
, Obj
):
4492 if not self
.__IsKeyword
( "FILE"):
4495 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4497 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4498 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4499 FfsFileObj
.FileType
= self
.__Token
4501 if not self
.__GetNextToken
():
4502 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4503 FfsFileObj
.FileName
= self
.__Token
4504 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4505 #check for file path
4506 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4508 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4510 if FfsFileObj
.FileType
== 'EFI':
4511 self
.__GetOptRomOverrides
(FfsFileObj
)
4513 Obj
.FfsList
.append(FfsFileObj
)
4517 ## __GetCapInFd() method
4519 # Get Cap list contained in FD
4521 # @param self The object pointer
4522 # @param FdName FD name
4523 # @retval CapList List of Capsule in FD
4525 def __GetCapInFd (self
, FdName
):
4528 if FdName
.upper() in self
.Profile
.FdDict
:
4529 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4530 for elementRegion
in FdObj
.RegionList
:
4531 if elementRegion
.RegionType
== 'CAPSULE':
4532 for elementRegionData
in elementRegion
.RegionDataList
:
4533 if elementRegionData
.endswith(".cap"):
4535 if elementRegionData
is not None and elementRegionData
.upper() not in CapList
:
4536 CapList
.append(elementRegionData
.upper())
4539 ## __GetReferencedFdCapTuple() method
4541 # Get FV and FD list referenced by a capsule image
4543 # @param self The object pointer
4544 # @param CapObj Capsule section to be searched
4545 # @param RefFdList referenced FD by section
4546 # @param RefFvList referenced FV by section
4548 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4550 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4551 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
is not None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4552 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4553 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
is not None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4554 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4555 elif CapsuleDataObj
.Ffs
is not None:
4556 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4557 if CapsuleDataObj
.Ffs
.FvName
is not None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4558 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4559 elif CapsuleDataObj
.Ffs
.FdName
is not None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4560 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4562 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4564 ## __GetFvInFd() method
4566 # Get FV list contained in FD
4568 # @param self The object pointer
4569 # @param FdName FD name
4570 # @retval FvList list of FV in FD
4572 def __GetFvInFd (self
, FdName
):
4575 if FdName
.upper() in self
.Profile
.FdDict
:
4576 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4577 for elementRegion
in FdObj
.RegionList
:
4578 if elementRegion
.RegionType
== 'FV':
4579 for elementRegionData
in elementRegion
.RegionDataList
:
4580 if elementRegionData
.endswith(".fv"):
4582 if elementRegionData
is not None and elementRegionData
.upper() not in FvList
:
4583 FvList
.append(elementRegionData
.upper())
4586 ## __GetReferencedFdFvTuple() method
4588 # Get FD and FV list referenced by a FFS file
4590 # @param self The object pointer
4591 # @param FfsFile contains sections to be searched
4592 # @param RefFdList referenced FD by section
4593 # @param RefFvList referenced FV by section
4595 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4597 for FfsObj
in FvObj
.FfsList
:
4598 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4599 if FfsObj
.FvName
is not None and FfsObj
.FvName
.upper() not in RefFvList
:
4600 RefFvList
.append(FfsObj
.FvName
.upper())
4601 elif FfsObj
.FdName
is not None and FfsObj
.FdName
.upper() not in RefFdList
:
4602 RefFdList
.append(FfsObj
.FdName
.upper())
4604 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4606 ## __GetReferencedFdFvTupleFromSection() method
4608 # Get FD and FV list referenced by a FFS section
4610 # @param self The object pointer
4611 # @param FfsFile contains sections to be searched
4612 # @param FdList referenced FD by section
4613 # @param FvList referenced FV by section
4615 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4618 SectionStack
.extend(FfsFile
.SectionList
)
4619 while SectionStack
!= []:
4620 SectionObj
= SectionStack
.pop()
4621 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4622 if SectionObj
.FvName
is not None and SectionObj
.FvName
.upper() not in FvList
:
4623 FvList
.append(SectionObj
.FvName
.upper())
4624 if SectionObj
.Fv
is not None and SectionObj
.Fv
.UiFvName
is not None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4625 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4626 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4628 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4629 SectionStack
.extend(SectionObj
.SectionList
)
4631 ## CycleReferenceCheck() method
4633 # Check whether cycle reference exists in FDF
4635 # @param self The object pointer
4636 # @retval True cycle reference exists
4637 # @retval False Not exists cycle reference
4639 def CycleReferenceCheck(self
):
4641 # Check the cycle between FV and FD image
4643 MaxLength
= len (self
.Profile
.FvDict
)
4644 for FvName
in self
.Profile
.FvDict
:
4645 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4647 RefFvStack
.append(FvName
)
4651 while RefFvStack
!= [] and Index
< MaxLength
:
4653 FvNameFromStack
= RefFvStack
.pop()
4654 if FvNameFromStack
.upper() in self
.Profile
.FvDict
:
4655 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4661 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4663 for RefFdName
in RefFdList
:
4664 if RefFdName
in FdAnalyzedList
:
4667 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4668 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4669 if FvInFdList
!= []:
4670 for FvNameInFd
in FvInFdList
:
4671 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4672 if FvNameInFd
not in RefFvStack
:
4673 RefFvStack
.append(FvNameInFd
)
4675 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4676 EdkLogger
.info(LogStr
)
4678 FdAnalyzedList
.append(RefFdName
)
4680 for RefFvName
in RefFvList
:
4681 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4682 if RefFvName
not in RefFvStack
:
4683 RefFvStack
.append(RefFvName
)
4685 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4686 EdkLogger
.info(LogStr
)
4690 # Check the cycle between Capsule and FD image
4692 MaxLength
= len (self
.Profile
.CapsuleDict
)
4693 for CapName
in self
.Profile
.CapsuleDict
:
4695 # Capsule image to be checked.
4697 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4699 RefCapStack
.append(CapName
)
4704 while RefCapStack
!= [] and Index
< MaxLength
:
4706 CapNameFromStack
= RefCapStack
.pop()
4707 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
:
4708 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4714 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4718 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4719 for RefFdName
in RefFdList
:
4720 if RefFdName
in FdAnalyzedList
:
4723 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4724 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4725 if CapInFdList
!= []:
4726 for CapNameInFd
in CapInFdList
:
4727 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4728 if CapNameInFd
not in RefCapStack
:
4729 RefCapStack
.append(CapNameInFd
)
4731 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4732 EdkLogger
.info(LogStr
)
4735 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4736 if FvInFdList
!= []:
4737 for FvNameInFd
in FvInFdList
:
4738 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4739 if FvNameInFd
not in RefFvList
:
4740 RefFvList
.append(FvNameInFd
)
4742 FdAnalyzedList
.append(RefFdName
)
4744 # the number of the parsed FV and FD image
4746 FvListLength
= len (RefFvList
)
4747 FdListLength
= len (RefFdList
)
4748 for RefFvName
in RefFvList
:
4749 if RefFvName
in FvAnalyzedList
:
4751 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4752 if RefFvName
.upper() in self
.Profile
.FvDict
:
4753 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4756 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4757 FvAnalyzedList
.append(RefFvName
)
4761 def GetAllIncludedFile (self
):
4762 global AllIncludeFileList
4763 return AllIncludeFileList
4765 if __name__
== "__main__":
4768 test_file
= sys
.argv
[1]
4769 except IndexError, v
:
4770 print "Usage: %s filename" % sys
.argv
[0]
4773 parser
= FdfParser(test_file
)
4776 parser
.CycleReferenceCheck()