4 # Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
5 # Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>
7 # This program and the accompanying materials
8 # are licensed and made available under the terms and conditions of the BSD License
9 # which accompanies this distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
25 import FfsInfStatement
26 import FfsFileStatement
32 import CompressSection
37 import RuleComplexFile
41 import ComponentStatement
43 import OptRomInfStatement
44 import OptRomFileStatement
46 from GenFdsGlobalVariable
import GenFdsGlobalVariable
47 from Common
.BuildToolError
import *
48 from Common
import EdkLogger
49 from Common
.Misc
import PathClass
50 from Common
.String
import NormPath
51 import Common
.GlobalData
as GlobalData
52 from Common
.Expression
import *
53 from Common
import GlobalData
54 from Common
.String
import ReplaceMacro
56 from Common
.Misc
import tdict
59 import Common
.LongFilePathOs
as os
60 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
62 ##define T_CHAR_SPACE ' '
63 ##define T_CHAR_NULL '\0'
64 ##define T_CHAR_CR '\r'
65 ##define T_CHAR_TAB '\t'
66 ##define T_CHAR_LF '\n'
67 ##define T_CHAR_SLASH '/'
68 ##define T_CHAR_BACKSLASH '\\'
69 ##define T_CHAR_DOUBLE_QUOTE '\"'
70 ##define T_CHAR_SINGLE_QUOTE '\''
71 ##define T_CHAR_STAR '*'
72 ##define T_CHAR_HASH '#'
74 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
75 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
76 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
78 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
80 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
81 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
82 RegionOffsetPcdPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*$")
83 ShortcutPcdPattern
= re
.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
85 AllIncludeFileList
= []
87 # Get the closest parent
88 def GetParentAtLine (Line
):
89 for Profile
in AllIncludeFileList
:
90 if Profile
.IsLineInFile(Line
):
95 def IsValidInclude (File
, Line
):
96 for Profile
in AllIncludeFileList
:
97 if Profile
.IsLineInFile(Line
) and Profile
.FileName
== File
:
102 def GetRealFileLine (File
, Line
):
105 for Profile
in AllIncludeFileList
:
106 if Profile
.IsLineInFile(Line
):
107 return Profile
.GetLineInFile(Line
)
108 elif Line
>= Profile
.InsertStartLineNumber
and Profile
.Level
== 1:
109 InsertedLines
+= Profile
.GetTotalLines()
111 return (File
, Line
- InsertedLines
)
113 ## The exception class that used to report error messages when parsing FDF
115 # Currently the "ToolName" is set to be "FDF Parser".
117 class Warning (Exception):
120 # @param self The object pointer
121 # @param Str The message to record
122 # @param File The FDF name
123 # @param Line The Line number that error occurs
125 def __init__(self
, Str
, File
= None, Line
= None):
127 FileLineTuple
= GetRealFileLine(File
, Line
)
128 self
.FileName
= FileLineTuple
[0]
129 self
.LineNumber
= FileLineTuple
[1]
130 self
.OriginalLineNumber
= Line
132 self
.ToolName
= 'FdfParser'
137 ## The MACRO class that used to record macro value data when parsing include file
143 # @param self The object pointer
144 # @param FileName The file that to be parsed
146 def __init__(self
, FileName
, Line
):
147 self
.FileName
= FileName
148 self
.DefinedAtLine
= Line
149 self
.MacroName
= None
150 self
.MacroValue
= None
152 ## The Include file content class that used to record file data when parsing include file
154 # May raise Exception when opening file.
156 class IncludeFileProfile
:
159 # @param self The object pointer
160 # @param FileName The file that to be parsed
162 def __init__(self
, FileName
):
163 self
.FileName
= FileName
164 self
.FileLinesList
= []
166 fsock
= open(FileName
, "rb", 0)
168 self
.FileLinesList
= fsock
.readlines()
173 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
175 self
.InsertStartLineNumber
= None
176 self
.InsertAdjust
= 0
177 self
.IncludeFileList
= []
178 self
.Level
= 1 # first level include file
180 def GetTotalLines(self
):
181 TotalLines
= self
.InsertAdjust
+ len(self
.FileLinesList
)
183 for Profile
in self
.IncludeFileList
:
184 TotalLines
+= Profile
.GetTotalLines()
188 def IsLineInFile(self
, Line
):
189 if Line
>= self
.InsertStartLineNumber
and Line
< self
.InsertStartLineNumber
+ self
.GetTotalLines():
194 def GetLineInFile(self
, Line
):
195 if not self
.IsLineInFile (Line
):
196 return (self
.FileName
, -1)
198 InsertedLines
= self
.InsertStartLineNumber
200 for Profile
in self
.IncludeFileList
:
201 if Profile
.IsLineInFile(Line
):
202 return Profile
.GetLineInFile(Line
)
203 elif Line
>= Profile
.InsertStartLineNumber
:
204 InsertedLines
+= Profile
.GetTotalLines()
206 return (self
.FileName
, Line
- InsertedLines
+ 1)
210 ## The FDF content class that used to record file data when parsing FDF
212 # May raise Exception when opening file.
217 # @param self The object pointer
218 # @param FileName The file that to be parsed
220 def __init__(self
, FileName
):
221 self
.FileLinesList
= []
223 fsock
= open(FileName
, "rb", 0)
225 self
.FileLinesList
= fsock
.readlines()
230 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
235 # ECC will use this Dict and List information
236 self
.PcdFileLineDict
= {}
237 self
.InfFileLineList
= []
240 self
.FdNameNotSet
= False
242 self
.CapsuleDict
= {}
246 self
.FmpPayloadDict
= {}
248 ## The syntax parser for FDF
250 # PreprocessFile method should be called prior to ParseFile
251 # CycleReferenceCheck method can detect cycles in FDF contents
253 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
254 # Get*** procedures mean these procedures will make judgement on current token only.
259 # @param self The object pointer
260 # @param FileName The file that to be parsed
262 def __init__(self
, FileName
):
263 self
.Profile
= FileProfile(FileName
)
264 self
.FileName
= FileName
265 self
.CurrentLineNumber
= 1
266 self
.CurrentOffsetWithinLine
= 0
267 self
.CurrentFdName
= None
268 self
.CurrentFvName
= None
270 self
.__SkippedChars
= ""
271 GlobalData
.gFdfParser
= self
273 # Used to section info
274 self
.__CurSection
= []
275 # Key: [section name, UI name, arch]
276 # Value: {MACRO_NAME : MACRO_VALUE}
277 self
.__MacroDict
= tdict(True, 3)
280 self
.__WipeOffArea
= []
281 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
282 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
284 ## __IsWhiteSpace() method
286 # Whether char at current FileBufferPos is whitespace
288 # @param self The object pointer
289 # @param Char The char to test
290 # @retval True The char is a kind of white space
291 # @retval False The char is NOT a kind of white space
293 def __IsWhiteSpace(self
, Char
):
294 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
299 ## __SkipWhiteSpace() method
301 # Skip white spaces from current char, return number of chars skipped
303 # @param self The object pointer
304 # @retval Count The number of chars skipped
306 def __SkipWhiteSpace(self
):
308 while not self
.__EndOfFile
():
310 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
311 self
.__SkippedChars
+= str(self
.__CurrentChar
())
318 ## __EndOfFile() method
320 # Judge current buffer pos is at file end
322 # @param self The object pointer
323 # @retval True Current File buffer position is at file end
324 # @retval False Current File buffer position is NOT at file end
326 def __EndOfFile(self
):
327 NumberOfLines
= len(self
.Profile
.FileLinesList
)
328 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
329 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
331 elif self
.CurrentLineNumber
> NumberOfLines
:
336 ## __EndOfLine() method
338 # Judge current buffer pos is at line end
340 # @param self The object pointer
341 # @retval True Current File buffer position is at line end
342 # @retval False Current File buffer position is NOT at line end
344 def __EndOfLine(self
):
345 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
347 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
348 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
355 # Reset file data buffer to the initial state
357 # @param self The object pointer
358 # @param DestLine Optional new destination line number.
359 # @param DestOffset Optional new destination offset.
361 def Rewind(self
, DestLine
= 1, DestOffset
= 0):
362 self
.CurrentLineNumber
= DestLine
363 self
.CurrentOffsetWithinLine
= DestOffset
365 ## __UndoOneChar() method
367 # Go back one char in the file buffer
369 # @param self The object pointer
370 # @retval True Successfully go back one char
371 # @retval False Not able to go back one char as file beginning reached
373 def __UndoOneChar(self
):
375 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
377 elif self
.CurrentOffsetWithinLine
== 0:
378 self
.CurrentLineNumber
-= 1
379 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
381 self
.CurrentOffsetWithinLine
-= 1
384 ## __GetOneChar() method
386 # Move forward one char in the file buffer
388 # @param self The object pointer
390 def __GetOneChar(self
):
391 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
392 self
.CurrentLineNumber
+= 1
393 self
.CurrentOffsetWithinLine
= 0
395 self
.CurrentOffsetWithinLine
+= 1
397 ## __CurrentChar() method
399 # Get the char pointed to by the file buffer pointer
401 # @param self The object pointer
402 # @retval Char Current char
404 def __CurrentChar(self
):
405 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
407 ## __NextChar() method
409 # Get the one char pass the char pointed to by the file buffer pointer
411 # @param self The object pointer
412 # @retval Char Next char
414 def __NextChar(self
):
415 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
416 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
418 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
420 ## __SetCurrentCharValue() method
422 # Modify the value of current char
424 # @param self The object pointer
425 # @param Value The new value of current char
427 def __SetCurrentCharValue(self
, Value
):
428 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
430 ## __CurrentLine() method
432 # Get the list that contains current line contents
434 # @param self The object pointer
435 # @retval List current line contents
437 def __CurrentLine(self
):
438 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
440 def __StringToList(self
):
441 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
442 self
.Profile
.FileLinesList
[-1].append(' ')
444 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
445 if StartPos
[0] == EndPos
[0]:
447 while Offset
<= EndPos
[1]:
448 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
453 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
454 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
458 while Line
< EndPos
[0]:
460 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
461 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
466 while Offset
<= EndPos
[1]:
467 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
471 def __GetMacroName(self
):
472 if not self
.__GetNextToken
():
473 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
474 MacroName
= self
.__Token
476 if MacroName
.startswith('!'):
478 MacroName
= MacroName
[1:].strip()
480 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
481 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
482 self
.FileName
, self
.CurrentLineNumber
)
483 MacroName
= MacroName
[2:-1]
484 return MacroName
, NotFlag
486 def __SetMacroValue(self
, Macro
, Value
):
487 if not self
.__CurSection
:
491 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
492 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
494 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
495 MacroDict
[Macro
] = Value
497 def __GetMacroValue(self
, Macro
):
499 if Macro
in GlobalData
.gCommandLineDefines
:
500 return GlobalData
.gCommandLineDefines
[Macro
]
501 if Macro
in GlobalData
.gGlobalDefines
:
502 return GlobalData
.gGlobalDefines
[Macro
]
504 if self
.__CurSection
:
505 MacroDict
= self
.__MacroDict
[
506 self
.__CurSection
[0],
507 self
.__CurSection
[1],
510 if MacroDict
and Macro
in MacroDict
:
511 return MacroDict
[Macro
]
514 if Macro
in GlobalData
.gPlatformDefines
:
515 return GlobalData
.gPlatformDefines
[Macro
]
518 def __SectionHeaderParser(self
, Section
):
520 # [FD.UiName]: use dummy instead if UI name is optional
523 # [Rule]: don't take rule section into account, macro is not allowed in this section
524 # [VTF.arch.UiName, arch]
525 # [OptionRom.DriverName]
526 self
.__CurSection
= []
527 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
528 ItemList
= Section
.split('.')
530 if Item
== '' or Item
== 'RULE':
533 if Item
== 'DEFINES':
534 self
.__CurSection
= ['COMMON', 'COMMON', 'COMMON']
535 elif Item
== 'VTF' and len(ItemList
) == 3:
537 Pos
= UiName
.find(',')
539 UiName
= UiName
[:Pos
]
540 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
541 elif len(ItemList
) > 1:
542 self
.__CurSection
= [ItemList
[0], ItemList
[1], 'COMMON']
543 elif len(ItemList
) > 0:
544 self
.__CurSection
= [ItemList
[0], 'DUMMY', 'COMMON']
546 ## PreprocessFile() method
548 # Preprocess file contents, replace comments with spaces.
549 # In the end, rewind the file buffer pointer to the beginning
550 # BUGBUG: No !include statement processing contained in this procedure
551 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
553 # @param self The object pointer
555 def PreprocessFile(self
):
559 DoubleSlashComment
= False
561 # HashComment in quoted string " " is ignored.
564 while not self
.__EndOfFile
():
566 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
567 InString
= not InString
568 # meet new line, then no longer in a comment for // and '#'
569 if self
.__CurrentChar
() == T_CHAR_LF
:
570 self
.CurrentLineNumber
+= 1
571 self
.CurrentOffsetWithinLine
= 0
572 if InComment
and DoubleSlashComment
:
574 DoubleSlashComment
= False
575 if InComment
and HashComment
:
578 # check for */ comment end
579 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
580 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
582 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
585 # set comments to spaces
587 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
589 # check for // comment
590 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
592 DoubleSlashComment
= True
593 # check for '#' comment
594 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
597 # check for /* comment start
598 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
599 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
601 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
607 # restore from ListOfList to ListOfString
608 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
611 ## PreprocessIncludeFile() method
613 # Preprocess file contents, replace !include statements with file contents.
614 # In the end, rewind the file buffer pointer to the beginning
616 # @param self The object pointer
618 def PreprocessIncludeFile(self
):
619 # nested include support
621 while self
.__GetNextToken
():
623 if self
.__Token
== '!include':
625 IncludeLine
= self
.CurrentLineNumber
626 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
627 if not self
.__GetNextToken
():
628 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
629 IncFileName
= self
.__Token
631 for Macro
in ['WORKSPACE', 'ECP_SOURCE', 'EFI_SOURCE', 'EDK_SOURCE']:
632 MacroVal
= self
.__GetMacroValue
(Macro
)
634 __IncludeMacros
[Macro
] = MacroVal
637 IncludedFile
= NormPath(ReplaceMacro(IncFileName
, __IncludeMacros
, RaiseError
=True))
639 raise Warning("only these system environment variables are permitted to start the path of the included file: "
640 "$(WORKSPACE), $(ECP_SOURCE), $(EFI_SOURCE), $(EDK_SOURCE)",
641 self
.FileName
, self
.CurrentLineNumber
)
643 # First search the include file under the same directory as FDF file
645 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
646 ErrorCode
= IncludedFile1
.Validate()[0]
649 # Then search the include file under the same directory as DSC file
652 if GenFdsGlobalVariable
.ActivePlatform
:
653 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
654 elif GlobalData
.gActivePlatform
:
655 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
656 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
657 ErrorCode
= IncludedFile1
.Validate()[0]
660 # Also search file under the WORKSPACE directory
662 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
663 ErrorCode
= IncludedFile1
.Validate()[0]
665 raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os
.path
.dirname(self
.FileName
), PlatformDir
, GlobalData
.gWorkspace
),
666 self
.FileName
, self
.CurrentLineNumber
)
668 if not IsValidInclude (IncludedFile1
.Path
, self
.CurrentLineNumber
):
669 raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1
.Path
), self
.FileName
, self
.CurrentLineNumber
)
671 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
673 CurrentLine
= self
.CurrentLineNumber
674 CurrentOffset
= self
.CurrentOffsetWithinLine
675 # list index of the insertion, note that line number is 'CurrentLine + 1'
676 InsertAtLine
= CurrentLine
677 ParentProfile
= GetParentAtLine (CurrentLine
)
678 if ParentProfile
!= None:
679 ParentProfile
.IncludeFileList
.insert(0, IncFileProfile
)
680 IncFileProfile
.Level
= ParentProfile
.Level
+ 1
681 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
682 # deal with remaining portions after "!include filename", if exists.
683 if self
.__GetNextToken
():
684 if self
.CurrentLineNumber
== CurrentLine
:
685 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
686 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
687 IncFileProfile
.InsertAdjust
+= 1
688 self
.CurrentLineNumber
+= 1
689 self
.CurrentOffsetWithinLine
= 0
691 for Line
in IncFileProfile
.FileLinesList
:
692 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
693 self
.CurrentLineNumber
+= 1
696 # reversely sorted to better determine error in file
697 AllIncludeFileList
.insert(0, IncFileProfile
)
699 # comment out the processed include file statement
700 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
701 TempList
.insert(IncludeOffset
, '#')
702 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
703 if Processed
: # Nested and back-to-back support
704 self
.Rewind(DestLine
= IncFileProfile
.InsertStartLineNumber
- 1)
709 def __GetIfListCurrentItemStat(self
, IfList
):
719 ## PreprocessConditionalStatement() method
721 # Preprocess conditional statement.
722 # In the end, rewind the file buffer pointer to the beginning
724 # @param self The object pointer
726 def PreprocessConditionalStatement(self
):
727 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
731 while self
.__GetNextToken
():
732 # Determine section name and the location dependent macro
733 if self
.__GetIfListCurrentItemStat
(IfList
):
734 if self
.__Token
.startswith('['):
735 Header
= self
.__Token
736 if not self
.__Token
.endswith(']'):
737 self
.__SkipToToken
(']')
738 Header
+= self
.__SkippedChars
739 if Header
.find('$(') != -1:
740 raise Warning("macro cannot be used in section header", self
.FileName
, self
.CurrentLineNumber
)
741 self
.__SectionHeaderParser
(Header
)
743 # Replace macros except in RULE section or out of section
744 elif self
.__CurSection
and ReplacedLine
!= self
.CurrentLineNumber
:
745 ReplacedLine
= self
.CurrentLineNumber
747 CurLine
= self
.Profile
.FileLinesList
[ReplacedLine
- 1]
749 StartPos
= CurLine
.find('$(', PreIndex
)
750 EndPos
= CurLine
.find(')', StartPos
+2)
751 while StartPos
!= -1 and EndPos
!= -1 and self
.__Token
not in ['!ifdef', '!ifndef', '!if', '!elseif']:
752 MacroName
= CurLine
[StartPos
+2 : EndPos
]
753 MacorValue
= self
.__GetMacroValue
(MacroName
)
754 if MacorValue
!= None:
755 CurLine
= CurLine
.replace('$(' + MacroName
+ ')', MacorValue
, 1)
756 if MacorValue
.find('$(') != -1:
759 PreIndex
= StartPos
+ len(MacorValue
)
761 PreIndex
= EndPos
+ 1
762 StartPos
= CurLine
.find('$(', PreIndex
)
763 EndPos
= CurLine
.find(')', StartPos
+2)
764 self
.Profile
.FileLinesList
[ReplacedLine
- 1] = CurLine
767 if self
.__Token
== 'DEFINE':
768 if self
.__GetIfListCurrentItemStat
(IfList
):
769 if not self
.__CurSection
:
770 raise Warning("macro cannot be defined in Rule section or out of section", self
.FileName
, self
.CurrentLineNumber
)
771 DefineLine
= self
.CurrentLineNumber
- 1
772 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
773 if not self
.__GetNextToken
():
774 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
776 if not self
.__IsToken
( "="):
777 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
779 Value
= self
.__GetExpression
()
780 self
.__SetMacroValue
(Macro
, Value
)
781 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
782 elif self
.__Token
== 'SET':
783 if not self
.__GetIfListCurrentItemStat
(IfList
):
785 SetLine
= self
.CurrentLineNumber
- 1
786 SetOffset
= self
.CurrentOffsetWithinLine
- len('SET')
787 PcdPair
= self
.__GetNextPcdName
()
788 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
789 if not self
.__IsToken
( "="):
790 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
792 Value
= self
.__GetExpression
()
793 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
795 self
.__PcdDict
[PcdName
] = Value
797 self
.Profile
.PcdDict
[PcdPair
] = Value
798 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
799 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
801 self
.__WipeOffArea
.append(((SetLine
, SetOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
802 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
803 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
804 IfList
.append([IfStartPos
, None, None])
806 CondLabel
= self
.__Token
807 Expression
= self
.__GetExpression
()
809 if CondLabel
== '!if':
810 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
812 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
813 if CondLabel
== '!ifndef':
814 ConditionSatisfied
= not ConditionSatisfied
816 BranchDetermined
= ConditionSatisfied
817 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
818 if ConditionSatisfied
:
819 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
820 elif self
.__Token
in ('!elseif', '!else'):
821 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
823 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
826 IfList
[-1] = [ElseStartPos
, False, True]
827 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
829 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
830 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
831 if self
.__Token
== '!elseif':
832 Expression
= self
.__GetExpression
()
833 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
834 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
838 IfList
[-1][1] = False
841 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
842 elif self
.__Token
== '!endif':
844 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
846 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
848 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
851 elif not IfList
: # Don't use PCDs inside conditional directive
852 if self
.CurrentLineNumber
<= RegionLayoutLine
:
853 # Don't try the same line twice
855 SetPcd
= ShortcutPcdPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
857 self
.__PcdDict
[SetPcd
.group('name')] = SetPcd
.group('value')
858 RegionLayoutLine
= self
.CurrentLineNumber
860 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
862 RegionLayoutLine
= self
.CurrentLineNumber
864 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
865 if not RegionSizeGuid
:
866 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
868 self
.__PcdDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
869 self
.__PcdDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
870 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
873 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
876 def __CollectMacroPcd(self
):
880 MacroDict
.update(GlobalData
.gPlatformPcds
)
881 MacroDict
.update(self
.__PcdDict
)
884 MacroDict
.update(GlobalData
.gPlatformDefines
)
886 if self
.__CurSection
:
888 ScopeMacro
= self
.__MacroDict
['COMMON', 'COMMON', 'COMMON']
890 MacroDict
.update(ScopeMacro
)
893 ScopeMacro
= self
.__MacroDict
[
894 self
.__CurSection
[0],
895 self
.__CurSection
[1],
899 MacroDict
.update(ScopeMacro
)
901 MacroDict
.update(GlobalData
.gGlobalDefines
)
902 MacroDict
.update(GlobalData
.gCommandLineDefines
)
907 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
908 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
909 MacroPcdDict
= self
.__CollectMacroPcd
()
913 return ValueExpression(Expression
, MacroPcdDict
)(True)
915 return ValueExpression(Expression
, MacroPcdDict
)()
916 except WrnExpression
, Excpt
:
918 # Catch expression evaluation warning here. We need to report
919 # the precise number of line and return the evaluation result
921 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
922 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
925 except Exception, Excpt
:
926 if hasattr(Excpt
, 'Pcd'):
927 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
928 Info
= GlobalData
.gPlatformOtherPcds
[Excpt
.Pcd
]
929 raise Warning("Cannot use this PCD (%s) in an expression as"
930 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
931 " of the DSC file (%s), and it is currently defined in this section:"
932 " %s, line #: %d." % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE'], Info
[0], Info
[1]),
935 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE']),
938 raise Warning(str(Excpt
), *FileLineTuple
)
940 if Expression
.startswith('$(') and Expression
[-1] == ')':
941 Expression
= Expression
[2:-1]
942 return Expression
in MacroPcdDict
944 ## __IsToken() method
946 # Check whether input string is found from current char position along
947 # If found, the string value is put into self.__Token
949 # @param self The object pointer
950 # @param String The string to search
951 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
952 # @retval True Successfully find string, file buffer pointer moved forward
953 # @retval False Not able to find string, file buffer pointer not changed
955 def __IsToken(self
, String
, IgnoreCase
= False):
956 self
.__SkipWhiteSpace
()
958 # Only consider the same line, no multi-line token allowed
959 StartPos
= self
.CurrentOffsetWithinLine
962 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
964 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
966 self
.CurrentOffsetWithinLine
+= len(String
)
967 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
971 ## __IsKeyword() method
973 # Check whether input keyword is found from current char position along, whole word only!
974 # If found, the string value is put into self.__Token
976 # @param self The object pointer
977 # @param Keyword The string to search
978 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
979 # @retval True Successfully find string, file buffer pointer moved forward
980 # @retval False Not able to find string, file buffer pointer not changed
982 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
983 self
.__SkipWhiteSpace
()
985 # Only consider the same line, no multi-line token allowed
986 StartPos
= self
.CurrentOffsetWithinLine
989 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
991 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
993 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
994 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
996 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
997 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1001 def __GetExpression(self
):
1002 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
1003 Index
= len(Line
) - 1
1004 while Line
[Index
] in ['\r', '\n']:
1006 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
1007 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
1008 ExpressionString
= ExpressionString
.strip()
1009 return ExpressionString
1011 ## __GetNextWord() method
1013 # Get next C name from file lines
1014 # If found, the string value is put into self.__Token
1016 # @param self The object pointer
1017 # @retval True Successfully find a C name string, file buffer pointer moved forward
1018 # @retval False Not able to find a C name string, file buffer pointer not changed
1020 def __GetNextWord(self
):
1021 self
.__SkipWhiteSpace
()
1022 if self
.__EndOfFile
():
1025 TempChar
= self
.__CurrentChar
()
1026 StartPos
= self
.CurrentOffsetWithinLine
1027 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
1029 while not self
.__EndOfLine
():
1030 TempChar
= self
.__CurrentChar
()
1031 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
1032 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
1038 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1043 ## __GetNextToken() method
1045 # Get next token unit before a seperator
1046 # If found, the string value is put into self.__Token
1048 # @param self The object pointer
1049 # @retval True Successfully find a token unit, file buffer pointer moved forward
1050 # @retval False Not able to find a token unit, file buffer pointer not changed
1052 def __GetNextToken(self
):
1053 # Skip leading spaces, if exist.
1054 self
.__SkipWhiteSpace
()
1055 if self
.__EndOfFile
():
1057 # Record the token start position, the position of the first non-space char.
1058 StartPos
= self
.CurrentOffsetWithinLine
1059 StartLine
= self
.CurrentLineNumber
1060 while StartLine
== self
.CurrentLineNumber
:
1061 TempChar
= self
.__CurrentChar
()
1062 # Try to find the end char that is not a space and not in seperator tuple.
1063 # That is, when we got a space or any char in the tuple, we got the end of token.
1064 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
1066 # if we happen to meet a seperator as the first char, we must proceed to get it.
1067 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1068 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1076 EndPos
= self
.CurrentOffsetWithinLine
1077 if self
.CurrentLineNumber
!= StartLine
:
1078 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
1079 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
1080 if StartPos
!= self
.CurrentOffsetWithinLine
:
1085 def __GetNextOp(self
):
1086 # Skip leading spaces, if exist.
1087 self
.__SkipWhiteSpace
()
1088 if self
.__EndOfFile
():
1090 # Record the token start position, the position of the first non-space char.
1091 StartPos
= self
.CurrentOffsetWithinLine
1092 while not self
.__EndOfLine
():
1093 TempChar
= self
.__CurrentChar
()
1094 # Try to find the end char that is not a space
1095 if not str(TempChar
).isspace():
1102 if StartPos
!= self
.CurrentOffsetWithinLine
:
1103 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1107 ## __GetNextGuid() method
1109 # Get next token unit before a seperator
1110 # If found, the GUID string is put into self.__Token
1112 # @param self The object pointer
1113 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1114 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1116 def __GetNextGuid(self
):
1118 if not self
.__GetNextToken
():
1120 p
= re
.compile('[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')
1121 if p
.match(self
.__Token
) != None:
1127 ## __UndoToken() method
1129 # Go back one token unit in file buffer
1131 # @param self The object pointer
1133 def __UndoToken(self
):
1134 self
.__UndoOneChar
()
1135 while self
.__CurrentChar
().isspace():
1136 if not self
.__UndoOneChar
():
1141 StartPos
= self
.CurrentOffsetWithinLine
1142 CurrentLine
= self
.CurrentLineNumber
1143 while CurrentLine
== self
.CurrentLineNumber
:
1145 TempChar
= self
.__CurrentChar
()
1146 # Try to find the end char that is not a space and not in seperator tuple.
1147 # That is, when we got a space or any char in the tuple, we got the end of token.
1148 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1149 if not self
.__UndoOneChar
():
1151 # if we happen to meet a seperator as the first char, we must proceed to get it.
1152 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1153 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1160 ## __HexDigit() method
1162 # Whether char input is a Hex data bit
1164 # @param self The object pointer
1165 # @param TempChar The char to test
1166 # @retval True The char is a Hex data bit
1167 # @retval False The char is NOT a Hex data bit
1169 def __HexDigit(self
, TempChar
):
1170 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
1171 or (TempChar
>= '0' and TempChar
<= '9'):
1176 def __IsHex(self
, HexStr
):
1177 if not HexStr
.upper().startswith("0X"):
1179 if len(self
.__Token
) <= 2:
1181 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
1182 if len(charList
) == 0:
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 self
.__IsHex
(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
):
1366 while self
.__GetFd
():
1369 while self
.__GetFv
():
1372 while self
.__GetFmp
():
1375 while self
.__GetCapsule
():
1378 while self
.__GetVtf
():
1381 while self
.__GetRule
():
1384 while self
.__GetOptionRom
():
1389 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1390 # At this point, the closest parent would be the included file itself
1391 Profile
= GetParentAtLine(X
.OriginalLineNumber
)
1393 X
.Message
+= ' near line %d, column %d: %s' \
1394 % (X
.LineNumber
, 0, Profile
.FileLinesList
[X
.LineNumber
-1])
1396 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1397 X
.Message
+= ' near line %d, column %d: %s' \
1398 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1401 ## __GetDefines() method
1403 # Get Defines section contents and store its data into AllMacrosList
1405 # @param self The object pointer
1406 # @retval True Successfully find a Defines
1407 # @retval False Not able to find a Defines
1409 def __GetDefines(self
):
1411 if not self
.__GetNextToken
():
1414 S
= self
.__Token
.upper()
1415 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1416 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1417 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1418 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1423 if not self
.__IsToken
("[DEFINES", True):
1424 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1425 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1426 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1427 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1429 if not self
.__IsToken
( "]"):
1430 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1432 while self
.__GetNextWord
():
1433 # handle the SET statement
1434 if self
.__Token
== 'SET':
1436 self
.__GetSetStatement
(None)
1439 Macro
= self
.__Token
1441 if not self
.__IsToken
("="):
1442 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1443 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1444 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1445 Value
= self
.__Token
1451 # Get FD section contents and store its data into FD dictionary of self.Profile
1453 # @param self The object pointer
1454 # @retval True Successfully find a FD
1455 # @retval False Not able to find a FD
1459 if not self
.__GetNextToken
():
1462 S
= self
.__Token
.upper()
1463 if S
.startswith("[") and not S
.startswith("[FD."):
1464 if not S
.startswith("[FV.") and not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
1465 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1466 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1471 if not self
.__IsToken
("[FD.", True):
1472 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1473 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1474 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1475 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1477 FdName
= self
.__GetUiName
()
1479 if len (self
.Profile
.FdDict
) == 0:
1480 FdName
= GenFdsGlobalVariable
.PlatformName
1481 if FdName
== "" and GlobalData
.gActivePlatform
:
1482 FdName
= GlobalData
.gActivePlatform
.PlatformName
1483 self
.Profile
.FdNameNotSet
= True
1485 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1486 self
.CurrentFdName
= FdName
.upper()
1488 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1489 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1491 if not self
.__IsToken
( "]"):
1492 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1495 FdObj
.FdUiName
= self
.CurrentFdName
1496 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1498 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1499 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1501 Status
= self
.__GetCreateFile
(FdObj
)
1503 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1505 while self
.__GetTokenStatements
(FdObj
):
1507 for Attr
in ("BaseAddress", "Size", "ErasePolarity"):
1508 if getattr(FdObj
, Attr
) == None:
1509 self
.__GetNextToken
()
1510 raise Warning("Keyword %s missing" % Attr
, self
.FileName
, self
.CurrentLineNumber
)
1512 if not FdObj
.BlockSizeList
:
1513 FdObj
.BlockSizeList
.append((1, FdObj
.Size
, None))
1515 self
.__GetDefineStatements
(FdObj
)
1517 self
.__GetSetStatements
(FdObj
)
1519 if not self
.__GetRegionLayout
(FdObj
):
1520 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1522 while self
.__GetRegionLayout
(FdObj
):
1526 ## __GetUiName() method
1528 # Return the UI name of a section
1530 # @param self The object pointer
1531 # @retval FdName UI name
1533 def __GetUiName(self
):
1535 if self
.__GetNextWord
():
1540 ## __GetCreateFile() method
1542 # Return the output file name of object
1544 # @param self The object pointer
1545 # @param Obj object whose data will be stored in file
1546 # @retval FdName UI name
1548 def __GetCreateFile(self
, Obj
):
1550 if self
.__IsKeyword
( "CREATE_FILE"):
1551 if not self
.__IsToken
( "="):
1552 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1554 if not self
.__GetNextToken
():
1555 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1557 FileName
= self
.__Token
1558 Obj
.CreateFileName
= FileName
1562 ## __GetTokenStatements() method
1564 # Get token statements
1566 # @param self The object pointer
1567 # @param Obj for whom token statement is got
1569 def __GetTokenStatements(self
, Obj
):
1570 if self
.__IsKeyword
( "BaseAddress"):
1571 if not self
.__IsToken
( "="):
1572 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1574 if not self
.__GetNextHexNumber
():
1575 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1577 Obj
.BaseAddress
= self
.__Token
1579 if self
.__IsToken
( "|"):
1580 pcdPair
= self
.__GetNextPcdName
()
1581 Obj
.BaseAddressPcd
= pcdPair
1582 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1583 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1584 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1587 if self
.__IsKeyword
( "Size"):
1588 if not self
.__IsToken
( "="):
1589 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1591 if not self
.__GetNextHexNumber
():
1592 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1595 if self
.__IsToken
( "|"):
1596 pcdPair
= self
.__GetNextPcdName
()
1597 Obj
.SizePcd
= pcdPair
1598 self
.Profile
.PcdDict
[pcdPair
] = Size
1599 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1600 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1601 Obj
.Size
= long(Size
, 0)
1604 if self
.__IsKeyword
( "ErasePolarity"):
1605 if not self
.__IsToken
( "="):
1606 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1608 if not self
.__GetNextToken
():
1609 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1611 if self
.__Token
!= "1" and self
.__Token
!= "0":
1612 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1614 Obj
.ErasePolarity
= self
.__Token
1617 return self
.__GetBlockStatements
(Obj
)
1619 ## __GetAddressStatements() method
1621 # Get address statements
1623 # @param self The object pointer
1624 # @param Obj for whom address statement is got
1625 # @retval True Successfully find
1626 # @retval False Not able to find
1628 def __GetAddressStatements(self
, Obj
):
1630 if self
.__IsKeyword
("BsBaseAddress"):
1631 if not self
.__IsToken
( "="):
1632 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1634 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1635 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1637 BsAddress
= long(self
.__Token
, 0)
1638 Obj
.BsBaseAddress
= BsAddress
1640 if self
.__IsKeyword
("RtBaseAddress"):
1641 if not self
.__IsToken
( "="):
1642 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1644 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1645 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1647 RtAddress
= long(self
.__Token
, 0)
1648 Obj
.RtBaseAddress
= RtAddress
1650 ## __GetBlockStatements() method
1652 # Get block statements
1654 # @param self The object pointer
1655 # @param Obj for whom block statement is got
1657 def __GetBlockStatements(self
, Obj
):
1659 while self
.__GetBlockStatement
(Obj
):
1662 Item
= Obj
.BlockSizeList
[-1]
1663 if Item
[0] == None or Item
[1] == None:
1664 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1667 ## __GetBlockStatement() method
1669 # Get block statement
1671 # @param self The object pointer
1672 # @param Obj for whom block statement is got
1673 # @retval True Successfully find
1674 # @retval False Not able to find
1676 def __GetBlockStatement(self
, Obj
):
1677 if not self
.__IsKeyword
( "BlockSize"):
1680 if not self
.__IsToken
( "="):
1681 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1683 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1684 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1686 BlockSize
= self
.__Token
1688 if self
.__IsToken
( "|"):
1689 PcdPair
= self
.__GetNextPcdName
()
1690 BlockSizePcd
= PcdPair
1691 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1692 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1693 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1694 BlockSize
= long(BlockSize
, 0)
1697 if self
.__IsKeyword
( "NumBlocks"):
1698 if not self
.__IsToken
( "="):
1699 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1701 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1702 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1704 BlockNumber
= long(self
.__Token
, 0)
1706 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1709 ## __GetDefineStatements() method
1711 # Get define statements
1713 # @param self The object pointer
1714 # @param Obj for whom define statement is got
1715 # @retval True Successfully find
1716 # @retval False Not able to find
1718 def __GetDefineStatements(self
, Obj
):
1719 while self
.__GetDefineStatement
( Obj
):
1722 ## __GetDefineStatement() method
1724 # Get define statement
1726 # @param self The object pointer
1727 # @param Obj for whom define statement is got
1728 # @retval True Successfully find
1729 # @retval False Not able to find
1731 def __GetDefineStatement(self
, Obj
):
1732 if self
.__IsKeyword
("DEFINE"):
1733 self
.__GetNextToken
()
1734 Macro
= self
.__Token
1735 if not self
.__IsToken
( "="):
1736 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1738 if not self
.__GetNextToken
():
1739 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1741 Value
= self
.__Token
1742 Macro
= '$(' + Macro
+ ')'
1743 Obj
.DefineVarDict
[Macro
] = Value
1748 ## __GetSetStatements() method
1750 # Get set statements
1752 # @param self The object pointer
1753 # @param Obj for whom set statement is got
1754 # @retval True Successfully find
1755 # @retval False Not able to find
1757 def __GetSetStatements(self
, Obj
):
1758 while self
.__GetSetStatement
(Obj
):
1761 ## __GetSetStatement() method
1765 # @param self The object pointer
1766 # @param Obj for whom set statement is got
1767 # @retval True Successfully find
1768 # @retval False Not able to find
1770 def __GetSetStatement(self
, Obj
):
1771 if self
.__IsKeyword
("SET"):
1772 PcdPair
= self
.__GetNextPcdName
()
1774 if not self
.__IsToken
( "="):
1775 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1777 Value
= self
.__GetExpression
()
1778 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1781 Obj
.SetVarDict
[PcdPair
] = Value
1782 self
.Profile
.PcdDict
[PcdPair
] = Value
1783 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1784 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1789 ## __CalcRegionExpr(self)
1791 # Calculate expression for offset or size of a region
1793 # @return: None if invalid expression
1794 # Calculated number if successfully
1796 def __CalcRegionExpr(self
):
1797 StartPos
= self
.GetFileBufferPos()
1800 while not self
.__EndOfFile
():
1801 CurCh
= self
.__CurrentChar
()
1807 if CurCh
in '|\r\n' and PairCount
== 0:
1813 ValueExpression(Expr
,
1814 self
.__CollectMacroPcd
()
1817 self
.SetFileBufferPos(StartPos
)
1820 ## __GetRegionLayout() method
1822 # Get region layout for FD
1824 # @param self The object pointer
1825 # @param Fd for whom region is got
1826 # @retval True Successfully find
1827 # @retval False Not able to find
1829 def __GetRegionLayout(self
, Fd
):
1830 Offset
= self
.__CalcRegionExpr
()
1834 RegionObj
= Region
.Region()
1835 RegionObj
.Offset
= Offset
1836 Fd
.RegionList
.append(RegionObj
)
1838 if not self
.__IsToken
( "|"):
1839 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1841 Size
= self
.__CalcRegionExpr
()
1843 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1844 RegionObj
.Size
= Size
1846 if not self
.__GetNextWord
():
1849 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):
1851 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]
1852 # Or it might be next region's offset described by an expression which starts with a PCD.
1853 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size
1856 IsRegionPcd
= (RegionSizeGuidPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]) or
1857 RegionOffsetPcdPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]))
1859 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1860 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1861 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdOffset
[1], RegionObj
.PcdOffset
[0])] = "0x%x" % RegionObj
.Offset
1862 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1863 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1864 if self
.__IsToken
( "|"):
1865 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1866 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1867 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdSize
[1], RegionObj
.PcdSize
[0])] = "0x%x" % RegionObj
.Size
1868 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1869 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1871 if not self
.__GetNextWord
():
1874 if self
.__Token
== "SET":
1876 self
.__GetSetStatements
( RegionObj
)
1877 if not self
.__GetNextWord
():
1880 elif self
.__Token
== "FV":
1882 self
.__GetRegionFvType
( RegionObj
)
1884 elif self
.__Token
== "CAPSULE":
1886 self
.__GetRegionCapType
( RegionObj
)
1888 elif self
.__Token
== "FILE":
1890 self
.__GetRegionFileType
(RegionObj
)
1892 elif self
.__Token
== "INF":
1894 RegionObj
.RegionType
= "INF"
1895 while self
.__IsKeyword
("INF"):
1897 ffsInf
= self
.__ParseInfStatement
()
1900 RegionObj
.RegionDataList
.append(ffsInf
)
1902 elif self
.__Token
== "DATA":
1904 self
.__GetRegionDataType
(RegionObj
)
1907 if self
.__GetRegionLayout
(Fd
):
1909 raise Warning("A valid region type was not found. "
1910 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",
1911 self
.FileName
, self
.CurrentLineNumber
)
1915 ## __GetRegionFvType() method
1917 # Get region fv data for region
1919 # @param self The object pointer
1920 # @param RegionObj for whom region data is got
1922 def __GetRegionFvType(self
, RegionObj
):
1924 if not self
.__IsKeyword
( "FV"):
1925 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1927 if not self
.__IsToken
( "="):
1928 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1930 if not self
.__GetNextToken
():
1931 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1933 RegionObj
.RegionType
= "FV"
1934 RegionObj
.RegionDataList
.append(self
.__Token
)
1936 while self
.__IsKeyword
( "FV"):
1938 if not self
.__IsToken
( "="):
1939 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1941 if not self
.__GetNextToken
():
1942 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1944 RegionObj
.RegionDataList
.append(self
.__Token
)
1946 ## __GetRegionCapType() method
1948 # Get region capsule data for region
1950 # @param self The object pointer
1951 # @param RegionObj for whom region data is got
1953 def __GetRegionCapType(self
, RegionObj
):
1955 if not self
.__IsKeyword
("CAPSULE"):
1956 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1958 if not self
.__IsToken
("="):
1959 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1961 if not self
.__GetNextToken
():
1962 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1964 RegionObj
.RegionType
= "CAPSULE"
1965 RegionObj
.RegionDataList
.append(self
.__Token
)
1967 while self
.__IsKeyword
("CAPSULE"):
1969 if not self
.__IsToken
("="):
1970 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1972 if not self
.__GetNextToken
():
1973 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1975 RegionObj
.RegionDataList
.append(self
.__Token
)
1977 ## __GetRegionFileType() method
1979 # Get region file data for region
1981 # @param self The object pointer
1982 # @param RegionObj for whom region data is got
1984 def __GetRegionFileType(self
, RegionObj
):
1986 if not self
.__IsKeyword
( "FILE"):
1987 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1989 if not self
.__IsToken
( "="):
1990 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1992 if not self
.__GetNextToken
():
1993 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1995 RegionObj
.RegionType
= "FILE"
1996 RegionObj
.RegionDataList
.append( self
.__Token
)
1998 while self
.__IsKeyword
( "FILE"):
2000 if not self
.__IsToken
( "="):
2001 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2003 if not self
.__GetNextToken
():
2004 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
2006 RegionObj
.RegionDataList
.append(self
.__Token
)
2008 ## __GetRegionDataType() method
2010 # Get region array data for region
2012 # @param self The object pointer
2013 # @param RegionObj for whom region data is got
2015 def __GetRegionDataType(self
, RegionObj
):
2017 if not self
.__IsKeyword
( "DATA"):
2018 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
2020 if not self
.__IsToken
( "="):
2021 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2023 if not self
.__IsToken
( "{"):
2024 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2026 if not self
.__GetNextHexNumber
():
2027 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2029 if len(self
.__Token
) > 18:
2030 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2032 # convert hex string value to byte hex string array
2033 AllString
= self
.__Token
2034 AllStrLen
= len (AllString
)
2036 while AllStrLen
> 4:
2037 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2038 AllStrLen
= AllStrLen
- 2
2039 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2042 if len (self
.__Token
) <= 4:
2043 while self
.__IsToken
(","):
2044 if not self
.__GetNextHexNumber
():
2045 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2046 if len(self
.__Token
) > 4:
2047 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2048 DataString
+= self
.__Token
2051 if not self
.__IsToken
( "}"):
2052 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2054 DataString
= DataString
.rstrip(",")
2055 RegionObj
.RegionType
= "DATA"
2056 RegionObj
.RegionDataList
.append( DataString
)
2058 while self
.__IsKeyword
( "DATA"):
2060 if not self
.__IsToken
( "="):
2061 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2063 if not self
.__IsToken
( "{"):
2064 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2066 if not self
.__GetNextHexNumber
():
2067 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2069 if len(self
.__Token
) > 18:
2070 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2072 # convert hex string value to byte hex string array
2073 AllString
= self
.__Token
2074 AllStrLen
= len (AllString
)
2076 while AllStrLen
> 4:
2077 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2078 AllStrLen
= AllStrLen
- 2
2079 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2082 if len (self
.__Token
) <= 4:
2083 while self
.__IsToken
(","):
2084 if not self
.__GetNextHexNumber
():
2085 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2086 if len(self
.__Token
) > 4:
2087 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2088 DataString
+= self
.__Token
2091 if not self
.__IsToken
( "}"):
2092 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2094 DataString
= DataString
.rstrip(",")
2095 RegionObj
.RegionDataList
.append( DataString
)
2099 # Get FV section contents and store its data into FV dictionary of self.Profile
2101 # @param self The object pointer
2102 # @retval True Successfully find a FV
2103 # @retval False Not able to find a FV
2106 if not self
.__GetNextToken
():
2109 S
= self
.__Token
.upper()
2110 if S
.startswith("[") and not S
.startswith("[FV."):
2111 if not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
2112 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2113 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2118 if not self
.__IsToken
("[FV.", True):
2119 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2120 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2121 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2122 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2124 FvName
= self
.__GetUiName
()
2125 self
.CurrentFvName
= FvName
.upper()
2127 if not self
.__IsToken
( "]"):
2128 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2131 FvObj
.UiFvName
= self
.CurrentFvName
2132 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
2134 Status
= self
.__GetCreateFile
(FvObj
)
2136 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2138 self
.__GetDefineStatements
(FvObj
)
2140 self
.__GetAddressStatements
(FvObj
)
2142 FvObj
.FvExtEntryTypeValue
= []
2143 FvObj
.FvExtEntryType
= []
2144 FvObj
.FvExtEntryData
= []
2146 self
.__GetSetStatements
(FvObj
)
2148 if not (self
.__GetBlockStatement
(FvObj
) or self
.__GetFvBaseAddress
(FvObj
) or
2149 self
.__GetFvForceRebase
(FvObj
) or self
.__GetFvAlignment
(FvObj
) or
2150 self
.__GetFvAttributes
(FvObj
) or self
.__GetFvNameGuid
(FvObj
) or
2151 self
.__GetFvExtEntryStatement
(FvObj
) or self
.__GetFvNameString
(FvObj
)):
2154 if FvObj
.FvNameString
== 'TRUE' and not FvObj
.FvNameGuid
:
2155 raise Warning("FvNameString found but FvNameGuid was not found", self
.FileName
, self
.CurrentLineNumber
)
2157 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2158 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2161 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2162 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2163 if not isInf
and not isFile
:
2168 ## __GetFvAlignment() method
2170 # Get alignment for FV
2172 # @param self The object pointer
2173 # @param Obj for whom alignment is got
2174 # @retval True Successfully find a alignment statement
2175 # @retval False Not able to find a alignment statement
2177 def __GetFvAlignment(self
, Obj
):
2179 if not self
.__IsKeyword
( "FvAlignment"):
2182 if not self
.__IsToken
( "="):
2183 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2185 if not self
.__GetNextToken
():
2186 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2188 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2189 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2190 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2192 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2193 Obj
.FvAlignment
= self
.__Token
2196 ## __GetFvBaseAddress() method
2198 # Get BaseAddress for FV
2200 # @param self The object pointer
2201 # @param Obj for whom FvBaseAddress is got
2202 # @retval True Successfully find a FvBaseAddress statement
2203 # @retval False Not able to find a FvBaseAddress statement
2205 def __GetFvBaseAddress(self
, Obj
):
2207 if not self
.__IsKeyword
("FvBaseAddress"):
2210 if not self
.__IsToken
( "="):
2211 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2213 if not self
.__GetNextToken
():
2214 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2216 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2218 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2219 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2220 Obj
.FvBaseAddress
= self
.__Token
2223 ## __GetFvForceRebase() method
2225 # Get FvForceRebase for FV
2227 # @param self The object pointer
2228 # @param Obj for whom FvForceRebase is got
2229 # @retval True Successfully find a FvForceRebase statement
2230 # @retval False Not able to find a FvForceRebase statement
2232 def __GetFvForceRebase(self
, Obj
):
2234 if not self
.__IsKeyword
("FvForceRebase"):
2237 if not self
.__IsToken
( "="):
2238 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2240 if not self
.__GetNextToken
():
2241 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2243 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2244 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2246 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2247 Obj
.FvForceRebase
= True
2248 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2249 Obj
.FvForceRebase
= False
2251 Obj
.FvForceRebase
= None
2256 ## __GetFvAttributes() method
2258 # Get attributes for FV
2260 # @param self The object pointer
2261 # @param Obj for whom attribute is got
2264 def __GetFvAttributes(self
, FvObj
):
2266 while self
.__GetNextWord
():
2269 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2270 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2271 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2272 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2273 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2274 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"):
2278 if not self
.__IsToken
( "="):
2279 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2281 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2282 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2284 FvObj
.FvAttributeDict
[name
] = self
.__Token
2288 ## __GetFvNameGuid() method
2290 # Get FV GUID for FV
2292 # @param self The object pointer
2293 # @param Obj for whom GUID is got
2296 def __GetFvNameGuid(self
, FvObj
):
2298 if not self
.__IsKeyword
( "FvNameGuid"):
2301 if not self
.__IsToken
( "="):
2302 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2304 if not self
.__GetNextGuid
():
2305 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2307 FvObj
.FvNameGuid
= self
.__Token
2311 def __GetFvNameString(self
, FvObj
):
2313 if not self
.__IsKeyword
( "FvNameString"):
2316 if not self
.__IsToken
( "="):
2317 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2319 if not self
.__GetNextToken
() or self
.__Token
not in ('TRUE', 'FALSE'):
2320 raise Warning("expected TRUE or FALSE for FvNameString", self
.FileName
, self
.CurrentLineNumber
)
2322 FvObj
.FvNameString
= self
.__Token
2326 def __GetFvExtEntryStatement(self
, FvObj
):
2328 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2331 if not self
.__IsKeyword
("TYPE"):
2332 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2334 if not self
.__IsToken
( "="):
2335 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2337 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2338 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2340 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2342 if not self
.__IsToken
( "{"):
2343 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2345 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2346 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2348 FvObj
.FvExtEntryType
+= [self
.__Token
]
2350 if self
.__Token
== 'DATA':
2352 if not self
.__IsToken
( "="):
2353 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2355 if not self
.__IsToken
( "{"):
2356 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2358 if not self
.__GetNextHexNumber
():
2359 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2361 if len(self
.__Token
) > 4:
2362 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2364 DataString
= self
.__Token
2367 while self
.__IsToken
(","):
2368 if not self
.__GetNextHexNumber
():
2369 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2370 if len(self
.__Token
) > 4:
2371 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2372 DataString
+= self
.__Token
2375 if not self
.__IsToken
( "}"):
2376 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2378 if not self
.__IsToken
( "}"):
2379 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2381 DataString
= DataString
.rstrip(",")
2382 FvObj
.FvExtEntryData
+= [DataString
]
2384 if self
.__Token
== 'FILE':
2386 if not self
.__IsToken
( "="):
2387 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2389 if not self
.__GetNextToken
():
2390 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2392 FvObj
.FvExtEntryData
+= [self
.__Token
]
2394 if not self
.__IsToken
( "}"):
2395 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2399 ## __GetAprioriSection() method
2401 # Get token statements
2403 # @param self The object pointer
2404 # @param FvObj for whom apriori is got
2405 # @param MacroDict dictionary used to replace macro
2406 # @retval True Successfully find apriori statement
2407 # @retval False Not able to find apriori statement
2409 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2411 if not self
.__IsKeyword
( "APRIORI"):
2414 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2415 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2416 AprType
= self
.__Token
2418 if not self
.__IsToken
( "{"):
2419 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2421 AprSectionObj
= AprioriSection
.AprioriSection()
2422 AprSectionObj
.AprioriType
= AprType
2424 self
.__GetDefineStatements
(AprSectionObj
)
2425 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2428 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2429 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2430 if not IsInf
and not IsFile
:
2433 if not self
.__IsToken
( "}"):
2434 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2436 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2439 def __ParseInfStatement(self
):
2440 if not self
.__IsKeyword
("INF"):
2443 ffsInf
= FfsInfStatement
.FfsInfStatement()
2444 self
.__GetInfOptions
(ffsInf
)
2446 if not self
.__GetNextToken
():
2447 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2448 ffsInf
.InfFileName
= self
.__Token
2450 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2451 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2453 #Replace $(SAPCE) with real space
2454 ffsInf
.InfFileName
= ffsInf
.InfFileName
.replace('$(SPACE)', ' ')
2456 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2457 #do case sensitive check for file path
2458 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2460 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2462 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2463 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2464 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2465 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2467 if self
.__IsToken
('|'):
2468 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2469 ffsInf
.KeepReloc
= False
2470 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2471 ffsInf
.KeepReloc
= True
2473 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2476 ## __GetInfStatement() method
2478 # Get INF statements
2480 # @param self The object pointer
2481 # @param Obj for whom inf statement is got
2482 # @param MacroDict dictionary used to replace macro
2483 # @retval True Successfully find inf statement
2484 # @retval False Not able to find inf statement
2486 def __GetInfStatement(self
, Obj
, ForCapsule
=False, MacroDict
={}):
2487 ffsInf
= self
.__ParseInfStatement
()
2492 capsuleFfs
= CapsuleData
.CapsuleFfs()
2493 capsuleFfs
.Ffs
= ffsInf
2494 Obj
.CapsuleDataList
.append(capsuleFfs
)
2496 Obj
.FfsList
.append(ffsInf
)
2499 ## __GetInfOptions() method
2501 # Get options for INF
2503 # @param self The object pointer
2504 # @param FfsInfObj for whom option is got
2506 def __GetInfOptions(self
, FfsInfObj
):
2507 if self
.__IsKeyword
("FILE_GUID"):
2508 if not self
.__IsToken
("="):
2509 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2510 if not self
.__GetNextGuid
():
2511 raise Warning("expected GUID value", self
.FileName
, self
.CurrentLineNumber
)
2512 FfsInfObj
.OverrideGuid
= self
.__Token
2514 if self
.__IsKeyword
( "RuleOverride"):
2515 if not self
.__IsToken
( "="):
2516 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2517 if not self
.__GetNextToken
():
2518 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2519 FfsInfObj
.Rule
= self
.__Token
2521 if self
.__IsKeyword
( "VERSION"):
2522 if not self
.__IsToken
( "="):
2523 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2524 if not self
.__GetNextToken
():
2525 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2527 if self
.__GetStringData
():
2528 FfsInfObj
.Version
= self
.__Token
2530 if self
.__IsKeyword
( "UI"):
2531 if not self
.__IsToken
( "="):
2532 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2533 if not self
.__GetNextToken
():
2534 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2536 if self
.__GetStringData
():
2537 FfsInfObj
.Ui
= self
.__Token
2539 if self
.__IsKeyword
( "USE"):
2540 if not self
.__IsToken
( "="):
2541 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2542 if not self
.__GetNextToken
():
2543 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2544 FfsInfObj
.UseArch
= self
.__Token
2547 if self
.__GetNextToken
():
2548 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')
2549 if p
.match(self
.__Token
) and p
.match(self
.__Token
).span()[1] == len(self
.__Token
):
2550 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2551 if not self
.__IsToken
(","):
2557 while self
.__GetNextToken
():
2558 if not p
.match(self
.__Token
):
2559 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2560 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2562 if not self
.__IsToken
(","):
2565 ## __GetFileStatement() method
2567 # Get FILE statements
2569 # @param self The object pointer
2570 # @param Obj for whom FILE statement is got
2571 # @param MacroDict dictionary used to replace macro
2572 # @retval True Successfully find FILE statement
2573 # @retval False Not able to find FILE statement
2575 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2577 if not self
.__IsKeyword
( "FILE"):
2580 if not self
.__GetNextWord
():
2581 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2583 if ForCapsule
and self
.__Token
== 'DATA':
2588 FfsFileObj
= FfsFileStatement
.FileStatement()
2589 FfsFileObj
.FvFileType
= self
.__Token
2591 if not self
.__IsToken
( "="):
2592 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2594 if not self
.__GetNextGuid
():
2595 if not self
.__GetNextWord
():
2596 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2597 if self
.__Token
== 'PCD':
2598 if not self
.__IsToken
( "("):
2599 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2600 PcdPair
= self
.__GetNextPcdName
()
2601 if not self
.__IsToken
( ")"):
2602 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2603 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2605 FfsFileObj
.NameGuid
= self
.__Token
2607 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2610 capsuleFfs
= CapsuleData
.CapsuleFfs()
2611 capsuleFfs
.Ffs
= FfsFileObj
2612 Obj
.CapsuleDataList
.append(capsuleFfs
)
2614 Obj
.FfsList
.append(FfsFileObj
)
2618 ## __FileCouldHaveRelocFlag() method
2620 # Check whether reloc strip flag can be set for a file type.
2622 # @param self The object pointer
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 (self
, FileType
):
2629 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2634 ## __SectionCouldHaveRelocFlag() method
2636 # Check whether reloc strip flag can be set for a section type.
2638 # @param self The object pointer
2639 # @param SectionType The section type to check with
2640 # @retval True This type could have relocation strip flag
2641 # @retval False No way to have it
2644 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2645 if SectionType
in ('TE', 'PE32'):
2650 ## __GetFilePart() method
2652 # Get components for FILE statement
2654 # @param self The object pointer
2655 # @param FfsFileObj for whom component is got
2656 # @param MacroDict dictionary used to replace macro
2658 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2660 self
.__GetFileOpts
( FfsFileObj
)
2662 if not self
.__IsToken
("{"):
2663 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2664 if self
.__FileCouldHaveRelocFlag
(FfsFileObj
.FvFileType
):
2665 if self
.__Token
== 'RELOCS_STRIPPED':
2666 FfsFileObj
.KeepReloc
= False
2668 FfsFileObj
.KeepReloc
= True
2670 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj
.FvFileType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2672 if not self
.__IsToken
("{"):
2673 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2675 if not self
.__GetNextToken
():
2676 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2678 if self
.__Token
== "FV":
2679 if not self
.__IsToken
( "="):
2680 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2681 if not self
.__GetNextToken
():
2682 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2683 FfsFileObj
.FvName
= self
.__Token
2685 elif self
.__Token
== "FD":
2686 if not self
.__IsToken
( "="):
2687 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2688 if not self
.__GetNextToken
():
2689 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2690 FfsFileObj
.FdName
= self
.__Token
2692 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2694 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2696 elif hasattr(FfsFileObj
, 'FvFileType') and FfsFileObj
.FvFileType
== 'RAW':
2698 self
.__GetRAWData
(FfsFileObj
, MacroDict
)
2701 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2702 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2703 FfsFileObj
.FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2704 self
.__VerifyFile
(FfsFileObj
.FileName
)
2706 if not self
.__IsToken
( "}"):
2707 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2709 ## __GetRAWData() method
2711 # Get RAW data for FILE statement
2713 # @param self The object pointer
2714 # @param FfsFileObj for whom section is got
2715 # @param MacroDict dictionary used to replace macro
2717 def __GetRAWData(self
, FfsFileObj
, MacroDict
= {}):
2718 FfsFileObj
.FileName
= []
2719 FfsFileObj
.Alignment
= []
2720 AlignDict
= {"Auto":1, "8":8, "16":16, "32":32, "64":64, "128":128, "512":512, "1K":1024, "4K":4096, "32K":32768, "64K":65536}
2723 if self
.__GetAlignment
():
2724 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2725 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2726 AlignValue
= AlignValue
= AlignDict
[self
.__Token
]
2727 if not self
.__GetNextToken
():
2728 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2730 FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2733 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2735 self
.__VerifyFile
(FileName
)
2736 File
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
)
2737 FfsFileObj
.FileName
.append(File
.Path
)
2738 FfsFileObj
.Alignment
.append(AlignValue
)
2740 if self
.__IsToken
( "}"):
2744 if len(FfsFileObj
.Alignment
) == 1:
2745 FfsFileObj
.Alignment
= FfsFileObj
.Alignment
[0]
2746 if len(FfsFileObj
.FileName
) == 1:
2747 FfsFileObj
.FileName
= FfsFileObj
.FileName
[0]
2749 ## __GetFileOpts() method
2751 # Get options for FILE statement
2753 # @param self The object pointer
2754 # @param FfsFileObj for whom options is got
2756 def __GetFileOpts(self
, FfsFileObj
):
2758 if self
.__GetNextToken
():
2759 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2760 if Pattern
.match(self
.__Token
):
2761 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2762 if self
.__IsToken
(","):
2763 while self
.__GetNextToken
():
2764 if not Pattern
.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"):
2782 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2783 #For FFS, Auto is default option same to ""
2784 if not self
.__Token
== "Auto":
2785 FfsFileObj
.Alignment
= self
.__Token
2787 ## __GetAlignment() method
2789 # Return the alignment value
2791 # @param self The object pointer
2792 # @retval True Successfully find alignment
2793 # @retval False Not able to find alignment
2795 def __GetAlignment(self
):
2796 if self
.__IsKeyword
( "Align", True):
2797 if not self
.__IsToken
( "="):
2798 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2800 if not self
.__GetNextToken
():
2801 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2806 ## __GetFilePart() method
2808 # Get section data for FILE statement
2810 # @param self The object pointer
2811 # @param FfsFileObj for whom section is got
2812 # @param MacroDict dictionary used to replace macro
2814 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2816 Dict
.update(MacroDict
)
2818 self
.__GetDefineStatements
(FfsFileObj
)
2820 Dict
.update(FfsFileObj
.DefineVarDict
)
2821 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2822 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2825 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2826 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2827 if not IsLeafSection
and not IsEncapSection
:
2830 ## __GetLeafSection() method
2832 # Get leaf section for Obj
2834 # @param self The object pointer
2835 # @param Obj for whom leaf section is got
2836 # @param MacroDict dictionary used to replace macro
2837 # @retval True Successfully find section statement
2838 # @retval False Not able to find section statement
2840 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2842 OldPos
= self
.GetFileBufferPos()
2844 if not self
.__IsKeyword
( "SECTION"):
2845 if len(Obj
.SectionList
) == 0:
2846 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2851 if self
.__GetAlignment
():
2852 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2853 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2854 AlignValue
= self
.__Token
2857 if self
.__IsKeyword
( "BUILD_NUM"):
2858 if not self
.__IsToken
( "="):
2859 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2861 if not self
.__GetNextToken
():
2862 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2864 BuildNum
= self
.__Token
2866 if self
.__IsKeyword
( "VERSION"):
2867 if AlignValue
== 'Auto':
2868 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2869 if not self
.__IsToken
( "="):
2870 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2871 if not self
.__GetNextToken
():
2872 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2873 VerSectionObj
= VerSection
.VerSection()
2874 VerSectionObj
.Alignment
= AlignValue
2875 VerSectionObj
.BuildNum
= BuildNum
2876 if self
.__GetStringData
():
2877 VerSectionObj
.StringData
= self
.__Token
2879 VerSectionObj
.FileName
= self
.__Token
2880 Obj
.SectionList
.append(VerSectionObj
)
2882 elif self
.__IsKeyword
( "UI"):
2883 if AlignValue
== 'Auto':
2884 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2885 if not self
.__IsToken
( "="):
2886 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2887 if not self
.__GetNextToken
():
2888 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2889 UiSectionObj
= UiSection
.UiSection()
2890 UiSectionObj
.Alignment
= AlignValue
2891 if self
.__GetStringData
():
2892 UiSectionObj
.StringData
= self
.__Token
2894 UiSectionObj
.FileName
= self
.__Token
2895 Obj
.SectionList
.append(UiSectionObj
)
2897 elif self
.__IsKeyword
( "FV_IMAGE"):
2898 if AlignValue
== 'Auto':
2899 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2900 if not self
.__IsToken
( "="):
2901 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2902 if not self
.__GetNextToken
():
2903 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2905 FvName
= self
.__Token
2908 if self
.__IsToken
( "{"):
2910 FvObj
.UiFvName
= FvName
.upper()
2911 self
.__GetDefineStatements
(FvObj
)
2912 MacroDict
.update(FvObj
.DefineVarDict
)
2913 self
.__GetBlockStatement
(FvObj
)
2914 self
.__GetSetStatements
(FvObj
)
2915 self
.__GetFvAlignment
(FvObj
)
2916 self
.__GetFvAttributes
(FvObj
)
2917 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2918 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2921 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2922 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2923 if not IsInf
and not IsFile
:
2926 if not self
.__IsToken
( "}"):
2927 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2929 FvImageSectionObj
= FvImageSection
.FvImageSection()
2930 FvImageSectionObj
.Alignment
= AlignValue
2932 FvImageSectionObj
.Fv
= FvObj
2933 FvImageSectionObj
.FvName
= None
2935 FvImageSectionObj
.FvName
= FvName
.upper()
2936 FvImageSectionObj
.FvFileName
= FvName
2938 Obj
.SectionList
.append(FvImageSectionObj
)
2940 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2941 if AlignValue
== 'Auto':
2942 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2943 DepexSectionObj
= DepexSection
.DepexSection()
2944 DepexSectionObj
.Alignment
= AlignValue
2945 DepexSectionObj
.DepexType
= self
.__Token
2947 if not self
.__IsToken
( "="):
2948 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2949 if not self
.__IsToken
( "{"):
2950 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2951 if not self
.__SkipToToken
( "}"):
2952 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2954 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2955 Obj
.SectionList
.append(DepexSectionObj
)
2958 if not self
.__GetNextWord
():
2959 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2961 # Encapsulation section appear, UndoToken and return
2962 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2963 self
.SetFileBufferPos(OldPos
)
2966 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2967 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2968 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2969 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2970 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2973 DataSectionObj
= DataSection
.DataSection()
2974 DataSectionObj
.Alignment
= AlignValue
2975 DataSectionObj
.SecType
= self
.__Token
2977 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2978 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2979 if self
.__Token
== 'RELOCS_STRIPPED':
2980 DataSectionObj
.KeepReloc
= False
2982 DataSectionObj
.KeepReloc
= True
2984 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
)
2986 if self
.__IsToken
("="):
2987 if not self
.__GetNextToken
():
2988 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2989 DataSectionObj
.SectFileName
= self
.__Token
2990 self
.__VerifyFile
(DataSectionObj
.SectFileName
)
2992 if not self
.__GetCglSection
(DataSectionObj
):
2995 Obj
.SectionList
.append(DataSectionObj
)
3001 # Check if file exists or not:
3002 # If current phase if GenFds, the file must exist;
3003 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist
3004 # @param FileName: File path to be verified.
3006 def __VerifyFile(self
, FileName
):
3007 if FileName
.replace('$(WORKSPACE)', '').find('$') != -1:
3009 if not GlobalData
.gAutoGenPhase
or not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FileName
:
3010 ErrorCode
, ErrorInfo
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3012 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3014 ## __GetCglSection() method
3016 # Get compressed or GUIDed section for Obj
3018 # @param self The object pointer
3019 # @param Obj for whom leaf section is got
3020 # @param AlignValue alignment value for complex section
3021 # @retval True Successfully find section statement
3022 # @retval False Not able to find section statement
3024 def __GetCglSection(self
, Obj
, AlignValue
= None):
3026 if self
.__IsKeyword
( "COMPRESS"):
3028 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3031 if not self
.__IsToken
("{"):
3032 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3034 CompressSectionObj
= CompressSection
.CompressSection()
3035 CompressSectionObj
.Alignment
= AlignValue
3036 CompressSectionObj
.CompType
= type
3037 # Recursive sections...
3039 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
3040 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
3041 if not IsLeafSection
and not IsEncapSection
:
3045 if not self
.__IsToken
( "}"):
3046 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3047 Obj
.SectionList
.append(CompressSectionObj
)
3050 # raise Warning("Compress type not known")
3054 elif self
.__IsKeyword
( "GUIDED"):
3056 if self
.__GetNextGuid
():
3057 GuidValue
= self
.__Token
3059 AttribDict
= self
.__GetGuidAttrib
()
3060 if not self
.__IsToken
("{"):
3061 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3062 GuidSectionObj
= GuidSection
.GuidSection()
3063 GuidSectionObj
.Alignment
= AlignValue
3064 GuidSectionObj
.NameGuid
= GuidValue
3065 GuidSectionObj
.SectionType
= "GUIDED"
3066 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3067 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3068 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
3069 # Recursive sections...
3071 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
3072 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
3073 if not IsLeafSection
and not IsEncapSection
:
3076 if not self
.__IsToken
( "}"):
3077 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3078 Obj
.SectionList
.append(GuidSectionObj
)
3084 ## __GetGuidAttri() method
3086 # Get attributes for GUID section
3088 # @param self The object pointer
3089 # @retval AttribDict Dictionary of key-value pair of section attributes
3091 def __GetGuidAttrib(self
):
3094 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
3095 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
3096 AttribDict
["EXTRA_HEADER_SIZE"] = -1
3097 while self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID") \
3098 or self
.__IsKeyword
("EXTRA_HEADER_SIZE"):
3099 AttribKey
= self
.__Token
3101 if not self
.__IsToken
("="):
3102 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3104 if not self
.__GetNextToken
():
3105 raise Warning("expected TRUE(1)/FALSE(0)/Number", self
.FileName
, self
.CurrentLineNumber
)
3106 elif AttribKey
== "EXTRA_HEADER_SIZE":
3108 if self
.__Token
[0:2].upper() == "0X":
3111 AttribDict
[AttribKey
] = int(self
.__Token
, Base
)
3114 raise Warning("expected Number", self
.FileName
, self
.CurrentLineNumber
)
3115 elif self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
3116 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
3117 AttribDict
[AttribKey
] = self
.__Token
3121 ## __GetEncapsulationSec() method
3123 # Get encapsulation section for FILE
3125 # @param self The object pointer
3126 # @param FfsFile for whom section is got
3127 # @retval True Successfully find section statement
3128 # @retval False Not able to find section statement
3130 def __GetEncapsulationSec(self
, FfsFileObj
):
3132 OldPos
= self
.GetFileBufferPos()
3133 if not self
.__IsKeyword
( "SECTION"):
3134 if len(FfsFileObj
.SectionList
) == 0:
3135 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
3140 if self
.__GetAlignment
():
3141 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3142 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3143 AlignValue
= self
.__Token
3145 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
3146 self
.SetFileBufferPos(OldPos
)
3152 if not self
.__GetNextToken
():
3154 S
= self
.__Token
.upper()
3155 if not S
.startswith("[FMPPAYLOAD."):
3156 if not S
.startswith("[CAPSULE.") and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3157 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [FmpPayload.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3162 self
.__SkipToToken
("[FMPPAYLOAD.", True)
3163 FmpUiName
= self
.__GetUiName
().upper()
3164 if FmpUiName
in self
.Profile
.FmpPayloadDict
:
3165 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName
, self
.FileName
, self
.CurrentLineNumber
)
3167 FmpData
= CapsuleData
.CapsulePayload()
3168 FmpData
.UiName
= FmpUiName
3170 if not self
.__IsToken
( "]"):
3171 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3173 if not self
.__GetNextToken
():
3174 raise Warning("The FMP payload section is empty!", self
.FileName
, self
.CurrentLineNumber
)
3175 FmpKeyList
= ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE']
3176 while self
.__Token
in FmpKeyList
:
3178 FmpKeyList
.remove(Name
)
3179 if not self
.__IsToken
("="):
3180 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3181 if Name
== 'IMAGE_TYPE_ID':
3182 if not self
.__GetNextGuid
():
3183 raise Warning("expected GUID value for IMAGE_TYPE_ID", self
.FileName
, self
.CurrentLineNumber
)
3184 FmpData
.ImageTypeId
= self
.__Token
3186 if not self
.__GetNextToken
():
3187 raise Warning("expected value of %s" % Name
, self
.FileName
, self
.CurrentLineNumber
)
3188 Value
= self
.__Token
3189 if Name
== 'IMAGE_HEADER_INIT_VERSION':
3190 FmpData
.Version
= Value
3191 elif Name
== 'IMAGE_INDEX':
3192 FmpData
.ImageIndex
= Value
3193 elif Name
== 'HARDWARE_INSTANCE':
3194 FmpData
.HardwareInstance
= Value
3195 if not self
.__GetNextToken
():
3201 raise Warning("Missing keywords %s in FMP payload section" % ', '.join(FmpKeyList
), self
.FileName
, self
.CurrentLineNumber
)
3202 ImageFile
= self
.__ParseRawFileStatement
()
3204 raise Warning("Missing image file in FMP payload section", self
.FileName
, self
.CurrentLineNumber
)
3205 FmpData
.ImageFile
= ImageFile
3206 VendorCodeFile
= self
.__ParseRawFileStatement
()
3208 FmpData
.VendorCodeFile
= VendorCodeFile
3209 self
.Profile
.FmpPayloadDict
[FmpUiName
] = FmpData
3212 ## __GetCapsule() method
3214 # Get capsule section contents and store its data into capsule list of self.Profile
3216 # @param self The object pointer
3217 # @retval True Successfully find a capsule
3218 # @retval False Not able to find a capsule
3220 def __GetCapsule(self
):
3222 if not self
.__GetNextToken
():
3225 S
= self
.__Token
.upper()
3226 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
3227 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3228 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3233 if not self
.__IsToken
("[CAPSULE.", True):
3234 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3235 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3236 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3237 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
3239 CapsuleObj
= Capsule
.Capsule()
3241 CapsuleName
= self
.__GetUiName
()
3243 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
3245 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
3247 if not self
.__IsToken
( "]"):
3248 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3250 if self
.__IsKeyword
("CREATE_FILE"):
3251 if not self
.__IsToken
( "="):
3252 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3254 if not self
.__GetNextToken
():
3255 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
3257 CapsuleObj
.CreateFile
= self
.__Token
3259 self
.__GetCapsuleStatements
(CapsuleObj
)
3260 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3263 ## __GetCapsuleStatements() method
3265 # Get statements for capsule
3267 # @param self The object pointer
3268 # @param Obj for whom statements are got
3270 def __GetCapsuleStatements(self
, Obj
):
3271 self
.__GetCapsuleTokens
(Obj
)
3272 self
.__GetDefineStatements
(Obj
)
3273 self
.__GetSetStatements
(Obj
)
3274 self
.__GetCapsuleData
(Obj
)
3276 ## __GetCapsuleTokens() method
3278 # Get token statements for capsule
3280 # @param self The object pointer
3281 # @param Obj for whom token statements are got
3283 def __GetCapsuleTokens(self
, Obj
):
3284 if not self
.__GetNextToken
():
3286 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):
3287 Name
= self
.__Token
.strip()
3288 if not self
.__IsToken
("="):
3289 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3290 if not self
.__GetNextToken
():
3291 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3292 if Name
== 'CAPSULE_FLAGS':
3293 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3294 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3295 Value
= self
.__Token
.strip()
3296 while self
.__IsToken
(","):
3298 if not self
.__GetNextToken
():
3299 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3300 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3301 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3302 Value
+= self
.__Token
.strip()
3303 elif Name
== 'OEM_CAPSULE_FLAGS':
3304 Value
= self
.__Token
.strip()
3305 if not Value
.upper().startswith('0X'):
3306 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3308 Value
= int(Value
, 0)
3310 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3311 if not 0x0000 <= Value
<= 0xFFFF:
3312 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3313 Value
= self
.__Token
.strip()
3315 Value
= self
.__Token
.strip()
3316 Obj
.TokensDict
[Name
] = Value
3317 if not self
.__GetNextToken
():
3321 ## __GetCapsuleData() method
3323 # Get capsule data for capsule
3325 # @param self The object pointer
3326 # @param Obj for whom capsule data are got
3328 def __GetCapsuleData(self
, Obj
):
3331 IsInf
= self
.__GetInfStatement
(Obj
, True)
3332 IsFile
= self
.__GetFileStatement
(Obj
, True)
3333 IsFv
= self
.__GetFvStatement
(Obj
)
3334 IsFd
= self
.__GetFdStatement
(Obj
)
3335 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3336 IsAfile
= self
.__GetAfileStatement
(Obj
)
3337 IsFmp
= self
.__GetFmpStatement
(Obj
)
3338 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
or IsAfile
or IsFmp
):
3341 ## __GetFvStatement() method
3343 # Get FV for capsule
3345 # @param self The object pointer
3346 # @param CapsuleObj for whom FV is got
3347 # @retval True Successfully find a FV statement
3348 # @retval False Not able to find a FV statement
3350 def __GetFvStatement(self
, CapsuleObj
):
3352 if not self
.__IsKeyword
("FV"):
3355 if not self
.__IsToken
("="):
3356 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3358 if not self
.__GetNextToken
():
3359 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3361 if self
.__Token
.upper() not in self
.Profile
.FvDict
.keys():
3362 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3364 CapsuleFv
= CapsuleData
.CapsuleFv()
3365 CapsuleFv
.FvName
= self
.__Token
3366 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3369 ## __GetFdStatement() method
3371 # Get FD for capsule
3373 # @param self The object pointer
3374 # @param CapsuleObj for whom FD is got
3375 # @retval True Successfully find a FD statement
3376 # @retval False Not able to find a FD statement
3378 def __GetFdStatement(self
, CapsuleObj
):
3380 if not self
.__IsKeyword
("FD"):
3383 if not self
.__IsToken
("="):
3384 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3386 if not self
.__GetNextToken
():
3387 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3389 if self
.__Token
.upper() not in self
.Profile
.FdDict
.keys():
3390 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3392 CapsuleFd
= CapsuleData
.CapsuleFd()
3393 CapsuleFd
.FdName
= self
.__Token
3394 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3397 def __GetFmpStatement(self
, CapsuleObj
):
3398 if not self
.__IsKeyword
("FMP"):
3401 if not self
.__IsKeyword
("PAYLOAD"):
3405 if not self
.__IsToken
("="):
3406 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3408 if not self
.__GetNextToken
():
3409 raise Warning("expected payload name after FMP PAYLOAD =", self
.FileName
, self
.CurrentLineNumber
)
3410 Payload
= self
.__Token
.upper()
3411 if Payload
not in self
.Profile
.FmpPayloadDict
:
3412 raise Warning("This FMP Payload does not exist: %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3413 CapsuleObj
.FmpPayloadList
.append(self
.Profile
.FmpPayloadDict
[Payload
])
3416 def __ParseRawFileStatement(self
):
3417 if not self
.__IsKeyword
("FILE"):
3420 if not self
.__IsKeyword
("DATA"):
3424 if not self
.__IsToken
("="):
3425 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3427 if not self
.__GetNextToken
():
3428 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3430 AnyFileName
= self
.__Token
3431 AnyFileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AnyFileName
)
3432 if not os
.path
.exists(AnyFileName
):
3433 raise Warning("File %s not exists"%AnyFileName
, self
.FileName
, self
.CurrentLineNumber
)
3436 ## __GetAnyFileStatement() method
3438 # Get AnyFile for capsule
3440 # @param self The object pointer
3441 # @param CapsuleObj for whom AnyFile is got
3442 # @retval True Successfully find a Anyfile statement
3443 # @retval False Not able to find a AnyFile statement
3445 def __GetAnyFileStatement(self
, CapsuleObj
):
3446 AnyFileName
= self
.__ParseRawFileStatement
()
3450 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3451 CapsuleAnyFile
.FileName
= AnyFileName
3452 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3455 ## __GetAfileStatement() method
3457 # Get Afile for capsule
3459 # @param self The object pointer
3460 # @param CapsuleObj for whom Afile is got
3461 # @retval True Successfully find a Afile statement
3462 # @retval False Not able to find a Afile statement
3464 def __GetAfileStatement(self
, CapsuleObj
):
3466 if not self
.__IsKeyword
("APPEND"):
3469 if not self
.__IsToken
("="):
3470 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3472 if not self
.__GetNextToken
():
3473 raise Warning("expected Afile name", self
.FileName
, self
.CurrentLineNumber
)
3475 AfileName
= self
.__Token
3476 AfileBaseName
= os
.path
.basename(AfileName
)
3478 if os
.path
.splitext(AfileBaseName
)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:
3479 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \
3480 self
.FileName
, self
.CurrentLineNumber
)
3482 if not os
.path
.isabs(AfileName
):
3483 AfileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AfileName
)
3484 self
.__VerifyFile
(AfileName
)
3486 if not os
.path
.exists(AfileName
):
3487 raise Warning('%s does not exist' % AfileName
, self
.FileName
, self
.CurrentLineNumber
)
3491 CapsuleAfile
= CapsuleData
.CapsuleAfile()
3492 CapsuleAfile
.FileName
= AfileName
3493 CapsuleObj
.CapsuleDataList
.append(CapsuleAfile
)
3496 ## __GetRule() method
3498 # Get Rule section contents and store its data into rule list of self.Profile
3500 # @param self The object pointer
3501 # @retval True Successfully find a Rule
3502 # @retval False Not able to find a Rule
3504 def __GetRule(self
):
3506 if not self
.__GetNextToken
():
3509 S
= self
.__Token
.upper()
3510 if S
.startswith("[") and not S
.startswith("[RULE."):
3511 if not S
.startswith("[OPTIONROM."):
3512 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3516 if not self
.__IsToken
("[Rule.", True):
3517 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3518 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3519 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3520 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3522 if not self
.__SkipToToken
("."):
3523 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3525 Arch
= self
.__SkippedChars
.rstrip(".")
3526 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
3527 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3529 ModuleType
= self
.__GetModuleType
()
3532 if self
.__IsToken
("."):
3533 if not self
.__GetNextWord
():
3534 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3535 TemplateName
= self
.__Token
3537 if not self
.__IsToken
( "]"):
3538 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3540 RuleObj
= self
.__GetRuleFileStatements
()
3541 RuleObj
.Arch
= Arch
.upper()
3542 RuleObj
.ModuleType
= ModuleType
3543 RuleObj
.TemplateName
= TemplateName
3544 if TemplateName
== '' :
3545 self
.Profile
.RuleDict
['RULE' + \
3549 ModuleType
.upper() ] = RuleObj
3551 self
.Profile
.RuleDict
['RULE' + \
3555 ModuleType
.upper() + \
3557 TemplateName
.upper() ] = RuleObj
3558 # self.Profile.RuleList.append(rule)
3561 ## __GetModuleType() method
3563 # Return the module type
3565 # @param self The object pointer
3566 # @retval string module type
3568 def __GetModuleType(self
):
3570 if not self
.__GetNextWord
():
3571 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3572 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3573 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3574 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3575 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3576 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3577 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3578 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3581 ## __GetFileExtension() method
3583 # Return the file extension
3585 # @param self The object pointer
3586 # @retval string file name extension
3588 def __GetFileExtension(self
):
3589 if not self
.__IsToken
("."):
3590 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3593 if self
.__GetNextToken
():
3594 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3595 if Pattern
.match(self
.__Token
):
3599 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3602 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3604 ## __GetRuleFileStatement() method
3608 # @param self The object pointer
3609 # @retval Rule Rule object
3611 def __GetRuleFileStatements(self
):
3613 if not self
.__IsKeyword
("FILE"):
3614 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3616 if not self
.__GetNextWord
():
3617 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3619 Type
= self
.__Token
.strip().upper()
3620 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3621 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3622 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3624 if not self
.__IsToken
("="):
3625 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3627 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3628 if not self
.__GetNextWord
():
3629 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3630 if self
.__Token
== 'PCD':
3631 if not self
.__IsToken
( "("):
3632 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3633 PcdPair
= self
.__GetNextPcdName
()
3634 if not self
.__IsToken
( ")"):
3635 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3636 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3638 NameGuid
= self
.__Token
3641 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3642 if self
.__FileCouldHaveRelocFlag
(Type
):
3643 if self
.__Token
== 'RELOCS_STRIPPED':
3648 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3651 if self
.__GetNextToken
():
3652 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3653 if Pattern
.match(self
.__Token
):
3654 KeyStringList
.append(self
.__Token
)
3655 if self
.__IsToken
(","):
3656 while self
.__GetNextToken
():
3657 if not Pattern
.match(self
.__Token
):
3658 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3659 KeyStringList
.append(self
.__Token
)
3661 if not self
.__IsToken
(","):
3669 if self
.__IsKeyword
("Fixed", True):
3673 if self
.__IsKeyword
("CheckSum", True):
3677 if self
.__GetAlignment
():
3678 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3679 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3680 #For FFS, Auto is default option same to ""
3681 if not self
.__Token
== "Auto":
3682 AlignValue
= self
.__Token
3684 if self
.__IsToken
("{"):
3685 # Complex file rule expected
3686 Rule
= RuleComplexFile
.RuleComplexFile()
3687 Rule
.FvFileType
= Type
3688 Rule
.NameGuid
= NameGuid
3689 Rule
.Alignment
= AlignValue
3690 Rule
.CheckSum
= CheckSum
3692 Rule
.KeyStringList
= KeyStringList
3693 if KeepReloc
!= None:
3694 Rule
.KeepReloc
= KeepReloc
3697 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3698 IsLeaf
= self
.__GetEfiSection
(Rule
)
3699 if not IsEncapsulate
and not IsLeaf
:
3702 if not self
.__IsToken
("}"):
3703 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3708 # Simple file rule expected
3709 if not self
.__GetNextWord
():
3710 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3712 SectionName
= self
.__Token
3714 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3715 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3716 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3719 if self
.__IsKeyword
("Fixed", True):
3722 if self
.__IsKeyword
("CheckSum", True):
3726 if self
.__GetAlignment
():
3727 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3728 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3729 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3730 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3731 SectAlignment
= self
.__Token
3734 if self
.__IsToken
('|'):
3735 Ext
= self
.__GetFileExtension
()
3736 elif not self
.__GetNextToken
():
3737 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3739 Rule
= RuleSimpleFile
.RuleSimpleFile()
3740 Rule
.SectionType
= SectionName
3741 Rule
.FvFileType
= Type
3742 Rule
.NameGuid
= NameGuid
3743 Rule
.Alignment
= AlignValue
3744 Rule
.SectAlignment
= SectAlignment
3745 Rule
.CheckSum
= CheckSum
3747 Rule
.KeyStringList
= KeyStringList
3748 if KeepReloc
!= None:
3749 Rule
.KeepReloc
= KeepReloc
3750 Rule
.FileExtension
= Ext
3751 Rule
.FileName
= self
.__Token
3754 ## __GetEfiSection() method
3756 # Get section list for Rule
3758 # @param self The object pointer
3759 # @param Obj for whom section is got
3760 # @retval True Successfully find section statement
3761 # @retval False Not able to find section statement
3763 def __GetEfiSection(self
, Obj
):
3765 OldPos
= self
.GetFileBufferPos()
3766 if not self
.__GetNextWord
():
3768 SectionName
= self
.__Token
3770 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3771 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3775 if SectionName
== "FV_IMAGE":
3776 FvImageSectionObj
= FvImageSection
.FvImageSection()
3777 if self
.__IsKeyword
("FV_IMAGE"):
3779 if self
.__IsToken
( "{"):
3781 self
.__GetDefineStatements
(FvObj
)
3782 self
.__GetBlockStatement
(FvObj
)
3783 self
.__GetSetStatements
(FvObj
)
3784 self
.__GetFvAlignment
(FvObj
)
3785 self
.__GetFvAttributes
(FvObj
)
3786 self
.__GetAprioriSection
(FvObj
)
3787 self
.__GetAprioriSection
(FvObj
)
3790 IsInf
= self
.__GetInfStatement
(FvObj
)
3791 IsFile
= self
.__GetFileStatement
(FvObj
)
3792 if not IsInf
and not IsFile
:
3795 if not self
.__IsToken
( "}"):
3796 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3797 FvImageSectionObj
.Fv
= FvObj
3798 FvImageSectionObj
.FvName
= None
3801 if not self
.__IsKeyword
("FV"):
3802 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3803 FvImageSectionObj
.FvFileType
= self
.__Token
3805 if self
.__GetAlignment
():
3806 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3807 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3808 FvImageSectionObj
.Alignment
= self
.__Token
3810 if self
.__IsToken
('|'):
3811 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3812 elif self
.__GetNextToken
():
3813 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3814 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3815 FvImageSectionObj
.FvFileName
= self
.__Token
3819 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3821 Obj
.SectionList
.append(FvImageSectionObj
)
3824 EfiSectionObj
= EfiSection
.EfiSection()
3825 EfiSectionObj
.SectionType
= SectionName
3827 if not self
.__GetNextToken
():
3828 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3830 if self
.__Token
== "STRING":
3831 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3832 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3834 if not self
.__IsToken
('='):
3835 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3837 if not self
.__GetNextToken
():
3838 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3840 if self
.__GetStringData
():
3841 EfiSectionObj
.StringData
= self
.__Token
3843 if self
.__IsKeyword
("BUILD_NUM"):
3844 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3845 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3847 if not self
.__IsToken
("="):
3848 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3849 if not self
.__GetNextToken
():
3850 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3851 EfiSectionObj
.BuildNum
= self
.__Token
3854 EfiSectionObj
.FileType
= self
.__Token
3855 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3857 if self
.__IsKeyword
("Optional"):
3858 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3859 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3860 EfiSectionObj
.Optional
= True
3862 if self
.__IsKeyword
("BUILD_NUM"):
3863 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3864 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3866 if not self
.__IsToken
("="):
3867 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3868 if not self
.__GetNextToken
():
3869 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3870 EfiSectionObj
.BuildNum
= self
.__Token
3872 if self
.__GetAlignment
():
3873 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3874 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3875 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3876 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3877 EfiSectionObj
.Alignment
= self
.__Token
3879 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3880 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3881 if self
.__Token
== 'RELOCS_STRIPPED':
3882 EfiSectionObj
.KeepReloc
= False
3884 EfiSectionObj
.KeepReloc
= True
3885 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3886 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3888 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3891 if self
.__IsToken
('|'):
3892 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3893 elif self
.__GetNextToken
():
3894 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3895 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3897 if self
.__Token
.startswith('PCD'):
3899 self
.__GetNextWord
()
3901 if self
.__Token
== 'PCD':
3902 if not self
.__IsToken
( "("):
3903 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3904 PcdPair
= self
.__GetNextPcdName
()
3905 if not self
.__IsToken
( ")"):
3906 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3907 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3909 EfiSectionObj
.FileName
= self
.__Token
3914 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3916 Obj
.SectionList
.append(EfiSectionObj
)
3919 ## __RuleSectionCouldBeOptional() method
3921 # Get whether a section could be optional
3923 # @param self The object pointer
3924 # @param SectionType The section type to check
3925 # @retval True section could be optional
3926 # @retval False section never optional
3928 def __RuleSectionCouldBeOptional(self
, SectionType
):
3929 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3934 ## __RuleSectionCouldHaveBuildNum() method
3936 # Get whether a section could have build number information
3938 # @param self The object pointer
3939 # @param SectionType The section type to check
3940 # @retval True section could have build number information
3941 # @retval False section never have build number information
3943 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3944 if SectionType
in ("VERSION"):
3949 ## __RuleSectionCouldHaveString() method
3951 # Get whether a section could have string
3953 # @param self The object pointer
3954 # @param SectionType The section type to check
3955 # @retval True section could have string
3956 # @retval False section never have string
3958 def __RuleSectionCouldHaveString(self
, SectionType
):
3959 if SectionType
in ("UI", "VERSION"):
3964 ## __CheckRuleSectionFileType() method
3966 # Get whether a section matches a file type
3968 # @param self The object pointer
3969 # @param SectionType The section type to check
3970 # @param FileType The file type to check
3972 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3973 if SectionType
== "COMPAT16":
3974 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3975 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3976 elif SectionType
== "PE32":
3977 if FileType
not in ("PE32", "SEC_PE32"):
3978 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3979 elif SectionType
== "PIC":
3980 if FileType
not in ("PIC", "PIC"):
3981 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3982 elif SectionType
== "TE":
3983 if FileType
not in ("TE", "SEC_TE"):
3984 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3985 elif SectionType
== "RAW":
3986 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3987 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3988 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3989 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3990 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3991 elif SectionType
== "UI":
3992 if FileType
not in ("UI", "SEC_UI"):
3993 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3994 elif SectionType
== "VERSION":
3995 if FileType
not in ("VERSION", "SEC_VERSION"):
3996 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3997 elif SectionType
== "PEI_DEPEX":
3998 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3999 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4000 elif SectionType
== "GUID":
4001 if FileType
not in ("PE32", "SEC_GUID"):
4002 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4004 ## __GetRuleEncapsulationSection() method
4006 # Get encapsulation section for Rule
4008 # @param self The object pointer
4009 # @param Rule for whom section is got
4010 # @retval True Successfully find section statement
4011 # @retval False Not able to find section statement
4013 def __GetRuleEncapsulationSection(self
, Rule
):
4015 if self
.__IsKeyword
( "COMPRESS"):
4017 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
4020 if not self
.__IsToken
("{"):
4021 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4023 CompressSectionObj
= CompressSection
.CompressSection()
4025 CompressSectionObj
.CompType
= Type
4026 # Recursive sections...
4028 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
4029 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
4030 if not IsEncapsulate
and not IsLeaf
:
4033 if not self
.__IsToken
( "}"):
4034 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4035 Rule
.SectionList
.append(CompressSectionObj
)
4039 elif self
.__IsKeyword
( "GUIDED"):
4041 if self
.__GetNextGuid
():
4042 GuidValue
= self
.__Token
4044 if self
.__IsKeyword
( "$(NAMED_GUID)"):
4045 GuidValue
= self
.__Token
4047 AttribDict
= self
.__GetGuidAttrib
()
4049 if not self
.__IsToken
("{"):
4050 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4051 GuidSectionObj
= GuidSection
.GuidSection()
4052 GuidSectionObj
.NameGuid
= GuidValue
4053 GuidSectionObj
.SectionType
= "GUIDED"
4054 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
4055 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
4056 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
4060 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
4061 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
4062 if not IsEncapsulate
and not IsLeaf
:
4065 if not self
.__IsToken
( "}"):
4066 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4067 Rule
.SectionList
.append(GuidSectionObj
)
4073 ## __GetVtf() method
4075 # Get VTF section contents and store its data into VTF list of self.Profile
4077 # @param self The object pointer
4078 # @retval True Successfully find a VTF
4079 # @retval False Not able to find a VTF
4083 if not self
.__GetNextToken
():
4086 S
= self
.__Token
.upper()
4087 if S
.startswith("[") and not S
.startswith("[VTF."):
4088 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
4089 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
4094 if not self
.__IsToken
("[VTF.", True):
4095 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4096 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
4097 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
4098 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
4100 if not self
.__SkipToToken
("."):
4101 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
4103 Arch
= self
.__SkippedChars
.rstrip(".").upper()
4104 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4105 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
4107 if not self
.__GetNextWord
():
4108 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
4109 Name
= self
.__Token
.upper()
4112 VtfObj
.UiName
= Name
4113 VtfObj
.KeyArch
= Arch
4115 if self
.__IsToken
(","):
4116 if not self
.__GetNextWord
():
4117 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
4118 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4119 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4120 VtfObj
.ArchList
= self
.__Token
.upper()
4122 if not self
.__IsToken
( "]"):
4123 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4125 if self
.__IsKeyword
("IA32_RST_BIN"):
4126 if not self
.__IsToken
("="):
4127 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4129 if not self
.__GetNextToken
():
4130 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
4132 VtfObj
.ResetBin
= self
.__Token
4133 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4134 #check for file path
4135 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4137 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4139 while self
.__GetComponentStatement
(VtfObj
):
4142 self
.Profile
.VtfList
.append(VtfObj
)
4145 ## __GetComponentStatement() method
4147 # Get components in VTF
4149 # @param self The object pointer
4150 # @param VtfObj for whom component is got
4151 # @retval True Successfully find a component
4152 # @retval False Not able to find a component
4154 def __GetComponentStatement(self
, VtfObj
):
4156 if not self
.__IsKeyword
("COMP_NAME"):
4159 if not self
.__IsToken
("="):
4160 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4162 if not self
.__GetNextWord
():
4163 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
4165 CompStatementObj
= ComponentStatement
.ComponentStatement()
4166 CompStatementObj
.CompName
= self
.__Token
4168 if not self
.__IsKeyword
("COMP_LOC"):
4169 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
4171 if not self
.__IsToken
("="):
4172 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4174 CompStatementObj
.CompLoc
= ""
4175 if self
.__GetNextWord
():
4176 CompStatementObj
.CompLoc
= self
.__Token
4177 if self
.__IsToken
('|'):
4178 if not self
.__GetNextWord
():
4179 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
4181 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
4182 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4184 CompStatementObj
.FilePos
= self
.__Token
4186 self
.CurrentLineNumber
+= 1
4187 self
.CurrentOffsetWithinLine
= 0
4189 if not self
.__IsKeyword
("COMP_TYPE"):
4190 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
4192 if not self
.__IsToken
("="):
4193 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4195 if not self
.__GetNextToken
():
4196 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
4197 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
4198 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
4199 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
4200 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4201 CompStatementObj
.CompType
= self
.__Token
4203 if not self
.__IsKeyword
("COMP_VER"):
4204 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
4206 if not self
.__IsToken
("="):
4207 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4209 if not self
.__GetNextToken
():
4210 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
4212 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
4213 if Pattern
.match(self
.__Token
) == None:
4214 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4215 CompStatementObj
.CompVer
= self
.__Token
4217 if not self
.__IsKeyword
("COMP_CS"):
4218 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
4220 if not self
.__IsToken
("="):
4221 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4223 if not self
.__GetNextToken
():
4224 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
4225 if self
.__Token
not in ("1", "0"):
4226 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4227 CompStatementObj
.CompCs
= self
.__Token
4230 if not self
.__IsKeyword
("COMP_BIN"):
4231 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
4233 if not self
.__IsToken
("="):
4234 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4236 if not self
.__GetNextToken
():
4237 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
4239 CompStatementObj
.CompBin
= self
.__Token
4240 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4241 #check for file path
4242 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4244 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4246 if not self
.__IsKeyword
("COMP_SYM"):
4247 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
4249 if not self
.__IsToken
("="):
4250 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4252 if not self
.__GetNextToken
():
4253 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
4255 CompStatementObj
.CompSym
= self
.__Token
4256 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
4257 #check for file path
4258 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4260 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4262 if not self
.__IsKeyword
("COMP_SIZE"):
4263 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
4265 if not self
.__IsToken
("="):
4266 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4268 if self
.__IsToken
("-"):
4269 CompStatementObj
.CompSize
= self
.__Token
4270 elif self
.__GetNextDecimalNumber
():
4271 CompStatementObj
.CompSize
= self
.__Token
4272 elif self
.__GetNextHexNumber
():
4273 CompStatementObj
.CompSize
= self
.__Token
4275 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4277 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
4280 ## __GetOptionRom() method
4282 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
4284 # @param self The object pointer
4285 # @retval True Successfully find a OptionROM
4286 # @retval False Not able to find a OptionROM
4288 def __GetOptionRom(self
):
4290 if not self
.__GetNextToken
():
4293 S
= self
.__Token
.upper()
4294 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
4295 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
4298 if not self
.__IsToken
("[OptionRom.", True):
4299 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4301 OptRomName
= self
.__GetUiName
()
4303 if not self
.__IsToken
( "]"):
4304 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4306 OptRomObj
= OptionRom
.OPTIONROM()
4307 OptRomObj
.DriverName
= OptRomName
4308 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
4311 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
4312 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
4313 if not isInf
and not isFile
:
4318 ## __GetOptRomInfStatement() method
4320 # Get INF statements
4322 # @param self The object pointer
4323 # @param Obj for whom inf statement is got
4324 # @retval True Successfully find inf statement
4325 # @retval False Not able to find inf statement
4327 def __GetOptRomInfStatement(self
, Obj
):
4329 if not self
.__IsKeyword
( "INF"):
4332 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
4333 self
.__GetInfOptions
( ffsInf
)
4335 if not self
.__GetNextToken
():
4336 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
4337 ffsInf
.InfFileName
= self
.__Token
4338 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4339 #check for file path
4340 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4342 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4344 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4345 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4346 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4347 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4350 self
.__GetOptRomOverrides
(ffsInf
)
4352 Obj
.FfsList
.append(ffsInf
)
4355 ## __GetOptRomOverrides() method
4357 # Get overrides for OptROM INF & FILE
4359 # @param self The object pointer
4360 # @param FfsInfObj for whom overrides is got
4362 def __GetOptRomOverrides(self
, Obj
):
4363 if self
.__IsToken
('{'):
4364 Overrides
= OptionRom
.OverrideAttribs()
4366 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4367 if not self
.__IsToken
( "="):
4368 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4369 if not self
.__GetNextHexNumber
():
4370 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4371 Overrides
.PciVendorId
= self
.__Token
4374 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4375 if not self
.__IsToken
( "="):
4376 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4377 if not self
.__GetNextHexNumber
():
4378 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4379 Overrides
.PciClassCode
= self
.__Token
4382 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4383 if not self
.__IsToken
( "="):
4384 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4385 if not self
.__GetNextHexNumber
():
4386 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4388 Overrides
.PciDeviceId
= self
.__Token
4391 if self
.__IsKeyword
( "PCI_REVISION"):
4392 if not self
.__IsToken
( "="):
4393 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4394 if not self
.__GetNextHexNumber
():
4395 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4396 Overrides
.PciRevision
= self
.__Token
4399 if self
.__IsKeyword
( "PCI_COMPRESS"):
4400 if not self
.__IsToken
( "="):
4401 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4402 if not self
.__GetNextToken
():
4403 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4404 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4407 if self
.__IsToken
( "}"):
4410 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4412 Obj
.OverrideAttribs
= Overrides
4414 ## __GetOptRomFileStatement() method
4416 # Get FILE statements
4418 # @param self The object pointer
4419 # @param Obj for whom FILE statement is got
4420 # @retval True Successfully find FILE statement
4421 # @retval False Not able to find FILE statement
4423 def __GetOptRomFileStatement(self
, Obj
):
4425 if not self
.__IsKeyword
( "FILE"):
4428 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4430 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4431 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4432 FfsFileObj
.FileType
= self
.__Token
4434 if not self
.__GetNextToken
():
4435 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4436 FfsFileObj
.FileName
= self
.__Token
4437 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4438 #check for file path
4439 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4441 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4443 if FfsFileObj
.FileType
== 'EFI':
4444 self
.__GetOptRomOverrides
(FfsFileObj
)
4446 Obj
.FfsList
.append(FfsFileObj
)
4450 ## __GetCapInFd() method
4452 # Get Cap list contained in FD
4454 # @param self The object pointer
4455 # @param FdName FD name
4456 # @retval CapList List of Capsule in FD
4458 def __GetCapInFd (self
, FdName
):
4461 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4462 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4463 for elementRegion
in FdObj
.RegionList
:
4464 if elementRegion
.RegionType
== 'CAPSULE':
4465 for elementRegionData
in elementRegion
.RegionDataList
:
4466 if elementRegionData
.endswith(".cap"):
4468 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
4469 CapList
.append(elementRegionData
.upper())
4472 ## __GetReferencedFdCapTuple() method
4474 # Get FV and FD list referenced by a capsule image
4476 # @param self The object pointer
4477 # @param CapObj Capsule section to be searched
4478 # @param RefFdList referenced FD by section
4479 # @param RefFvList referenced FV by section
4481 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4483 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4484 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4485 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4486 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4487 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4488 elif CapsuleDataObj
.Ffs
!= None:
4489 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4490 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4491 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4492 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4493 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4495 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4497 ## __GetFvInFd() method
4499 # Get FV list contained in FD
4501 # @param self The object pointer
4502 # @param FdName FD name
4503 # @retval FvList list of FV in FD
4505 def __GetFvInFd (self
, FdName
):
4508 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4509 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4510 for elementRegion
in FdObj
.RegionList
:
4511 if elementRegion
.RegionType
== 'FV':
4512 for elementRegionData
in elementRegion
.RegionDataList
:
4513 if elementRegionData
.endswith(".fv"):
4515 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4516 FvList
.append(elementRegionData
.upper())
4519 ## __GetReferencedFdFvTuple() method
4521 # Get FD and FV list referenced by a FFS file
4523 # @param self The object pointer
4524 # @param FfsFile contains sections to be searched
4525 # @param RefFdList referenced FD by section
4526 # @param RefFvList referenced FV by section
4528 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4530 for FfsObj
in FvObj
.FfsList
:
4531 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4532 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4533 RefFvList
.append(FfsObj
.FvName
.upper())
4534 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4535 RefFdList
.append(FfsObj
.FdName
.upper())
4537 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4539 ## __GetReferencedFdFvTupleFromSection() method
4541 # Get FD and FV list referenced by a FFS section
4543 # @param self The object pointer
4544 # @param FfsFile contains sections to be searched
4545 # @param FdList referenced FD by section
4546 # @param FvList referenced FV by section
4548 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4551 SectionStack
.extend(FfsFile
.SectionList
)
4552 while SectionStack
!= []:
4553 SectionObj
= SectionStack
.pop()
4554 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4555 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4556 FvList
.append(SectionObj
.FvName
.upper())
4557 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4558 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4559 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4561 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4562 SectionStack
.extend(SectionObj
.SectionList
)
4564 ## CycleReferenceCheck() method
4566 # Check whether cycle reference exists in FDF
4568 # @param self The object pointer
4569 # @retval True cycle reference exists
4570 # @retval False Not exists cycle reference
4572 def CycleReferenceCheck(self
):
4574 # Check the cycle between FV and FD image
4576 MaxLength
= len (self
.Profile
.FvDict
)
4577 for FvName
in self
.Profile
.FvDict
.keys():
4578 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4580 RefFvStack
.append(FvName
)
4584 while RefFvStack
!= [] and Index
< MaxLength
:
4586 FvNameFromStack
= RefFvStack
.pop()
4587 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4588 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4594 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4596 for RefFdName
in RefFdList
:
4597 if RefFdName
in FdAnalyzedList
:
4600 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4601 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4602 if FvInFdList
!= []:
4603 for FvNameInFd
in FvInFdList
:
4604 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4605 if FvNameInFd
not in RefFvStack
:
4606 RefFvStack
.append(FvNameInFd
)
4608 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4609 EdkLogger
.info(LogStr
)
4611 FdAnalyzedList
.append(RefFdName
)
4613 for RefFvName
in RefFvList
:
4614 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4615 if RefFvName
not in RefFvStack
:
4616 RefFvStack
.append(RefFvName
)
4618 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4619 EdkLogger
.info(LogStr
)
4623 # Check the cycle between Capsule and FD image
4625 MaxLength
= len (self
.Profile
.CapsuleDict
)
4626 for CapName
in self
.Profile
.CapsuleDict
.keys():
4628 # Capsule image to be checked.
4630 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4632 RefCapStack
.append(CapName
)
4637 while RefCapStack
!= [] and Index
< MaxLength
:
4639 CapNameFromStack
= RefCapStack
.pop()
4640 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4641 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4647 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4651 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4652 for RefFdName
in RefFdList
:
4653 if RefFdName
in FdAnalyzedList
:
4656 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4657 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4658 if CapInFdList
!= []:
4659 for CapNameInFd
in CapInFdList
:
4660 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4661 if CapNameInFd
not in RefCapStack
:
4662 RefCapStack
.append(CapNameInFd
)
4664 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4665 EdkLogger
.info(LogStr
)
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 RefFvList
:
4673 RefFvList
.append(FvNameInFd
)
4675 FdAnalyzedList
.append(RefFdName
)
4677 # the number of the parsed FV and FD image
4679 FvListLength
= len (RefFvList
)
4680 FdListLength
= len (RefFdList
)
4681 for RefFvName
in RefFvList
:
4682 if RefFvName
in FvAnalyzedList
:
4684 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4685 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4686 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4689 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4690 FvAnalyzedList
.append(RefFvName
)
4694 if __name__
== "__main__":
4697 test_file
= sys
.argv
[1]
4698 except IndexError, v
:
4699 print "Usage: %s filename" % sys
.argv
[0]
4702 parser
= FdfParser(test_file
)
4705 parser
.CycleReferenceCheck()