4 # Copyright (c) 2007 - 2014, 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"):
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
== "DATA":
1894 self
.__GetRegionDataType
( RegionObj
)
1897 if self
.__GetRegionLayout
(Fd
):
1899 raise Warning("A valid region type was not found. "
1900 "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",
1901 self
.FileName
, self
.CurrentLineNumber
)
1905 ## __GetRegionFvType() method
1907 # Get region fv data for region
1909 # @param self The object pointer
1910 # @param RegionObj for whom region data is got
1912 def __GetRegionFvType(self
, RegionObj
):
1914 if not self
.__IsKeyword
( "FV"):
1915 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1917 if not self
.__IsToken
( "="):
1918 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1920 if not self
.__GetNextToken
():
1921 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1923 RegionObj
.RegionType
= "FV"
1924 RegionObj
.RegionDataList
.append(self
.__Token
)
1926 while self
.__IsKeyword
( "FV"):
1928 if not self
.__IsToken
( "="):
1929 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1931 if not self
.__GetNextToken
():
1932 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1934 RegionObj
.RegionDataList
.append(self
.__Token
)
1936 ## __GetRegionCapType() method
1938 # Get region capsule data for region
1940 # @param self The object pointer
1941 # @param RegionObj for whom region data is got
1943 def __GetRegionCapType(self
, RegionObj
):
1945 if not self
.__IsKeyword
("CAPSULE"):
1946 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1948 if not self
.__IsToken
("="):
1949 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1951 if not self
.__GetNextToken
():
1952 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1954 RegionObj
.RegionType
= "CAPSULE"
1955 RegionObj
.RegionDataList
.append(self
.__Token
)
1957 while self
.__IsKeyword
("CAPSULE"):
1959 if not self
.__IsToken
("="):
1960 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1962 if not self
.__GetNextToken
():
1963 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1965 RegionObj
.RegionDataList
.append(self
.__Token
)
1967 ## __GetRegionFileType() method
1969 # Get region file data for region
1971 # @param self The object pointer
1972 # @param RegionObj for whom region data is got
1974 def __GetRegionFileType(self
, RegionObj
):
1976 if not self
.__IsKeyword
( "FILE"):
1977 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1979 if not self
.__IsToken
( "="):
1980 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1982 if not self
.__GetNextToken
():
1983 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1985 RegionObj
.RegionType
= "FILE"
1986 RegionObj
.RegionDataList
.append( self
.__Token
)
1988 while self
.__IsKeyword
( "FILE"):
1990 if not self
.__IsToken
( "="):
1991 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1993 if not self
.__GetNextToken
():
1994 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1996 RegionObj
.RegionDataList
.append(self
.__Token
)
1998 ## __GetRegionDataType() method
2000 # Get region array data for region
2002 # @param self The object pointer
2003 # @param RegionObj for whom region data is got
2005 def __GetRegionDataType(self
, RegionObj
):
2007 if not self
.__IsKeyword
( "DATA"):
2008 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
2010 if not self
.__IsToken
( "="):
2011 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2013 if not self
.__IsToken
( "{"):
2014 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2016 if not self
.__GetNextHexNumber
():
2017 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2019 if len(self
.__Token
) > 18:
2020 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2022 # convert hex string value to byte hex string array
2023 AllString
= self
.__Token
2024 AllStrLen
= len (AllString
)
2026 while AllStrLen
> 4:
2027 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2028 AllStrLen
= AllStrLen
- 2
2029 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2032 if len (self
.__Token
) <= 4:
2033 while self
.__IsToken
(","):
2034 if not self
.__GetNextHexNumber
():
2035 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2036 if len(self
.__Token
) > 4:
2037 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2038 DataString
+= self
.__Token
2041 if not self
.__IsToken
( "}"):
2042 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2044 DataString
= DataString
.rstrip(",")
2045 RegionObj
.RegionType
= "DATA"
2046 RegionObj
.RegionDataList
.append( DataString
)
2048 while self
.__IsKeyword
( "DATA"):
2050 if not self
.__IsToken
( "="):
2051 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2053 if not self
.__IsToken
( "{"):
2054 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2056 if not self
.__GetNextHexNumber
():
2057 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2059 if len(self
.__Token
) > 18:
2060 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2062 # convert hex string value to byte hex string array
2063 AllString
= self
.__Token
2064 AllStrLen
= len (AllString
)
2066 while AllStrLen
> 4:
2067 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2068 AllStrLen
= AllStrLen
- 2
2069 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2072 if len (self
.__Token
) <= 4:
2073 while self
.__IsToken
(","):
2074 if not self
.__GetNextHexNumber
():
2075 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2076 if len(self
.__Token
) > 4:
2077 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2078 DataString
+= self
.__Token
2081 if not self
.__IsToken
( "}"):
2082 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2084 DataString
= DataString
.rstrip(",")
2085 RegionObj
.RegionDataList
.append( DataString
)
2089 # Get FV section contents and store its data into FV dictionary of self.Profile
2091 # @param self The object pointer
2092 # @retval True Successfully find a FV
2093 # @retval False Not able to find a FV
2096 if not self
.__GetNextToken
():
2099 S
= self
.__Token
.upper()
2100 if S
.startswith("[") and not S
.startswith("[FV."):
2101 if not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
2102 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2103 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2108 if not self
.__IsToken
("[FV.", True):
2109 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2110 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2111 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2112 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2114 FvName
= self
.__GetUiName
()
2115 self
.CurrentFvName
= FvName
.upper()
2117 if not self
.__IsToken
( "]"):
2118 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2121 FvObj
.UiFvName
= self
.CurrentFvName
2122 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
2124 Status
= self
.__GetCreateFile
(FvObj
)
2126 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2128 self
.__GetDefineStatements
(FvObj
)
2130 self
.__GetAddressStatements
(FvObj
)
2132 FvObj
.FvExtEntryTypeValue
= []
2133 FvObj
.FvExtEntryType
= []
2134 FvObj
.FvExtEntryData
= []
2136 self
.__GetSetStatements
(FvObj
)
2138 if not (self
.__GetBlockStatement
(FvObj
) or self
.__GetFvBaseAddress
(FvObj
) or
2139 self
.__GetFvForceRebase
(FvObj
) or self
.__GetFvAlignment
(FvObj
) or
2140 self
.__GetFvAttributes
(FvObj
) or self
.__GetFvNameGuid
(FvObj
) or
2141 self
.__GetFvExtEntryStatement
(FvObj
) or self
.__GetFvNameString
(FvObj
)):
2144 if FvObj
.FvNameString
== 'TRUE' and not FvObj
.FvNameGuid
:
2145 raise Warning("FvNameString found but FvNameGuid was not found", self
.FileName
, self
.CurrentLineNumber
)
2147 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2148 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2151 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2152 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2153 if not isInf
and not isFile
:
2158 ## __GetFvAlignment() method
2160 # Get alignment for FV
2162 # @param self The object pointer
2163 # @param Obj for whom alignment is got
2164 # @retval True Successfully find a alignment statement
2165 # @retval False Not able to find a alignment statement
2167 def __GetFvAlignment(self
, Obj
):
2169 if not self
.__IsKeyword
( "FvAlignment"):
2172 if not self
.__IsToken
( "="):
2173 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2175 if not self
.__GetNextToken
():
2176 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2178 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2179 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2180 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2182 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2183 Obj
.FvAlignment
= self
.__Token
2186 ## __GetFvBaseAddress() method
2188 # Get BaseAddress for FV
2190 # @param self The object pointer
2191 # @param Obj for whom FvBaseAddress is got
2192 # @retval True Successfully find a FvBaseAddress statement
2193 # @retval False Not able to find a FvBaseAddress statement
2195 def __GetFvBaseAddress(self
, Obj
):
2197 if not self
.__IsKeyword
("FvBaseAddress"):
2200 if not self
.__IsToken
( "="):
2201 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2203 if not self
.__GetNextToken
():
2204 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2206 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
2208 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
2209 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2210 Obj
.FvBaseAddress
= self
.__Token
2213 ## __GetFvForceRebase() method
2215 # Get FvForceRebase for FV
2217 # @param self The object pointer
2218 # @param Obj for whom FvForceRebase is got
2219 # @retval True Successfully find a FvForceRebase statement
2220 # @retval False Not able to find a FvForceRebase statement
2222 def __GetFvForceRebase(self
, Obj
):
2224 if not self
.__IsKeyword
("FvForceRebase"):
2227 if not self
.__IsToken
( "="):
2228 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2230 if not self
.__GetNextToken
():
2231 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2233 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2234 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2236 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2237 Obj
.FvForceRebase
= True
2238 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2239 Obj
.FvForceRebase
= False
2241 Obj
.FvForceRebase
= None
2246 ## __GetFvAttributes() method
2248 # Get attributes for FV
2250 # @param self The object pointer
2251 # @param Obj for whom attribute is got
2254 def __GetFvAttributes(self
, FvObj
):
2256 while self
.__GetNextWord
():
2259 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2260 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2261 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2262 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2263 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2264 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT"):
2268 if not self
.__IsToken
( "="):
2269 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2271 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2272 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2274 FvObj
.FvAttributeDict
[name
] = self
.__Token
2278 ## __GetFvNameGuid() method
2280 # Get FV GUID for FV
2282 # @param self The object pointer
2283 # @param Obj for whom GUID is got
2286 def __GetFvNameGuid(self
, FvObj
):
2288 if not self
.__IsKeyword
( "FvNameGuid"):
2291 if not self
.__IsToken
( "="):
2292 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2294 if not self
.__GetNextGuid
():
2295 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2297 FvObj
.FvNameGuid
= self
.__Token
2301 def __GetFvNameString(self
, FvObj
):
2303 if not self
.__IsKeyword
( "FvNameString"):
2306 if not self
.__IsToken
( "="):
2307 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2309 if not self
.__GetNextToken
() or self
.__Token
not in ('TRUE', 'FALSE'):
2310 raise Warning("expected TRUE or FALSE for FvNameString", self
.FileName
, self
.CurrentLineNumber
)
2312 FvObj
.FvNameString
= self
.__Token
2316 def __GetFvExtEntryStatement(self
, FvObj
):
2318 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2321 if not self
.__IsKeyword
("TYPE"):
2322 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2324 if not self
.__IsToken
( "="):
2325 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2327 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2328 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2330 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2332 if not self
.__IsToken
( "{"):
2333 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2335 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2336 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2338 FvObj
.FvExtEntryType
+= [self
.__Token
]
2340 if self
.__Token
== 'DATA':
2342 if not self
.__IsToken
( "="):
2343 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2345 if not self
.__IsToken
( "{"):
2346 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2348 if not self
.__GetNextHexNumber
():
2349 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2351 if len(self
.__Token
) > 4:
2352 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2354 DataString
= self
.__Token
2357 while self
.__IsToken
(","):
2358 if not self
.__GetNextHexNumber
():
2359 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2360 if len(self
.__Token
) > 4:
2361 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2362 DataString
+= self
.__Token
2365 if not self
.__IsToken
( "}"):
2366 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2368 if not self
.__IsToken
( "}"):
2369 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2371 DataString
= DataString
.rstrip(",")
2372 FvObj
.FvExtEntryData
+= [DataString
]
2374 if self
.__Token
== 'FILE':
2376 if not self
.__IsToken
( "="):
2377 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2379 if not self
.__GetNextToken
():
2380 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2382 FvObj
.FvExtEntryData
+= [self
.__Token
]
2384 if not self
.__IsToken
( "}"):
2385 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2389 ## __GetAprioriSection() method
2391 # Get token statements
2393 # @param self The object pointer
2394 # @param FvObj for whom apriori is got
2395 # @param MacroDict dictionary used to replace macro
2396 # @retval True Successfully find apriori statement
2397 # @retval False Not able to find apriori statement
2399 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2401 if not self
.__IsKeyword
( "APRIORI"):
2404 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2405 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2406 AprType
= self
.__Token
2408 if not self
.__IsToken
( "{"):
2409 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2411 AprSectionObj
= AprioriSection
.AprioriSection()
2412 AprSectionObj
.AprioriType
= AprType
2414 self
.__GetDefineStatements
(AprSectionObj
)
2415 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2418 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2419 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2420 if not IsInf
and not IsFile
:
2423 if not self
.__IsToken
( "}"):
2424 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2426 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2429 ## __GetInfStatement() method
2431 # Get INF statements
2433 # @param self The object pointer
2434 # @param Obj for whom inf statement is got
2435 # @param MacroDict dictionary used to replace macro
2436 # @retval True Successfully find inf statement
2437 # @retval False Not able to find inf statement
2439 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2441 if not self
.__IsKeyword
( "INF"):
2444 ffsInf
= FfsInfStatement
.FfsInfStatement()
2445 self
.__GetInfOptions
( ffsInf
)
2447 if not self
.__GetNextToken
():
2448 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2449 ffsInf
.InfFileName
= self
.__Token
2451 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2452 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2454 #Replace $(SAPCE) with real space
2455 ffsInf
.InfFileName
= ffsInf
.InfFileName
.replace('$(SPACE)', ' ')
2457 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2458 #do case sensitive check for file path
2459 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2461 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2463 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2464 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2465 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2466 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2468 if self
.__IsToken
('|'):
2469 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2470 ffsInf
.KeepReloc
= False
2471 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2472 ffsInf
.KeepReloc
= True
2474 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2477 capsuleFfs
= CapsuleData
.CapsuleFfs()
2478 capsuleFfs
.Ffs
= ffsInf
2479 Obj
.CapsuleDataList
.append(capsuleFfs
)
2481 Obj
.FfsList
.append(ffsInf
)
2484 ## __GetInfOptions() method
2486 # Get options for INF
2488 # @param self The object pointer
2489 # @param FfsInfObj for whom option is got
2491 def __GetInfOptions(self
, FfsInfObj
):
2492 if self
.__IsKeyword
("FILE_GUID"):
2493 if not self
.__IsToken
("="):
2494 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2495 if not self
.__GetNextGuid
():
2496 raise Warning("expected GUID value", self
.FileName
, self
.CurrentLineNumber
)
2497 FfsInfObj
.OverrideGuid
= self
.__Token
2499 if self
.__IsKeyword
( "RuleOverride"):
2500 if not self
.__IsToken
( "="):
2501 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2502 if not self
.__GetNextToken
():
2503 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2504 FfsInfObj
.Rule
= self
.__Token
2506 if self
.__IsKeyword
( "VERSION"):
2507 if not self
.__IsToken
( "="):
2508 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2509 if not self
.__GetNextToken
():
2510 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2512 if self
.__GetStringData
():
2513 FfsInfObj
.Version
= self
.__Token
2515 if self
.__IsKeyword
( "UI"):
2516 if not self
.__IsToken
( "="):
2517 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2518 if not self
.__GetNextToken
():
2519 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2521 if self
.__GetStringData
():
2522 FfsInfObj
.Ui
= self
.__Token
2524 if self
.__IsKeyword
( "USE"):
2525 if not self
.__IsToken
( "="):
2526 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2527 if not self
.__GetNextToken
():
2528 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2529 FfsInfObj
.UseArch
= self
.__Token
2532 if self
.__GetNextToken
():
2533 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')
2534 if p
.match(self
.__Token
) and p
.match(self
.__Token
).span()[1] == len(self
.__Token
):
2535 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2536 if not self
.__IsToken
(","):
2542 while self
.__GetNextToken
():
2543 if not p
.match(self
.__Token
):
2544 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2545 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2547 if not self
.__IsToken
(","):
2550 ## __GetFileStatement() method
2552 # Get FILE statements
2554 # @param self The object pointer
2555 # @param Obj for whom FILE statement is got
2556 # @param MacroDict dictionary used to replace macro
2557 # @retval True Successfully find FILE statement
2558 # @retval False Not able to find FILE statement
2560 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2562 if not self
.__IsKeyword
( "FILE"):
2565 if not self
.__GetNextWord
():
2566 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2568 if ForCapsule
and self
.__Token
== 'DATA':
2573 FfsFileObj
= FfsFileStatement
.FileStatement()
2574 FfsFileObj
.FvFileType
= self
.__Token
2576 if not self
.__IsToken
( "="):
2577 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2579 if not self
.__GetNextGuid
():
2580 if not self
.__GetNextWord
():
2581 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2582 if self
.__Token
== 'PCD':
2583 if not self
.__IsToken
( "("):
2584 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2585 PcdPair
= self
.__GetNextPcdName
()
2586 if not self
.__IsToken
( ")"):
2587 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2588 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2590 FfsFileObj
.NameGuid
= self
.__Token
2592 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2595 capsuleFfs
= CapsuleData
.CapsuleFfs()
2596 capsuleFfs
.Ffs
= FfsFileObj
2597 Obj
.CapsuleDataList
.append(capsuleFfs
)
2599 Obj
.FfsList
.append(FfsFileObj
)
2603 ## __FileCouldHaveRelocFlag() method
2605 # Check whether reloc strip flag can be set for a file type.
2607 # @param self The object pointer
2608 # @param FileType The file type to check with
2609 # @retval True This type could have relocation strip flag
2610 # @retval False No way to have it
2613 def __FileCouldHaveRelocFlag (self
, FileType
):
2614 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2619 ## __SectionCouldHaveRelocFlag() method
2621 # Check whether reloc strip flag can be set for a section type.
2623 # @param self The object pointer
2624 # @param SectionType The section type to check with
2625 # @retval True This type could have relocation strip flag
2626 # @retval False No way to have it
2629 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2630 if SectionType
in ('TE', 'PE32'):
2635 ## __GetFilePart() method
2637 # Get components for FILE statement
2639 # @param self The object pointer
2640 # @param FfsFileObj for whom component is got
2641 # @param MacroDict dictionary used to replace macro
2643 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2645 self
.__GetFileOpts
( FfsFileObj
)
2647 if not self
.__IsToken
("{"):
2648 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2649 if self
.__FileCouldHaveRelocFlag
(FfsFileObj
.FvFileType
):
2650 if self
.__Token
== 'RELOCS_STRIPPED':
2651 FfsFileObj
.KeepReloc
= False
2653 FfsFileObj
.KeepReloc
= True
2655 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj
.FvFileType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2657 if not self
.__IsToken
("{"):
2658 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2660 if not self
.__GetNextToken
():
2661 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2663 if self
.__Token
== "FV":
2664 if not self
.__IsToken
( "="):
2665 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2666 if not self
.__GetNextToken
():
2667 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2668 FfsFileObj
.FvName
= self
.__Token
2670 elif self
.__Token
== "FD":
2671 if not self
.__IsToken
( "="):
2672 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2673 if not self
.__GetNextToken
():
2674 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2675 FfsFileObj
.FdName
= self
.__Token
2677 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2679 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2681 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2682 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2683 FfsFileObj
.FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2684 self
.__VerifyFile
(FfsFileObj
.FileName
)
2686 if not self
.__IsToken
( "}"):
2687 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2689 ## __GetFileOpts() method
2691 # Get options for FILE statement
2693 # @param self The object pointer
2694 # @param FfsFileObj for whom options is got
2696 def __GetFileOpts(self
, FfsFileObj
):
2698 if self
.__GetNextToken
():
2699 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2700 if Pattern
.match(self
.__Token
):
2701 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2702 if self
.__IsToken
(","):
2703 while self
.__GetNextToken
():
2704 if not Pattern
.match(self
.__Token
):
2705 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2706 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2708 if not self
.__IsToken
(","):
2714 if self
.__IsKeyword
( "FIXED", True):
2715 FfsFileObj
.Fixed
= True
2717 if self
.__IsKeyword
( "CHECKSUM", True):
2718 FfsFileObj
.CheckSum
= True
2720 if self
.__GetAlignment
():
2721 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2722 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2723 #For FFS, Auto is default option same to ""
2724 if not self
.__Token
== "Auto":
2725 FfsFileObj
.Alignment
= self
.__Token
2727 ## __GetAlignment() method
2729 # Return the alignment value
2731 # @param self The object pointer
2732 # @retval True Successfully find alignment
2733 # @retval False Not able to find alignment
2735 def __GetAlignment(self
):
2736 if self
.__IsKeyword
( "Align", True):
2737 if not self
.__IsToken
( "="):
2738 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2740 if not self
.__GetNextToken
():
2741 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2746 ## __GetFilePart() method
2748 # Get section data for FILE statement
2750 # @param self The object pointer
2751 # @param FfsFileObj for whom section is got
2752 # @param MacroDict dictionary used to replace macro
2754 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2756 Dict
.update(MacroDict
)
2758 self
.__GetDefineStatements
(FfsFileObj
)
2760 Dict
.update(FfsFileObj
.DefineVarDict
)
2761 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2762 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2765 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2766 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2767 if not IsLeafSection
and not IsEncapSection
:
2770 ## __GetLeafSection() method
2772 # Get leaf section for Obj
2774 # @param self The object pointer
2775 # @param Obj for whom leaf section is got
2776 # @param MacroDict dictionary used to replace macro
2777 # @retval True Successfully find section statement
2778 # @retval False Not able to find section statement
2780 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2782 OldPos
= self
.GetFileBufferPos()
2784 if not self
.__IsKeyword
( "SECTION"):
2785 if len(Obj
.SectionList
) == 0:
2786 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2791 if self
.__GetAlignment
():
2792 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2793 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2794 AlignValue
= self
.__Token
2797 if self
.__IsKeyword
( "BUILD_NUM"):
2798 if not self
.__IsToken
( "="):
2799 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2801 if not self
.__GetNextToken
():
2802 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2804 BuildNum
= self
.__Token
2806 if self
.__IsKeyword
( "VERSION"):
2807 if AlignValue
== 'Auto':
2808 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2809 if not self
.__IsToken
( "="):
2810 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2811 if not self
.__GetNextToken
():
2812 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2813 VerSectionObj
= VerSection
.VerSection()
2814 VerSectionObj
.Alignment
= AlignValue
2815 VerSectionObj
.BuildNum
= BuildNum
2816 if self
.__GetStringData
():
2817 VerSectionObj
.StringData
= self
.__Token
2819 VerSectionObj
.FileName
= self
.__Token
2820 Obj
.SectionList
.append(VerSectionObj
)
2822 elif self
.__IsKeyword
( "UI"):
2823 if AlignValue
== 'Auto':
2824 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2825 if not self
.__IsToken
( "="):
2826 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2827 if not self
.__GetNextToken
():
2828 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2829 UiSectionObj
= UiSection
.UiSection()
2830 UiSectionObj
.Alignment
= AlignValue
2831 if self
.__GetStringData
():
2832 UiSectionObj
.StringData
= self
.__Token
2834 UiSectionObj
.FileName
= self
.__Token
2835 Obj
.SectionList
.append(UiSectionObj
)
2837 elif self
.__IsKeyword
( "FV_IMAGE"):
2838 if AlignValue
== 'Auto':
2839 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2840 if not self
.__IsToken
( "="):
2841 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2842 if not self
.__GetNextToken
():
2843 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2845 FvName
= self
.__Token
2848 if self
.__IsToken
( "{"):
2850 FvObj
.UiFvName
= FvName
.upper()
2851 self
.__GetDefineStatements
(FvObj
)
2852 MacroDict
.update(FvObj
.DefineVarDict
)
2853 self
.__GetBlockStatement
(FvObj
)
2854 self
.__GetSetStatements
(FvObj
)
2855 self
.__GetFvAlignment
(FvObj
)
2856 self
.__GetFvAttributes
(FvObj
)
2857 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2858 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2861 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2862 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2863 if not IsInf
and not IsFile
:
2866 if not self
.__IsToken
( "}"):
2867 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2869 FvImageSectionObj
= FvImageSection
.FvImageSection()
2870 FvImageSectionObj
.Alignment
= AlignValue
2872 FvImageSectionObj
.Fv
= FvObj
2873 FvImageSectionObj
.FvName
= None
2875 FvImageSectionObj
.FvName
= FvName
.upper()
2876 FvImageSectionObj
.FvFileName
= FvName
2878 Obj
.SectionList
.append(FvImageSectionObj
)
2880 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2881 if AlignValue
== 'Auto':
2882 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2883 DepexSectionObj
= DepexSection
.DepexSection()
2884 DepexSectionObj
.Alignment
= AlignValue
2885 DepexSectionObj
.DepexType
= self
.__Token
2887 if not self
.__IsToken
( "="):
2888 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2889 if not self
.__IsToken
( "{"):
2890 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2891 if not self
.__SkipToToken
( "}"):
2892 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2894 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2895 Obj
.SectionList
.append(DepexSectionObj
)
2898 if not self
.__GetNextWord
():
2899 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2901 # Encapsulation section appear, UndoToken and return
2902 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2903 self
.SetFileBufferPos(OldPos
)
2906 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2907 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2908 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2909 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2910 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2913 DataSectionObj
= DataSection
.DataSection()
2914 DataSectionObj
.Alignment
= AlignValue
2915 DataSectionObj
.SecType
= self
.__Token
2917 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2918 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2919 if self
.__Token
== 'RELOCS_STRIPPED':
2920 DataSectionObj
.KeepReloc
= False
2922 DataSectionObj
.KeepReloc
= True
2924 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
)
2926 if self
.__IsToken
("="):
2927 if not self
.__GetNextToken
():
2928 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2929 DataSectionObj
.SectFileName
= self
.__Token
2930 self
.__VerifyFile
(DataSectionObj
.SectFileName
)
2932 if not self
.__GetCglSection
(DataSectionObj
):
2935 Obj
.SectionList
.append(DataSectionObj
)
2941 # Check if file exists or not:
2942 # If current phase if GenFds, the file must exist;
2943 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist
2944 # @param FileName: File path to be verified.
2946 def __VerifyFile(self
, FileName
):
2947 if FileName
.replace('$(WORKSPACE)', '').find('$') != -1:
2949 if not GlobalData
.gAutoGenPhase
or not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FileName
:
2950 ErrorCode
, ErrorInfo
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2952 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2954 ## __GetCglSection() method
2956 # Get compressed or GUIDed section for Obj
2958 # @param self The object pointer
2959 # @param Obj for whom leaf section is got
2960 # @param AlignValue alignment value for complex section
2961 # @retval True Successfully find section statement
2962 # @retval False Not able to find section statement
2964 def __GetCglSection(self
, Obj
, AlignValue
= None):
2966 if self
.__IsKeyword
( "COMPRESS"):
2968 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2971 if not self
.__IsToken
("{"):
2972 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2974 CompressSectionObj
= CompressSection
.CompressSection()
2975 CompressSectionObj
.Alignment
= AlignValue
2976 CompressSectionObj
.CompType
= type
2977 # Recursive sections...
2979 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2980 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2981 if not IsLeafSection
and not IsEncapSection
:
2985 if not self
.__IsToken
( "}"):
2986 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2987 Obj
.SectionList
.append(CompressSectionObj
)
2990 # raise Warning("Compress type not known")
2994 elif self
.__IsKeyword
( "GUIDED"):
2996 if self
.__GetNextGuid
():
2997 GuidValue
= self
.__Token
2999 AttribDict
= self
.__GetGuidAttrib
()
3000 if not self
.__IsToken
("{"):
3001 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3002 GuidSectionObj
= GuidSection
.GuidSection()
3003 GuidSectionObj
.Alignment
= AlignValue
3004 GuidSectionObj
.NameGuid
= GuidValue
3005 GuidSectionObj
.SectionType
= "GUIDED"
3006 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3007 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3008 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
3009 # Recursive sections...
3011 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
3012 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
3013 if not IsLeafSection
and not IsEncapSection
:
3016 if not self
.__IsToken
( "}"):
3017 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3018 Obj
.SectionList
.append(GuidSectionObj
)
3024 ## __GetGuidAttri() method
3026 # Get attributes for GUID section
3028 # @param self The object pointer
3029 # @retval AttribDict Dictionary of key-value pair of section attributes
3031 def __GetGuidAttrib(self
):
3034 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
3035 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
3036 AttribDict
["EXTRA_HEADER_SIZE"] = -1
3037 while self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID") \
3038 or self
.__IsKeyword
("EXTRA_HEADER_SIZE"):
3039 AttribKey
= self
.__Token
3041 if not self
.__IsToken
("="):
3042 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3044 if not self
.__GetNextToken
():
3045 raise Warning("expected TRUE(1)/FALSE(0)/Number", self
.FileName
, self
.CurrentLineNumber
)
3046 elif AttribKey
== "EXTRA_HEADER_SIZE":
3048 if self
.__Token
[0:2].upper() == "0X":
3051 AttribDict
[AttribKey
] = int(self
.__Token
, Base
)
3054 raise Warning("expected Number", self
.FileName
, self
.CurrentLineNumber
)
3055 elif self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
3056 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
3057 AttribDict
[AttribKey
] = self
.__Token
3061 ## __GetEncapsulationSec() method
3063 # Get encapsulation section for FILE
3065 # @param self The object pointer
3066 # @param FfsFile for whom section is got
3067 # @retval True Successfully find section statement
3068 # @retval False Not able to find section statement
3070 def __GetEncapsulationSec(self
, FfsFileObj
):
3072 OldPos
= self
.GetFileBufferPos()
3073 if not self
.__IsKeyword
( "SECTION"):
3074 if len(FfsFileObj
.SectionList
) == 0:
3075 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
3080 if self
.__GetAlignment
():
3081 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3082 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3083 AlignValue
= self
.__Token
3085 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
3086 self
.SetFileBufferPos(OldPos
)
3092 if not self
.__GetNextToken
():
3094 S
= self
.__Token
.upper()
3095 if not S
.startswith("[FMPPAYLOAD."):
3096 if not S
.startswith("[CAPSULE.") and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3097 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
)
3102 self
.__SkipToToken
("[FMPPAYLOAD.", True)
3103 FmpUiName
= self
.__GetUiName
().upper()
3104 if FmpUiName
in self
.Profile
.FmpPayloadDict
:
3105 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName
, self
.FileName
, self
.CurrentLineNumber
)
3107 FmpData
= CapsuleData
.CapsulePayload()
3108 FmpData
.UiName
= FmpUiName
3110 if not self
.__IsToken
( "]"):
3111 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3113 if not self
.__GetNextToken
():
3114 raise Warning("The FMP payload section is empty!", self
.FileName
, self
.CurrentLineNumber
)
3115 FmpKeyList
= ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE']
3116 while self
.__Token
in FmpKeyList
:
3118 FmpKeyList
.remove(Name
)
3119 if not self
.__IsToken
("="):
3120 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3121 if Name
== 'IMAGE_TYPE_ID':
3122 if not self
.__GetNextGuid
():
3123 raise Warning("expected GUID value for IMAGE_TYPE_ID", self
.FileName
, self
.CurrentLineNumber
)
3124 FmpData
.ImageTypeId
= self
.__Token
3126 if not self
.__GetNextToken
():
3127 raise Warning("expected value of %s" % Name
, self
.FileName
, self
.CurrentLineNumber
)
3128 Value
= self
.__Token
3129 if Name
== 'IMAGE_HEADER_INIT_VERSION':
3130 FmpData
.Version
= Value
3131 elif Name
== 'IMAGE_INDEX':
3132 FmpData
.ImageIndex
= Value
3133 elif Name
== 'HARDWARE_INSTANCE':
3134 FmpData
.HardwareInstance
= Value
3135 if not self
.__GetNextToken
():
3141 raise Warning("Missing keywords %s in FMP payload section" % ', '.join(FmpKeyList
), self
.FileName
, self
.CurrentLineNumber
)
3142 ImageFile
= self
.__ParseRawFileStatement
()
3144 raise Warning("Missing image file in FMP payload section", self
.FileName
, self
.CurrentLineNumber
)
3145 FmpData
.ImageFile
= ImageFile
3146 VendorCodeFile
= self
.__ParseRawFileStatement
()
3148 FmpData
.VendorCodeFile
= VendorCodeFile
3149 self
.Profile
.FmpPayloadDict
[FmpUiName
] = FmpData
3152 ## __GetCapsule() method
3154 # Get capsule section contents and store its data into capsule list of self.Profile
3156 # @param self The object pointer
3157 # @retval True Successfully find a capsule
3158 # @retval False Not able to find a capsule
3160 def __GetCapsule(self
):
3162 if not self
.__GetNextToken
():
3165 S
= self
.__Token
.upper()
3166 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
3167 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3168 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3173 if not self
.__IsToken
("[CAPSULE.", True):
3174 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3175 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3176 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3177 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
3179 CapsuleObj
= Capsule
.Capsule()
3181 CapsuleName
= self
.__GetUiName
()
3183 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
3185 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
3187 if not self
.__IsToken
( "]"):
3188 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3190 if self
.__IsKeyword
("CREATE_FILE"):
3191 if not self
.__IsToken
( "="):
3192 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3194 if not self
.__GetNextToken
():
3195 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
3197 CapsuleObj
.CreateFile
= self
.__Token
3199 self
.__GetCapsuleStatements
(CapsuleObj
)
3200 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3203 ## __GetCapsuleStatements() method
3205 # Get statements for capsule
3207 # @param self The object pointer
3208 # @param Obj for whom statements are got
3210 def __GetCapsuleStatements(self
, Obj
):
3211 self
.__GetCapsuleTokens
(Obj
)
3212 self
.__GetDefineStatements
(Obj
)
3213 self
.__GetSetStatements
(Obj
)
3214 self
.__GetCapsuleData
(Obj
)
3216 ## __GetCapsuleTokens() method
3218 # Get token statements for capsule
3220 # @param self The object pointer
3221 # @param Obj for whom token statements are got
3223 def __GetCapsuleTokens(self
, Obj
):
3224 if not self
.__GetNextToken
():
3226 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):
3227 Name
= self
.__Token
.strip()
3228 if not self
.__IsToken
("="):
3229 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3230 if not self
.__GetNextToken
():
3231 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3232 if Name
== 'CAPSULE_FLAGS':
3233 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3234 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3235 Value
= self
.__Token
.strip()
3236 while self
.__IsToken
(","):
3238 if not self
.__GetNextToken
():
3239 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3240 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3241 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3242 Value
+= self
.__Token
.strip()
3243 elif Name
== 'OEM_CAPSULE_FLAGS':
3244 Value
= self
.__Token
.strip()
3245 if not Value
.upper().startswith('0X'):
3246 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3248 Value
= int(Value
, 0)
3250 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3251 if not 0x0000 <= Value
<= 0xFFFF:
3252 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3253 Value
= self
.__Token
.strip()
3255 Value
= self
.__Token
.strip()
3256 Obj
.TokensDict
[Name
] = Value
3257 if not self
.__GetNextToken
():
3261 ## __GetCapsuleData() method
3263 # Get capsule data for capsule
3265 # @param self The object pointer
3266 # @param Obj for whom capsule data are got
3268 def __GetCapsuleData(self
, Obj
):
3271 IsInf
= self
.__GetInfStatement
(Obj
, True)
3272 IsFile
= self
.__GetFileStatement
(Obj
, True)
3273 IsFv
= self
.__GetFvStatement
(Obj
)
3274 IsFd
= self
.__GetFdStatement
(Obj
)
3275 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3276 IsAfile
= self
.__GetAfileStatement
(Obj
)
3277 IsFmp
= self
.__GetFmpStatement
(Obj
)
3278 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
or IsAfile
or IsFmp
):
3281 ## __GetFvStatement() method
3283 # Get FV for capsule
3285 # @param self The object pointer
3286 # @param CapsuleObj for whom FV is got
3287 # @retval True Successfully find a FV statement
3288 # @retval False Not able to find a FV statement
3290 def __GetFvStatement(self
, CapsuleObj
):
3292 if not self
.__IsKeyword
("FV"):
3295 if not self
.__IsToken
("="):
3296 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3298 if not self
.__GetNextToken
():
3299 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3301 if self
.__Token
.upper() not in self
.Profile
.FvDict
.keys():
3302 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3304 CapsuleFv
= CapsuleData
.CapsuleFv()
3305 CapsuleFv
.FvName
= self
.__Token
3306 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3309 ## __GetFdStatement() method
3311 # Get FD for capsule
3313 # @param self The object pointer
3314 # @param CapsuleObj for whom FD is got
3315 # @retval True Successfully find a FD statement
3316 # @retval False Not able to find a FD statement
3318 def __GetFdStatement(self
, CapsuleObj
):
3320 if not self
.__IsKeyword
("FD"):
3323 if not self
.__IsToken
("="):
3324 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3326 if not self
.__GetNextToken
():
3327 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3329 if self
.__Token
.upper() not in self
.Profile
.FdDict
.keys():
3330 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3332 CapsuleFd
= CapsuleData
.CapsuleFd()
3333 CapsuleFd
.FdName
= self
.__Token
3334 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3337 def __GetFmpStatement(self
, CapsuleObj
):
3338 if not self
.__IsKeyword
("FMP"):
3341 if not self
.__IsKeyword
("PAYLOAD"):
3345 if not self
.__IsToken
("="):
3346 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3348 if not self
.__GetNextToken
():
3349 raise Warning("expected payload name after FMP PAYLOAD =", self
.FileName
, self
.CurrentLineNumber
)
3350 Payload
= self
.__Token
.upper()
3351 if Payload
not in self
.Profile
.FmpPayloadDict
:
3352 raise Warning("This FMP Payload does not exist: %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3353 CapsuleObj
.FmpPayloadList
.append(self
.Profile
.FmpPayloadDict
[Payload
])
3356 def __ParseRawFileStatement(self
):
3357 if not self
.__IsKeyword
("FILE"):
3360 if not self
.__IsKeyword
("DATA"):
3364 if not self
.__IsToken
("="):
3365 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3367 if not self
.__GetNextToken
():
3368 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3370 AnyFileName
= self
.__Token
3371 AnyFileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AnyFileName
)
3372 if not os
.path
.exists(AnyFileName
):
3373 raise Warning("File %s not exists"%AnyFileName
, self
.FileName
, self
.CurrentLineNumber
)
3376 ## __GetAnyFileStatement() method
3378 # Get AnyFile for capsule
3380 # @param self The object pointer
3381 # @param CapsuleObj for whom AnyFile is got
3382 # @retval True Successfully find a Anyfile statement
3383 # @retval False Not able to find a AnyFile statement
3385 def __GetAnyFileStatement(self
, CapsuleObj
):
3386 AnyFileName
= self
.__ParseRawFileStatement
()
3390 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3391 CapsuleAnyFile
.FileName
= AnyFileName
3392 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3395 ## __GetAfileStatement() method
3397 # Get Afile for capsule
3399 # @param self The object pointer
3400 # @param CapsuleObj for whom Afile is got
3401 # @retval True Successfully find a Afile statement
3402 # @retval False Not able to find a Afile statement
3404 def __GetAfileStatement(self
, CapsuleObj
):
3406 if not self
.__IsKeyword
("APPEND"):
3409 if not self
.__IsToken
("="):
3410 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3412 if not self
.__GetNextToken
():
3413 raise Warning("expected Afile name", self
.FileName
, self
.CurrentLineNumber
)
3415 AfileName
= self
.__Token
3416 AfileBaseName
= os
.path
.basename(AfileName
)
3418 if os
.path
.splitext(AfileBaseName
)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:
3419 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \
3420 self
.FileName
, self
.CurrentLineNumber
)
3422 if not os
.path
.isabs(AfileName
):
3423 AfileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AfileName
)
3424 self
.__VerifyFile
(AfileName
)
3426 if not os
.path
.exists(AfileName
):
3427 raise Warning('%s does not exist' % AfileName
, self
.FileName
, self
.CurrentLineNumber
)
3431 CapsuleAfile
= CapsuleData
.CapsuleAfile()
3432 CapsuleAfile
.FileName
= AfileName
3433 CapsuleObj
.CapsuleDataList
.append(CapsuleAfile
)
3436 ## __GetRule() method
3438 # Get Rule section contents and store its data into rule list of self.Profile
3440 # @param self The object pointer
3441 # @retval True Successfully find a Rule
3442 # @retval False Not able to find a Rule
3444 def __GetRule(self
):
3446 if not self
.__GetNextToken
():
3449 S
= self
.__Token
.upper()
3450 if S
.startswith("[") and not S
.startswith("[RULE."):
3451 if not S
.startswith("[OPTIONROM."):
3452 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3456 if not self
.__IsToken
("[Rule.", True):
3457 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3458 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3459 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3460 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3462 if not self
.__SkipToToken
("."):
3463 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3465 Arch
= self
.__SkippedChars
.rstrip(".")
3466 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
3467 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3469 ModuleType
= self
.__GetModuleType
()
3472 if self
.__IsToken
("."):
3473 if not self
.__GetNextWord
():
3474 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3475 TemplateName
= self
.__Token
3477 if not self
.__IsToken
( "]"):
3478 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3480 RuleObj
= self
.__GetRuleFileStatements
()
3481 RuleObj
.Arch
= Arch
.upper()
3482 RuleObj
.ModuleType
= ModuleType
3483 RuleObj
.TemplateName
= TemplateName
3484 if TemplateName
== '' :
3485 self
.Profile
.RuleDict
['RULE' + \
3489 ModuleType
.upper() ] = RuleObj
3491 self
.Profile
.RuleDict
['RULE' + \
3495 ModuleType
.upper() + \
3497 TemplateName
.upper() ] = RuleObj
3498 # self.Profile.RuleList.append(rule)
3501 ## __GetModuleType() method
3503 # Return the module type
3505 # @param self The object pointer
3506 # @retval string module type
3508 def __GetModuleType(self
):
3510 if not self
.__GetNextWord
():
3511 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3512 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3513 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3514 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3515 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3516 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3517 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3518 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3521 ## __GetFileExtension() method
3523 # Return the file extension
3525 # @param self The object pointer
3526 # @retval string file name extension
3528 def __GetFileExtension(self
):
3529 if not self
.__IsToken
("."):
3530 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3533 if self
.__GetNextToken
():
3534 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3535 if Pattern
.match(self
.__Token
):
3539 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3542 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3544 ## __GetRuleFileStatement() method
3548 # @param self The object pointer
3549 # @retval Rule Rule object
3551 def __GetRuleFileStatements(self
):
3553 if not self
.__IsKeyword
("FILE"):
3554 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3556 if not self
.__GetNextWord
():
3557 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3559 Type
= self
.__Token
.strip().upper()
3560 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3561 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3562 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3564 if not self
.__IsToken
("="):
3565 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3567 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3568 if not self
.__GetNextWord
():
3569 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3570 if self
.__Token
== 'PCD':
3571 if not self
.__IsToken
( "("):
3572 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3573 PcdPair
= self
.__GetNextPcdName
()
3574 if not self
.__IsToken
( ")"):
3575 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3576 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3578 NameGuid
= self
.__Token
3581 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3582 if self
.__FileCouldHaveRelocFlag
(Type
):
3583 if self
.__Token
== 'RELOCS_STRIPPED':
3588 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3591 if self
.__GetNextToken
():
3592 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3593 if Pattern
.match(self
.__Token
):
3594 KeyStringList
.append(self
.__Token
)
3595 if self
.__IsToken
(","):
3596 while self
.__GetNextToken
():
3597 if not Pattern
.match(self
.__Token
):
3598 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3599 KeyStringList
.append(self
.__Token
)
3601 if not self
.__IsToken
(","):
3609 if self
.__IsKeyword
("Fixed", True):
3613 if self
.__IsKeyword
("CheckSum", True):
3617 if self
.__GetAlignment
():
3618 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3619 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3620 #For FFS, Auto is default option same to ""
3621 if not self
.__Token
== "Auto":
3622 AlignValue
= self
.__Token
3624 if self
.__IsToken
("{"):
3625 # Complex file rule expected
3626 Rule
= RuleComplexFile
.RuleComplexFile()
3627 Rule
.FvFileType
= Type
3628 Rule
.NameGuid
= NameGuid
3629 Rule
.Alignment
= AlignValue
3630 Rule
.CheckSum
= CheckSum
3632 Rule
.KeyStringList
= KeyStringList
3633 if KeepReloc
!= None:
3634 Rule
.KeepReloc
= KeepReloc
3637 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3638 IsLeaf
= self
.__GetEfiSection
(Rule
)
3639 if not IsEncapsulate
and not IsLeaf
:
3642 if not self
.__IsToken
("}"):
3643 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3648 # Simple file rule expected
3649 if not self
.__GetNextWord
():
3650 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3652 SectionName
= self
.__Token
3654 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3655 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3656 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3659 if self
.__IsKeyword
("Fixed", True):
3662 if self
.__IsKeyword
("CheckSum", True):
3666 if self
.__GetAlignment
():
3667 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3668 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3669 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3670 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3671 SectAlignment
= self
.__Token
3674 if self
.__IsToken
('|'):
3675 Ext
= self
.__GetFileExtension
()
3676 elif not self
.__GetNextToken
():
3677 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3679 Rule
= RuleSimpleFile
.RuleSimpleFile()
3680 Rule
.SectionType
= SectionName
3681 Rule
.FvFileType
= Type
3682 Rule
.NameGuid
= NameGuid
3683 Rule
.Alignment
= AlignValue
3684 Rule
.SectAlignment
= SectAlignment
3685 Rule
.CheckSum
= CheckSum
3687 Rule
.KeyStringList
= KeyStringList
3688 if KeepReloc
!= None:
3689 Rule
.KeepReloc
= KeepReloc
3690 Rule
.FileExtension
= Ext
3691 Rule
.FileName
= self
.__Token
3694 ## __GetEfiSection() method
3696 # Get section list for Rule
3698 # @param self The object pointer
3699 # @param Obj for whom section is got
3700 # @retval True Successfully find section statement
3701 # @retval False Not able to find section statement
3703 def __GetEfiSection(self
, Obj
):
3705 OldPos
= self
.GetFileBufferPos()
3706 if not self
.__GetNextWord
():
3708 SectionName
= self
.__Token
3710 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3711 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3715 if SectionName
== "FV_IMAGE":
3716 FvImageSectionObj
= FvImageSection
.FvImageSection()
3717 if self
.__IsKeyword
("FV_IMAGE"):
3719 if self
.__IsToken
( "{"):
3721 self
.__GetDefineStatements
(FvObj
)
3722 self
.__GetBlockStatement
(FvObj
)
3723 self
.__GetSetStatements
(FvObj
)
3724 self
.__GetFvAlignment
(FvObj
)
3725 self
.__GetFvAttributes
(FvObj
)
3726 self
.__GetAprioriSection
(FvObj
)
3727 self
.__GetAprioriSection
(FvObj
)
3730 IsInf
= self
.__GetInfStatement
(FvObj
)
3731 IsFile
= self
.__GetFileStatement
(FvObj
)
3732 if not IsInf
and not IsFile
:
3735 if not self
.__IsToken
( "}"):
3736 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3737 FvImageSectionObj
.Fv
= FvObj
3738 FvImageSectionObj
.FvName
= None
3741 if not self
.__IsKeyword
("FV"):
3742 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3743 FvImageSectionObj
.FvFileType
= self
.__Token
3745 if self
.__GetAlignment
():
3746 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3747 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3748 FvImageSectionObj
.Alignment
= self
.__Token
3750 if self
.__IsToken
('|'):
3751 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3752 elif self
.__GetNextToken
():
3753 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3754 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3755 FvImageSectionObj
.FvFileName
= self
.__Token
3759 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3761 Obj
.SectionList
.append(FvImageSectionObj
)
3764 EfiSectionObj
= EfiSection
.EfiSection()
3765 EfiSectionObj
.SectionType
= SectionName
3767 if not self
.__GetNextToken
():
3768 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3770 if self
.__Token
== "STRING":
3771 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3772 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3774 if not self
.__IsToken
('='):
3775 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3777 if not self
.__GetNextToken
():
3778 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3780 if self
.__GetStringData
():
3781 EfiSectionObj
.StringData
= self
.__Token
3783 if self
.__IsKeyword
("BUILD_NUM"):
3784 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3785 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3787 if not self
.__IsToken
("="):
3788 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3789 if not self
.__GetNextToken
():
3790 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3791 EfiSectionObj
.BuildNum
= self
.__Token
3794 EfiSectionObj
.FileType
= self
.__Token
3795 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3797 if self
.__IsKeyword
("Optional"):
3798 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3799 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3800 EfiSectionObj
.Optional
= True
3802 if self
.__IsKeyword
("BUILD_NUM"):
3803 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3804 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3806 if not self
.__IsToken
("="):
3807 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3808 if not self
.__GetNextToken
():
3809 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3810 EfiSectionObj
.BuildNum
= self
.__Token
3812 if self
.__GetAlignment
():
3813 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3814 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3815 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3816 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3817 EfiSectionObj
.Alignment
= self
.__Token
3819 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3820 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3821 if self
.__Token
== 'RELOCS_STRIPPED':
3822 EfiSectionObj
.KeepReloc
= False
3824 EfiSectionObj
.KeepReloc
= True
3825 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3826 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3828 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3831 if self
.__IsToken
('|'):
3832 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3833 elif self
.__GetNextToken
():
3834 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3835 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3837 if self
.__Token
.startswith('PCD'):
3839 self
.__GetNextWord
()
3841 if self
.__Token
== 'PCD':
3842 if not self
.__IsToken
( "("):
3843 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3844 PcdPair
= self
.__GetNextPcdName
()
3845 if not self
.__IsToken
( ")"):
3846 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3847 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3849 EfiSectionObj
.FileName
= self
.__Token
3854 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3856 Obj
.SectionList
.append(EfiSectionObj
)
3859 ## __RuleSectionCouldBeOptional() method
3861 # Get whether a section could be optional
3863 # @param self The object pointer
3864 # @param SectionType The section type to check
3865 # @retval True section could be optional
3866 # @retval False section never optional
3868 def __RuleSectionCouldBeOptional(self
, SectionType
):
3869 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3874 ## __RuleSectionCouldHaveBuildNum() method
3876 # Get whether a section could have build number information
3878 # @param self The object pointer
3879 # @param SectionType The section type to check
3880 # @retval True section could have build number information
3881 # @retval False section never have build number information
3883 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3884 if SectionType
in ("VERSION"):
3889 ## __RuleSectionCouldHaveString() method
3891 # Get whether a section could have string
3893 # @param self The object pointer
3894 # @param SectionType The section type to check
3895 # @retval True section could have string
3896 # @retval False section never have string
3898 def __RuleSectionCouldHaveString(self
, SectionType
):
3899 if SectionType
in ("UI", "VERSION"):
3904 ## __CheckRuleSectionFileType() method
3906 # Get whether a section matches a file type
3908 # @param self The object pointer
3909 # @param SectionType The section type to check
3910 # @param FileType The file type to check
3912 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3913 if SectionType
== "COMPAT16":
3914 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3915 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3916 elif SectionType
== "PE32":
3917 if FileType
not in ("PE32", "SEC_PE32"):
3918 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3919 elif SectionType
== "PIC":
3920 if FileType
not in ("PIC", "PIC"):
3921 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3922 elif SectionType
== "TE":
3923 if FileType
not in ("TE", "SEC_TE"):
3924 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3925 elif SectionType
== "RAW":
3926 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3927 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3928 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3929 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3930 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3931 elif SectionType
== "UI":
3932 if FileType
not in ("UI", "SEC_UI"):
3933 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3934 elif SectionType
== "VERSION":
3935 if FileType
not in ("VERSION", "SEC_VERSION"):
3936 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3937 elif SectionType
== "PEI_DEPEX":
3938 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3939 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3940 elif SectionType
== "GUID":
3941 if FileType
not in ("PE32", "SEC_GUID"):
3942 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3944 ## __GetRuleEncapsulationSection() method
3946 # Get encapsulation section for Rule
3948 # @param self The object pointer
3949 # @param Rule for whom section is got
3950 # @retval True Successfully find section statement
3951 # @retval False Not able to find section statement
3953 def __GetRuleEncapsulationSection(self
, Rule
):
3955 if self
.__IsKeyword
( "COMPRESS"):
3957 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3960 if not self
.__IsToken
("{"):
3961 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3963 CompressSectionObj
= CompressSection
.CompressSection()
3965 CompressSectionObj
.CompType
= Type
3966 # Recursive sections...
3968 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3969 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3970 if not IsEncapsulate
and not IsLeaf
:
3973 if not self
.__IsToken
( "}"):
3974 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3975 Rule
.SectionList
.append(CompressSectionObj
)
3979 elif self
.__IsKeyword
( "GUIDED"):
3981 if self
.__GetNextGuid
():
3982 GuidValue
= self
.__Token
3984 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3985 GuidValue
= self
.__Token
3987 AttribDict
= self
.__GetGuidAttrib
()
3989 if not self
.__IsToken
("{"):
3990 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3991 GuidSectionObj
= GuidSection
.GuidSection()
3992 GuidSectionObj
.NameGuid
= GuidValue
3993 GuidSectionObj
.SectionType
= "GUIDED"
3994 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3995 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3996 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
4000 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
4001 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
4002 if not IsEncapsulate
and not IsLeaf
:
4005 if not self
.__IsToken
( "}"):
4006 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4007 Rule
.SectionList
.append(GuidSectionObj
)
4013 ## __GetVtf() method
4015 # Get VTF section contents and store its data into VTF list of self.Profile
4017 # @param self The object pointer
4018 # @retval True Successfully find a VTF
4019 # @retval False Not able to find a VTF
4023 if not self
.__GetNextToken
():
4026 S
= self
.__Token
.upper()
4027 if S
.startswith("[") and not S
.startswith("[VTF."):
4028 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
4029 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
4034 if not self
.__IsToken
("[VTF.", True):
4035 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4036 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
4037 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
4038 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
4040 if not self
.__SkipToToken
("."):
4041 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
4043 Arch
= self
.__SkippedChars
.rstrip(".").upper()
4044 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4045 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
4047 if not self
.__GetNextWord
():
4048 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
4049 Name
= self
.__Token
.upper()
4052 VtfObj
.UiName
= Name
4053 VtfObj
.KeyArch
= Arch
4055 if self
.__IsToken
(","):
4056 if not self
.__GetNextWord
():
4057 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
4058 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4059 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4060 VtfObj
.ArchList
= self
.__Token
.upper()
4062 if not self
.__IsToken
( "]"):
4063 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4065 if self
.__IsKeyword
("IA32_RST_BIN"):
4066 if not self
.__IsToken
("="):
4067 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4069 if not self
.__GetNextToken
():
4070 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
4072 VtfObj
.ResetBin
= self
.__Token
4073 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4074 #check for file path
4075 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4077 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4079 while self
.__GetComponentStatement
(VtfObj
):
4082 self
.Profile
.VtfList
.append(VtfObj
)
4085 ## __GetComponentStatement() method
4087 # Get components in VTF
4089 # @param self The object pointer
4090 # @param VtfObj for whom component is got
4091 # @retval True Successfully find a component
4092 # @retval False Not able to find a component
4094 def __GetComponentStatement(self
, VtfObj
):
4096 if not self
.__IsKeyword
("COMP_NAME"):
4099 if not self
.__IsToken
("="):
4100 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4102 if not self
.__GetNextWord
():
4103 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
4105 CompStatementObj
= ComponentStatement
.ComponentStatement()
4106 CompStatementObj
.CompName
= self
.__Token
4108 if not self
.__IsKeyword
("COMP_LOC"):
4109 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
4111 if not self
.__IsToken
("="):
4112 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4114 CompStatementObj
.CompLoc
= ""
4115 if self
.__GetNextWord
():
4116 CompStatementObj
.CompLoc
= self
.__Token
4117 if self
.__IsToken
('|'):
4118 if not self
.__GetNextWord
():
4119 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
4121 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
4122 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4124 CompStatementObj
.FilePos
= self
.__Token
4126 self
.CurrentLineNumber
+= 1
4127 self
.CurrentOffsetWithinLine
= 0
4129 if not self
.__IsKeyword
("COMP_TYPE"):
4130 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
4132 if not self
.__IsToken
("="):
4133 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4135 if not self
.__GetNextToken
():
4136 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
4137 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
4138 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
4139 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
4140 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4141 CompStatementObj
.CompType
= self
.__Token
4143 if not self
.__IsKeyword
("COMP_VER"):
4144 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
4146 if not self
.__IsToken
("="):
4147 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4149 if not self
.__GetNextToken
():
4150 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
4152 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
4153 if Pattern
.match(self
.__Token
) == None:
4154 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4155 CompStatementObj
.CompVer
= self
.__Token
4157 if not self
.__IsKeyword
("COMP_CS"):
4158 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
4160 if not self
.__IsToken
("="):
4161 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4163 if not self
.__GetNextToken
():
4164 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
4165 if self
.__Token
not in ("1", "0"):
4166 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4167 CompStatementObj
.CompCs
= self
.__Token
4170 if not self
.__IsKeyword
("COMP_BIN"):
4171 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
4173 if not self
.__IsToken
("="):
4174 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4176 if not self
.__GetNextToken
():
4177 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
4179 CompStatementObj
.CompBin
= self
.__Token
4180 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4181 #check for file path
4182 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4184 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4186 if not self
.__IsKeyword
("COMP_SYM"):
4187 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
4189 if not self
.__IsToken
("="):
4190 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4192 if not self
.__GetNextToken
():
4193 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
4195 CompStatementObj
.CompSym
= self
.__Token
4196 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
4197 #check for file path
4198 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4200 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4202 if not self
.__IsKeyword
("COMP_SIZE"):
4203 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
4205 if not self
.__IsToken
("="):
4206 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4208 if self
.__IsToken
("-"):
4209 CompStatementObj
.CompSize
= self
.__Token
4210 elif self
.__GetNextDecimalNumber
():
4211 CompStatementObj
.CompSize
= self
.__Token
4212 elif self
.__GetNextHexNumber
():
4213 CompStatementObj
.CompSize
= self
.__Token
4215 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4217 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
4220 ## __GetOptionRom() method
4222 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
4224 # @param self The object pointer
4225 # @retval True Successfully find a OptionROM
4226 # @retval False Not able to find a OptionROM
4228 def __GetOptionRom(self
):
4230 if not self
.__GetNextToken
():
4233 S
= self
.__Token
.upper()
4234 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
4235 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
4238 if not self
.__IsToken
("[OptionRom.", True):
4239 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4241 OptRomName
= self
.__GetUiName
()
4243 if not self
.__IsToken
( "]"):
4244 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4246 OptRomObj
= OptionRom
.OPTIONROM()
4247 OptRomObj
.DriverName
= OptRomName
4248 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
4251 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
4252 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
4253 if not isInf
and not isFile
:
4258 ## __GetOptRomInfStatement() method
4260 # Get INF statements
4262 # @param self The object pointer
4263 # @param Obj for whom inf statement is got
4264 # @retval True Successfully find inf statement
4265 # @retval False Not able to find inf statement
4267 def __GetOptRomInfStatement(self
, Obj
):
4269 if not self
.__IsKeyword
( "INF"):
4272 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
4273 self
.__GetInfOptions
( ffsInf
)
4275 if not self
.__GetNextToken
():
4276 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
4277 ffsInf
.InfFileName
= self
.__Token
4278 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4279 #check for file path
4280 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4282 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4284 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4285 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4286 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4287 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4290 self
.__GetOptRomOverrides
(ffsInf
)
4292 Obj
.FfsList
.append(ffsInf
)
4295 ## __GetOptRomOverrides() method
4297 # Get overrides for OptROM INF & FILE
4299 # @param self The object pointer
4300 # @param FfsInfObj for whom overrides is got
4302 def __GetOptRomOverrides(self
, Obj
):
4303 if self
.__IsToken
('{'):
4304 Overrides
= OptionRom
.OverrideAttribs()
4306 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4307 if not self
.__IsToken
( "="):
4308 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4309 if not self
.__GetNextHexNumber
():
4310 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4311 Overrides
.PciVendorId
= self
.__Token
4314 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4315 if not self
.__IsToken
( "="):
4316 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4317 if not self
.__GetNextHexNumber
():
4318 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4319 Overrides
.PciClassCode
= self
.__Token
4322 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4323 if not self
.__IsToken
( "="):
4324 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4325 if not self
.__GetNextHexNumber
():
4326 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4328 Overrides
.PciDeviceId
= self
.__Token
4331 if self
.__IsKeyword
( "PCI_REVISION"):
4332 if not self
.__IsToken
( "="):
4333 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4334 if not self
.__GetNextHexNumber
():
4335 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4336 Overrides
.PciRevision
= self
.__Token
4339 if self
.__IsKeyword
( "PCI_COMPRESS"):
4340 if not self
.__IsToken
( "="):
4341 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4342 if not self
.__GetNextToken
():
4343 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4344 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4347 if self
.__IsToken
( "}"):
4350 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4352 Obj
.OverrideAttribs
= Overrides
4354 ## __GetOptRomFileStatement() method
4356 # Get FILE statements
4358 # @param self The object pointer
4359 # @param Obj for whom FILE statement is got
4360 # @retval True Successfully find FILE statement
4361 # @retval False Not able to find FILE statement
4363 def __GetOptRomFileStatement(self
, Obj
):
4365 if not self
.__IsKeyword
( "FILE"):
4368 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4370 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
4371 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4372 FfsFileObj
.FileType
= self
.__Token
4374 if not self
.__GetNextToken
():
4375 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4376 FfsFileObj
.FileName
= self
.__Token
4377 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4378 #check for file path
4379 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4381 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4383 if FfsFileObj
.FileType
== 'EFI':
4384 self
.__GetOptRomOverrides
(FfsFileObj
)
4386 Obj
.FfsList
.append(FfsFileObj
)
4390 ## __GetCapInFd() method
4392 # Get Cap list contained in FD
4394 # @param self The object pointer
4395 # @param FdName FD name
4396 # @retval CapList List of Capsule in FD
4398 def __GetCapInFd (self
, FdName
):
4401 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4402 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4403 for elementRegion
in FdObj
.RegionList
:
4404 if elementRegion
.RegionType
== 'CAPSULE':
4405 for elementRegionData
in elementRegion
.RegionDataList
:
4406 if elementRegionData
.endswith(".cap"):
4408 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
4409 CapList
.append(elementRegionData
.upper())
4412 ## __GetReferencedFdCapTuple() method
4414 # Get FV and FD list referenced by a capsule image
4416 # @param self The object pointer
4417 # @param CapObj Capsule section to be searched
4418 # @param RefFdList referenced FD by section
4419 # @param RefFvList referenced FV by section
4421 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4423 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4424 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4425 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4426 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4427 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4428 elif CapsuleDataObj
.Ffs
!= None:
4429 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4430 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4431 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4432 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4433 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4435 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4437 ## __GetFvInFd() method
4439 # Get FV list contained in FD
4441 # @param self The object pointer
4442 # @param FdName FD name
4443 # @retval FvList list of FV in FD
4445 def __GetFvInFd (self
, FdName
):
4448 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4449 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4450 for elementRegion
in FdObj
.RegionList
:
4451 if elementRegion
.RegionType
== 'FV':
4452 for elementRegionData
in elementRegion
.RegionDataList
:
4453 if elementRegionData
.endswith(".fv"):
4455 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4456 FvList
.append(elementRegionData
.upper())
4459 ## __GetReferencedFdFvTuple() method
4461 # Get FD and FV list referenced by a FFS file
4463 # @param self The object pointer
4464 # @param FfsFile contains sections to be searched
4465 # @param RefFdList referenced FD by section
4466 # @param RefFvList referenced FV by section
4468 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4470 for FfsObj
in FvObj
.FfsList
:
4471 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4472 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4473 RefFvList
.append(FfsObj
.FvName
.upper())
4474 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4475 RefFdList
.append(FfsObj
.FdName
.upper())
4477 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4479 ## __GetReferencedFdFvTupleFromSection() method
4481 # Get FD and FV list referenced by a FFS section
4483 # @param self The object pointer
4484 # @param FfsFile contains sections to be searched
4485 # @param FdList referenced FD by section
4486 # @param FvList referenced FV by section
4488 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4491 SectionStack
.extend(FfsFile
.SectionList
)
4492 while SectionStack
!= []:
4493 SectionObj
= SectionStack
.pop()
4494 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4495 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4496 FvList
.append(SectionObj
.FvName
.upper())
4497 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4498 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4499 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4501 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4502 SectionStack
.extend(SectionObj
.SectionList
)
4504 ## CycleReferenceCheck() method
4506 # Check whether cycle reference exists in FDF
4508 # @param self The object pointer
4509 # @retval True cycle reference exists
4510 # @retval False Not exists cycle reference
4512 def CycleReferenceCheck(self
):
4514 # Check the cycle between FV and FD image
4516 MaxLength
= len (self
.Profile
.FvDict
)
4517 for FvName
in self
.Profile
.FvDict
.keys():
4518 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4520 RefFvStack
.append(FvName
)
4524 while RefFvStack
!= [] and Index
< MaxLength
:
4526 FvNameFromStack
= RefFvStack
.pop()
4527 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4528 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4534 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4536 for RefFdName
in RefFdList
:
4537 if RefFdName
in FdAnalyzedList
:
4540 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4541 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4542 if FvInFdList
!= []:
4543 for FvNameInFd
in FvInFdList
:
4544 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4545 if FvNameInFd
not in RefFvStack
:
4546 RefFvStack
.append(FvNameInFd
)
4548 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4549 EdkLogger
.info(LogStr
)
4551 FdAnalyzedList
.append(RefFdName
)
4553 for RefFvName
in RefFvList
:
4554 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4555 if RefFvName
not in RefFvStack
:
4556 RefFvStack
.append(RefFvName
)
4558 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4559 EdkLogger
.info(LogStr
)
4563 # Check the cycle between Capsule and FD image
4565 MaxLength
= len (self
.Profile
.CapsuleDict
)
4566 for CapName
in self
.Profile
.CapsuleDict
.keys():
4568 # Capsule image to be checked.
4570 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4572 RefCapStack
.append(CapName
)
4577 while RefCapStack
!= [] and Index
< MaxLength
:
4579 CapNameFromStack
= RefCapStack
.pop()
4580 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4581 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4587 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4591 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4592 for RefFdName
in RefFdList
:
4593 if RefFdName
in FdAnalyzedList
:
4596 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4597 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4598 if CapInFdList
!= []:
4599 for CapNameInFd
in CapInFdList
:
4600 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4601 if CapNameInFd
not in RefCapStack
:
4602 RefCapStack
.append(CapNameInFd
)
4604 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4605 EdkLogger
.info(LogStr
)
4608 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4609 if FvInFdList
!= []:
4610 for FvNameInFd
in FvInFdList
:
4611 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4612 if FvNameInFd
not in RefFvList
:
4613 RefFvList
.append(FvNameInFd
)
4615 FdAnalyzedList
.append(RefFdName
)
4617 # the number of the parsed FV and FD image
4619 FvListLength
= len (RefFvList
)
4620 FdListLength
= len (RefFdList
)
4621 for RefFvName
in RefFvList
:
4622 if RefFvName
in FvAnalyzedList
:
4624 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4625 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4626 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4629 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4630 FvAnalyzedList
.append(RefFvName
)
4634 if __name__
== "__main__":
4637 test_file
= sys
.argv
[1]
4638 except IndexError, v
:
4639 print "Usage: %s filename" % sys
.argv
[0]
4642 parser
= FdfParser(test_file
)
4645 parser
.CycleReferenceCheck()