4 # Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
5 # Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>
7 # This program and the accompanying materials
8 # are licensed and made available under the terms and conditions of the BSD License
9 # which accompanies this distribution. The full text of the license may be found at
10 # http://opensource.org/licenses/bsd-license.php
12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
24 from . import AprioriSection
25 from . import FfsInfStatement
26 from . import FfsFileStatement
27 from . import VerSection
28 from . import UiSection
29 from . import FvImageSection
30 from . import DataSection
31 from . import DepexSection
32 from . import CompressSection
33 from . import GuidSection
35 from . import CapsuleData
37 from . import RuleComplexFile
38 from . import RuleSimpleFile
39 from . import EfiSection
41 from . import ComponentStatement
42 from . import OptionRom
43 from . import OptRomInfStatement
44 from . import OptRomFileStatement
47 from .GenFdsGlobalVariable
import GenFdsGlobalVariable
48 from Common
.BuildToolError
import *
49 from Common
import EdkLogger
50 from Common
.Misc
import PathClass
51 from Common
.StringUtils
import NormPath
52 import Common
.GlobalData
as GlobalData
53 from Common
.Expression
import *
54 from Common
import GlobalData
55 from Common
.DataType
import *
56 from Common
.StringUtils
import ReplaceMacro
58 from Common
.Misc
import tdict
59 from Common
.MultipleWorkspace
import MultipleWorkspace
as mws
60 import Common
.LongFilePathOs
as os
61 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
62 from .Capsule
import EFI_CERT_TYPE_PKCS7_GUID
63 from .Capsule
import EFI_CERT_TYPE_RSA2048_SHA256_GUID
64 from Common
.RangeExpression
import RangeExpression
65 from collections
import OrderedDict
67 ##define T_CHAR_SPACE ' '
68 ##define T_CHAR_NULL '\0'
69 ##define T_CHAR_CR '\r'
70 ##define T_CHAR_TAB '\t'
71 ##define T_CHAR_LF '\n'
72 ##define T_CHAR_SLASH '/'
73 ##define T_CHAR_BACKSLASH '\\'
74 ##define T_CHAR_DOUBLE_QUOTE '\"'
75 ##define T_CHAR_SINGLE_QUOTE '\''
76 ##define T_CHAR_STAR '*'
77 ##define T_CHAR_HASH '#'
79 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
80 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
81 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
83 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
85 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
86 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+[\.\w\[\]]*)\s*\|\s*(?P<size>\w+\.\w+[\.\w\[\]]*)\s*")
87 RegionOffsetPcdPattern
= re
.compile("\s*(?P<base>\w+\.\w+[\.\w\[\]]*)\s*$")
88 ShortcutPcdPattern
= re
.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
89 BaseAddrValuePattern
= re
.compile('^0[xX][0-9a-fA-F]+')
90 FileExtensionPattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
91 TokenFindPattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
92 AllIncludeFileList
= []
94 # Get the closest parent
95 def GetParentAtLine (Line
):
96 for Profile
in AllIncludeFileList
:
97 if Profile
.IsLineInFile(Line
):
102 def IsValidInclude (File
, Line
):
103 for Profile
in AllIncludeFileList
:
104 if Profile
.IsLineInFile(Line
) and Profile
.FileName
== File
:
109 def GetRealFileLine (File
, Line
):
112 for Profile
in AllIncludeFileList
:
113 if Profile
.IsLineInFile(Line
):
114 return Profile
.GetLineInFile(Line
)
115 elif Line
>= Profile
.InsertStartLineNumber
and Profile
.Level
== 1:
116 InsertedLines
+= Profile
.GetTotalLines()
118 return (File
, Line
- InsertedLines
)
120 ## The exception class that used to report error messages when parsing FDF
122 # Currently the "ToolName" is set to be "FDF Parser".
124 class Warning (Exception):
127 # @param self The object pointer
128 # @param Str The message to record
129 # @param File The FDF name
130 # @param Line The Line number that error occurs
132 def __init__(self
, Str
, File
= None, Line
= None):
134 FileLineTuple
= GetRealFileLine(File
, Line
)
135 self
.FileName
= FileLineTuple
[0]
136 self
.LineNumber
= FileLineTuple
[1]
137 self
.OriginalLineNumber
= Line
139 self
.ToolName
= 'FdfParser'
144 ## The Include file content class that used to record file data when parsing include file
146 # May raise Exception when opening file.
148 class IncludeFileProfile
:
151 # @param self The object pointer
152 # @param FileName The file that to be parsed
154 def __init__(self
, FileName
):
155 self
.FileName
= FileName
156 self
.FileLinesList
= []
158 fsock
= open(FileName
, "rb", 0)
160 self
.FileLinesList
= fsock
.readlines()
161 for index
, line
in enumerate(self
.FileLinesList
):
162 if not line
.endswith('\n'):
163 self
.FileLinesList
[index
] += '\n'
169 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
171 self
.InsertStartLineNumber
= None
172 self
.InsertAdjust
= 0
173 self
.IncludeFileList
= []
174 self
.Level
= 1 # first level include file
176 def GetTotalLines(self
):
177 TotalLines
= self
.InsertAdjust
+ len(self
.FileLinesList
)
179 for Profile
in self
.IncludeFileList
:
180 TotalLines
+= Profile
.GetTotalLines()
184 def IsLineInFile(self
, Line
):
185 if Line
>= self
.InsertStartLineNumber
and Line
< self
.InsertStartLineNumber
+ self
.GetTotalLines():
190 def GetLineInFile(self
, Line
):
191 if not self
.IsLineInFile (Line
):
192 return (self
.FileName
, -1)
194 InsertedLines
= self
.InsertStartLineNumber
196 for Profile
in self
.IncludeFileList
:
197 if Profile
.IsLineInFile(Line
):
198 return Profile
.GetLineInFile(Line
)
199 elif Line
>= Profile
.InsertStartLineNumber
:
200 InsertedLines
+= Profile
.GetTotalLines()
202 return (self
.FileName
, Line
- InsertedLines
+ 1)
206 ## The FDF content class that used to record file data when parsing FDF
208 # May raise Exception when opening file.
213 # @param self The object pointer
214 # @param FileName The file that to be parsed
216 def __init__(self
, FileName
):
217 self
.FileLinesList
= []
219 fsock
= open(FileName
, "rb", 0)
221 self
.FileLinesList
= fsock
.readlines()
226 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
228 self
.FileName
= FileName
229 self
.PcdDict
= OrderedDict()
230 self
.PcdLocalDict
= OrderedDict()
232 self
.InfDict
= {'ArchTBD':[]}
233 # ECC will use this Dict and List information
234 self
.PcdFileLineDict
= {}
235 self
.InfFileLineList
= []
238 self
.FdNameNotSet
= False
240 self
.CapsuleDict
= {}
244 self
.FmpPayloadDict
= {}
246 ## The syntax parser for FDF
248 # PreprocessFile method should be called prior to ParseFile
249 # CycleReferenceCheck method can detect cycles in FDF contents
251 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
252 # Get*** procedures mean these procedures will make judgement on current token only.
257 # @param self The object pointer
258 # @param FileName The file that to be parsed
260 def __init__(self
, FileName
):
261 self
.Profile
= FileProfile(FileName
)
262 self
.FileName
= FileName
263 self
.CurrentLineNumber
= 1
264 self
.CurrentOffsetWithinLine
= 0
265 self
.CurrentFdName
= None
266 self
.CurrentFvName
= None
268 self
.__SkippedChars
= ""
269 GlobalData
.gFdfParser
= self
271 # Used to section info
272 self
.__CurSection
= []
273 # Key: [section name, UI name, arch]
274 # Value: {MACRO_NAME : MACRO_VALUE}
275 self
.__MacroDict
= tdict(True, 3)
276 self
.__PcdDict
= OrderedDict()
278 self
.__WipeOffArea
= []
279 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
280 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
282 ## __SkipWhiteSpace() method
284 # Skip white spaces from current char, return number of chars skipped
286 # @param self The object pointer
287 # @retval Count The number of chars skipped
289 def __SkipWhiteSpace(self
):
291 while not self
.__EndOfFile
():
293 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
294 self
.__SkippedChars
+= str(self
.__CurrentChar
())
301 ## __EndOfFile() method
303 # Judge current buffer pos is at file end
305 # @param self The object pointer
306 # @retval True Current File buffer position is at file end
307 # @retval False Current File buffer position is NOT at file end
309 def __EndOfFile(self
):
310 NumberOfLines
= len(self
.Profile
.FileLinesList
)
311 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
312 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
314 elif self
.CurrentLineNumber
> NumberOfLines
:
319 ## __EndOfLine() method
321 # Judge current buffer pos is at line end
323 # @param self The object pointer
324 # @retval True Current File buffer position is at line end
325 # @retval False Current File buffer position is NOT at line end
327 def __EndOfLine(self
):
328 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
330 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
331 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
338 # Reset file data buffer to the initial state
340 # @param self The object pointer
341 # @param DestLine Optional new destination line number.
342 # @param DestOffset Optional new destination offset.
344 def Rewind(self
, DestLine
= 1, DestOffset
= 0):
345 self
.CurrentLineNumber
= DestLine
346 self
.CurrentOffsetWithinLine
= DestOffset
348 ## __UndoOneChar() method
350 # Go back one char in the file buffer
352 # @param self The object pointer
353 # @retval True Successfully go back one char
354 # @retval False Not able to go back one char as file beginning reached
356 def __UndoOneChar(self
):
358 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
360 elif self
.CurrentOffsetWithinLine
== 0:
361 self
.CurrentLineNumber
-= 1
362 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
364 self
.CurrentOffsetWithinLine
-= 1
367 ## __GetOneChar() method
369 # Move forward one char in the file buffer
371 # @param self The object pointer
373 def __GetOneChar(self
):
374 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
375 self
.CurrentLineNumber
+= 1
376 self
.CurrentOffsetWithinLine
= 0
378 self
.CurrentOffsetWithinLine
+= 1
380 ## __CurrentChar() method
382 # Get the char pointed to by the file buffer pointer
384 # @param self The object pointer
385 # @retval Char Current char
387 def __CurrentChar(self
):
388 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
390 ## __NextChar() method
392 # Get the one char pass the char pointed to by the file buffer pointer
394 # @param self The object pointer
395 # @retval Char Next char
397 def __NextChar(self
):
398 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
399 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
401 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
403 ## __SetCurrentCharValue() method
405 # Modify the value of current char
407 # @param self The object pointer
408 # @param Value The new value of current char
410 def __SetCurrentCharValue(self
, Value
):
411 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
413 ## __CurrentLine() method
415 # Get the list that contains current line contents
417 # @param self The object pointer
418 # @retval List current line contents
420 def __CurrentLine(self
):
421 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
423 def __StringToList(self
):
424 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
425 if not self
.Profile
.FileLinesList
:
426 EdkLogger
.error('FdfParser', FILE_READ_FAILURE
, 'The file is empty!', File
=self
.FileName
)
427 self
.Profile
.FileLinesList
[-1].append(' ')
429 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
430 if StartPos
[0] == EndPos
[0]:
432 while Offset
<= EndPos
[1]:
433 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
438 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
439 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
443 while Line
< EndPos
[0]:
445 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
446 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
451 while Offset
<= EndPos
[1]:
452 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
456 def __GetMacroName(self
):
457 if not self
.__GetNextToken
():
458 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
459 MacroName
= self
.__Token
461 if MacroName
.startswith('!'):
463 MacroName
= MacroName
[1:].strip()
465 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
466 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
467 self
.FileName
, self
.CurrentLineNumber
)
468 MacroName
= MacroName
[2:-1]
469 return MacroName
, NotFlag
471 def __SetMacroValue(self
, Macro
, Value
):
472 if not self
.__CurSection
:
476 if not self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]:
477 self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]] = MacroDict
479 MacroDict
= self
.__MacroDict
[self
.__CurSection
[0], self
.__CurSection
[1], self
.__CurSection
[2]]
480 MacroDict
[Macro
] = Value
482 def __GetMacroValue(self
, Macro
):
484 if Macro
in GlobalData
.gCommandLineDefines
:
485 return GlobalData
.gCommandLineDefines
[Macro
]
486 if Macro
in GlobalData
.gGlobalDefines
:
487 return GlobalData
.gGlobalDefines
[Macro
]
489 if self
.__CurSection
:
490 MacroDict
= self
.__MacroDict
[
491 self
.__CurSection
[0],
492 self
.__CurSection
[1],
495 if MacroDict
and Macro
in MacroDict
:
496 return MacroDict
[Macro
]
499 if Macro
in GlobalData
.gPlatformDefines
:
500 return GlobalData
.gPlatformDefines
[Macro
]
503 def __SectionHeaderParser(self
, Section
):
505 # [FD.UiName]: use dummy instead if UI name is optional
508 # [Rule]: don't take rule section into account, macro is not allowed in this section
509 # [VTF.arch.UiName, arch]
510 # [OptionRom.DriverName]
511 self
.__CurSection
= []
512 Section
= Section
.strip()[1:-1].upper().replace(' ', '').strip('.')
513 ItemList
= Section
.split('.')
515 if Item
== '' or Item
== 'RULE':
518 if Item
== TAB_COMMON_DEFINES
.upper():
519 self
.__CurSection
= [TAB_COMMON
, TAB_COMMON
, TAB_COMMON
]
520 elif Item
== 'VTF' and len(ItemList
) == 3:
522 Pos
= UiName
.find(',')
524 UiName
= UiName
[:Pos
]
525 self
.__CurSection
= ['VTF', UiName
, ItemList
[1]]
526 elif len(ItemList
) > 1:
527 self
.__CurSection
= [ItemList
[0], ItemList
[1], TAB_COMMON
]
528 elif len(ItemList
) > 0:
529 self
.__CurSection
= [ItemList
[0], 'DUMMY', TAB_COMMON
]
531 ## PreprocessFile() method
533 # Preprocess file contents, replace comments with spaces.
534 # In the end, rewind the file buffer pointer to the beginning
535 # BUGBUG: No !include statement processing contained in this procedure
536 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
538 # @param self The object pointer
540 def PreprocessFile(self
):
544 DoubleSlashComment
= False
546 # HashComment in quoted string " " is ignored.
549 while not self
.__EndOfFile
():
551 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
552 InString
= not InString
553 # meet new line, then no longer in a comment for // and '#'
554 if self
.__CurrentChar
() == T_CHAR_LF
:
555 self
.CurrentLineNumber
+= 1
556 self
.CurrentOffsetWithinLine
= 0
557 if InComment
and DoubleSlashComment
:
559 DoubleSlashComment
= False
560 if InComment
and HashComment
:
563 # check for */ comment end
564 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
565 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
567 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
570 # set comments to spaces
572 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
574 # check for // comment
575 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
577 DoubleSlashComment
= True
578 # check for '#' comment
579 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
582 # check for /* comment start
583 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
584 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
586 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
592 # restore from ListOfList to ListOfString
593 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
596 ## PreprocessIncludeFile() method
598 # Preprocess file contents, replace !include statements with file contents.
599 # In the end, rewind the file buffer pointer to the beginning
601 # @param self The object pointer
603 def PreprocessIncludeFile(self
):
604 # nested include support
607 while self
.__GetNextToken
():
609 if self
.__Token
== 'DEFINE':
610 if not self
.__GetNextToken
():
611 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
613 if not self
.__IsToken
( "="):
614 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
615 Value
= self
.__GetExpression
()
616 MacroDict
[Macro
] = Value
618 elif self
.__Token
== '!include':
620 IncludeLine
= self
.CurrentLineNumber
621 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
622 if not self
.__GetNextToken
():
623 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
624 IncFileName
= self
.__Token
626 StartPos
= IncFileName
.find('$(', PreIndex
)
627 EndPos
= IncFileName
.find(')', StartPos
+2)
628 while StartPos
!= -1 and EndPos
!= -1:
629 Macro
= IncFileName
[StartPos
+2 : EndPos
]
630 MacroVal
= self
.__GetMacroValue
(Macro
)
632 if Macro
in MacroDict
:
633 MacroVal
= MacroDict
[Macro
]
634 if MacroVal
is not None:
635 IncFileName
= IncFileName
.replace('$(' + Macro
+ ')', MacroVal
, 1)
636 if MacroVal
.find('$(') != -1:
639 PreIndex
= StartPos
+ len(MacroVal
)
641 raise Warning("The Macro %s is not defined" %Macro
, self
.FileName
, self
.CurrentLineNumber
)
642 StartPos
= IncFileName
.find('$(', PreIndex
)
643 EndPos
= IncFileName
.find(')', StartPos
+2)
645 IncludedFile
= NormPath(IncFileName
)
647 # First search the include file under the same directory as FDF file
649 IncludedFile1
= PathClass(IncludedFile
, os
.path
.dirname(self
.FileName
))
650 ErrorCode
= IncludedFile1
.Validate()[0]
653 # Then search the include file under the same directory as DSC file
656 if GenFdsGlobalVariable
.ActivePlatform
:
657 PlatformDir
= GenFdsGlobalVariable
.ActivePlatform
.Dir
658 elif GlobalData
.gActivePlatform
:
659 PlatformDir
= GlobalData
.gActivePlatform
.MetaFile
.Dir
660 IncludedFile1
= PathClass(IncludedFile
, PlatformDir
)
661 ErrorCode
= IncludedFile1
.Validate()[0]
664 # Also search file under the WORKSPACE directory
666 IncludedFile1
= PathClass(IncludedFile
, GlobalData
.gWorkspace
)
667 ErrorCode
= IncludedFile1
.Validate()[0]
669 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
),
670 self
.FileName
, self
.CurrentLineNumber
)
672 if not IsValidInclude (IncludedFile1
.Path
, self
.CurrentLineNumber
):
673 raise Warning("The include file {0} is causing a include loop.\n".format (IncludedFile1
.Path
), self
.FileName
, self
.CurrentLineNumber
)
675 IncFileProfile
= IncludeFileProfile(IncludedFile1
.Path
)
677 CurrentLine
= self
.CurrentLineNumber
678 CurrentOffset
= self
.CurrentOffsetWithinLine
679 # list index of the insertion, note that line number is 'CurrentLine + 1'
680 InsertAtLine
= CurrentLine
681 ParentProfile
= GetParentAtLine (CurrentLine
)
682 if ParentProfile
is not None:
683 ParentProfile
.IncludeFileList
.insert(0, IncFileProfile
)
684 IncFileProfile
.Level
= ParentProfile
.Level
+ 1
685 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
686 # deal with remaining portions after "!include filename", if exists.
687 if self
.__GetNextToken
():
688 if self
.CurrentLineNumber
== CurrentLine
:
689 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
690 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
691 IncFileProfile
.InsertAdjust
+= 1
692 self
.CurrentLineNumber
+= 1
693 self
.CurrentOffsetWithinLine
= 0
695 for Line
in IncFileProfile
.FileLinesList
:
696 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
697 self
.CurrentLineNumber
+= 1
700 # reversely sorted to better determine error in file
701 AllIncludeFileList
.insert(0, IncFileProfile
)
703 # comment out the processed include file statement
704 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
705 TempList
.insert(IncludeOffset
, '#')
706 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
707 if Processed
: # Nested and back-to-back support
708 self
.Rewind(DestLine
= IncFileProfile
.InsertStartLineNumber
- 1)
714 def __GetIfListCurrentItemStat(IfList
):
724 ## PreprocessConditionalStatement() method
726 # Preprocess conditional statement.
727 # In the end, rewind the file buffer pointer to the beginning
729 # @param self The object pointer
731 def PreprocessConditionalStatement(self
):
732 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
736 while self
.__GetNextToken
():
737 # Determine section name and the location dependent macro
738 if self
.__GetIfListCurrentItemStat
(IfList
):
739 if self
.__Token
.startswith('['):
740 Header
= self
.__Token
741 if not self
.__Token
.endswith(']'):
742 self
.__SkipToToken
(']')
743 Header
+= self
.__SkippedChars
744 if Header
.find('$(') != -1:
745 raise Warning("macro cannot be used in section header", self
.FileName
, self
.CurrentLineNumber
)
746 self
.__SectionHeaderParser
(Header
)
748 # Replace macros except in RULE section or out of section
749 elif self
.__CurSection
and ReplacedLine
!= self
.CurrentLineNumber
:
750 ReplacedLine
= self
.CurrentLineNumber
752 CurLine
= self
.Profile
.FileLinesList
[ReplacedLine
- 1]
754 StartPos
= CurLine
.find('$(', PreIndex
)
755 EndPos
= CurLine
.find(')', StartPos
+2)
756 while StartPos
!= -1 and EndPos
!= -1 and self
.__Token
not in ['!ifdef', '!ifndef', '!if', '!elseif']:
757 MacroName
= CurLine
[StartPos
+2 : EndPos
]
758 MacorValue
= self
.__GetMacroValue
(MacroName
)
759 if MacorValue
is not None:
760 CurLine
= CurLine
.replace('$(' + MacroName
+ ')', MacorValue
, 1)
761 if MacorValue
.find('$(') != -1:
764 PreIndex
= StartPos
+ len(MacorValue
)
766 PreIndex
= EndPos
+ 1
767 StartPos
= CurLine
.find('$(', PreIndex
)
768 EndPos
= CurLine
.find(')', StartPos
+2)
769 self
.Profile
.FileLinesList
[ReplacedLine
- 1] = CurLine
772 if self
.__Token
== 'DEFINE':
773 if self
.__GetIfListCurrentItemStat
(IfList
):
774 if not self
.__CurSection
:
775 raise Warning("macro cannot be defined in Rule section or out of section", self
.FileName
, self
.CurrentLineNumber
)
776 DefineLine
= self
.CurrentLineNumber
- 1
777 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
778 if not self
.__GetNextToken
():
779 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
781 if not self
.__IsToken
( "="):
782 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
784 Value
= self
.__GetExpression
()
785 self
.__SetMacroValue
(Macro
, Value
)
786 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
787 elif self
.__Token
== 'SET':
788 if not self
.__GetIfListCurrentItemStat
(IfList
):
790 SetLine
= self
.CurrentLineNumber
- 1
791 SetOffset
= self
.CurrentOffsetWithinLine
- len('SET')
792 PcdPair
= self
.__GetNextPcdSettings
()
793 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
794 if not self
.__IsToken
( "="):
795 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
797 Value
= self
.__GetExpression
()
798 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
800 self
.__PcdDict
[PcdName
] = Value
802 self
.Profile
.PcdDict
[PcdPair
] = Value
803 self
.SetPcdLocalation(PcdPair
)
804 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
805 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
807 self
.__WipeOffArea
.append(((SetLine
, SetOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
808 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
809 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
810 IfList
.append([IfStartPos
, None, None])
812 CondLabel
= self
.__Token
813 Expression
= self
.__GetExpression
()
815 if CondLabel
== '!if':
816 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
818 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
819 if CondLabel
== '!ifndef':
820 ConditionSatisfied
= not ConditionSatisfied
822 BranchDetermined
= ConditionSatisfied
823 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
824 if ConditionSatisfied
:
825 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
826 elif self
.__Token
in ('!elseif', '!else'):
827 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
829 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
832 IfList
[-1] = [ElseStartPos
, False, True]
833 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
835 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
836 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
837 if self
.__Token
== '!elseif':
838 Expression
= self
.__GetExpression
()
839 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
840 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
844 IfList
[-1][1] = False
847 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
848 elif self
.__Token
== '!endif':
850 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
852 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
854 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
857 elif not IfList
: # Don't use PCDs inside conditional directive
858 if self
.CurrentLineNumber
<= RegionLayoutLine
:
859 # Don't try the same line twice
861 SetPcd
= ShortcutPcdPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
863 self
.__PcdDict
[SetPcd
.group('name')] = SetPcd
.group('value')
864 RegionLayoutLine
= self
.CurrentLineNumber
866 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
868 RegionLayoutLine
= self
.CurrentLineNumber
870 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
871 if not RegionSizeGuid
:
872 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
874 self
.__PcdDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
875 self
.__PcdDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
876 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
879 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
882 def __CollectMacroPcd(self
):
886 MacroDict
.update(GlobalData
.gPlatformPcds
)
887 MacroDict
.update(self
.__PcdDict
)
890 MacroDict
.update(GlobalData
.gPlatformDefines
)
892 if self
.__CurSection
:
894 ScopeMacro
= self
.__MacroDict
[TAB_COMMON
, TAB_COMMON
, TAB_COMMON
]
896 MacroDict
.update(ScopeMacro
)
899 ScopeMacro
= self
.__MacroDict
[
900 self
.__CurSection
[0],
901 self
.__CurSection
[1],
905 MacroDict
.update(ScopeMacro
)
907 MacroDict
.update(GlobalData
.gGlobalDefines
)
908 MacroDict
.update(GlobalData
.gCommandLineDefines
)
909 if GlobalData
.BuildOptionPcd
:
910 for Item
in GlobalData
.BuildOptionPcd
:
911 if isinstance(Item
, tuple):
913 PcdName
, TmpValue
= Item
.split("=")
914 TmpValue
= BuildOptionValue(TmpValue
, {})
915 MacroDict
[PcdName
.strip()] = TmpValue
920 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
921 MacroPcdDict
= self
.__CollectMacroPcd
()
925 return ValueExpression(Expression
, MacroPcdDict
)(True)
927 return ValueExpression(Expression
, MacroPcdDict
)()
928 except WrnExpression
as Excpt
:
930 # Catch expression evaluation warning here. We need to report
931 # the precise number of line and return the evaluation result
933 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
934 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
937 except Exception as Excpt
:
938 if hasattr(Excpt
, 'Pcd'):
939 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
940 Info
= GlobalData
.gPlatformOtherPcds
[Excpt
.Pcd
]
941 raise Warning("Cannot use this PCD (%s) in an expression as"
942 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
943 " of the DSC file (%s), and it is currently defined in this section:"
944 " %s, line #: %d." % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE'], Info
[0], Info
[1]),
947 raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt
.Pcd
, GlobalData
.gPlatformOtherPcds
['DSCFILE']),
950 raise Warning(str(Excpt
), self
.FileName
, Line
)
952 if Expression
.startswith('$(') and Expression
[-1] == ')':
953 Expression
= Expression
[2:-1]
954 return Expression
in MacroPcdDict
956 ## __IsToken() method
958 # Check whether input string is found from current char position along
959 # If found, the string value is put into self.__Token
961 # @param self The object pointer
962 # @param String The string to search
963 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
964 # @retval True Successfully find string, file buffer pointer moved forward
965 # @retval False Not able to find string, file buffer pointer not changed
967 def __IsToken(self
, String
, IgnoreCase
= False):
968 self
.__SkipWhiteSpace
()
970 # Only consider the same line, no multi-line token allowed
971 StartPos
= self
.CurrentOffsetWithinLine
974 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
976 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
978 self
.CurrentOffsetWithinLine
+= len(String
)
979 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
983 ## __IsKeyword() method
985 # Check whether input keyword is found from current char position along, whole word only!
986 # If found, the string value is put into self.__Token
988 # @param self The object pointer
989 # @param Keyword The string to search
990 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
991 # @retval True Successfully find string, file buffer pointer moved forward
992 # @retval False Not able to find string, file buffer pointer not changed
994 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
995 self
.__SkipWhiteSpace
()
997 # Only consider the same line, no multi-line token allowed
998 StartPos
= self
.CurrentOffsetWithinLine
1001 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
1003 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
1005 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
1006 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
1008 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
1009 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1013 def __GetExpression(self
):
1014 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
1015 Index
= len(Line
) - 1
1016 while Line
[Index
] in ['\r', '\n']:
1018 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
1019 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
1020 ExpressionString
= ExpressionString
.strip()
1021 return ExpressionString
1023 ## __GetNextWord() method
1025 # Get next C name from file lines
1026 # If found, the string value is put into self.__Token
1028 # @param self The object pointer
1029 # @retval True Successfully find a C name string, file buffer pointer moved forward
1030 # @retval False Not able to find a C name string, file buffer pointer not changed
1032 def __GetNextWord(self
):
1033 self
.__SkipWhiteSpace
()
1034 if self
.__EndOfFile
():
1037 TempChar
= self
.__CurrentChar
()
1038 StartPos
= self
.CurrentOffsetWithinLine
1039 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
1041 while not self
.__EndOfLine
():
1042 TempChar
= self
.__CurrentChar
()
1043 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
1044 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
1050 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1055 def __GetNextPcdWord(self
):
1056 self
.__SkipWhiteSpace
()
1057 if self
.__EndOfFile
():
1060 TempChar
= self
.__CurrentChar
()
1061 StartPos
= self
.CurrentOffsetWithinLine
1062 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_' or TempChar
== '[' or TempChar
== ']':
1064 while not self
.__EndOfLine
():
1065 TempChar
= self
.__CurrentChar
()
1066 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
1067 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-' or TempChar
== '[' or TempChar
== ']':
1073 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
1078 ## __GetNextToken() method
1080 # Get next token unit before a seperator
1081 # If found, the string value is put into self.__Token
1083 # @param self The object pointer
1084 # @retval True Successfully find a token unit, file buffer pointer moved forward
1085 # @retval False Not able to find a token unit, file buffer pointer not changed
1087 def __GetNextToken(self
):
1088 # Skip leading spaces, if exist.
1089 self
.__SkipWhiteSpace
()
1090 if self
.__EndOfFile
():
1092 # Record the token start position, the position of the first non-space char.
1093 StartPos
= self
.CurrentOffsetWithinLine
1094 StartLine
= self
.CurrentLineNumber
1095 while StartLine
== self
.CurrentLineNumber
:
1096 TempChar
= self
.__CurrentChar
()
1097 # Try to find the end char that is not a space and not in seperator tuple.
1098 # That is, when we got a space or any char in the tuple, we got the end of token.
1099 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
1101 # if we happen to meet a seperator as the first char, we must proceed to get it.
1102 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1103 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1111 EndPos
= self
.CurrentOffsetWithinLine
1112 if self
.CurrentLineNumber
!= StartLine
:
1113 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
1114 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
1115 if self
.__Token
.lower() in [TAB_IF
, TAB_END_IF
, TAB_ELSE_IF
, TAB_ELSE
, TAB_IF_DEF
, TAB_IF_N_DEF
, TAB_ERROR
, TAB_INCLUDE
]:
1116 self
.__Token
= self
.__Token
.lower()
1117 if StartPos
!= self
.CurrentOffsetWithinLine
:
1122 ## __GetNextGuid() method
1124 # Get next token unit before a seperator
1125 # If found, the GUID string is put into self.__Token
1127 # @param self The object pointer
1128 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
1129 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
1131 def __GetNextGuid(self
):
1133 if not self
.__GetNextToken
():
1135 if gGuidPattern
.match(self
.__Token
) is not None:
1142 def __Verify(Name
, Value
, Scope
):
1143 # value verification only applies to numeric values.
1144 if Scope
not in TAB_PCD_NUMERIC_TYPES
:
1149 ValueNumber
= int(Value
, 0)
1151 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value is not valid dec or hex number for %s." % Name
)
1153 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "The value can't be set to negative value for %s." % Name
)
1154 if ValueNumber
> MAX_VAL_TYPE
[Scope
]:
1155 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "Too large value for %s." % Name
)
1158 ## __UndoToken() method
1160 # Go back one token unit in file buffer
1162 # @param self The object pointer
1164 def __UndoToken(self
):
1165 self
.__UndoOneChar
()
1166 while self
.__CurrentChar
().isspace():
1167 if not self
.__UndoOneChar
():
1172 StartPos
= self
.CurrentOffsetWithinLine
1173 CurrentLine
= self
.CurrentLineNumber
1174 while CurrentLine
== self
.CurrentLineNumber
:
1176 TempChar
= self
.__CurrentChar
()
1177 # Try to find the end char that is not a space and not in seperator tuple.
1178 # That is, when we got a space or any char in the tuple, we got the end of token.
1179 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
1180 if not self
.__UndoOneChar
():
1182 # if we happen to meet a seperator as the first char, we must proceed to get it.
1183 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
1184 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
1191 ## __GetNextHexNumber() method
1193 # Get next HEX data before a seperator
1194 # If found, the HEX data is put into self.__Token
1196 # @param self The object pointer
1197 # @retval True Successfully find a HEX data, file buffer pointer moved forward
1198 # @retval False Not able to find a HEX data, file buffer pointer not changed
1200 def __GetNextHexNumber(self
):
1201 if not self
.__GetNextToken
():
1203 if gHexPatternAll
.match(self
.__Token
):
1209 ## __GetNextDecimalNumber() method
1211 # Get next decimal data before a seperator
1212 # If found, the decimal data is put into self.__Token
1214 # @param self The object pointer
1215 # @retval True Successfully find a decimal data, file buffer pointer moved forward
1216 # @retval False Not able to find a decimal data, file buffer pointer not changed
1218 def __GetNextDecimalNumber(self
):
1219 if not self
.__GetNextToken
():
1221 if self
.__Token
.isdigit():
1227 def __GetNextPcdSettings(self
):
1228 if not self
.__GetNextWord
():
1229 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1230 pcdTokenSpaceCName
= self
.__Token
1232 if not self
.__IsToken
( "."):
1233 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1235 if not self
.__GetNextWord
():
1236 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1237 pcdCName
= self
.__Token
1240 while self
.__IsToken
("."):
1241 if not self
.__GetNextPcdWord
():
1242 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1243 Fields
.append(self
.__Token
)
1245 return (pcdCName
, pcdTokenSpaceCName
,".".join(Fields
))
1247 ## __GetStringData() method
1249 # Get string contents quoted in ""
1250 # If found, the decimal data is put into self.__Token
1252 # @param self The object pointer
1253 # @retval True Successfully find a string data, file buffer pointer moved forward
1254 # @retval False Not able to find a string data, file buffer pointer not changed
1256 def __GetStringData(self
):
1257 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1259 self
.__SkipToToken
("\"")
1260 currentLineNumber
= self
.CurrentLineNumber
1262 if not self
.__SkipToToken
("\""):
1263 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1264 if currentLineNumber
!= self
.CurrentLineNumber
:
1265 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1266 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1269 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1271 self
.__SkipToToken
("\'")
1272 currentLineNumber
= self
.CurrentLineNumber
1274 if not self
.__SkipToToken
("\'"):
1275 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1276 if currentLineNumber
!= self
.CurrentLineNumber
:
1277 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1278 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1284 ## __SkipToToken() method
1286 # Search forward in file buffer for the string
1287 # The skipped chars are put into self.__SkippedChars
1289 # @param self The object pointer
1290 # @param String The string to search
1291 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1292 # @retval True Successfully find the string, file buffer pointer moved forward
1293 # @retval False Not able to find the string, file buffer pointer not changed
1295 def __SkipToToken(self
, String
, IgnoreCase
= False):
1296 StartPos
= self
.GetFileBufferPos()
1298 self
.__SkippedChars
= ""
1299 while not self
.__EndOfFile
():
1302 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1304 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1306 self
.CurrentOffsetWithinLine
+= len(String
)
1307 self
.__SkippedChars
+= String
1309 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1312 self
.SetFileBufferPos( StartPos
)
1313 self
.__SkippedChars
= ""
1316 ## GetFileBufferPos() method
1318 # Return the tuple of current line and offset within the line
1320 # @param self The object pointer
1321 # @retval Tuple Line number and offset pair
1323 def GetFileBufferPos(self
):
1324 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1326 ## SetFileBufferPos() method
1328 # Restore the file buffer position
1330 # @param self The object pointer
1331 # @param Pos The new file buffer position
1333 def SetFileBufferPos(self
, Pos
):
1334 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1336 ## Preprocess() method
1338 # Preprocess comment, conditional directive, include directive, replace macro.
1339 # Exception will be raised if syntax error found
1341 # @param self The object pointer
1343 def Preprocess(self
):
1344 self
.__StringToList
()
1345 self
.PreprocessFile()
1346 self
.PreprocessIncludeFile()
1347 self
.__StringToList
()
1348 self
.PreprocessFile()
1349 self
.PreprocessConditionalStatement()
1350 self
.__StringToList
()
1351 for Pos
in self
.__WipeOffArea
:
1352 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1353 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1355 while self
.__GetDefines
():
1358 ## ParseFile() method
1360 # Parse the file profile buffer to extract fd, fv ... information
1361 # Exception will be raised if syntax error found
1363 # @param self The object pointer
1365 def ParseFile(self
):
1371 # Keep processing sections of the FDF until no new sections or a syntax error is found
1373 while self
.__GetFd
() or self
.__GetFv
() or self
.__GetFmp
() or self
.__GetCapsule
() or self
.__GetVtf
() or self
.__GetRule
() or self
.__GetOptionRom
():
1376 except Warning as X
:
1378 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1379 # At this point, the closest parent would be the included file itself
1380 Profile
= GetParentAtLine(X
.OriginalLineNumber
)
1381 if Profile
is not None:
1382 X
.Message
+= ' near line %d, column %d: %s' \
1383 % (X
.LineNumber
, 0, Profile
.FileLinesList
[X
.LineNumber
-1])
1385 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1386 X
.Message
+= ' near line %d, column %d: %s' \
1387 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1390 ## SectionParser() method
1392 # Parse the file section info
1393 # Exception will be raised if syntax error found
1395 # @param self The object pointer
1396 # @param section The section string
1398 def SectionParser(self
, section
):
1400 if not S
.startswith("[DEFINES") and not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1401 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM.") and not S
.startswith('[FMPPAYLOAD.'):
1402 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self
.FileName
, self
.CurrentLineNumber
)
1404 ## __GetDefines() method
1406 # Get Defines section contents and store its data into AllMacrosList
1408 # @param self The object pointer
1409 # @retval True Successfully find a Defines
1410 # @retval False Not able to find a Defines
1412 def __GetDefines(self
):
1414 if not self
.__GetNextToken
():
1417 S
= self
.__Token
.upper()
1418 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1419 self
.SectionParser(S
)
1424 if not self
.__IsToken
("[DEFINES", True):
1425 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1426 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1427 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1428 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1430 if not self
.__IsToken
( "]"):
1431 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1433 while self
.__GetNextWord
():
1434 # handle the SET statement
1435 if self
.__Token
== 'SET':
1437 self
.__GetSetStatement
(None)
1440 Macro
= self
.__Token
1442 if not self
.__IsToken
("="):
1443 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1444 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1445 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1446 Value
= self
.__Token
1450 ##__GetError() method
1451 def __GetError(self
):
1452 #save the Current information
1453 CurrentLine
= self
.CurrentLineNumber
1454 CurrentOffset
= self
.CurrentOffsetWithinLine
1455 while self
.__GetNextToken
():
1456 if self
.__Token
== TAB_ERROR
:
1457 EdkLogger
.error('FdfParser', ERROR_STATEMENT
, self
.__CurrentLine
().replace(TAB_ERROR
, '', 1), File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
1458 self
.CurrentLineNumber
= CurrentLine
1459 self
.CurrentOffsetWithinLine
= CurrentOffset
1463 # Get FD section contents and store its data into FD dictionary of self.Profile
1465 # @param self The object pointer
1466 # @retval True Successfully find a FD
1467 # @retval False Not able to find a FD
1471 if not self
.__GetNextToken
():
1474 S
= self
.__Token
.upper()
1475 if S
.startswith("[") and not S
.startswith("[FD."):
1476 if not S
.startswith("[FV.") and not S
.startswith('[FMPPAYLOAD.') and not S
.startswith("[CAPSULE.") \
1477 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1478 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1483 if not self
.__IsToken
("[FD.", True):
1484 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1485 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1486 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1487 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1489 FdName
= self
.__GetUiName
()
1491 if len (self
.Profile
.FdDict
) == 0:
1492 FdName
= GenFdsGlobalVariable
.PlatformName
1493 if FdName
== "" and GlobalData
.gActivePlatform
:
1494 FdName
= GlobalData
.gActivePlatform
.PlatformName
1495 self
.Profile
.FdNameNotSet
= True
1497 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1498 self
.CurrentFdName
= FdName
.upper()
1500 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1501 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1503 if not self
.__IsToken
( "]"):
1504 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1507 FdObj
.FdUiName
= self
.CurrentFdName
1508 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1510 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1511 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1513 Status
= self
.__GetCreateFile
(FdObj
)
1515 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1517 while self
.__GetTokenStatements
(FdObj
):
1519 for Attr
in ("BaseAddress", "Size", "ErasePolarity"):
1520 if getattr(FdObj
, Attr
) is None:
1521 self
.__GetNextToken
()
1522 raise Warning("Keyword %s missing" % Attr
, self
.FileName
, self
.CurrentLineNumber
)
1524 if not FdObj
.BlockSizeList
:
1525 FdObj
.BlockSizeList
.append((1, FdObj
.Size
, None))
1527 self
.__GetDefineStatements
(FdObj
)
1529 self
.__GetSetStatements
(FdObj
)
1531 if not self
.__GetRegionLayout
(FdObj
):
1532 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1534 while self
.__GetRegionLayout
(FdObj
):
1538 ## __GetUiName() method
1540 # Return the UI name of a section
1542 # @param self The object pointer
1543 # @retval FdName UI name
1545 def __GetUiName(self
):
1547 if self
.__GetNextWord
():
1552 ## __GetCreateFile() method
1554 # Return the output file name of object
1556 # @param self The object pointer
1557 # @param Obj object whose data will be stored in file
1558 # @retval FdName UI name
1560 def __GetCreateFile(self
, Obj
):
1562 if self
.__IsKeyword
( "CREATE_FILE"):
1563 if not self
.__IsToken
( "="):
1564 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1566 if not self
.__GetNextToken
():
1567 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1569 FileName
= self
.__Token
1570 Obj
.CreateFileName
= FileName
1574 def SetPcdLocalation(self
,pcdpair
):
1575 self
.Profile
.PcdLocalDict
[pcdpair
] = (self
.Profile
.FileName
,self
.CurrentLineNumber
)
1577 ## __GetTokenStatements() method
1579 # Get token statements
1581 # @param self The object pointer
1582 # @param Obj for whom token statement is got
1584 def __GetTokenStatements(self
, Obj
):
1585 if self
.__IsKeyword
( "BaseAddress"):
1586 if not self
.__IsToken
( "="):
1587 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1589 if not self
.__GetNextHexNumber
():
1590 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1592 Obj
.BaseAddress
= self
.__Token
1594 if self
.__IsToken
( "|"):
1595 pcdPair
= self
.__GetNextPcdSettings
()
1596 Obj
.BaseAddressPcd
= pcdPair
1597 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1598 self
.SetPcdLocalation(pcdPair
)
1599 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1600 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1603 if self
.__IsKeyword
( "Size"):
1604 if not self
.__IsToken
( "="):
1605 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1607 if not self
.__GetNextHexNumber
():
1608 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1611 if self
.__IsToken
( "|"):
1612 pcdPair
= self
.__GetNextPcdSettings
()
1613 Obj
.SizePcd
= pcdPair
1614 self
.Profile
.PcdDict
[pcdPair
] = Size
1615 self
.SetPcdLocalation(pcdPair
)
1616 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1617 self
.Profile
.PcdFileLineDict
[pcdPair
] = FileLineTuple
1618 Obj
.Size
= long(Size
, 0)
1621 if self
.__IsKeyword
( "ErasePolarity"):
1622 if not self
.__IsToken
( "="):
1623 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1625 if not self
.__GetNextToken
():
1626 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1628 if self
.__Token
!= "1" and self
.__Token
!= "0":
1629 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1631 Obj
.ErasePolarity
= self
.__Token
1634 return self
.__GetBlockStatements
(Obj
)
1636 ## __GetAddressStatements() method
1638 # Get address statements
1640 # @param self The object pointer
1641 # @param Obj for whom address statement is got
1642 # @retval True Successfully find
1643 # @retval False Not able to find
1645 def __GetAddressStatements(self
, Obj
):
1647 if self
.__IsKeyword
("BsBaseAddress"):
1648 if not self
.__IsToken
( "="):
1649 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1651 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1652 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1654 BsAddress
= long(self
.__Token
, 0)
1655 Obj
.BsBaseAddress
= BsAddress
1657 if self
.__IsKeyword
("RtBaseAddress"):
1658 if not self
.__IsToken
( "="):
1659 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1661 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1662 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1664 RtAddress
= long(self
.__Token
, 0)
1665 Obj
.RtBaseAddress
= RtAddress
1667 ## __GetBlockStatements() method
1669 # Get block statements
1671 # @param self The object pointer
1672 # @param Obj for whom block statement is got
1674 def __GetBlockStatements(self
, Obj
):
1676 while self
.__GetBlockStatement
(Obj
):
1679 Item
= Obj
.BlockSizeList
[-1]
1680 if Item
[0] is None or Item
[1] is None:
1681 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1684 ## __GetBlockStatement() method
1686 # Get block statement
1688 # @param self The object pointer
1689 # @param Obj for whom block statement is got
1690 # @retval True Successfully find
1691 # @retval False Not able to find
1693 def __GetBlockStatement(self
, Obj
):
1694 if not self
.__IsKeyword
( "BlockSize"):
1697 if not self
.__IsToken
( "="):
1698 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1700 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1701 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1703 BlockSize
= self
.__Token
1705 if self
.__IsToken
( "|"):
1706 PcdPair
= self
.__GetNextPcdSettings
()
1707 BlockSizePcd
= PcdPair
1708 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1709 self
.SetPcdLocalation(PcdPair
)
1710 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1711 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1712 BlockSize
= long(BlockSize
, 0)
1715 if self
.__IsKeyword
( "NumBlocks"):
1716 if not self
.__IsToken
( "="):
1717 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1719 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1720 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1722 BlockNumber
= long(self
.__Token
, 0)
1724 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1727 ## __GetDefineStatements() method
1729 # Get define statements
1731 # @param self The object pointer
1732 # @param Obj for whom define statement is got
1733 # @retval True Successfully find
1734 # @retval False Not able to find
1736 def __GetDefineStatements(self
, Obj
):
1737 while self
.__GetDefineStatement
( Obj
):
1740 ## __GetDefineStatement() method
1742 # Get define statement
1744 # @param self The object pointer
1745 # @param Obj for whom define statement is got
1746 # @retval True Successfully find
1747 # @retval False Not able to find
1749 def __GetDefineStatement(self
, Obj
):
1750 if self
.__IsKeyword
("DEFINE"):
1751 self
.__GetNextToken
()
1752 Macro
= self
.__Token
1753 if not self
.__IsToken
( "="):
1754 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1756 if not self
.__GetNextToken
():
1757 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1759 Value
= self
.__Token
1760 Macro
= '$(' + Macro
+ ')'
1761 Obj
.DefineVarDict
[Macro
] = Value
1766 ## __GetSetStatements() method
1768 # Get set statements
1770 # @param self The object pointer
1771 # @param Obj for whom set statement is got
1772 # @retval True Successfully find
1773 # @retval False Not able to find
1775 def __GetSetStatements(self
, Obj
):
1776 while self
.__GetSetStatement
(Obj
):
1779 ## __GetSetStatement() method
1783 # @param self The object pointer
1784 # @param Obj for whom set statement is got
1785 # @retval True Successfully find
1786 # @retval False Not able to find
1788 def __GetSetStatement(self
, Obj
):
1789 if self
.__IsKeyword
("SET"):
1790 PcdPair
= self
.__GetNextPcdSettings
()
1792 if not self
.__IsToken
( "="):
1793 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1795 Value
= self
.__GetExpression
()
1796 Value
= self
.__EvaluateConditional
(Value
, self
.CurrentLineNumber
, 'eval', True)
1799 Obj
.SetVarDict
[PcdPair
] = Value
1800 self
.Profile
.PcdDict
[PcdPair
] = Value
1801 self
.SetPcdLocalation(PcdPair
)
1802 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1803 self
.Profile
.PcdFileLineDict
[PcdPair
] = FileLineTuple
1808 ## __CalcRegionExpr(self)
1810 # Calculate expression for offset or size of a region
1812 # @return: None if invalid expression
1813 # Calculated number if successfully
1815 def __CalcRegionExpr(self
):
1816 StartPos
= self
.GetFileBufferPos()
1819 while not self
.__EndOfFile
():
1820 CurCh
= self
.__CurrentChar
()
1826 if CurCh
in '|\r\n' and PairCount
== 0:
1832 ValueExpression(Expr
,
1833 self
.__CollectMacroPcd
()
1836 self
.SetFileBufferPos(StartPos
)
1839 ## __GetRegionLayout() method
1841 # Get region layout for FD
1843 # @param self The object pointer
1844 # @param Fd for whom region is got
1845 # @retval True Successfully find
1846 # @retval False Not able to find
1848 def __GetRegionLayout(self
, Fd
):
1849 Offset
= self
.__CalcRegionExpr
()
1853 RegionObj
= Region
.Region()
1854 RegionObj
.Offset
= Offset
1855 Fd
.RegionList
.append(RegionObj
)
1857 if not self
.__IsToken
( "|"):
1858 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1860 Size
= self
.__CalcRegionExpr
()
1862 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1863 RegionObj
.Size
= Size
1865 if not self
.__GetNextWord
():
1868 if not self
.__Token
in ("SET", BINARY_FILE_TYPE_FV
, "FILE", "DATA", "CAPSULE", "INF"):
1870 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]
1871 # Or it might be next region's offset described by an expression which starts with a PCD.
1872 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size
1875 IsRegionPcd
= (RegionSizeGuidPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]) or
1876 RegionOffsetPcdPattern
.match(self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
:]))
1878 RegionObj
.PcdOffset
= self
.__GetNextPcdSettings
()
1879 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1880 self
.SetPcdLocalation(RegionObj
.PcdOffset
)
1881 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdOffset
[1], RegionObj
.PcdOffset
[0])] = "0x%x" % RegionObj
.Offset
1882 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1883 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdOffset
] = FileLineTuple
1884 if self
.__IsToken
( "|"):
1885 RegionObj
.PcdSize
= self
.__GetNextPcdSettings
()
1886 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1887 self
.SetPcdLocalation(RegionObj
.PcdSize
)
1888 self
.__PcdDict
['%s.%s' % (RegionObj
.PcdSize
[1], RegionObj
.PcdSize
[0])] = "0x%x" % RegionObj
.Size
1889 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1890 self
.Profile
.PcdFileLineDict
[RegionObj
.PcdSize
] = FileLineTuple
1892 if not self
.__GetNextWord
():
1895 if self
.__Token
== "SET":
1897 self
.__GetSetStatements
( RegionObj
)
1898 if not self
.__GetNextWord
():
1901 elif self
.__Token
== BINARY_FILE_TYPE_FV
:
1903 self
.__GetRegionFvType
( RegionObj
)
1905 elif self
.__Token
== "CAPSULE":
1907 self
.__GetRegionCapType
( RegionObj
)
1909 elif self
.__Token
== "FILE":
1911 self
.__GetRegionFileType
(RegionObj
)
1913 elif self
.__Token
== "INF":
1915 RegionObj
.RegionType
= "INF"
1916 while self
.__IsKeyword
("INF"):
1918 ffsInf
= self
.__ParseInfStatement
()
1921 RegionObj
.RegionDataList
.append(ffsInf
)
1923 elif self
.__Token
== "DATA":
1925 self
.__GetRegionDataType
(RegionObj
)
1928 if self
.__GetRegionLayout
(Fd
):
1930 raise Warning("A valid region type was not found. "
1931 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",
1932 self
.FileName
, self
.CurrentLineNumber
)
1936 ## __GetRegionFvType() method
1938 # Get region fv data for region
1940 # @param self The object pointer
1941 # @param RegionObj for whom region data is got
1943 def __GetRegionFvType(self
, RegionObj
):
1945 if not self
.__IsKeyword
( BINARY_FILE_TYPE_FV
):
1946 raise Warning("expected Keyword BINARY_FILE_TYPE_FV", 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 FV name", self
.FileName
, self
.CurrentLineNumber
)
1954 RegionObj
.RegionType
= BINARY_FILE_TYPE_FV
1955 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1957 while self
.__IsKeyword
( BINARY_FILE_TYPE_FV
):
1959 if not self
.__IsToken
( "="):
1960 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1962 if not self
.__GetNextToken
():
1963 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1965 RegionObj
.RegionDataList
.append((self
.__Token
).upper())
1967 ## __GetRegionCapType() method
1969 # Get region capsule data for region
1971 # @param self The object pointer
1972 # @param RegionObj for whom region data is got
1974 def __GetRegionCapType(self
, RegionObj
):
1976 if not self
.__IsKeyword
("CAPSULE"):
1977 raise Warning("expected Keyword 'CAPSULE'", 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 CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1985 RegionObj
.RegionType
= "CAPSULE"
1986 RegionObj
.RegionDataList
.append(self
.__Token
)
1988 while self
.__IsKeyword
("CAPSULE"):
1990 if not self
.__IsToken
("="):
1991 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1993 if not self
.__GetNextToken
():
1994 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1996 RegionObj
.RegionDataList
.append(self
.__Token
)
1998 ## __GetRegionFileType() method
2000 # Get region file data for region
2002 # @param self The object pointer
2003 # @param RegionObj for whom region data is got
2005 def __GetRegionFileType(self
, RegionObj
):
2007 if not self
.__IsKeyword
( "FILE"):
2008 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
2010 if not self
.__IsToken
( "="):
2011 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2013 if not self
.__GetNextToken
():
2014 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
2016 RegionObj
.RegionType
= "FILE"
2017 RegionObj
.RegionDataList
.append( self
.__Token
)
2019 while self
.__IsKeyword
( "FILE"):
2021 if not self
.__IsToken
( "="):
2022 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2024 if not self
.__GetNextToken
():
2025 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
2027 RegionObj
.RegionDataList
.append(self
.__Token
)
2029 ## __GetRegionDataType() method
2031 # Get region array data for region
2033 # @param self The object pointer
2034 # @param RegionObj for whom region data is got
2036 def __GetRegionDataType(self
, RegionObj
):
2038 if not self
.__IsKeyword
( "DATA"):
2039 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
2041 if not self
.__IsToken
( "="):
2042 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2044 if not self
.__IsToken
( "{"):
2045 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2047 if not self
.__GetNextHexNumber
():
2048 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2050 if len(self
.__Token
) > 18:
2051 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2053 # convert hex string value to byte hex string array
2054 AllString
= self
.__Token
2055 AllStrLen
= len (AllString
)
2057 while AllStrLen
> 4:
2058 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2059 AllStrLen
= AllStrLen
- 2
2060 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2063 if len (self
.__Token
) <= 4:
2064 while self
.__IsToken
(","):
2065 if not self
.__GetNextHexNumber
():
2066 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2067 if len(self
.__Token
) > 4:
2068 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2069 DataString
+= self
.__Token
2072 if not self
.__IsToken
( "}"):
2073 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2075 DataString
= DataString
.rstrip(",")
2076 RegionObj
.RegionType
= "DATA"
2077 RegionObj
.RegionDataList
.append( DataString
)
2079 while self
.__IsKeyword
( "DATA"):
2081 if not self
.__IsToken
( "="):
2082 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2084 if not self
.__IsToken
( "{"):
2085 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2087 if not self
.__GetNextHexNumber
():
2088 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2090 if len(self
.__Token
) > 18:
2091 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
2093 # convert hex string value to byte hex string array
2094 AllString
= self
.__Token
2095 AllStrLen
= len (AllString
)
2097 while AllStrLen
> 4:
2098 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
2099 AllStrLen
= AllStrLen
- 2
2100 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
2103 if len (self
.__Token
) <= 4:
2104 while self
.__IsToken
(","):
2105 if not self
.__GetNextHexNumber
():
2106 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2107 if len(self
.__Token
) > 4:
2108 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2109 DataString
+= self
.__Token
2112 if not self
.__IsToken
( "}"):
2113 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2115 DataString
= DataString
.rstrip(",")
2116 RegionObj
.RegionDataList
.append( DataString
)
2120 # Get FV section contents and store its data into FV dictionary of self.Profile
2122 # @param self The object pointer
2123 # @retval True Successfully find a FV
2124 # @retval False Not able to find a FV
2127 if not self
.__GetNextToken
():
2130 S
= self
.__Token
.upper()
2131 if S
.startswith("[") and not S
.startswith("[FV."):
2132 self
.SectionParser(S
)
2137 if not self
.__IsToken
("[FV.", True):
2138 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2139 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2140 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2141 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2143 FvName
= self
.__GetUiName
()
2144 self
.CurrentFvName
= FvName
.upper()
2146 if not self
.__IsToken
( "]"):
2147 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2150 FvObj
.UiFvName
= self
.CurrentFvName
2151 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
2153 Status
= self
.__GetCreateFile
(FvObj
)
2155 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
2157 self
.__GetDefineStatements
(FvObj
)
2159 self
.__GetAddressStatements
(FvObj
)
2161 FvObj
.FvExtEntryTypeValue
= []
2162 FvObj
.FvExtEntryType
= []
2163 FvObj
.FvExtEntryData
= []
2165 self
.__GetSetStatements
(FvObj
)
2167 if not (self
.__GetBlockStatement
(FvObj
) or self
.__GetFvBaseAddress
(FvObj
) or
2168 self
.__GetFvForceRebase
(FvObj
) or self
.__GetFvAlignment
(FvObj
) or
2169 self
.__GetFvAttributes
(FvObj
) or self
.__GetFvNameGuid
(FvObj
) or
2170 self
.__GetFvExtEntryStatement
(FvObj
) or self
.__GetFvNameString
(FvObj
)):
2173 if FvObj
.FvNameString
== 'TRUE' and not FvObj
.FvNameGuid
:
2174 raise Warning("FvNameString found but FvNameGuid was not found", self
.FileName
, self
.CurrentLineNumber
)
2176 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2177 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
2180 isInf
= self
.__GetInfStatement
(FvObj
)
2181 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
2182 if not isInf
and not isFile
:
2187 ## __GetFvAlignment() method
2189 # Get alignment for FV
2191 # @param self The object pointer
2192 # @param Obj for whom alignment is got
2193 # @retval True Successfully find a alignment statement
2194 # @retval False Not able to find a alignment statement
2196 def __GetFvAlignment(self
, Obj
):
2198 if not self
.__IsKeyword
( "FvAlignment"):
2201 if not self
.__IsToken
( "="):
2202 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2204 if not self
.__GetNextToken
():
2205 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2207 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
2208 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
2209 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
2211 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2212 Obj
.FvAlignment
= self
.__Token
2215 ## __GetFvBaseAddress() method
2217 # Get BaseAddress for FV
2219 # @param self The object pointer
2220 # @param Obj for whom FvBaseAddress is got
2221 # @retval True Successfully find a FvBaseAddress statement
2222 # @retval False Not able to find a FvBaseAddress statement
2224 def __GetFvBaseAddress(self
, Obj
):
2226 if not self
.__IsKeyword
("FvBaseAddress"):
2229 if not self
.__IsToken
( "="):
2230 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2232 if not self
.__GetNextToken
():
2233 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
2235 if not BaseAddrValuePattern
.match(self
.__Token
.upper()):
2236 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2237 Obj
.FvBaseAddress
= self
.__Token
2240 ## __GetFvForceRebase() method
2242 # Get FvForceRebase for FV
2244 # @param self The object pointer
2245 # @param Obj for whom FvForceRebase is got
2246 # @retval True Successfully find a FvForceRebase statement
2247 # @retval False Not able to find a FvForceRebase statement
2249 def __GetFvForceRebase(self
, Obj
):
2251 if not self
.__IsKeyword
("FvForceRebase"):
2254 if not self
.__IsToken
( "="):
2255 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2257 if not self
.__GetNextToken
():
2258 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
2260 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
2261 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2263 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
2264 Obj
.FvForceRebase
= True
2265 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
2266 Obj
.FvForceRebase
= False
2268 Obj
.FvForceRebase
= None
2273 ## __GetFvAttributes() method
2275 # Get attributes for FV
2277 # @param self The object pointer
2278 # @param Obj for whom attribute is got
2281 def __GetFvAttributes(self
, FvObj
):
2283 while self
.__GetNextWord
():
2286 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2287 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2288 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2289 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2290 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2291 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):
2295 if not self
.__IsToken
( "="):
2296 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2298 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2299 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2301 FvObj
.FvAttributeDict
[name
] = self
.__Token
2305 ## __GetFvNameGuid() method
2307 # Get FV GUID for FV
2309 # @param self The object pointer
2310 # @param Obj for whom GUID is got
2313 def __GetFvNameGuid(self
, FvObj
):
2315 if not self
.__IsKeyword
( "FvNameGuid"):
2318 if not self
.__IsToken
( "="):
2319 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2321 if not self
.__GetNextGuid
():
2322 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2324 FvObj
.FvNameGuid
= self
.__Token
2328 def __GetFvNameString(self
, FvObj
):
2330 if not self
.__IsKeyword
( "FvNameString"):
2333 if not self
.__IsToken
( "="):
2334 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2336 if not self
.__GetNextToken
() or self
.__Token
not in ('TRUE', 'FALSE'):
2337 raise Warning("expected TRUE or FALSE for FvNameString", self
.FileName
, self
.CurrentLineNumber
)
2339 FvObj
.FvNameString
= self
.__Token
2343 def __GetFvExtEntryStatement(self
, FvObj
):
2345 if not (self
.__IsKeyword
( "FV_EXT_ENTRY") or self
.__IsKeyword
( "FV_EXT_ENTRY_TYPE")):
2348 if not self
.__IsKeyword
("TYPE"):
2349 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2351 if not self
.__IsToken
( "="):
2352 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2354 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2355 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2357 FvObj
.FvExtEntryTypeValue
.append(self
.__Token
)
2359 if not self
.__IsToken
( "{"):
2360 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2362 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2363 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2365 FvObj
.FvExtEntryType
.append(self
.__Token
)
2367 if self
.__Token
== 'DATA':
2369 if not self
.__IsToken
( "="):
2370 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2372 if not self
.__IsToken
( "{"):
2373 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2375 if not self
.__GetNextHexNumber
():
2376 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2378 if len(self
.__Token
) > 4:
2379 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2381 DataString
= self
.__Token
2384 while self
.__IsToken
(","):
2385 if not self
.__GetNextHexNumber
():
2386 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2387 if len(self
.__Token
) > 4:
2388 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2389 DataString
+= self
.__Token
2392 if not self
.__IsToken
( "}"):
2393 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2395 if not self
.__IsToken
( "}"):
2396 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2398 DataString
= DataString
.rstrip(",")
2399 FvObj
.FvExtEntryData
.append(DataString
)
2401 if self
.__Token
== 'FILE':
2403 if not self
.__IsToken
( "="):
2404 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2406 if not self
.__GetNextToken
():
2407 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2409 FvObj
.FvExtEntryData
.append(self
.__Token
)
2411 if not self
.__IsToken
( "}"):
2412 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2416 ## __GetAprioriSection() method
2418 # Get token statements
2420 # @param self The object pointer
2421 # @param FvObj for whom apriori is got
2422 # @param MacroDict dictionary used to replace macro
2423 # @retval True Successfully find apriori statement
2424 # @retval False Not able to find apriori statement
2426 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2428 if not self
.__IsKeyword
( "APRIORI"):
2431 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2432 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2433 AprType
= self
.__Token
2435 if not self
.__IsToken
( "{"):
2436 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2438 AprSectionObj
= AprioriSection
.AprioriSection()
2439 AprSectionObj
.AprioriType
= AprType
2441 self
.__GetDefineStatements
(AprSectionObj
)
2442 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2445 IsInf
= self
.__GetInfStatement
(AprSectionObj
)
2446 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2447 if not IsInf
and not IsFile
:
2450 if not self
.__IsToken
( "}"):
2451 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2453 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2456 def __ParseInfStatement(self
):
2457 if not self
.__IsKeyword
("INF"):
2460 ffsInf
= FfsInfStatement
.FfsInfStatement()
2461 self
.__GetInfOptions
(ffsInf
)
2463 if not self
.__GetNextToken
():
2464 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2465 ffsInf
.InfFileName
= self
.__Token
2466 if not ffsInf
.InfFileName
.endswith('.inf'):
2467 raise Warning("expected .inf file path", self
.FileName
, self
.CurrentLineNumber
)
2469 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2470 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2472 #Replace $(SAPCE) with real space
2473 ffsInf
.InfFileName
= ffsInf
.InfFileName
.replace('$(SPACE)', ' ')
2475 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2476 #do case sensitive check for file path
2477 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2479 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2481 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2482 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2483 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2484 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
2486 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
2487 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
2489 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
2491 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
2493 if self
.__IsToken
('|'):
2494 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2495 ffsInf
.KeepReloc
= False
2496 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2497 ffsInf
.KeepReloc
= True
2499 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2502 ## __GetInfStatement() method
2504 # Get INF statements
2506 # @param self The object pointer
2507 # @param Obj for whom inf statement is got
2508 # @retval True Successfully find inf statement
2509 # @retval False Not able to find inf statement
2511 def __GetInfStatement(self
, Obj
, ForCapsule
=False):
2512 ffsInf
= self
.__ParseInfStatement
()
2517 capsuleFfs
= CapsuleData
.CapsuleFfs()
2518 capsuleFfs
.Ffs
= ffsInf
2519 Obj
.CapsuleDataList
.append(capsuleFfs
)
2521 Obj
.FfsList
.append(ffsInf
)
2524 ## __GetInfOptions() method
2526 # Get options for INF
2528 # @param self The object pointer
2529 # @param FfsInfObj for whom option is got
2531 def __GetInfOptions(self
, FfsInfObj
):
2532 if self
.__IsKeyword
("FILE_GUID"):
2533 if not self
.__IsToken
("="):
2534 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2535 if not self
.__GetNextGuid
():
2536 raise Warning("expected GUID value", self
.FileName
, self
.CurrentLineNumber
)
2537 FfsInfObj
.OverrideGuid
= self
.__Token
2539 if self
.__IsKeyword
( "RuleOverride"):
2540 if not self
.__IsToken
( "="):
2541 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2542 if not self
.__GetNextToken
():
2543 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2544 FfsInfObj
.Rule
= self
.__Token
2546 if self
.__IsKeyword
( "VERSION"):
2547 if not self
.__IsToken
( "="):
2548 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2549 if not self
.__GetNextToken
():
2550 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2552 if self
.__GetStringData
():
2553 FfsInfObj
.Version
= self
.__Token
2555 if self
.__IsKeyword
( BINARY_FILE_TYPE_UI
):
2556 if not self
.__IsToken
( "="):
2557 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2558 if not self
.__GetNextToken
():
2559 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2561 if self
.__GetStringData
():
2562 FfsInfObj
.Ui
= self
.__Token
2564 if self
.__IsKeyword
( "USE"):
2565 if not self
.__IsToken
( "="):
2566 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2567 if not self
.__GetNextToken
():
2568 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2569 FfsInfObj
.UseArch
= self
.__Token
2572 if self
.__GetNextToken
():
2573 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')
2574 if p
.match(self
.__Token
) and p
.match(self
.__Token
).span()[1] == len(self
.__Token
):
2575 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2576 if not self
.__IsToken
(","):
2582 while self
.__GetNextToken
():
2583 if not p
.match(self
.__Token
):
2584 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2585 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2587 if not self
.__IsToken
(","):
2590 ## __GetFileStatement() method
2592 # Get FILE statements
2594 # @param self The object pointer
2595 # @param Obj for whom FILE statement is got
2596 # @param MacroDict dictionary used to replace macro
2597 # @retval True Successfully find FILE statement
2598 # @retval False Not able to find FILE statement
2600 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2602 if not self
.__IsKeyword
( "FILE"):
2605 if not self
.__GetNextWord
():
2606 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2608 if ForCapsule
and self
.__Token
== 'DATA':
2613 FfsFileObj
= FfsFileStatement
.FileStatement()
2614 FfsFileObj
.FvFileType
= self
.__Token
2616 if not self
.__IsToken
( "="):
2617 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2619 if not self
.__GetNextGuid
():
2620 if not self
.__GetNextWord
():
2621 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2622 if self
.__Token
== 'PCD':
2623 if not self
.__IsToken
( "("):
2624 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2625 PcdPair
= self
.__GetNextPcdSettings
()
2626 if not self
.__IsToken
( ")"):
2627 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2628 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2630 FfsFileObj
.NameGuid
= self
.__Token
2632 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2635 capsuleFfs
= CapsuleData
.CapsuleFfs()
2636 capsuleFfs
.Ffs
= FfsFileObj
2637 Obj
.CapsuleDataList
.append(capsuleFfs
)
2639 Obj
.FfsList
.append(FfsFileObj
)
2643 ## __FileCouldHaveRelocFlag() method
2645 # Check whether reloc strip flag can be set for a file type.
2647 # @param FileType The file type to check with
2648 # @retval True This type could have relocation strip flag
2649 # @retval False No way to have it
2652 def __FileCouldHaveRelocFlag (FileType
):
2653 if FileType
in (SUP_MODULE_SEC
, SUP_MODULE_PEI_CORE
, SUP_MODULE_PEIM
, 'PEI_DXE_COMBO'):
2658 ## __SectionCouldHaveRelocFlag() method
2660 # Check whether reloc strip flag can be set for a section type.
2662 # @param SectionType The section type to check with
2663 # @retval True This type could have relocation strip flag
2664 # @retval False No way to have it
2667 def __SectionCouldHaveRelocFlag (SectionType
):
2668 if SectionType
in (BINARY_FILE_TYPE_TE
, BINARY_FILE_TYPE_PE32
):
2673 ## __GetFilePart() method
2675 # Get components for FILE statement
2677 # @param self The object pointer
2678 # @param FfsFileObj for whom component is got
2679 # @param MacroDict dictionary used to replace macro
2681 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2683 self
.__GetFileOpts
( FfsFileObj
)
2685 if not self
.__IsToken
("{"):
2686 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2687 if self
.__FileCouldHaveRelocFlag
(FfsFileObj
.FvFileType
):
2688 if self
.__Token
== 'RELOCS_STRIPPED':
2689 FfsFileObj
.KeepReloc
= False
2691 FfsFileObj
.KeepReloc
= True
2693 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj
.FvFileType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
2695 if not self
.__IsToken
("{"):
2696 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2698 if not self
.__GetNextToken
():
2699 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2701 if self
.__Token
== BINARY_FILE_TYPE_FV
:
2702 if not self
.__IsToken
( "="):
2703 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2704 if not self
.__GetNextToken
():
2705 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2706 FfsFileObj
.FvName
= self
.__Token
2708 elif self
.__Token
== "FD":
2709 if not self
.__IsToken
( "="):
2710 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2711 if not self
.__GetNextToken
():
2712 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2713 FfsFileObj
.FdName
= self
.__Token
2715 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2717 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2719 elif hasattr(FfsFileObj
, 'FvFileType') and FfsFileObj
.FvFileType
== 'RAW':
2721 self
.__GetRAWData
(FfsFileObj
, MacroDict
)
2724 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2725 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2726 FfsFileObj
.FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2727 self
.__VerifyFile
(FfsFileObj
.FileName
)
2729 if not self
.__IsToken
( "}"):
2730 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2732 ## __GetRAWData() method
2734 # Get RAW data for FILE statement
2736 # @param self The object pointer
2737 # @param FfsFileObj for whom section is got
2738 # @param MacroDict dictionary used to replace macro
2740 def __GetRAWData(self
, FfsFileObj
, MacroDict
= {}):
2741 FfsFileObj
.FileName
= []
2742 FfsFileObj
.SubAlignment
= []
2745 if self
.__GetAlignment
():
2746 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
2747 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2748 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2749 #For FFS, Auto is default option same to ""
2750 if not self
.__Token
== "Auto":
2751 AlignValue
= self
.__Token
2752 if not self
.__GetNextToken
():
2753 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2755 FileName
= self
.__Token
.replace('$(SPACE)', ' ')
2758 raise Warning("expected Filename value", self
.FileName
, self
.CurrentLineNumber
)
2760 self
.__VerifyFile
(FileName
)
2761 File
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
)
2762 FfsFileObj
.FileName
.append(File
.Path
)
2763 FfsFileObj
.SubAlignment
.append(AlignValue
)
2765 if self
.__IsToken
( "}"):
2769 if len(FfsFileObj
.SubAlignment
) == 1:
2770 FfsFileObj
.SubAlignment
= FfsFileObj
.SubAlignment
[0]
2771 if len(FfsFileObj
.FileName
) == 1:
2772 FfsFileObj
.FileName
= FfsFileObj
.FileName
[0]
2774 ## __GetFileOpts() method
2776 # Get options for FILE statement
2778 # @param self The object pointer
2779 # @param FfsFileObj for whom options is got
2781 def __GetFileOpts(self
, FfsFileObj
):
2783 if self
.__GetNextToken
():
2784 if TokenFindPattern
.match(self
.__Token
):
2785 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2786 if self
.__IsToken
(","):
2787 while self
.__GetNextToken
():
2788 if not TokenFindPattern
.match(self
.__Token
):
2789 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2790 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2792 if not self
.__IsToken
(","):
2798 if self
.__IsKeyword
( "FIXED", True):
2799 FfsFileObj
.Fixed
= True
2801 if self
.__IsKeyword
( "CHECKSUM", True):
2802 FfsFileObj
.CheckSum
= True
2804 if self
.__GetAlignment
():
2805 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
2806 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2807 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2808 #For FFS, Auto is default option same to ""
2809 if not self
.__Token
== "Auto":
2810 FfsFileObj
.Alignment
= self
.__Token
2812 ## __GetAlignment() method
2814 # Return the alignment value
2816 # @param self The object pointer
2817 # @retval True Successfully find alignment
2818 # @retval False Not able to find alignment
2820 def __GetAlignment(self
):
2821 if self
.__IsKeyword
( "Align", True):
2822 if not self
.__IsToken
( "="):
2823 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2825 if not self
.__GetNextToken
():
2826 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2831 ## __GetFilePart() method
2833 # Get section data for FILE statement
2835 # @param self The object pointer
2836 # @param FfsFileObj for whom section is got
2837 # @param MacroDict dictionary used to replace macro
2839 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2841 Dict
.update(MacroDict
)
2843 self
.__GetDefineStatements
(FfsFileObj
)
2845 Dict
.update(FfsFileObj
.DefineVarDict
)
2846 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2847 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2850 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2851 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2852 if not IsLeafSection
and not IsEncapSection
:
2855 ## __GetLeafSection() method
2857 # Get leaf section for Obj
2859 # @param self The object pointer
2860 # @param Obj for whom leaf section is got
2861 # @param MacroDict dictionary used to replace macro
2862 # @retval True Successfully find section statement
2863 # @retval False Not able to find section statement
2865 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2867 OldPos
= self
.GetFileBufferPos()
2869 if not self
.__IsKeyword
( "SECTION"):
2870 if len(Obj
.SectionList
) == 0:
2871 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2876 if self
.__GetAlignment
():
2877 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
2878 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
2879 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2880 AlignValue
= self
.__Token
2883 if self
.__IsKeyword
( "BUILD_NUM"):
2884 if not self
.__IsToken
( "="):
2885 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2887 if not self
.__GetNextToken
():
2888 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2890 BuildNum
= self
.__Token
2892 if self
.__IsKeyword
( "VERSION"):
2893 if AlignValue
== 'Auto':
2894 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2895 if not self
.__IsToken
( "="):
2896 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2897 if not self
.__GetNextToken
():
2898 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2899 VerSectionObj
= VerSection
.VerSection()
2900 VerSectionObj
.Alignment
= AlignValue
2901 VerSectionObj
.BuildNum
= BuildNum
2902 if self
.__GetStringData
():
2903 VerSectionObj
.StringData
= self
.__Token
2905 VerSectionObj
.FileName
= self
.__Token
2906 Obj
.SectionList
.append(VerSectionObj
)
2908 elif self
.__IsKeyword
( BINARY_FILE_TYPE_UI
):
2909 if AlignValue
== 'Auto':
2910 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2911 if not self
.__IsToken
( "="):
2912 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2913 if not self
.__GetNextToken
():
2914 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2915 UiSectionObj
= UiSection
.UiSection()
2916 UiSectionObj
.Alignment
= AlignValue
2917 if self
.__GetStringData
():
2918 UiSectionObj
.StringData
= self
.__Token
2920 UiSectionObj
.FileName
= self
.__Token
2921 Obj
.SectionList
.append(UiSectionObj
)
2923 elif self
.__IsKeyword
( "FV_IMAGE"):
2924 if AlignValue
== 'Auto':
2925 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2926 if not self
.__IsToken
( "="):
2927 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2928 if not self
.__GetNextToken
():
2929 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2931 FvName
= self
.__Token
2934 if self
.__IsToken
( "{"):
2936 FvObj
.UiFvName
= FvName
.upper()
2937 self
.__GetDefineStatements
(FvObj
)
2938 MacroDict
.update(FvObj
.DefineVarDict
)
2939 self
.__GetBlockStatement
(FvObj
)
2940 self
.__GetSetStatements
(FvObj
)
2941 self
.__GetFvAlignment
(FvObj
)
2942 self
.__GetFvAttributes
(FvObj
)
2943 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2944 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2947 IsInf
= self
.__GetInfStatement
(FvObj
)
2948 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2949 if not IsInf
and not IsFile
:
2952 if not self
.__IsToken
( "}"):
2953 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2955 FvImageSectionObj
= FvImageSection
.FvImageSection()
2956 FvImageSectionObj
.Alignment
= AlignValue
2957 if FvObj
is not None:
2958 FvImageSectionObj
.Fv
= FvObj
2959 FvImageSectionObj
.FvName
= None
2961 FvImageSectionObj
.FvName
= FvName
.upper()
2962 FvImageSectionObj
.FvFileName
= FvName
2964 Obj
.SectionList
.append(FvImageSectionObj
)
2966 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2967 if AlignValue
== 'Auto':
2968 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2969 DepexSectionObj
= DepexSection
.DepexSection()
2970 DepexSectionObj
.Alignment
= AlignValue
2971 DepexSectionObj
.DepexType
= self
.__Token
2973 if not self
.__IsToken
( "="):
2974 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2975 if not self
.__IsToken
( "{"):
2976 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2977 if not self
.__SkipToToken
( "}"):
2978 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2980 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2981 Obj
.SectionList
.append(DepexSectionObj
)
2984 if not self
.__GetNextWord
():
2985 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2987 # Encapsulation section appear, UndoToken and return
2988 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2989 self
.SetFileBufferPos(OldPos
)
2992 if self
.__Token
not in ("COMPAT16", BINARY_FILE_TYPE_PE32
, BINARY_FILE_TYPE_PIC
, BINARY_FILE_TYPE_TE
, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX
,\
2993 BINARY_FILE_TYPE_UI
, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX
, "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX
):
2994 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2995 if AlignValue
== 'Auto'and (not self
.__Token
== BINARY_FILE_TYPE_PE32
) and (not self
.__Token
== BINARY_FILE_TYPE_TE
):
2996 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2999 DataSectionObj
= DataSection
.DataSection()
3000 DataSectionObj
.Alignment
= AlignValue
3001 DataSectionObj
.SecType
= self
.__Token
3003 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3004 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
3005 if self
.__Token
== 'RELOCS_STRIPPED':
3006 DataSectionObj
.KeepReloc
= False
3008 DataSectionObj
.KeepReloc
= True
3010 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
)
3012 if self
.__IsToken
("="):
3013 if not self
.__GetNextToken
():
3014 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
3015 DataSectionObj
.SectFileName
= self
.__Token
3016 self
.__VerifyFile
(DataSectionObj
.SectFileName
)
3018 if not self
.__GetCglSection
(DataSectionObj
):
3021 Obj
.SectionList
.append(DataSectionObj
)
3027 # Check if file exists or not:
3028 # If current phase if GenFds, the file must exist;
3029 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist
3030 # @param FileName: File path to be verified.
3032 def __VerifyFile(self
, FileName
):
3033 if FileName
.replace('$(WORKSPACE)', '').find('$') != -1:
3035 if not GlobalData
.gAutoGenPhase
or not self
.__GetMacroValue
("OUTPUT_DIRECTORY") in FileName
:
3036 ErrorCode
, ErrorInfo
= PathClass(NormPath(FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3038 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3040 ## __GetCglSection() method
3042 # Get compressed or GUIDed section for Obj
3044 # @param self The object pointer
3045 # @param Obj for whom leaf section is got
3046 # @param AlignValue alignment value for complex section
3047 # @retval True Successfully find section statement
3048 # @retval False Not able to find section statement
3050 def __GetCglSection(self
, Obj
, AlignValue
= None):
3052 if self
.__IsKeyword
( "COMPRESS"):
3054 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3057 if not self
.__IsToken
("{"):
3058 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3060 CompressSectionObj
= CompressSection
.CompressSection()
3061 CompressSectionObj
.Alignment
= AlignValue
3062 CompressSectionObj
.CompType
= type
3063 # Recursive sections...
3065 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
3066 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
3067 if not IsLeafSection
and not IsEncapSection
:
3071 if not self
.__IsToken
( "}"):
3072 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3073 Obj
.SectionList
.append(CompressSectionObj
)
3076 # raise Warning("Compress type not known")
3080 elif self
.__IsKeyword
( "GUIDED"):
3082 if self
.__GetNextGuid
():
3083 GuidValue
= self
.__Token
3085 AttribDict
= self
.__GetGuidAttrib
()
3086 if not self
.__IsToken
("{"):
3087 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3088 GuidSectionObj
= GuidSection
.GuidSection()
3089 GuidSectionObj
.Alignment
= AlignValue
3090 GuidSectionObj
.NameGuid
= GuidValue
3091 GuidSectionObj
.SectionType
= "GUIDED"
3092 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3093 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3094 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
3095 # Recursive sections...
3097 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
3098 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
3099 if not IsLeafSection
and not IsEncapSection
:
3102 if not self
.__IsToken
( "}"):
3103 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3104 Obj
.SectionList
.append(GuidSectionObj
)
3110 ## __GetGuidAttri() method
3112 # Get attributes for GUID section
3114 # @param self The object pointer
3115 # @retval AttribDict Dictionary of key-value pair of section attributes
3117 def __GetGuidAttrib(self
):
3120 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
3121 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
3122 AttribDict
["EXTRA_HEADER_SIZE"] = -1
3123 while self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID") \
3124 or self
.__IsKeyword
("EXTRA_HEADER_SIZE"):
3125 AttribKey
= self
.__Token
3127 if not self
.__IsToken
("="):
3128 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3130 if not self
.__GetNextToken
():
3131 raise Warning("expected TRUE(1)/FALSE(0)/Number", self
.FileName
, self
.CurrentLineNumber
)
3132 elif AttribKey
== "EXTRA_HEADER_SIZE":
3134 if self
.__Token
[0:2].upper() == "0X":
3137 AttribDict
[AttribKey
] = int(self
.__Token
, Base
)
3140 raise Warning("expected Number", self
.FileName
, self
.CurrentLineNumber
)
3141 elif self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
3142 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
3143 AttribDict
[AttribKey
] = self
.__Token
3147 ## __GetEncapsulationSec() method
3149 # Get encapsulation section for FILE
3151 # @param self The object pointer
3152 # @param FfsFile for whom section is got
3153 # @retval True Successfully find section statement
3154 # @retval False Not able to find section statement
3156 def __GetEncapsulationSec(self
, FfsFileObj
):
3158 OldPos
= self
.GetFileBufferPos()
3159 if not self
.__IsKeyword
( "SECTION"):
3160 if len(FfsFileObj
.SectionList
) == 0:
3161 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
3166 if self
.__GetAlignment
():
3167 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
3168 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3169 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3170 AlignValue
= self
.__Token
3172 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
3173 self
.SetFileBufferPos(OldPos
)
3179 if not self
.__GetNextToken
():
3181 S
= self
.__Token
.upper()
3182 if S
.startswith("[") and not S
.startswith("[FMPPAYLOAD."):
3183 self
.SectionParser(S
)
3188 self
.__SkipToToken
("[FMPPAYLOAD.", True)
3189 FmpUiName
= self
.__GetUiName
().upper()
3190 if FmpUiName
in self
.Profile
.FmpPayloadDict
:
3191 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName
, self
.FileName
, self
.CurrentLineNumber
)
3193 FmpData
= CapsuleData
.CapsulePayload()
3194 FmpData
.UiName
= FmpUiName
3196 if not self
.__IsToken
( "]"):
3197 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3199 if not self
.__GetNextToken
():
3200 raise Warning("The FMP payload section is empty!", self
.FileName
, self
.CurrentLineNumber
)
3201 FmpKeyList
= ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']
3202 while self
.__Token
in FmpKeyList
:
3204 FmpKeyList
.remove(Name
)
3205 if not self
.__IsToken
("="):
3206 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3207 if Name
== 'IMAGE_TYPE_ID':
3208 if not self
.__GetNextGuid
():
3209 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self
.FileName
, self
.CurrentLineNumber
)
3210 FmpData
.ImageTypeId
= self
.__Token
3211 elif Name
== 'CERTIFICATE_GUID':
3212 if not self
.__GetNextGuid
():
3213 raise Warning("expected GUID value for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3214 FmpData
.Certificate_Guid
= self
.__Token
3215 if uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_RSA2048_SHA256_GUID
and uuid
.UUID(FmpData
.Certificate_Guid
) != EFI_CERT_TYPE_PKCS7_GUID
:
3216 raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self
.FileName
, self
.CurrentLineNumber
)
3218 if not self
.__GetNextToken
():
3219 raise Warning("expected value of %s" % Name
, self
.FileName
, self
.CurrentLineNumber
)
3220 Value
= self
.__Token
3221 if Name
== 'IMAGE_HEADER_INIT_VERSION':
3222 if FdfParser
.__Verify
(Name
, Value
, 'UINT8'):
3223 FmpData
.Version
= Value
3224 elif Name
== 'IMAGE_INDEX':
3225 if FdfParser
.__Verify
(Name
, Value
, 'UINT8'):
3226 FmpData
.ImageIndex
= Value
3227 elif Name
== 'HARDWARE_INSTANCE':
3228 if FdfParser
.__Verify
(Name
, Value
, 'UINT8'):
3229 FmpData
.HardwareInstance
= Value
3230 elif Name
== 'MONOTONIC_COUNT':
3231 if FdfParser
.__Verify
(Name
, Value
, 'UINT64'):
3232 FmpData
.MonotonicCount
= Value
3233 if FmpData
.MonotonicCount
.upper().startswith('0X'):
3234 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
, 16)
3236 FmpData
.MonotonicCount
= (long)(FmpData
.MonotonicCount
)
3237 if not self
.__GetNextToken
():
3242 if (FmpData
.MonotonicCount
and not FmpData
.Certificate_Guid
) or (not FmpData
.MonotonicCount
and FmpData
.Certificate_Guid
):
3243 EdkLogger
.error("FdfParser", FORMAT_INVALID
, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")
3245 # Only the IMAGE_TYPE_ID is required item
3246 if FmpKeyList
and 'IMAGE_TYPE_ID' in FmpKeyList
:
3247 raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3248 # get the Image file and Vendor code file
3249 self
.__GetFMPCapsuleData
(FmpData
)
3250 if not FmpData
.ImageFile
:
3251 raise Warning("Missing image file in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3252 # check whether more than one Vendor code file
3253 if len(FmpData
.VendorCodeFile
) > 1:
3254 raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self
.FileName
, self
.CurrentLineNumber
)
3255 self
.Profile
.FmpPayloadDict
[FmpUiName
] = FmpData
3258 ## __GetCapsule() method
3260 # Get capsule section contents and store its data into capsule list of self.Profile
3262 # @param self The object pointer
3263 # @retval True Successfully find a capsule
3264 # @retval False Not able to find a capsule
3266 def __GetCapsule(self
):
3268 if not self
.__GetNextToken
():
3271 S
= self
.__Token
.upper()
3272 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
3273 self
.SectionParser(S
)
3278 if not self
.__IsToken
("[CAPSULE.", True):
3279 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3280 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3281 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3282 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
3284 CapsuleObj
= Capsule
.Capsule()
3286 CapsuleName
= self
.__GetUiName
()
3288 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
3290 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
3292 if not self
.__IsToken
( "]"):
3293 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3295 if self
.__IsKeyword
("CREATE_FILE"):
3296 if not self
.__IsToken
( "="):
3297 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3299 if not self
.__GetNextToken
():
3300 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
3302 CapsuleObj
.CreateFile
= self
.__Token
3304 self
.__GetCapsuleStatements
(CapsuleObj
)
3305 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
3308 ## __GetCapsuleStatements() method
3310 # Get statements for capsule
3312 # @param self The object pointer
3313 # @param Obj for whom statements are got
3315 def __GetCapsuleStatements(self
, Obj
):
3316 self
.__GetCapsuleTokens
(Obj
)
3317 self
.__GetDefineStatements
(Obj
)
3318 self
.__GetSetStatements
(Obj
)
3319 self
.__GetCapsuleData
(Obj
)
3321 ## __GetCapsuleTokens() method
3323 # Get token statements for capsule
3325 # @param self The object pointer
3326 # @param Obj for whom token statements are got
3328 def __GetCapsuleTokens(self
, Obj
):
3329 if not self
.__GetNextToken
():
3331 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):
3332 Name
= self
.__Token
.strip()
3333 if not self
.__IsToken
("="):
3334 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3335 if not self
.__GetNextToken
():
3336 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3337 if Name
== 'CAPSULE_FLAGS':
3338 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3339 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3340 Value
= self
.__Token
.strip()
3341 while self
.__IsToken
(","):
3343 if not self
.__GetNextToken
():
3344 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
3345 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
3346 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
3347 Value
+= self
.__Token
.strip()
3348 elif Name
== 'OEM_CAPSULE_FLAGS':
3349 Value
= self
.__Token
.strip()
3350 if not Value
.upper().startswith('0X'):
3351 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3353 Value
= int(Value
, 0)
3355 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3356 if not 0x0000 <= Value
<= 0xFFFF:
3357 raise Warning("expected hex value between 0x0000 and 0xFFFF", self
.FileName
, self
.CurrentLineNumber
)
3358 Value
= self
.__Token
.strip()
3360 Value
= self
.__Token
.strip()
3361 Obj
.TokensDict
[Name
] = Value
3362 if not self
.__GetNextToken
():
3366 ## __GetCapsuleData() method
3368 # Get capsule data for capsule
3370 # @param self The object pointer
3371 # @param Obj for whom capsule data are got
3373 def __GetCapsuleData(self
, Obj
):
3376 IsInf
= self
.__GetInfStatement
(Obj
, True)
3377 IsFile
= self
.__GetFileStatement
(Obj
, True)
3378 IsFv
= self
.__GetFvStatement
(Obj
)
3379 IsFd
= self
.__GetFdStatement
(Obj
)
3380 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
3381 IsAfile
= self
.__GetAfileStatement
(Obj
)
3382 IsFmp
= self
.__GetFmpStatement
(Obj
)
3383 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
or IsAfile
or IsFmp
):
3386 ## __GetFMPCapsuleData() method
3388 # Get capsule data for FMP capsule
3390 # @param self The object pointer
3391 # @param Obj for whom capsule data are got
3393 def __GetFMPCapsuleData(self
, Obj
):
3396 IsFv
= self
.__GetFvStatement
(Obj
, True)
3397 IsFd
= self
.__GetFdStatement
(Obj
, True)
3398 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
, True)
3399 if not (IsFv
or IsFd
or IsAnyFile
):
3402 ## __GetFvStatement() method
3404 # Get FV for capsule
3406 # @param self The object pointer
3407 # @param CapsuleObj for whom FV is got
3408 # @retval True Successfully find a FV statement
3409 # @retval False Not able to find a FV statement
3411 def __GetFvStatement(self
, CapsuleObj
, FMPCapsule
= False):
3413 if not self
.__IsKeyword
(BINARY_FILE_TYPE_FV
):
3416 if not self
.__IsToken
("="):
3417 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3419 if not self
.__GetNextToken
():
3420 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
3422 if self
.__Token
.upper() not in self
.Profile
.FvDict
:
3423 raise Warning("FV name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3425 CapsuleFv
= CapsuleData
.CapsuleFv()
3426 CapsuleFv
.FvName
= self
.__Token
3428 if not CapsuleObj
.ImageFile
:
3429 CapsuleObj
.ImageFile
.append(CapsuleFv
)
3431 CapsuleObj
.VendorCodeFile
.append(CapsuleFv
)
3433 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
3436 ## __GetFdStatement() method
3438 # Get FD for capsule
3440 # @param self The object pointer
3441 # @param CapsuleObj for whom FD is got
3442 # @retval True Successfully find a FD statement
3443 # @retval False Not able to find a FD statement
3445 def __GetFdStatement(self
, CapsuleObj
, FMPCapsule
= False):
3447 if not self
.__IsKeyword
("FD"):
3450 if not self
.__IsToken
("="):
3451 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3453 if not self
.__GetNextToken
():
3454 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
3456 if self
.__Token
.upper() not in self
.Profile
.FdDict
:
3457 raise Warning("FD name does not exist", self
.FileName
, self
.CurrentLineNumber
)
3459 CapsuleFd
= CapsuleData
.CapsuleFd()
3460 CapsuleFd
.FdName
= self
.__Token
3462 if not CapsuleObj
.ImageFile
:
3463 CapsuleObj
.ImageFile
.append(CapsuleFd
)
3465 CapsuleObj
.VendorCodeFile
.append(CapsuleFd
)
3467 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
3470 def __GetFmpStatement(self
, CapsuleObj
):
3471 if not self
.__IsKeyword
("FMP_PAYLOAD"):
3472 if not self
.__IsKeyword
("FMP"):
3475 if not self
.__IsKeyword
("PAYLOAD"):
3479 if not self
.__IsToken
("="):
3480 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3482 if not self
.__GetNextToken
():
3483 raise Warning("expected payload name after FMP_PAYLOAD =", self
.FileName
, self
.CurrentLineNumber
)
3484 Payload
= self
.__Token
.upper()
3485 if Payload
not in self
.Profile
.FmpPayloadDict
:
3486 raise Warning("This FMP Payload does not exist: %s" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3487 CapsuleObj
.FmpPayloadList
.append(self
.Profile
.FmpPayloadDict
[Payload
])
3490 def __ParseRawFileStatement(self
):
3491 if not self
.__IsKeyword
("FILE"):
3494 if not self
.__IsKeyword
("DATA"):
3498 if not self
.__IsToken
("="):
3499 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3501 if not self
.__GetNextToken
():
3502 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3504 AnyFileName
= self
.__Token
3505 self
.__VerifyFile
(AnyFileName
)
3507 if not os
.path
.isabs(AnyFileName
):
3508 AnyFileName
= mws
.join(GenFdsGlobalVariable
.WorkSpaceDir
, AnyFileName
)
3512 ## __GetAnyFileStatement() method
3514 # Get AnyFile for capsule
3516 # @param self The object pointer
3517 # @param CapsuleObj for whom AnyFile is got
3518 # @retval True Successfully find a Anyfile statement
3519 # @retval False Not able to find a AnyFile statement
3521 def __GetAnyFileStatement(self
, CapsuleObj
, FMPCapsule
= False):
3522 AnyFileName
= self
.__ParseRawFileStatement
()
3526 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3527 CapsuleAnyFile
.FileName
= AnyFileName
3529 if not CapsuleObj
.ImageFile
:
3530 CapsuleObj
.ImageFile
.append(CapsuleAnyFile
)
3532 CapsuleObj
.VendorCodeFile
.append(CapsuleAnyFile
)
3534 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3537 ## __GetAfileStatement() method
3539 # Get Afile for capsule
3541 # @param self The object pointer
3542 # @param CapsuleObj for whom Afile is got
3543 # @retval True Successfully find a Afile statement
3544 # @retval False Not able to find a Afile statement
3546 def __GetAfileStatement(self
, CapsuleObj
):
3548 if not self
.__IsKeyword
("APPEND"):
3551 if not self
.__IsToken
("="):
3552 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3554 if not self
.__GetNextToken
():
3555 raise Warning("expected Afile name", self
.FileName
, self
.CurrentLineNumber
)
3557 AfileName
= self
.__Token
3558 AfileBaseName
= os
.path
.basename(AfileName
)
3560 if os
.path
.splitext(AfileBaseName
)[1] not in [".bin", ".BIN", ".Bin", ".dat", ".DAT", ".Dat", ".data", ".DATA", ".Data"]:
3561 raise Warning('invalid binary file type, should be one of "bin",BINARY_FILE_TYPE_BIN,"Bin","dat","DAT","Dat","data","DATA","Data"', \
3562 self
.FileName
, self
.CurrentLineNumber
)
3564 if not os
.path
.isabs(AfileName
):
3565 AfileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AfileName
)
3566 self
.__VerifyFile
(AfileName
)
3568 if not os
.path
.exists(AfileName
):
3569 raise Warning('%s does not exist' % AfileName
, self
.FileName
, self
.CurrentLineNumber
)
3573 CapsuleAfile
= CapsuleData
.CapsuleAfile()
3574 CapsuleAfile
.FileName
= AfileName
3575 CapsuleObj
.CapsuleDataList
.append(CapsuleAfile
)
3578 ## __GetRule() method
3580 # Get Rule section contents and store its data into rule list of self.Profile
3582 # @param self The object pointer
3583 # @retval True Successfully find a Rule
3584 # @retval False Not able to find a Rule
3586 def __GetRule(self
):
3588 if not self
.__GetNextToken
():
3591 S
= self
.__Token
.upper()
3592 if S
.startswith("[") and not S
.startswith("[RULE."):
3593 self
.SectionParser(S
)
3597 if not self
.__IsToken
("[Rule.", True):
3598 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3599 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3600 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3601 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3603 if not self
.__SkipToToken
("."):
3604 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3606 Arch
= self
.__SkippedChars
.rstrip(".")
3607 if Arch
.upper() not in ARCH_SET_FULL
:
3608 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3610 ModuleType
= self
.__GetModuleType
()
3613 if self
.__IsToken
("."):
3614 if not self
.__GetNextWord
():
3615 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3616 TemplateName
= self
.__Token
3618 if not self
.__IsToken
( "]"):
3619 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3621 RuleObj
= self
.__GetRuleFileStatements
()
3622 RuleObj
.Arch
= Arch
.upper()
3623 RuleObj
.ModuleType
= ModuleType
3624 RuleObj
.TemplateName
= TemplateName
3625 if TemplateName
== '' :
3626 self
.Profile
.RuleDict
['RULE' + \
3630 ModuleType
.upper() ] = RuleObj
3632 self
.Profile
.RuleDict
['RULE' + \
3636 ModuleType
.upper() + \
3638 TemplateName
.upper() ] = RuleObj
3641 ## __GetModuleType() method
3643 # Return the module type
3645 # @param self The object pointer
3646 # @retval string module type
3648 def __GetModuleType(self
):
3650 if not self
.__GetNextWord
():
3651 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3652 if self
.__Token
.upper() not in (SUP_MODULE_SEC
, SUP_MODULE_PEI_CORE
, SUP_MODULE_PEIM
, SUP_MODULE_DXE_CORE
, \
3653 SUP_MODULE_DXE_DRIVER
, SUP_MODULE_DXE_SAL_DRIVER
, \
3654 SUP_MODULE_DXE_SMM_DRIVER
, SUP_MODULE_DXE_RUNTIME_DRIVER
, \
3655 SUP_MODULE_UEFI_DRIVER
, SUP_MODULE_UEFI_APPLICATION
, SUP_MODULE_USER_DEFINED
, "DEFAULT", SUP_MODULE_BASE
, \
3656 EDK_COMPONENT_TYPE_SECURITY_CORE
, EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER
, EDK_COMPONENT_TYPE_PIC_PEIM
, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM
, \
3657 "PE32_PEIM", EDK_COMPONENT_TYPE_BS_DRIVER
, EDK_COMPONENT_TYPE_RT_DRIVER
, EDK_COMPONENT_TYPE_SAL_RT_DRIVER
, EDK_COMPONENT_TYPE_APPLICATION
, "ACPITABLE", SUP_MODULE_SMM_CORE
, SUP_MODULE_MM_STANDALONE
, SUP_MODULE_MM_CORE_STANDALONE
):
3658 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3661 ## __GetFileExtension() method
3663 # Return the file extension
3665 # @param self The object pointer
3666 # @retval string file name extension
3668 def __GetFileExtension(self
):
3669 if not self
.__IsToken
("."):
3670 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3673 if self
.__GetNextToken
():
3674 if FileExtensionPattern
.match(self
.__Token
):
3678 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3681 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3683 ## __GetRuleFileStatement() method
3687 # @param self The object pointer
3688 # @retval Rule Rule object
3690 def __GetRuleFileStatements(self
):
3692 if not self
.__IsKeyword
("FILE"):
3693 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3695 if not self
.__GetNextWord
():
3696 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3698 Type
= self
.__Token
.strip().upper()
3699 if Type
not in ("RAW", "FREEFORM", SUP_MODULE_SEC
, SUP_MODULE_PEI_CORE
, SUP_MODULE_PEIM
,\
3700 "PEI_DXE_COMBO", "DRIVER", SUP_MODULE_DXE_CORE
, EDK_COMPONENT_TYPE_APPLICATION
, "FV_IMAGE", "SMM", SUP_MODULE_SMM_CORE
, SUP_MODULE_MM_STANDALONE
, SUP_MODULE_MM_CORE_STANDALONE
):
3701 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3703 if not self
.__IsToken
("="):
3704 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3706 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3707 if not self
.__GetNextWord
():
3708 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3709 if self
.__Token
== 'PCD':
3710 if not self
.__IsToken
( "("):
3711 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3712 PcdPair
= self
.__GetNextPcdSettings
()
3713 if not self
.__IsToken
( ")"):
3714 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3715 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3717 NameGuid
= self
.__Token
3720 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3721 if self
.__FileCouldHaveRelocFlag
(Type
):
3722 if self
.__Token
== 'RELOCS_STRIPPED':
3727 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3730 if self
.__GetNextToken
():
3731 if TokenFindPattern
.match(self
.__Token
):
3732 KeyStringList
.append(self
.__Token
)
3733 if self
.__IsToken
(","):
3734 while self
.__GetNextToken
():
3735 if not TokenFindPattern
.match(self
.__Token
):
3736 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3737 KeyStringList
.append(self
.__Token
)
3739 if not self
.__IsToken
(","):
3747 if self
.__IsKeyword
("Fixed", True):
3751 if self
.__IsKeyword
("CheckSum", True):
3755 if self
.__GetAlignment
():
3756 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
3757 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3758 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3759 #For FFS, Auto is default option same to ""
3760 if not self
.__Token
== "Auto":
3761 AlignValue
= self
.__Token
3763 if self
.__IsToken
("{"):
3764 # Complex file rule expected
3765 Rule
= RuleComplexFile
.RuleComplexFile()
3766 Rule
.FvFileType
= Type
3767 Rule
.NameGuid
= NameGuid
3768 Rule
.Alignment
= AlignValue
3769 Rule
.CheckSum
= CheckSum
3771 Rule
.KeyStringList
= KeyStringList
3772 if KeepReloc
is not None:
3773 Rule
.KeepReloc
= KeepReloc
3776 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3777 IsLeaf
= self
.__GetEfiSection
(Rule
)
3778 if not IsEncapsulate
and not IsLeaf
:
3781 if not self
.__IsToken
("}"):
3782 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3787 # Simple file rule expected
3788 if not self
.__GetNextWord
():
3789 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3791 SectionName
= self
.__Token
3793 if SectionName
not in ("COMPAT16", BINARY_FILE_TYPE_PE32
, BINARY_FILE_TYPE_PIC
, BINARY_FILE_TYPE_TE
, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX
,\
3794 BINARY_FILE_TYPE_UI
, BINARY_FILE_TYPE_PEI_DEPEX
, "VERSION", "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX
):
3795 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3798 if self
.__IsKeyword
("Fixed", True):
3801 if self
.__IsKeyword
("CheckSum", True):
3805 if self
.__GetAlignment
():
3806 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
3807 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3808 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3809 if self
.__Token
== 'Auto' and (not SectionName
== BINARY_FILE_TYPE_PE32
) and (not SectionName
== BINARY_FILE_TYPE_TE
):
3810 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3811 SectAlignment
= self
.__Token
3814 if self
.__IsToken
('|'):
3815 Ext
= self
.__GetFileExtension
()
3816 elif not self
.__GetNextToken
():
3817 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3819 Rule
= RuleSimpleFile
.RuleSimpleFile()
3820 Rule
.SectionType
= SectionName
3821 Rule
.FvFileType
= Type
3822 Rule
.NameGuid
= NameGuid
3823 Rule
.Alignment
= AlignValue
3824 Rule
.SectAlignment
= SectAlignment
3825 Rule
.CheckSum
= CheckSum
3827 Rule
.KeyStringList
= KeyStringList
3828 if KeepReloc
is not None:
3829 Rule
.KeepReloc
= KeepReloc
3830 Rule
.FileExtension
= Ext
3831 Rule
.FileName
= self
.__Token
3834 ## __GetEfiSection() method
3836 # Get section list for Rule
3838 # @param self The object pointer
3839 # @param Obj for whom section is got
3840 # @retval True Successfully find section statement
3841 # @retval False Not able to find section statement
3843 def __GetEfiSection(self
, Obj
):
3845 OldPos
= self
.GetFileBufferPos()
3846 if not self
.__GetNextWord
():
3848 SectionName
= self
.__Token
3850 if SectionName
not in ("COMPAT16", BINARY_FILE_TYPE_PE32
, BINARY_FILE_TYPE_PIC
, BINARY_FILE_TYPE_TE
, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX
,\
3851 BINARY_FILE_TYPE_UI
, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX
, BINARY_FILE_TYPE_GUID
, BINARY_FILE_TYPE_SMM_DEPEX
):
3855 if SectionName
== "FV_IMAGE":
3856 FvImageSectionObj
= FvImageSection
.FvImageSection()
3857 if self
.__IsKeyword
("FV_IMAGE"):
3859 if self
.__IsToken
( "{"):
3861 self
.__GetDefineStatements
(FvObj
)
3862 self
.__GetBlockStatement
(FvObj
)
3863 self
.__GetSetStatements
(FvObj
)
3864 self
.__GetFvAlignment
(FvObj
)
3865 self
.__GetFvAttributes
(FvObj
)
3866 self
.__GetAprioriSection
(FvObj
)
3867 self
.__GetAprioriSection
(FvObj
)
3870 IsInf
= self
.__GetInfStatement
(FvObj
)
3871 IsFile
= self
.__GetFileStatement
(FvObj
)
3872 if not IsInf
and not IsFile
:
3875 if not self
.__IsToken
( "}"):
3876 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3877 FvImageSectionObj
.Fv
= FvObj
3878 FvImageSectionObj
.FvName
= None
3881 if not self
.__IsKeyword
(BINARY_FILE_TYPE_FV
):
3882 raise Warning("expected BINARY_FILE_TYPE_FV", self
.FileName
, self
.CurrentLineNumber
)
3883 FvImageSectionObj
.FvFileType
= self
.__Token
3885 if self
.__GetAlignment
():
3886 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
3887 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3888 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3889 FvImageSectionObj
.Alignment
= self
.__Token
3891 if self
.__IsToken
('|'):
3892 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3893 elif self
.__GetNextToken
():
3894 if self
.__Token
not in ("}", "COMPAT16", BINARY_FILE_TYPE_PE32
, BINARY_FILE_TYPE_PIC
, BINARY_FILE_TYPE_TE
, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX
,\
3895 BINARY_FILE_TYPE_UI
, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX
, BINARY_FILE_TYPE_GUID
, BINARY_FILE_TYPE_SMM_DEPEX
):
3896 FvImageSectionObj
.FvFileName
= self
.__Token
3900 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3902 Obj
.SectionList
.append(FvImageSectionObj
)
3905 EfiSectionObj
= EfiSection
.EfiSection()
3906 EfiSectionObj
.SectionType
= SectionName
3908 if not self
.__GetNextToken
():
3909 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3911 if self
.__Token
== "STRING":
3912 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3913 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3915 if not self
.__IsToken
('='):
3916 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3918 if not self
.__GetNextToken
():
3919 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3921 if self
.__GetStringData
():
3922 EfiSectionObj
.StringData
= self
.__Token
3924 if self
.__IsKeyword
("BUILD_NUM"):
3925 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3926 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3928 if not self
.__IsToken
("="):
3929 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3930 if not self
.__GetNextToken
():
3931 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3932 EfiSectionObj
.BuildNum
= self
.__Token
3935 EfiSectionObj
.FileType
= self
.__Token
3936 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3938 if self
.__IsKeyword
("Optional"):
3939 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3940 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3941 EfiSectionObj
.Optional
= True
3943 if self
.__IsKeyword
("BUILD_NUM"):
3944 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3945 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3947 if not self
.__IsToken
("="):
3948 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3949 if not self
.__GetNextToken
():
3950 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3951 EfiSectionObj
.BuildNum
= self
.__Token
3953 if self
.__GetAlignment
():
3954 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",
3955 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
3956 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3957 if self
.__Token
== 'Auto' and (not SectionName
== BINARY_FILE_TYPE_PE32
) and (not SectionName
== BINARY_FILE_TYPE_TE
):
3958 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3959 EfiSectionObj
.Alignment
= self
.__Token
3961 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3962 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3963 if self
.__Token
== 'RELOCS_STRIPPED':
3964 EfiSectionObj
.KeepReloc
= False
3966 EfiSectionObj
.KeepReloc
= True
3967 if Obj
.KeepReloc
is not None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3968 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3970 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3973 if self
.__IsToken
('|'):
3974 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3975 elif self
.__GetNextToken
():
3976 if self
.__Token
not in ("}", "COMPAT16", BINARY_FILE_TYPE_PE32
, BINARY_FILE_TYPE_PIC
, BINARY_FILE_TYPE_TE
, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX
,\
3977 BINARY_FILE_TYPE_UI
, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX
, BINARY_FILE_TYPE_GUID
, BINARY_FILE_TYPE_SMM_DEPEX
):
3979 if self
.__Token
.startswith('PCD'):
3981 self
.__GetNextWord
()
3983 if self
.__Token
== 'PCD':
3984 if not self
.__IsToken
( "("):
3985 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3986 PcdPair
= self
.__GetNextPcdSettings
()
3987 if not self
.__IsToken
( ")"):
3988 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3989 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3991 EfiSectionObj
.FileName
= self
.__Token
3996 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3998 Obj
.SectionList
.append(EfiSectionObj
)
4001 ## __RuleSectionCouldBeOptional() method
4003 # Get whether a section could be optional
4005 # @param SectionType The section type to check
4006 # @retval True section could be optional
4007 # @retval False section never optional
4010 def __RuleSectionCouldBeOptional(SectionType
):
4011 if SectionType
in (BINARY_FILE_TYPE_DXE_DEPEX
, BINARY_FILE_TYPE_UI
, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX
, "RAW", BINARY_FILE_TYPE_SMM_DEPEX
):
4016 ## __RuleSectionCouldHaveBuildNum() method
4018 # Get whether a section could have build number information
4020 # @param SectionType The section type to check
4021 # @retval True section could have build number information
4022 # @retval False section never have build number information
4025 def __RuleSectionCouldHaveBuildNum(SectionType
):
4026 if SectionType
in ("VERSION"):
4031 ## __RuleSectionCouldHaveString() method
4033 # Get whether a section could have string
4035 # @param SectionType The section type to check
4036 # @retval True section could have string
4037 # @retval False section never have string
4040 def __RuleSectionCouldHaveString(SectionType
):
4041 if SectionType
in (BINARY_FILE_TYPE_UI
, "VERSION"):
4046 ## __CheckRuleSectionFileType() method
4048 # Get whether a section matches a file type
4050 # @param self The object pointer
4051 # @param SectionType The section type to check
4052 # @param FileType The file type to check
4054 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
4055 if SectionType
== "COMPAT16":
4056 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
4057 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4058 elif SectionType
== BINARY_FILE_TYPE_PE32
:
4059 if FileType
not in (BINARY_FILE_TYPE_PE32
, "SEC_PE32"):
4060 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4061 elif SectionType
== BINARY_FILE_TYPE_PIC
:
4062 if FileType
not in (BINARY_FILE_TYPE_PIC
, BINARY_FILE_TYPE_PIC
):
4063 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4064 elif SectionType
== BINARY_FILE_TYPE_TE
:
4065 if FileType
not in (BINARY_FILE_TYPE_TE
, "SEC_TE"):
4066 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4067 elif SectionType
== "RAW":
4068 if FileType
not in (BINARY_FILE_TYPE_BIN
, "SEC_BIN", "RAW", "ASL", "ACPI"):
4069 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4070 elif SectionType
== BINARY_FILE_TYPE_DXE_DEPEX
or SectionType
== BINARY_FILE_TYPE_SMM_DEPEX
:
4071 if FileType
not in (BINARY_FILE_TYPE_DXE_DEPEX
, "SEC_DXE_DEPEX", BINARY_FILE_TYPE_SMM_DEPEX
):
4072 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4073 elif SectionType
== BINARY_FILE_TYPE_UI
:
4074 if FileType
not in (BINARY_FILE_TYPE_UI
, "SEC_UI"):
4075 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4076 elif SectionType
== "VERSION":
4077 if FileType
not in ("VERSION", "SEC_VERSION"):
4078 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4079 elif SectionType
== BINARY_FILE_TYPE_PEI_DEPEX
:
4080 if FileType
not in (BINARY_FILE_TYPE_PEI_DEPEX
, "SEC_PEI_DEPEX"):
4081 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4082 elif SectionType
== BINARY_FILE_TYPE_GUID
:
4083 if FileType
not in (BINARY_FILE_TYPE_PE32
, "SEC_GUID"):
4084 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
4086 ## __GetRuleEncapsulationSection() method
4088 # Get encapsulation section for Rule
4090 # @param self The object pointer
4091 # @param Rule for whom section is got
4092 # @retval True Successfully find section statement
4093 # @retval False Not able to find section statement
4095 def __GetRuleEncapsulationSection(self
, Rule
):
4096 if self
.__IsKeyword
( "COMPRESS"):
4098 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
4101 if not self
.__IsToken
("{"):
4102 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4104 CompressSectionObj
= CompressSection
.CompressSection()
4106 CompressSectionObj
.CompType
= Type
4107 # Recursive sections...
4109 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
4110 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
4111 if not IsEncapsulate
and not IsLeaf
:
4114 if not self
.__IsToken
( "}"):
4115 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4116 Rule
.SectionList
.append(CompressSectionObj
)
4120 elif self
.__IsKeyword
( "GUIDED"):
4122 if self
.__GetNextGuid
():
4123 GuidValue
= self
.__Token
4125 if self
.__IsKeyword
( "$(NAMED_GUID)"):
4126 GuidValue
= self
.__Token
4128 AttribDict
= self
.__GetGuidAttrib
()
4130 if not self
.__IsToken
("{"):
4131 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
4132 GuidSectionObj
= GuidSection
.GuidSection()
4133 GuidSectionObj
.NameGuid
= GuidValue
4134 GuidSectionObj
.SectionType
= "GUIDED"
4135 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
4136 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
4137 GuidSectionObj
.ExtraHeaderSize
= AttribDict
["EXTRA_HEADER_SIZE"]
4141 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
4142 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
4143 if not IsEncapsulate
and not IsLeaf
:
4146 if not self
.__IsToken
( "}"):
4147 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
4148 Rule
.SectionList
.append(GuidSectionObj
)
4154 ## __GetVtf() method
4156 # Get VTF section contents and store its data into VTF list of self.Profile
4158 # @param self The object pointer
4159 # @retval True Successfully find a VTF
4160 # @retval False Not able to find a VTF
4163 if not self
.__GetNextToken
():
4166 S
= self
.__Token
.upper()
4167 if S
.startswith("[") and not S
.startswith("[VTF."):
4168 self
.SectionParser(S
)
4173 if not self
.__IsToken
("[VTF.", True):
4174 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4175 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
4176 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
4177 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
4179 if not self
.__SkipToToken
("."):
4180 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
4182 Arch
= self
.__SkippedChars
.rstrip(".").upper()
4183 if Arch
not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4184 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
4186 if not self
.__GetNextWord
():
4187 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
4188 Name
= self
.__Token
.upper()
4191 VtfObj
.UiName
= Name
4192 VtfObj
.KeyArch
= Arch
4194 if self
.__IsToken
(","):
4195 if not self
.__GetNextWord
():
4196 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
4197 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
4198 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4199 VtfObj
.ArchList
= self
.__Token
.upper()
4201 if not self
.__IsToken
( "]"):
4202 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4204 if self
.__IsKeyword
("IA32_RST_BIN"):
4205 if not self
.__IsToken
("="):
4206 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4208 if not self
.__GetNextToken
():
4209 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
4211 VtfObj
.ResetBin
= self
.__Token
4212 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4213 #check for file path
4214 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4216 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4218 while self
.__GetComponentStatement
(VtfObj
):
4221 self
.Profile
.VtfList
.append(VtfObj
)
4224 ## __GetComponentStatement() method
4226 # Get components in VTF
4228 # @param self The object pointer
4229 # @param VtfObj for whom component is got
4230 # @retval True Successfully find a component
4231 # @retval False Not able to find a component
4233 def __GetComponentStatement(self
, VtfObj
):
4234 if not self
.__IsKeyword
("COMP_NAME"):
4237 if not self
.__IsToken
("="):
4238 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4240 if not self
.__GetNextWord
():
4241 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
4243 CompStatementObj
= ComponentStatement
.ComponentStatement()
4244 CompStatementObj
.CompName
= self
.__Token
4246 if not self
.__IsKeyword
("COMP_LOC"):
4247 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
4249 if not self
.__IsToken
("="):
4250 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4252 CompStatementObj
.CompLoc
= ""
4253 if self
.__GetNextWord
():
4254 CompStatementObj
.CompLoc
= self
.__Token
4255 if self
.__IsToken
('|'):
4256 if not self
.__GetNextWord
():
4257 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
4259 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
4260 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4262 CompStatementObj
.FilePos
= self
.__Token
4264 self
.CurrentLineNumber
+= 1
4265 self
.CurrentOffsetWithinLine
= 0
4267 if not self
.__IsKeyword
("COMP_TYPE"):
4268 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
4270 if not self
.__IsToken
("="):
4271 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4273 if not self
.__GetNextToken
():
4274 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
4275 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
4276 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
4277 not self
.__Token
[2] in string
.hexdigits
or not self
.__Token
[-1] in string
.hexdigits
:
4278 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4279 CompStatementObj
.CompType
= self
.__Token
4281 if not self
.__IsKeyword
("COMP_VER"):
4282 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
4284 if not self
.__IsToken
("="):
4285 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4287 if not self
.__GetNextToken
():
4288 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
4290 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
4291 if Pattern
.match(self
.__Token
) is None:
4292 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4293 CompStatementObj
.CompVer
= self
.__Token
4295 if not self
.__IsKeyword
("COMP_CS"):
4296 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
4298 if not self
.__IsToken
("="):
4299 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4301 if not self
.__GetNextToken
():
4302 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
4303 if self
.__Token
not in ("1", "0"):
4304 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4305 CompStatementObj
.CompCs
= self
.__Token
4308 if not self
.__IsKeyword
("COMP_BIN"):
4309 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
4311 if not self
.__IsToken
("="):
4312 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4314 if not self
.__GetNextToken
():
4315 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
4317 CompStatementObj
.CompBin
= self
.__Token
4318 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
4319 #check for file path
4320 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4322 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4324 if not self
.__IsKeyword
("COMP_SYM"):
4325 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
4327 if not self
.__IsToken
("="):
4328 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4330 if not self
.__GetNextToken
():
4331 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
4333 CompStatementObj
.CompSym
= self
.__Token
4334 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
4335 #check for file path
4336 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4338 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4340 if not self
.__IsKeyword
("COMP_SIZE"):
4341 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
4343 if not self
.__IsToken
("="):
4344 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4346 if self
.__IsToken
("-"):
4347 CompStatementObj
.CompSize
= self
.__Token
4348 elif self
.__GetNextDecimalNumber
():
4349 CompStatementObj
.CompSize
= self
.__Token
4350 elif self
.__GetNextHexNumber
():
4351 CompStatementObj
.CompSize
= self
.__Token
4353 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4355 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
4358 ## __GetOptionRom() method
4360 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
4362 # @param self The object pointer
4363 # @retval True Successfully find a OptionROM
4364 # @retval False Not able to find a OptionROM
4366 def __GetOptionRom(self
):
4367 if not self
.__GetNextToken
():
4370 S
= self
.__Token
.upper()
4371 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
4372 self
.SectionParser(S
)
4377 if not self
.__IsToken
("[OptionRom.", True):
4378 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
4380 OptRomName
= self
.__GetUiName
()
4382 if not self
.__IsToken
( "]"):
4383 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
4385 OptRomObj
= OptionRom
.OPTIONROM()
4386 OptRomObj
.DriverName
= OptRomName
4387 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
4390 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
4391 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
4392 if not isInf
and not isFile
:
4397 ## __GetOptRomInfStatement() method
4399 # Get INF statements
4401 # @param self The object pointer
4402 # @param Obj for whom inf statement is got
4403 # @retval True Successfully find inf statement
4404 # @retval False Not able to find inf statement
4406 def __GetOptRomInfStatement(self
, Obj
):
4407 if not self
.__IsKeyword
( "INF"):
4410 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
4411 self
.__GetInfOptions
( ffsInf
)
4413 if not self
.__GetNextToken
():
4414 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
4415 ffsInf
.InfFileName
= self
.__Token
4416 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4417 #check for file path
4418 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4420 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4422 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
4423 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
4424 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
4425 self
.Profile
.InfFileLineList
.append(FileLineTuple
)
4427 if ffsInf
.UseArch
not in self
.Profile
.InfDict
:
4428 self
.Profile
.InfDict
[ffsInf
.UseArch
] = [ffsInf
.InfFileName
]
4430 self
.Profile
.InfDict
[ffsInf
.UseArch
].append(ffsInf
.InfFileName
)
4432 self
.Profile
.InfDict
['ArchTBD'].append(ffsInf
.InfFileName
)
4435 self
.__GetOptRomOverrides
(ffsInf
)
4437 Obj
.FfsList
.append(ffsInf
)
4440 ## __GetOptRomOverrides() method
4442 # Get overrides for OptROM INF & FILE
4444 # @param self The object pointer
4445 # @param FfsInfObj for whom overrides is got
4447 def __GetOptRomOverrides(self
, Obj
):
4448 if self
.__IsToken
('{'):
4449 Overrides
= OptRomInfStatement
.OverrideAttribs()
4451 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
4452 if not self
.__IsToken
( "="):
4453 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4454 if not self
.__GetNextHexNumber
():
4455 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
4456 Overrides
.PciVendorId
= self
.__Token
4459 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
4460 if not self
.__IsToken
( "="):
4461 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4462 if not self
.__GetNextHexNumber
():
4463 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
4464 Overrides
.PciClassCode
= self
.__Token
4467 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
4468 if not self
.__IsToken
( "="):
4469 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4470 if not self
.__GetNextHexNumber
():
4471 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
4473 Overrides
.PciDeviceId
= self
.__Token
4476 if self
.__IsKeyword
( "PCI_REVISION"):
4477 if not self
.__IsToken
( "="):
4478 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4479 if not self
.__GetNextHexNumber
():
4480 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
4481 Overrides
.PciRevision
= self
.__Token
4484 if self
.__IsKeyword
( "PCI_COMPRESS"):
4485 if not self
.__IsToken
( "="):
4486 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
4487 if not self
.__GetNextToken
():
4488 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
4489 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
4492 if self
.__IsToken
( "}"):
4495 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
4497 Obj
.OverrideAttribs
= Overrides
4499 ## __GetOptRomFileStatement() method
4501 # Get FILE statements
4503 # @param self The object pointer
4504 # @param Obj for whom FILE statement is got
4505 # @retval True Successfully find FILE statement
4506 # @retval False Not able to find FILE statement
4508 def __GetOptRomFileStatement(self
, Obj
):
4509 if not self
.__IsKeyword
( "FILE"):
4512 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
4514 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
(BINARY_FILE_TYPE_BIN
):
4515 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
4516 FfsFileObj
.FileType
= self
.__Token
4518 if not self
.__GetNextToken
():
4519 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
4520 FfsFileObj
.FileName
= self
.__Token
4521 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
4522 #check for file path
4523 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
4525 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
4527 if FfsFileObj
.FileType
== 'EFI':
4528 self
.__GetOptRomOverrides
(FfsFileObj
)
4530 Obj
.FfsList
.append(FfsFileObj
)
4534 ## __GetCapInFd() method
4536 # Get Cap list contained in FD
4538 # @param self The object pointer
4539 # @param FdName FD name
4540 # @retval CapList List of Capsule in FD
4542 def __GetCapInFd (self
, FdName
):
4544 if FdName
.upper() in self
.Profile
.FdDict
:
4545 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4546 for elementRegion
in FdObj
.RegionList
:
4547 if elementRegion
.RegionType
== 'CAPSULE':
4548 for elementRegionData
in elementRegion
.RegionDataList
:
4549 if elementRegionData
.endswith(".cap"):
4551 if elementRegionData
is not None and elementRegionData
.upper() not in CapList
:
4552 CapList
.append(elementRegionData
.upper())
4555 ## __GetReferencedFdCapTuple() method
4557 # Get FV and FD list referenced by a capsule image
4559 # @param self The object pointer
4560 # @param CapObj Capsule section to be searched
4561 # @param RefFdList referenced FD by section
4562 # @param RefFvList referenced FV by section
4564 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
4565 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
4566 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
is not None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
4567 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
4568 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
is not None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
4569 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
4570 elif CapsuleDataObj
.Ffs
is not None:
4571 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4572 if CapsuleDataObj
.Ffs
.FvName
is not None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4573 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4574 elif CapsuleDataObj
.Ffs
.FdName
is not None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4575 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4577 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4579 ## __GetFvInFd() method
4581 # Get FV list contained in FD
4583 # @param self The object pointer
4584 # @param FdName FD name
4585 # @retval FvList list of FV in FD
4587 def __GetFvInFd (self
, FdName
):
4589 if FdName
.upper() in self
.Profile
.FdDict
:
4590 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4591 for elementRegion
in FdObj
.RegionList
:
4592 if elementRegion
.RegionType
== BINARY_FILE_TYPE_FV
:
4593 for elementRegionData
in elementRegion
.RegionDataList
:
4594 if elementRegionData
.endswith(".fv"):
4596 if elementRegionData
is not None and elementRegionData
.upper() not in FvList
:
4597 FvList
.append(elementRegionData
.upper())
4600 ## __GetReferencedFdFvTuple() method
4602 # Get FD and FV list referenced by a FFS file
4604 # @param self The object pointer
4605 # @param FfsFile contains sections to be searched
4606 # @param RefFdList referenced FD by section
4607 # @param RefFvList referenced FV by section
4609 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4610 for FfsObj
in FvObj
.FfsList
:
4611 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4612 if FfsObj
.FvName
is not None and FfsObj
.FvName
.upper() not in RefFvList
:
4613 RefFvList
.append(FfsObj
.FvName
.upper())
4614 elif FfsObj
.FdName
is not None and FfsObj
.FdName
.upper() not in RefFdList
:
4615 RefFdList
.append(FfsObj
.FdName
.upper())
4617 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4619 ## __GetReferencedFdFvTupleFromSection() method
4621 # Get FD and FV list referenced by a FFS section
4623 # @param self The object pointer
4624 # @param FfsFile contains sections to be searched
4625 # @param FdList referenced FD by section
4626 # @param FvList referenced FV by section
4628 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4630 SectionStack
.extend(FfsFile
.SectionList
)
4631 while SectionStack
!= []:
4632 SectionObj
= SectionStack
.pop()
4633 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4634 if SectionObj
.FvName
is not None and SectionObj
.FvName
.upper() not in FvList
:
4635 FvList
.append(SectionObj
.FvName
.upper())
4636 if SectionObj
.Fv
is not None and SectionObj
.Fv
.UiFvName
is not None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4637 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4638 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4640 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4641 SectionStack
.extend(SectionObj
.SectionList
)
4643 ## CycleReferenceCheck() method
4645 # Check whether cycle reference exists in FDF
4647 # @param self The object pointer
4648 # @retval True cycle reference exists
4649 # @retval False Not exists cycle reference
4651 def CycleReferenceCheck(self
):
4653 # Check the cycle between FV and FD image
4655 MaxLength
= len (self
.Profile
.FvDict
)
4656 for FvName
in self
.Profile
.FvDict
:
4657 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4659 RefFvStack
.append(FvName
)
4663 while RefFvStack
!= [] and Index
< MaxLength
:
4665 FvNameFromStack
= RefFvStack
.pop()
4666 if FvNameFromStack
.upper() in self
.Profile
.FvDict
:
4667 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4673 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4675 for RefFdName
in RefFdList
:
4676 if RefFdName
in FdAnalyzedList
:
4679 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4680 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4681 if FvInFdList
!= []:
4682 for FvNameInFd
in FvInFdList
:
4683 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
, FvNameInFd
)
4684 if FvNameInFd
not in RefFvStack
:
4685 RefFvStack
.append(FvNameInFd
)
4687 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4688 EdkLogger
.info(LogStr
)
4690 FdAnalyzedList
.append(RefFdName
)
4692 for RefFvName
in RefFvList
:
4693 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4694 if RefFvName
not in RefFvStack
:
4695 RefFvStack
.append(RefFvName
)
4697 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4698 EdkLogger
.info(LogStr
)
4702 # Check the cycle between Capsule and FD image
4704 MaxLength
= len (self
.Profile
.CapsuleDict
)
4705 for CapName
in self
.Profile
.CapsuleDict
:
4707 # Capsule image to be checked.
4709 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4711 RefCapStack
.append(CapName
)
4716 while RefCapStack
!= [] and Index
< MaxLength
:
4718 CapNameFromStack
= RefCapStack
.pop()
4719 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
:
4720 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4726 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4730 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4731 for RefFdName
in RefFdList
:
4732 if RefFdName
in FdAnalyzedList
:
4735 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4736 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4737 if CapInFdList
!= []:
4738 for CapNameInFd
in CapInFdList
:
4739 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
, CapNameInFd
)
4740 if CapNameInFd
not in RefCapStack
:
4741 RefCapStack
.append(CapNameInFd
)
4743 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4744 EdkLogger
.info(LogStr
)
4747 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4748 if FvInFdList
!= []:
4749 for FvNameInFd
in FvInFdList
:
4750 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
, FvNameInFd
)
4751 if FvNameInFd
not in RefFvList
:
4752 RefFvList
.append(FvNameInFd
)
4754 FdAnalyzedList
.append(RefFdName
)
4756 # the number of the parsed FV and FD image
4758 FvListLength
= len (RefFvList
)
4759 FdListLength
= len (RefFdList
)
4760 for RefFvName
in RefFvList
:
4761 if RefFvName
in FvAnalyzedList
:
4763 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4764 if RefFvName
.upper() in self
.Profile
.FvDict
:
4765 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4768 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4769 FvAnalyzedList
.append(RefFvName
)
4773 def GetAllIncludedFile (self
):
4774 global AllIncludeFileList
4775 return AllIncludeFileList
4777 if __name__
== "__main__":
4780 test_file
= sys
.argv
[1]
4781 except IndexError as v
:
4782 print("Usage: %s filename" % sys
.argv
[0])
4785 parser
= FdfParser(test_file
)
4788 parser
.CycleReferenceCheck()
4789 except Warning as X
: