4 # Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
24 import FfsInfStatement
25 import FfsFileStatement
31 import CompressSection
36 import RuleComplexFile
40 import ComponentStatement
42 import OptRomInfStatement
43 import OptRomFileStatement
45 from GenFdsGlobalVariable
import GenFdsGlobalVariable
46 from Common
.BuildToolError
import *
47 from Common
import EdkLogger
48 from Common
.Misc
import PathClass
49 from Common
.String
import NormPath
50 import Common
.GlobalData
as GlobalData
51 from Common
.Expression
import *
52 from Common
import GlobalData
57 ##define T_CHAR_SPACE ' '
58 ##define T_CHAR_NULL '\0'
59 ##define T_CHAR_CR '\r'
60 ##define T_CHAR_TAB '\t'
61 ##define T_CHAR_LF '\n'
62 ##define T_CHAR_SLASH '/'
63 ##define T_CHAR_BACKSLASH '\\'
64 ##define T_CHAR_DOUBLE_QUOTE '\"'
65 ##define T_CHAR_SINGLE_QUOTE '\''
66 ##define T_CHAR_STAR '*'
67 ##define T_CHAR_HASH '#'
69 (T_CHAR_SPACE
, T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_TAB
, T_CHAR_LF
, T_CHAR_SLASH
, \
70 T_CHAR_BACKSLASH
, T_CHAR_DOUBLE_QUOTE
, T_CHAR_SINGLE_QUOTE
, T_CHAR_STAR
, T_CHAR_HASH
) = \
71 (' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
73 SEPERATOR_TUPLE
= ('=', '|', ',', '{', '}')
75 RegionSizePattern
= re
.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
76 RegionSizeGuidPattern
= re
.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
79 # Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
81 # All Macro values when parsing file, not replace existing Macro
84 def GetRealFileLine (File
, Line
):
87 for Profile
in IncludeFileList
:
88 if Line
>= Profile
.InsertStartLineNumber
and Line
< Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
89 return (Profile
.FileName
, Line
- Profile
.InsertStartLineNumber
+ 1)
90 if Line
>= Profile
.InsertStartLineNumber
+ Profile
.InsertAdjust
+ len(Profile
.FileLinesList
):
91 InsertedLines
+= Profile
.InsertAdjust
+ len(Profile
.FileLinesList
)
93 return (File
, Line
- InsertedLines
)
95 ## The exception class that used to report error messages when parsing FDF
97 # Currently the "ToolName" is set to be "FDF Parser".
99 class Warning (Exception):
102 # @param self The object pointer
103 # @param Str The message to record
104 # @param File The FDF name
105 # @param Line The Line number that error occurs
107 def __init__(self
, Str
, File
= None, Line
= None):
109 FileLineTuple
= GetRealFileLine(File
, Line
)
110 self
.FileName
= FileLineTuple
[0]
111 self
.LineNumber
= FileLineTuple
[1]
113 self
.ToolName
= 'FdfParser'
118 ## The MACRO class that used to record macro value data when parsing include file
124 # @param self The object pointer
125 # @param FileName The file that to be parsed
127 def __init__(self
, FileName
, Line
):
128 self
.FileName
= FileName
129 self
.DefinedAtLine
= Line
130 self
.MacroName
= None
131 self
.MacroValue
= None
133 ## The Include file content class that used to record file data when parsing include file
135 # May raise Exception when opening file.
137 class IncludeFileProfile
:
140 # @param self The object pointer
141 # @param FileName The file that to be parsed
143 def __init__(self
, FileName
):
144 self
.FileName
= FileName
145 self
.FileLinesList
= []
147 fsock
= open(FileName
, "rb", 0)
149 self
.FileLinesList
= fsock
.readlines()
154 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
156 self
.InsertStartLineNumber
= None
157 self
.InsertAdjust
= 0
159 ## The FDF content class that used to record file data when parsing FDF
161 # May raise Exception when opening file.
166 # @param self The object pointer
167 # @param FileName The file that to be parsed
169 def __init__(self
, FileName
):
170 self
.FileLinesList
= []
172 fsock
= open(FileName
, "rb", 0)
174 self
.FileLinesList
= fsock
.readlines()
179 EdkLogger
.error("FdfParser", FILE_OPEN_FAILURE
, ExtraData
=FileName
)
186 self
.FdNameNotSet
= False
188 self
.CapsuleDict
= {}
193 ## The syntax parser for FDF
195 # PreprocessFile method should be called prior to ParseFile
196 # CycleReferenceCheck method can detect cycles in FDF contents
198 # GetNext*** procedures mean these procedures will get next token first, then make judgement.
199 # Get*** procedures mean these procedures will make judgement on current token only.
204 # @param self The object pointer
205 # @param FileName The file that to be parsed
207 def __init__(self
, FileName
):
208 self
.Profile
= FileProfile(FileName
)
209 self
.FileName
= FileName
210 self
.CurrentLineNumber
= 1
211 self
.CurrentOffsetWithinLine
= 0
212 self
.CurrentFdName
= None
213 self
.CurrentFvName
= None
215 self
.__SkippedChars
= ""
217 self
.__WipeOffArea
= []
218 if GenFdsGlobalVariable
.WorkSpaceDir
== '':
219 GenFdsGlobalVariable
.WorkSpaceDir
= os
.getenv("WORKSPACE")
221 InputMacroDict
.update(GlobalData
.gPlatformDefines
)
222 InputMacroDict
.update(GlobalData
.gGlobalDefines
)
223 InputMacroDict
.update(GlobalData
.gCommandLineDefines
)
225 ## __IsWhiteSpace() method
227 # Whether char at current FileBufferPos is whitespace
229 # @param self The object pointer
230 # @param Char The char to test
231 # @retval True The char is a kind of white space
232 # @retval False The char is NOT a kind of white space
234 def __IsWhiteSpace(self
, Char
):
235 if Char
in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_SPACE
, T_CHAR_TAB
, T_CHAR_LF
):
240 ## __SkipWhiteSpace() method
242 # Skip white spaces from current char, return number of chars skipped
244 # @param self The object pointer
245 # @retval Count The number of chars skipped
247 def __SkipWhiteSpace(self
):
249 while not self
.__EndOfFile
():
251 if self
.__CurrentChar
() in (T_CHAR_NULL
, T_CHAR_CR
, T_CHAR_LF
, T_CHAR_SPACE
, T_CHAR_TAB
):
252 self
.__SkippedChars
+= str(self
.__CurrentChar
())
259 ## __EndOfFile() method
261 # Judge current buffer pos is at file end
263 # @param self The object pointer
264 # @retval True Current File buffer position is at file end
265 # @retval False Current File buffer position is NOT at file end
267 def __EndOfFile(self
):
268 NumberOfLines
= len(self
.Profile
.FileLinesList
)
269 SizeOfLastLine
= len(self
.Profile
.FileLinesList
[-1])
270 if self
.CurrentLineNumber
== NumberOfLines
and self
.CurrentOffsetWithinLine
>= SizeOfLastLine
- 1:
272 elif self
.CurrentLineNumber
> NumberOfLines
:
277 ## __EndOfLine() method
279 # Judge current buffer pos is at line end
281 # @param self The object pointer
282 # @retval True Current File buffer position is at line end
283 # @retval False Current File buffer position is NOT at line end
285 def __EndOfLine(self
):
286 if self
.CurrentLineNumber
> len(self
.Profile
.FileLinesList
):
288 SizeOfCurrentLine
= len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
289 if self
.CurrentOffsetWithinLine
>= SizeOfCurrentLine
:
296 # Reset file data buffer to the initial state
298 # @param self The object pointer
301 self
.CurrentLineNumber
= 1
302 self
.CurrentOffsetWithinLine
= 0
304 ## __UndoOneChar() method
306 # Go back one char in the file buffer
308 # @param self The object pointer
309 # @retval True Successfully go back one char
310 # @retval False Not able to go back one char as file beginning reached
312 def __UndoOneChar(self
):
314 if self
.CurrentLineNumber
== 1 and self
.CurrentOffsetWithinLine
== 0:
316 elif self
.CurrentOffsetWithinLine
== 0:
317 self
.CurrentLineNumber
-= 1
318 self
.CurrentOffsetWithinLine
= len(self
.__CurrentLine
()) - 1
320 self
.CurrentOffsetWithinLine
-= 1
323 ## __GetOneChar() method
325 # Move forward one char in the file buffer
327 # @param self The object pointer
329 def __GetOneChar(self
):
330 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
331 self
.CurrentLineNumber
+= 1
332 self
.CurrentOffsetWithinLine
= 0
334 self
.CurrentOffsetWithinLine
+= 1
336 ## __CurrentChar() method
338 # Get the char pointed to by the file buffer pointer
340 # @param self The object pointer
341 # @retval Char Current char
343 def __CurrentChar(self
):
344 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
]
346 ## __NextChar() method
348 # Get the one char pass the char pointed to by the file buffer pointer
350 # @param self The object pointer
351 # @retval Char Next char
353 def __NextChar(self
):
354 if self
.CurrentOffsetWithinLine
== len(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]) - 1:
355 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
][0]
357 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
+ 1]
359 ## __SetCurrentCharValue() method
361 # Modify the value of current char
363 # @param self The object pointer
364 # @param Value The new value of current char
366 def __SetCurrentCharValue(self
, Value
):
367 self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
] = Value
369 ## __CurrentLine() method
371 # Get the list that contains current line contents
373 # @param self The object pointer
374 # @retval List current line contents
376 def __CurrentLine(self
):
377 return self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
379 def __StringToList(self
):
380 self
.Profile
.FileLinesList
= [list(s
) for s
in self
.Profile
.FileLinesList
]
381 self
.Profile
.FileLinesList
[-1].append(' ')
383 def __ReplaceMacros(self
, Str
, File
, Line
):
385 while Str
.find('$(', MacroEnd
) >= 0:
386 MacroStart
= Str
.find('$(', MacroEnd
)
387 if Str
.find(')', MacroStart
) > 0:
388 MacroEnd
= Str
.find(')', MacroStart
)
389 Name
= Str
[MacroStart
+ 2 : MacroEnd
]
391 if Name
in InputMacroDict
:
392 Value
= InputMacroDict
[Name
]
395 for Profile
in AllMacroList
:
396 if Profile
.FileName
== File
and Profile
.MacroName
== Name
and Profile
.DefinedAtLine
<= Line
:
397 Value
= Profile
.MacroValue
400 Str
= Str
.replace('$(' + Name
+ ')', Value
)
401 MacroEnd
= MacroStart
+ len(Value
)
404 raise Warning("Macro not complete", self
.FileName
, self
.CurrentLineNumber
)
407 def __ReplaceFragment(self
, StartPos
, EndPos
, Value
= ' '):
408 if StartPos
[0] == EndPos
[0]:
410 while Offset
<= EndPos
[1]:
411 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
416 while self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] not in ('\r', '\n'):
417 self
.Profile
.FileLinesList
[StartPos
[0]][Offset
] = Value
421 while Line
< EndPos
[0]:
423 while self
.Profile
.FileLinesList
[Line
][Offset
] not in ('\r', '\n'):
424 self
.Profile
.FileLinesList
[Line
][Offset
] = Value
429 while Offset
<= EndPos
[1]:
430 self
.Profile
.FileLinesList
[EndPos
[0]][Offset
] = Value
434 def __GetMacroName(self
):
435 if not self
.__GetNextToken
():
436 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
437 MacroName
= self
.__Token
439 if MacroName
.startswith('!'):
441 MacroName
= MacroName
[1:].strip()
443 if not MacroName
.startswith('$(') or not MacroName
.endswith(')'):
444 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName
},
445 self
.FileName
, self
.CurrentLineNumber
)
446 MacroName
= MacroName
[2:-1]
447 return MacroName
, NotFlag
449 ## PreprocessFile() method
451 # Preprocess file contents, replace comments with spaces.
452 # In the end, rewind the file buffer pointer to the beginning
453 # BUGBUG: No !include statement processing contained in this procedure
454 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
456 # @param self The object pointer
458 def PreprocessFile(self
):
462 DoubleSlashComment
= False
464 # HashComment in quoted string " " is ignored.
467 while not self
.__EndOfFile
():
469 if self
.__CurrentChar
() == T_CHAR_DOUBLE_QUOTE
and not InComment
:
470 InString
= not InString
471 # meet new line, then no longer in a comment for // and '#'
472 if self
.__CurrentChar
() == T_CHAR_LF
:
473 self
.CurrentLineNumber
+= 1
474 self
.CurrentOffsetWithinLine
= 0
475 if InComment
and DoubleSlashComment
:
477 DoubleSlashComment
= False
478 if InComment
and HashComment
:
481 # check for */ comment end
482 elif InComment
and not DoubleSlashComment
and not HashComment
and self
.__CurrentChar
() == T_CHAR_STAR
and self
.__NextChar
() == T_CHAR_SLASH
:
483 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
485 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
488 # set comments to spaces
490 self
.__SetCurrentCharValue
(T_CHAR_SPACE
)
492 # check for // comment
493 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_SLASH
and not self
.__EndOfLine
():
495 DoubleSlashComment
= True
496 # check for '#' comment
497 elif self
.__CurrentChar
() == T_CHAR_HASH
and not self
.__EndOfLine
() and not InString
:
500 # check for /* comment start
501 elif self
.__CurrentChar
() == T_CHAR_SLASH
and self
.__NextChar
() == T_CHAR_STAR
:
502 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
504 self
.__SetCurrentCharValue
( T_CHAR_SPACE
)
510 # restore from ListOfList to ListOfString
511 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
514 ## PreprocessIncludeFile() method
516 # Preprocess file contents, replace !include statements with file contents.
517 # In the end, rewind the file buffer pointer to the beginning
519 # @param self The object pointer
521 def PreprocessIncludeFile(self
):
523 while self
.__GetNextToken
():
525 if self
.__Token
== '!include':
526 IncludeLine
= self
.CurrentLineNumber
527 IncludeOffset
= self
.CurrentOffsetWithinLine
- len('!include')
528 if not self
.__GetNextToken
():
529 raise Warning("expected include file name", self
.FileName
, self
.CurrentLineNumber
)
530 IncFileName
= self
.__Token
531 if not os
.path
.isabs(IncFileName
):
532 if IncFileName
.startswith('$(WORKSPACE)'):
533 Str
= IncFileName
.replace('$(WORKSPACE)', os
.environ
.get('WORKSPACE'))
534 if os
.path
.exists(Str
):
535 if not os
.path
.isabs(Str
):
536 Str
= os
.path
.abspath(Str
)
539 # file is in the same dir with FDF file
540 FullFdf
= self
.FileName
541 if not os
.path
.isabs(self
.FileName
):
542 FullFdf
= os
.path
.join(os
.environ
.get('WORKSPACE'), self
.FileName
)
544 IncFileName
= os
.path
.join(os
.path
.dirname(FullFdf
), IncFileName
)
546 if not os
.path
.exists(os
.path
.normpath(IncFileName
)):
547 raise Warning("Include file not exists", self
.FileName
, self
.CurrentLineNumber
)
549 IncFileProfile
= IncludeFileProfile(os
.path
.normpath(IncFileName
))
551 CurrentLine
= self
.CurrentLineNumber
552 CurrentOffset
= self
.CurrentOffsetWithinLine
553 # list index of the insertion, note that line number is 'CurrentLine + 1'
554 InsertAtLine
= CurrentLine
555 IncFileProfile
.InsertStartLineNumber
= InsertAtLine
+ 1
556 # deal with remaining portions after "!include filename", if exists.
557 if self
.__GetNextToken
():
558 if self
.CurrentLineNumber
== CurrentLine
:
559 RemainingLine
= self
.__CurrentLine
()[CurrentOffset
:]
560 self
.Profile
.FileLinesList
.insert(self
.CurrentLineNumber
, RemainingLine
)
561 IncFileProfile
.InsertAdjust
+= 1
562 self
.CurrentLineNumber
+= 1
563 self
.CurrentOffsetWithinLine
= 0
565 for Line
in IncFileProfile
.FileLinesList
:
566 self
.Profile
.FileLinesList
.insert(InsertAtLine
, Line
)
567 self
.CurrentLineNumber
+= 1
570 IncludeFileList
.append(IncFileProfile
)
572 # comment out the processed include file statement
573 TempList
= list(self
.Profile
.FileLinesList
[IncludeLine
- 1])
574 TempList
.insert(IncludeOffset
, '#')
575 self
.Profile
.FileLinesList
[IncludeLine
- 1] = ''.join(TempList
)
579 def __GetIfListCurrentItemStat(self
, IfList
):
589 ## PreprocessConditionalStatement() method
591 # Preprocess conditional statement.
592 # In the end, rewind the file buffer pointer to the beginning
594 # @param self The object pointer
596 def PreprocessConditionalStatement(self
):
597 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
600 while self
.__GetNextToken
():
601 if self
.__Token
== 'DEFINE':
602 if self
.__GetIfListCurrentItemStat
(IfList
):
603 DefineLine
= self
.CurrentLineNumber
- 1
604 DefineOffset
= self
.CurrentOffsetWithinLine
- len('DEFINE')
605 if not self
.__GetNextToken
():
606 raise Warning("expected Macro name", self
.FileName
, self
.CurrentLineNumber
)
608 if not self
.__IsToken
( "="):
609 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
611 if not self
.__GetNextToken
():
612 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
614 if self
.__GetStringData
():
617 if not Macro
in InputMacroDict
:
618 FileLineTuple
= GetRealFileLine(self
.FileName
, DefineLine
+ 1)
619 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
620 MacProfile
.MacroName
= Macro
621 MacProfile
.MacroValue
= Value
622 AllMacroList
.append(MacProfile
)
623 InputMacroDict
[MacProfile
.MacroName
] = MacProfile
.MacroValue
624 self
.__WipeOffArea
.append(((DefineLine
, DefineOffset
), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
625 elif self
.__Token
== 'SET':
626 PcdPair
= self
.__GetNextPcdName
()
627 PcdName
= "%s.%s" % (PcdPair
[1], PcdPair
[0])
628 if not self
.__IsToken
( "="):
629 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
631 if not self
.__GetNextToken
():
632 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
635 if Value
.startswith("{"):
636 # deal with value with {}
637 if not self
.__SkipToToken
( "}"):
638 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
639 Value
+= self
.__SkippedChars
641 InputMacroDict
[PcdName
] = Value
642 elif self
.__Token
in ('!ifdef', '!ifndef', '!if'):
643 IfStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
644 IfList
.append([IfStartPos
, None, None])
646 CondLabel
= self
.__Token
647 Expression
= self
.__GetExpression
()
649 if CondLabel
== '!if':
650 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
652 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'in')
653 if CondLabel
== '!ifndef':
654 ConditionSatisfied
= not ConditionSatisfied
656 BranchDetermined
= ConditionSatisfied
657 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, BranchDetermined
]
658 if ConditionSatisfied
:
659 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
660 elif self
.__Token
in ('!elseif', '!else'):
661 ElseStartPos
= (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len(self
.__Token
))
663 raise Warning("Missing !if statement", self
.FileName
, self
.CurrentLineNumber
)
666 IfList
[-1] = [ElseStartPos
, False, True]
667 self
.__WipeOffArea
.append((ElseStartPos
, (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
669 self
.__WipeOffArea
.append((IfList
[-1][0], ElseStartPos
))
670 IfList
[-1] = [ElseStartPos
, True, IfList
[-1][2]]
671 if self
.__Token
== '!elseif':
672 Expression
= self
.__GetExpression
()
673 ConditionSatisfied
= self
.__EvaluateConditional
(Expression
, IfList
[-1][0][0] + 1, 'eval')
674 IfList
[-1] = [IfList
[-1][0], ConditionSatisfied
, IfList
[-1][2]]
678 IfList
[-1][1] = False
681 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
682 elif self
.__Token
== '!endif':
684 self
.__WipeOffArea
.append(((self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- len('!endif')), (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
686 self
.__WipeOffArea
.append((IfList
[-1][0], (self
.CurrentLineNumber
- 1, self
.CurrentOffsetWithinLine
- 1)))
689 elif not IfList
: # Don't use PCDs inside conditional directive
690 if self
.CurrentLineNumber
<= RegionLayoutLine
:
691 # Don't try the same line twice
693 RegionSize
= RegionSizePattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1])
695 RegionLayoutLine
= self
.CurrentLineNumber
697 RegionSizeGuid
= RegionSizeGuidPattern
.match(self
.Profile
.FileLinesList
[self
.CurrentLineNumber
])
698 if not RegionSizeGuid
:
699 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
701 InputMacroDict
[RegionSizeGuid
.group('base')] = RegionSize
.group('base')
702 InputMacroDict
[RegionSizeGuid
.group('size')] = RegionSize
.group('size')
703 RegionLayoutLine
= self
.CurrentLineNumber
+ 1
706 raise Warning("Missing !endif", self
.FileName
, self
.CurrentLineNumber
)
709 def __EvaluateConditional(self
, Expression
, Line
, Op
= None, Value
= None):
710 FileLineTuple
= GetRealFileLine(self
.FileName
, Line
)
713 return ValueExpression(Expression
, InputMacroDict
)()
714 except SymbolNotFound
:
716 except WrnExpression
, Excpt
:
718 # Catch expression evaluation warning here. We need to report
719 # the precise number of line and return the evaluation result
721 EdkLogger
.warn('Parser', "Suspicious expression: %s" % str(Excpt
),
722 File
=self
.FileName
, ExtraData
=self
.__CurrentLine
(),
725 except Exception, Excpt
:
726 raise Warning("Invalid expression", *FileLineTuple
)
728 if Expression
.startswith('$(') and Expression
[-1] == ')':
729 Expression
= Expression
[2:-1]
730 return Expression
in InputMacroDict
732 ## __IsToken() method
734 # Check whether input string is found from current char position along
735 # If found, the string value is put into self.__Token
737 # @param self The object pointer
738 # @param String The string to search
739 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
740 # @retval True Successfully find string, file buffer pointer moved forward
741 # @retval False Not able to find string, file buffer pointer not changed
743 def __IsToken(self
, String
, IgnoreCase
= False):
744 self
.__SkipWhiteSpace
()
746 # Only consider the same line, no multi-line token allowed
747 StartPos
= self
.CurrentOffsetWithinLine
750 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
752 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
754 self
.CurrentOffsetWithinLine
+= len(String
)
755 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
759 ## __IsKeyword() method
761 # Check whether input keyword is found from current char position along, whole word only!
762 # If found, the string value is put into self.__Token
764 # @param self The object pointer
765 # @param Keyword The string to search
766 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
767 # @retval True Successfully find string, file buffer pointer moved forward
768 # @retval False Not able to find string, file buffer pointer not changed
770 def __IsKeyword(self
, KeyWord
, IgnoreCase
= False):
771 self
.__SkipWhiteSpace
()
773 # Only consider the same line, no multi-line token allowed
774 StartPos
= self
.CurrentOffsetWithinLine
777 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(KeyWord
.upper())
779 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(KeyWord
)
781 followingChar
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
+ len(KeyWord
)]
782 if not str(followingChar
).isspace() and followingChar
not in SEPERATOR_TUPLE
:
784 self
.CurrentOffsetWithinLine
+= len(KeyWord
)
785 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
789 def __GetExpression(self
):
790 Line
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1]
791 Index
= len(Line
) - 1
792 while Line
[Index
] in ['\r', '\n']:
794 ExpressionString
= self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:Index
+1]
795 self
.CurrentOffsetWithinLine
+= len(ExpressionString
)
796 ExpressionString
= ExpressionString
.strip()
797 return ExpressionString
799 ## __GetNextWord() method
801 # Get next C name from file lines
802 # If found, the string value is put into self.__Token
804 # @param self The object pointer
805 # @retval True Successfully find a C name string, file buffer pointer moved forward
806 # @retval False Not able to find a C name string, file buffer pointer not changed
808 def __GetNextWord(self
):
809 self
.__SkipWhiteSpace
()
810 if self
.__EndOfFile
():
813 TempChar
= self
.__CurrentChar
()
814 StartPos
= self
.CurrentOffsetWithinLine
815 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') or TempChar
== '_':
817 while not self
.__EndOfLine
():
818 TempChar
= self
.__CurrentChar
()
819 if (TempChar
>= 'a' and TempChar
<= 'z') or (TempChar
>= 'A' and TempChar
<= 'Z') \
820 or (TempChar
>= '0' and TempChar
<= '9') or TempChar
== '_' or TempChar
== '-':
826 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
831 ## __GetNextToken() method
833 # Get next token unit before a seperator
834 # If found, the string value is put into self.__Token
836 # @param self The object pointer
837 # @retval True Successfully find a token unit, file buffer pointer moved forward
838 # @retval False Not able to find a token unit, file buffer pointer not changed
840 def __GetNextToken(self
):
841 # Skip leading spaces, if exist.
842 self
.__SkipWhiteSpace
()
843 if self
.__EndOfFile
():
845 # Record the token start position, the position of the first non-space char.
846 StartPos
= self
.CurrentOffsetWithinLine
847 StartLine
= self
.CurrentLineNumber
848 while not self
.__EndOfLine
():
849 TempChar
= self
.__CurrentChar
()
850 # Try to find the end char that is not a space and not in seperator tuple.
851 # That is, when we got a space or any char in the tuple, we got the end of token.
852 if not str(TempChar
).isspace() and TempChar
not in SEPERATOR_TUPLE
:
854 # if we happen to meet a seperator as the first char, we must proceed to get it.
855 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
856 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
864 EndPos
= self
.CurrentOffsetWithinLine
865 if self
.CurrentLineNumber
!= StartLine
:
866 EndPos
= len(self
.Profile
.FileLinesList
[StartLine
-1])
867 self
.__Token
= self
.Profile
.FileLinesList
[StartLine
-1][StartPos
: EndPos
]
868 if StartPos
!= self
.CurrentOffsetWithinLine
:
873 def __GetNextOp(self
):
874 # Skip leading spaces, if exist.
875 self
.__SkipWhiteSpace
()
876 if self
.__EndOfFile
():
878 # Record the token start position, the position of the first non-space char.
879 StartPos
= self
.CurrentOffsetWithinLine
880 while not self
.__EndOfLine
():
881 TempChar
= self
.__CurrentChar
()
882 # Try to find the end char that is not a space
883 if not str(TempChar
).isspace():
890 if StartPos
!= self
.CurrentOffsetWithinLine
:
891 self
.__Token
= self
.__CurrentLine
()[StartPos
: self
.CurrentOffsetWithinLine
]
895 ## __GetNextGuid() method
897 # Get next token unit before a seperator
898 # If found, the GUID string is put into self.__Token
900 # @param self The object pointer
901 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward
902 # @retval False Not able to find a registry format GUID, file buffer pointer not changed
904 def __GetNextGuid(self
):
906 if not self
.__GetNextToken
():
908 p
= re
.compile('[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}')
909 if p
.match(self
.__Token
) != None:
915 ## __UndoToken() method
917 # Go back one token unit in file buffer
919 # @param self The object pointer
921 def __UndoToken(self
):
923 while self
.__CurrentChar
().isspace():
924 if not self
.__UndoOneChar
():
929 StartPos
= self
.CurrentOffsetWithinLine
930 CurrentLine
= self
.CurrentLineNumber
931 while CurrentLine
== self
.CurrentLineNumber
:
933 TempChar
= self
.__CurrentChar
()
934 # Try to find the end char that is not a space and not in seperator tuple.
935 # That is, when we got a space or any char in the tuple, we got the end of token.
936 if not str(TempChar
).isspace() and not TempChar
in SEPERATOR_TUPLE
:
937 if not self
.__UndoOneChar
():
939 # if we happen to meet a seperator as the first char, we must proceed to get it.
940 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
941 elif StartPos
== self
.CurrentOffsetWithinLine
and TempChar
in SEPERATOR_TUPLE
:
948 ## __HexDigit() method
950 # Whether char input is a Hex data bit
952 # @param self The object pointer
953 # @param TempChar The char to test
954 # @retval True The char is a Hex data bit
955 # @retval False The char is NOT a Hex data bit
957 def __HexDigit(self
, TempChar
):
958 if (TempChar
>= 'a' and TempChar
<= 'f') or (TempChar
>= 'A' and TempChar
<= 'F') \
959 or (TempChar
>= '0' and TempChar
<= '9'):
964 def __IsHex(self
, HexStr
):
965 if not HexStr
.upper().startswith("0X"):
967 if len(self
.__Token
) <= 2:
969 charList
= [c
for c
in HexStr
[2 : ] if not self
.__HexDigit
( c
)]
970 if len(charList
) == 0:
974 ## __GetNextHexNumber() method
976 # Get next HEX data before a seperator
977 # If found, the HEX data is put into self.__Token
979 # @param self The object pointer
980 # @retval True Successfully find a HEX data, file buffer pointer moved forward
981 # @retval False Not able to find a HEX data, file buffer pointer not changed
983 def __GetNextHexNumber(self
):
984 if not self
.__GetNextToken
():
986 if self
.__IsHex
(self
.__Token
):
992 ## __GetNextDecimalNumber() method
994 # Get next decimal data before a seperator
995 # If found, the decimal data is put into self.__Token
997 # @param self The object pointer
998 # @retval True Successfully find a decimal data, file buffer pointer moved forward
999 # @retval False Not able to find a decimal data, file buffer pointer not changed
1001 def __GetNextDecimalNumber(self
):
1002 if not self
.__GetNextToken
():
1004 if self
.__Token
.isdigit():
1010 ## __GetNextPcdName() method
1012 # Get next PCD token space C name and PCD C name pair before a seperator
1013 # If found, the decimal data is put into self.__Token
1015 # @param self The object pointer
1016 # @retval Tuple PCD C name and PCD token space C name pair
1018 def __GetNextPcdName(self
):
1019 if not self
.__GetNextWord
():
1020 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1021 pcdTokenSpaceCName
= self
.__Token
1023 if not self
.__IsToken
( "."):
1024 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1026 if not self
.__GetNextWord
():
1027 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self
.FileName
, self
.CurrentLineNumber
)
1028 pcdCName
= self
.__Token
1030 return (pcdCName
, pcdTokenSpaceCName
)
1032 ## __GetStringData() method
1034 # Get string contents quoted in ""
1035 # If found, the decimal data is put into self.__Token
1037 # @param self The object pointer
1038 # @retval True Successfully find a string data, file buffer pointer moved forward
1039 # @retval False Not able to find a string data, file buffer pointer not changed
1041 def __GetStringData(self
):
1042 if self
.__Token
.startswith("\"") or self
.__Token
.startswith("L\""):
1044 self
.__SkipToToken
("\"")
1045 currentLineNumber
= self
.CurrentLineNumber
1047 if not self
.__SkipToToken
("\""):
1048 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1049 if currentLineNumber
!= self
.CurrentLineNumber
:
1050 raise Warning("Missing Quote \" for String", self
.FileName
, self
.CurrentLineNumber
)
1051 self
.__Token
= self
.__SkippedChars
.rstrip('\"')
1054 elif self
.__Token
.startswith("\'") or self
.__Token
.startswith("L\'"):
1056 self
.__SkipToToken
("\'")
1057 currentLineNumber
= self
.CurrentLineNumber
1059 if not self
.__SkipToToken
("\'"):
1060 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1061 if currentLineNumber
!= self
.CurrentLineNumber
:
1062 raise Warning("Missing Quote \' for String", self
.FileName
, self
.CurrentLineNumber
)
1063 self
.__Token
= self
.__SkippedChars
.rstrip('\'')
1069 ## __SkipToToken() method
1071 # Search forward in file buffer for the string
1072 # The skipped chars are put into self.__SkippedChars
1074 # @param self The object pointer
1075 # @param String The string to search
1076 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive
1077 # @retval True Successfully find the string, file buffer pointer moved forward
1078 # @retval False Not able to find the string, file buffer pointer not changed
1080 def __SkipToToken(self
, String
, IgnoreCase
= False):
1081 StartPos
= self
.GetFileBufferPos()
1083 self
.__SkippedChars
= ""
1084 while not self
.__EndOfFile
():
1087 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].upper().find(String
.upper())
1089 index
= self
.__CurrentLine
()[self
.CurrentOffsetWithinLine
: ].find(String
)
1091 self
.CurrentOffsetWithinLine
+= len(String
)
1092 self
.__SkippedChars
+= String
1094 self
.__SkippedChars
+= str(self
.__CurrentChar
())
1097 self
.SetFileBufferPos( StartPos
)
1098 self
.__SkippedChars
= ""
1101 ## GetFileBufferPos() method
1103 # Return the tuple of current line and offset within the line
1105 # @param self The object pointer
1106 # @retval Tuple Line number and offset pair
1108 def GetFileBufferPos(self
):
1109 return (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
)
1111 ## SetFileBufferPos() method
1113 # Restore the file buffer position
1115 # @param self The object pointer
1116 # @param Pos The new file buffer position
1118 def SetFileBufferPos(self
, Pos
):
1119 (self
.CurrentLineNumber
, self
.CurrentOffsetWithinLine
) = Pos
1121 ## Preprocess() method
1123 # Preprocess comment, conditional directive, include directive, replace macro.
1124 # Exception will be raised if syntax error found
1126 # @param self The object pointer
1128 def Preprocess(self
):
1129 self
.__StringToList
()
1130 self
.PreprocessFile()
1131 self
.PreprocessIncludeFile()
1132 self
.__StringToList
()
1133 self
.PreprocessFile()
1134 self
.PreprocessConditionalStatement()
1135 self
.__StringToList
()
1136 for Pos
in self
.__WipeOffArea
:
1137 self
.__ReplaceFragment
(Pos
[0], Pos
[1])
1138 self
.Profile
.FileLinesList
= ["".join(list) for list in self
.Profile
.FileLinesList
]
1140 while self
.__GetDefines
():
1144 while Index
< len(self
.Profile
.FileLinesList
):
1145 FileLineTuple
= GetRealFileLine(self
.FileName
, Index
+ 1)
1146 self
.Profile
.FileLinesList
[Index
] = self
.__ReplaceMacros
(self
.Profile
.FileLinesList
[Index
], FileLineTuple
[0], FileLineTuple
[1])
1149 ## ParseFile() method
1151 # Parse the file profile buffer to extract fd, fv ... information
1152 # Exception will be raised if syntax error found
1154 # @param self The object pointer
1156 def ParseFile(self
):
1160 while self
.__GetFd
():
1163 while self
.__GetFv
():
1166 while self
.__GetCapsule
():
1169 while self
.__GetVtf
():
1172 while self
.__GetRule
():
1175 while self
.__GetOptionRom
():
1180 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1181 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
1182 X
.Message
+= ' near line %d, column %d: %s' \
1183 % (FileLineTuple
[1], self
.CurrentOffsetWithinLine
+ 1, self
.Profile
.FileLinesList
[self
.CurrentLineNumber
- 1][self
.CurrentOffsetWithinLine
:].rstrip('\n').rstrip('\r'))
1186 ## __GetDefines() method
1188 # Get Defines section contents and store its data into AllMacrosList
1190 # @param self The object pointer
1191 # @retval True Successfully find a Defines
1192 # @retval False Not able to find a Defines
1194 def __GetDefines(self
):
1196 if not self
.__GetNextToken
():
1199 S
= self
.__Token
.upper()
1200 if S
.startswith("[") and not S
.startswith("[DEFINES"):
1201 if not S
.startswith("[FD.") and not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1202 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1203 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1208 if not self
.__IsToken
("[DEFINES", True):
1209 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1210 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1211 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1212 raise Warning("expected [DEFINES", self
.FileName
, self
.CurrentLineNumber
)
1214 if not self
.__IsToken
( "]"):
1215 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1217 while self
.__GetNextWord
():
1218 # handle the SET statement
1219 if self
.__Token
== 'SET':
1221 self
.__GetSetStatement
(None)
1224 Macro
= self
.__Token
1226 if not self
.__IsToken
("="):
1227 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1228 if not self
.__GetNextToken
() or self
.__Token
.startswith('['):
1229 raise Warning("expected MACRO value", self
.FileName
, self
.CurrentLineNumber
)
1230 Value
= self
.__Token
1231 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1232 MacProfile
= MacroProfile(FileLineTuple
[0], FileLineTuple
[1])
1233 MacProfile
.MacroName
= Macro
1234 MacProfile
.MacroValue
= Value
1235 AllMacroList
.append(MacProfile
)
1241 # Get FD section contents and store its data into FD dictionary of self.Profile
1243 # @param self The object pointer
1244 # @retval True Successfully find a FD
1245 # @retval False Not able to find a FD
1249 if not self
.__GetNextToken
():
1252 S
= self
.__Token
.upper()
1253 if S
.startswith("[") and not S
.startswith("[FD."):
1254 if not S
.startswith("[FV.") and not S
.startswith("[CAPSULE.") \
1255 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1256 raise Warning("Unknown section", self
.FileName
, self
.CurrentLineNumber
)
1261 if not self
.__IsToken
("[FD.", True):
1262 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1263 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1264 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1265 raise Warning("expected [FD.]", self
.FileName
, self
.CurrentLineNumber
)
1267 FdName
= self
.__GetUiName
()
1269 if len (self
.Profile
.FdDict
) == 0:
1270 FdName
= GenFdsGlobalVariable
.PlatformName
1271 self
.Profile
.FdNameNotSet
= True
1273 raise Warning("expected FdName in [FD.] section", self
.FileName
, self
.CurrentLineNumber
)
1274 self
.CurrentFdName
= FdName
.upper()
1276 if self
.CurrentFdName
in self
.Profile
.FdDict
:
1277 raise Warning("Unexpected the same FD name", self
.FileName
, self
.CurrentLineNumber
)
1279 if not self
.__IsToken
( "]"):
1280 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1283 FdObj
.FdUiName
= self
.CurrentFdName
1284 self
.Profile
.FdDict
[self
.CurrentFdName
] = FdObj
1286 if len (self
.Profile
.FdDict
) > 1 and self
.Profile
.FdNameNotSet
:
1287 raise Warning("expected all FDs have their name", self
.FileName
, self
.CurrentLineNumber
)
1289 Status
= self
.__GetCreateFile
(FdObj
)
1291 raise Warning("FD name error", self
.FileName
, self
.CurrentLineNumber
)
1293 self
.__GetTokenStatements
(FdObj
)
1295 self
.__GetDefineStatements
(FdObj
)
1297 self
.__GetSetStatements
(FdObj
)
1299 if not self
.__GetRegionLayout
(FdObj
):
1300 raise Warning("expected region layout", self
.FileName
, self
.CurrentLineNumber
)
1302 while self
.__GetRegionLayout
(FdObj
):
1306 ## __GetUiName() method
1308 # Return the UI name of a section
1310 # @param self The object pointer
1311 # @retval FdName UI name
1313 def __GetUiName(self
):
1315 if self
.__GetNextWord
():
1320 ## __GetCreateFile() method
1322 # Return the output file name of object
1324 # @param self The object pointer
1325 # @param Obj object whose data will be stored in file
1326 # @retval FdName UI name
1328 def __GetCreateFile(self
, Obj
):
1330 if self
.__IsKeyword
( "CREATE_FILE"):
1331 if not self
.__IsToken
( "="):
1332 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1334 if not self
.__GetNextToken
():
1335 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
1337 FileName
= self
.__Token
1338 Obj
.CreateFileName
= FileName
1342 ## __GetTokenStatements() method
1344 # Get token statements
1346 # @param self The object pointer
1347 # @param Obj for whom token statement is got
1349 def __GetTokenStatements(self
, Obj
):
1350 if not self
.__IsKeyword
( "BaseAddress"):
1351 raise Warning("BaseAddress missing", self
.FileName
, self
.CurrentLineNumber
)
1353 if not self
.__IsToken
( "="):
1354 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1356 if not self
.__GetNextHexNumber
():
1357 raise Warning("expected Hex base address", self
.FileName
, self
.CurrentLineNumber
)
1359 Obj
.BaseAddress
= self
.__Token
1361 if self
.__IsToken
( "|"):
1362 pcdPair
= self
.__GetNextPcdName
()
1363 Obj
.BaseAddressPcd
= pcdPair
1364 self
.Profile
.PcdDict
[pcdPair
] = Obj
.BaseAddress
1366 if not self
.__IsKeyword
( "Size"):
1367 raise Warning("Size missing", self
.FileName
, self
.CurrentLineNumber
)
1369 if not self
.__IsToken
( "="):
1370 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1372 if not self
.__GetNextHexNumber
():
1373 raise Warning("expected Hex size", self
.FileName
, self
.CurrentLineNumber
)
1377 if self
.__IsToken
( "|"):
1378 pcdPair
= self
.__GetNextPcdName
()
1379 Obj
.SizePcd
= pcdPair
1380 self
.Profile
.PcdDict
[pcdPair
] = Size
1381 Obj
.Size
= long(Size
, 0)
1383 if not self
.__IsKeyword
( "ErasePolarity"):
1384 raise Warning("ErasePolarity missing", self
.FileName
, self
.CurrentLineNumber
)
1386 if not self
.__IsToken
( "="):
1387 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1389 if not self
.__GetNextToken
():
1390 raise Warning("expected Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1392 if self
.__Token
!= "1" and self
.__Token
!= "0":
1393 raise Warning("expected 1 or 0 Erase Polarity", self
.FileName
, self
.CurrentLineNumber
)
1395 Obj
.ErasePolarity
= self
.__Token
1397 self
.__GetBlockStatements
(Obj
)
1399 ## __GetAddressStatements() method
1401 # Get address statements
1403 # @param self The object pointer
1404 # @param Obj for whom address statement is got
1405 # @retval True Successfully find
1406 # @retval False Not able to find
1408 def __GetAddressStatements(self
, Obj
):
1410 if self
.__IsKeyword
("BsBaseAddress"):
1411 if not self
.__IsToken
( "="):
1412 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1414 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1415 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1417 BsAddress
= long(self
.__Token
, 0)
1418 Obj
.BsBaseAddress
= BsAddress
1420 if self
.__IsKeyword
("RtBaseAddress"):
1421 if not self
.__IsToken
( "="):
1422 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1424 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1425 raise Warning("expected address", self
.FileName
, self
.CurrentLineNumber
)
1427 RtAddress
= long(self
.__Token
, 0)
1428 Obj
.RtBaseAddress
= RtAddress
1430 ## __GetBlockStatements() method
1432 # Get block statements
1434 # @param self The object pointer
1435 # @param Obj for whom block statement is got
1437 def __GetBlockStatements(self
, Obj
):
1439 if not self
.__GetBlockStatement
(Obj
):
1440 #set default block size is 1
1441 Obj
.BlockSizeList
.append((1, Obj
.Size
, None))
1444 while self
.__GetBlockStatement
(Obj
):
1447 for Item
in Obj
.BlockSizeList
:
1448 if Item
[0] == None or Item
[1] == None:
1449 raise Warning("expected block statement", self
.FileName
, self
.CurrentLineNumber
)
1451 ## __GetBlockStatement() method
1453 # Get block statement
1455 # @param self The object pointer
1456 # @param Obj for whom block statement is got
1457 # @retval True Successfully find
1458 # @retval False Not able to find
1460 def __GetBlockStatement(self
, Obj
):
1461 if not self
.__IsKeyword
( "BlockSize"):
1464 if not self
.__IsToken
( "="):
1465 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1467 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
1468 raise Warning("expected Hex or Integer block size", self
.FileName
, self
.CurrentLineNumber
)
1470 BlockSize
= self
.__Token
1472 if self
.__IsToken
( "|"):
1473 PcdPair
= self
.__GetNextPcdName
()
1474 BlockSizePcd
= PcdPair
1475 self
.Profile
.PcdDict
[PcdPair
] = BlockSize
1476 BlockSize
= long(BlockSize
, 0)
1479 if self
.__IsKeyword
( "NumBlocks"):
1480 if not self
.__IsToken
( "="):
1481 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1483 if not self
.__GetNextDecimalNumber
() and not self
.__GetNextHexNumber
():
1484 raise Warning("expected block numbers", self
.FileName
, self
.CurrentLineNumber
)
1486 BlockNumber
= long(self
.__Token
, 0)
1488 Obj
.BlockSizeList
.append((BlockSize
, BlockNumber
, BlockSizePcd
))
1491 ## __GetDefineStatements() method
1493 # Get define statements
1495 # @param self The object pointer
1496 # @param Obj for whom define statement is got
1497 # @retval True Successfully find
1498 # @retval False Not able to find
1500 def __GetDefineStatements(self
, Obj
):
1501 while self
.__GetDefineStatement
( Obj
):
1504 ## __GetDefineStatement() method
1506 # Get define statement
1508 # @param self The object pointer
1509 # @param Obj for whom define statement is got
1510 # @retval True Successfully find
1511 # @retval False Not able to find
1513 def __GetDefineStatement(self
, Obj
):
1514 if self
.__IsKeyword
("DEFINE"):
1515 self
.__GetNextToken
()
1516 Macro
= self
.__Token
1517 if not self
.__IsToken
( "="):
1518 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1520 if not self
.__GetNextToken
():
1521 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1523 Value
= self
.__Token
1524 Macro
= '$(' + Macro
+ ')'
1525 Obj
.DefineVarDict
[Macro
] = Value
1530 ## __GetSetStatements() method
1532 # Get set statements
1534 # @param self The object pointer
1535 # @param Obj for whom set statement is got
1536 # @retval True Successfully find
1537 # @retval False Not able to find
1539 def __GetSetStatements(self
, Obj
):
1540 while self
.__GetSetStatement
(Obj
):
1543 ## __GetSetStatement() method
1547 # @param self The object pointer
1548 # @param Obj for whom set statement is got
1549 # @retval True Successfully find
1550 # @retval False Not able to find
1552 def __GetSetStatement(self
, Obj
):
1553 if self
.__IsKeyword
("SET"):
1554 PcdPair
= self
.__GetNextPcdName
()
1556 if not self
.__IsToken
( "="):
1557 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1559 if not self
.__GetNextToken
():
1560 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
1562 Value
= self
.__Token
1563 if Value
.startswith("{"):
1564 # deal with value with {}
1565 if not self
.__SkipToToken
( "}"):
1566 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1567 Value
+= self
.__SkippedChars
1570 Obj
.SetVarDict
[PcdPair
] = Value
1571 self
.Profile
.PcdDict
[PcdPair
] = Value
1576 ## __GetRegionLayout() method
1578 # Get region layout for FD
1580 # @param self The object pointer
1581 # @param Fd for whom region is got
1582 # @retval True Successfully find
1583 # @retval False Not able to find
1585 def __GetRegionLayout(self
, Fd
):
1586 if not self
.__GetNextHexNumber
():
1589 RegionObj
= Region
.Region()
1590 RegionObj
.Offset
= long(self
.__Token
, 0)
1591 Fd
.RegionList
.append(RegionObj
)
1593 if not self
.__IsToken
( "|"):
1594 raise Warning("expected '|'", self
.FileName
, self
.CurrentLineNumber
)
1596 if not self
.__GetNextHexNumber
():
1597 raise Warning("expected Region Size", self
.FileName
, self
.CurrentLineNumber
)
1598 RegionObj
.Size
= long(self
.__Token
, 0)
1600 if not self
.__GetNextWord
():
1603 if not self
.__Token
in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
1605 RegionObj
.PcdOffset
= self
.__GetNextPcdName
()
1606 self
.Profile
.PcdDict
[RegionObj
.PcdOffset
] = "0x%08X" % (RegionObj
.Offset
+ long(Fd
.BaseAddress
, 0))
1607 if self
.__IsToken
( "|"):
1608 RegionObj
.PcdSize
= self
.__GetNextPcdName
()
1609 self
.Profile
.PcdDict
[RegionObj
.PcdSize
] = "0x%08X" % RegionObj
.Size
1611 if not self
.__GetNextWord
():
1614 if self
.__Token
== "SET":
1616 self
.__GetSetStatements
( RegionObj
)
1617 if not self
.__GetNextWord
():
1620 elif self
.__Token
== "FV":
1622 self
.__GetRegionFvType
( RegionObj
)
1624 elif self
.__Token
== "CAPSULE":
1626 self
.__GetRegionCapType
( RegionObj
)
1628 elif self
.__Token
== "FILE":
1630 self
.__GetRegionFileType
( RegionObj
)
1632 elif self
.__Token
== "DATA":
1634 self
.__GetRegionDataType
( RegionObj
)
1636 raise Warning("A valid region type was not found. "
1637 "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",
1638 self
.FileName
, self
.CurrentLineNumber
)
1642 ## __GetRegionFvType() method
1644 # Get region fv data for region
1646 # @param self The object pointer
1647 # @param RegionObj for whom region data is got
1649 def __GetRegionFvType(self
, RegionObj
):
1651 if not self
.__IsKeyword
( "FV"):
1652 raise Warning("expected Keyword 'FV'", self
.FileName
, self
.CurrentLineNumber
)
1654 if not self
.__IsToken
( "="):
1655 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1657 if not self
.__GetNextToken
():
1658 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1660 RegionObj
.RegionType
= "FV"
1661 RegionObj
.RegionDataList
.append(self
.__Token
)
1663 while self
.__IsKeyword
( "FV"):
1665 if not self
.__IsToken
( "="):
1666 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1668 if not self
.__GetNextToken
():
1669 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
1671 RegionObj
.RegionDataList
.append(self
.__Token
)
1673 ## __GetRegionCapType() method
1675 # Get region capsule data for region
1677 # @param self The object pointer
1678 # @param RegionObj for whom region data is got
1680 def __GetRegionCapType(self
, RegionObj
):
1682 if not self
.__IsKeyword
("CAPSULE"):
1683 raise Warning("expected Keyword 'CAPSULE'", self
.FileName
, self
.CurrentLineNumber
)
1685 if not self
.__IsToken
("="):
1686 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1688 if not self
.__GetNextToken
():
1689 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1691 RegionObj
.RegionType
= "CAPSULE"
1692 RegionObj
.RegionDataList
.append(self
.__Token
)
1694 while self
.__IsKeyword
("CAPSULE"):
1696 if not self
.__IsToken
("="):
1697 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1699 if not self
.__GetNextToken
():
1700 raise Warning("expected CAPSULE name", self
.FileName
, self
.CurrentLineNumber
)
1702 RegionObj
.RegionDataList
.append(self
.__Token
)
1704 ## __GetRegionFileType() method
1706 # Get region file data for region
1708 # @param self The object pointer
1709 # @param RegionObj for whom region data is got
1711 def __GetRegionFileType(self
, RegionObj
):
1713 if not self
.__IsKeyword
( "FILE"):
1714 raise Warning("expected Keyword 'FILE'", self
.FileName
, self
.CurrentLineNumber
)
1716 if not self
.__IsToken
( "="):
1717 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1719 if not self
.__GetNextToken
():
1720 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
1722 RegionObj
.RegionType
= "FILE"
1723 RegionObj
.RegionDataList
.append( self
.__Token
)
1725 while self
.__IsKeyword
( "FILE"):
1727 if not self
.__IsToken
( "="):
1728 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1730 if not self
.__GetNextToken
():
1731 raise Warning("expected FILE name", self
.FileName
, self
.CurrentLineNumber
)
1733 RegionObj
.RegionDataList
.append(self
.__Token
)
1735 ## __GetRegionDataType() method
1737 # Get region array data for region
1739 # @param self The object pointer
1740 # @param RegionObj for whom region data is got
1742 def __GetRegionDataType(self
, RegionObj
):
1744 if not self
.__IsKeyword
( "DATA"):
1745 raise Warning("expected Region Data type", self
.FileName
, self
.CurrentLineNumber
)
1747 if not self
.__IsToken
( "="):
1748 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1750 if not self
.__IsToken
( "{"):
1751 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1753 if not self
.__GetNextHexNumber
():
1754 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1756 if len(self
.__Token
) > 18:
1757 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1759 # convert hex string value to byte hex string array
1760 AllString
= self
.__Token
1761 AllStrLen
= len (AllString
)
1763 while AllStrLen
> 4:
1764 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1765 AllStrLen
= AllStrLen
- 2
1766 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1769 if len (self
.__Token
) <= 4:
1770 while self
.__IsToken
(","):
1771 if not self
.__GetNextHexNumber
():
1772 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1773 if len(self
.__Token
) > 4:
1774 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1775 DataString
+= self
.__Token
1778 if not self
.__IsToken
( "}"):
1779 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1781 DataString
= DataString
.rstrip(",")
1782 RegionObj
.RegionType
= "DATA"
1783 RegionObj
.RegionDataList
.append( DataString
)
1785 while self
.__IsKeyword
( "DATA"):
1787 if not self
.__IsToken
( "="):
1788 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1790 if not self
.__IsToken
( "{"):
1791 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
1793 if not self
.__GetNextHexNumber
():
1794 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
1796 if len(self
.__Token
) > 18:
1797 raise Warning("Hex string can't be converted to a valid UINT64 value", self
.FileName
, self
.CurrentLineNumber
)
1799 # convert hex string value to byte hex string array
1800 AllString
= self
.__Token
1801 AllStrLen
= len (AllString
)
1803 while AllStrLen
> 4:
1804 DataString
= DataString
+ "0x" + AllString
[AllStrLen
- 2: AllStrLen
] + ","
1805 AllStrLen
= AllStrLen
- 2
1806 DataString
= DataString
+ AllString
[:AllStrLen
] + ","
1809 if len (self
.__Token
) <= 4:
1810 while self
.__IsToken
(","):
1811 if not self
.__GetNextHexNumber
():
1812 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
1813 if len(self
.__Token
) > 4:
1814 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
1815 DataString
+= self
.__Token
1818 if not self
.__IsToken
( "}"):
1819 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
1821 DataString
= DataString
.rstrip(",")
1822 RegionObj
.RegionDataList
.append( DataString
)
1826 # Get FV section contents and store its data into FV dictionary of self.Profile
1828 # @param self The object pointer
1829 # @retval True Successfully find a FV
1830 # @retval False Not able to find a FV
1833 if not self
.__GetNextToken
():
1836 S
= self
.__Token
.upper()
1837 if S
.startswith("[") and not S
.startswith("[FV."):
1838 if not S
.startswith("[CAPSULE.") \
1839 and not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
1840 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
1845 if not self
.__IsToken
("[FV.", True):
1846 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
1847 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
1848 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
1849 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1851 FvName
= self
.__GetUiName
()
1852 self
.CurrentFvName
= FvName
.upper()
1854 if not self
.__IsToken
( "]"):
1855 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
1858 FvObj
.UiFvName
= self
.CurrentFvName
1859 self
.Profile
.FvDict
[self
.CurrentFvName
] = FvObj
1861 Status
= self
.__GetCreateFile
(FvObj
)
1863 raise Warning("FV name error", self
.FileName
, self
.CurrentLineNumber
)
1865 self
.__GetDefineStatements
(FvObj
)
1867 self
.__GetAddressStatements
(FvObj
)
1869 while self
.__GetBlockStatement
(FvObj
):
1872 self
.__GetSetStatements
(FvObj
)
1874 self
.__GetFvBaseAddress
(FvObj
)
1876 self
.__GetFvForceRebase
(FvObj
)
1878 self
.__GetFvAlignment
(FvObj
)
1880 self
.__GetFvAttributes
(FvObj
)
1882 self
.__GetFvNameGuid
(FvObj
)
1884 FvObj
.FvExtEntryTypeValue
= []
1885 FvObj
.FvExtEntryType
= []
1886 FvObj
.FvExtEntryData
= []
1888 isFvExtEntry
= self
.__GetFvExtEntryStatement
(FvObj
)
1889 if not isFvExtEntry
:
1892 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1893 self
.__GetAprioriSection
(FvObj
, FvObj
.DefineVarDict
.copy())
1896 isInf
= self
.__GetInfStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1897 isFile
= self
.__GetFileStatement
(FvObj
, MacroDict
= FvObj
.DefineVarDict
.copy())
1898 if not isInf
and not isFile
:
1903 ## __GetFvAlignment() method
1905 # Get alignment for FV
1907 # @param self The object pointer
1908 # @param Obj for whom alignment is got
1909 # @retval True Successfully find a alignment statement
1910 # @retval False Not able to find a alignment statement
1912 def __GetFvAlignment(self
, Obj
):
1914 if not self
.__IsKeyword
( "FvAlignment"):
1917 if not self
.__IsToken
( "="):
1918 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1920 if not self
.__GetNextToken
():
1921 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
1923 if self
.__Token
.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
1924 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
1925 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
1927 raise Warning("Unknown alignment value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1928 Obj
.FvAlignment
= self
.__Token
1931 ## __GetFvBaseAddress() method
1933 # Get BaseAddress for FV
1935 # @param self The object pointer
1936 # @param Obj for whom FvBaseAddress is got
1937 # @retval True Successfully find a FvBaseAddress statement
1938 # @retval False Not able to find a FvBaseAddress statement
1940 def __GetFvBaseAddress(self
, Obj
):
1942 if not self
.__IsKeyword
("FvBaseAddress"):
1945 if not self
.__IsToken
( "="):
1946 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1948 if not self
.__GetNextToken
():
1949 raise Warning("expected FV base address value", self
.FileName
, self
.CurrentLineNumber
)
1951 IsValidBaseAddrValue
= re
.compile('^0[x|X][0-9a-fA-F]+')
1953 if not IsValidBaseAddrValue
.match(self
.__Token
.upper()):
1954 raise Warning("Unknown FV base address value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1955 Obj
.FvBaseAddress
= self
.__Token
1958 ## __GetFvForceRebase() method
1960 # Get FvForceRebase for FV
1962 # @param self The object pointer
1963 # @param Obj for whom FvForceRebase is got
1964 # @retval True Successfully find a FvForceRebase statement
1965 # @retval False Not able to find a FvForceRebase statement
1967 def __GetFvForceRebase(self
, Obj
):
1969 if not self
.__IsKeyword
("FvForceRebase"):
1972 if not self
.__IsToken
( "="):
1973 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
1975 if not self
.__GetNextToken
():
1976 raise Warning("expected FvForceRebase value", self
.FileName
, self
.CurrentLineNumber
)
1978 if self
.__Token
.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:
1979 raise Warning("Unknown FvForceRebase value '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
1981 if self
.__Token
.upper() in ["TRUE", "1", "0X1", "0X01"]:
1982 Obj
.FvForceRebase
= True
1983 elif self
.__Token
.upper() in ["FALSE", "0", "0X0", "0X00"]:
1984 Obj
.FvForceRebase
= False
1986 Obj
.FvForceRebase
= None
1991 ## __GetFvAttributes() method
1993 # Get attributes for FV
1995 # @param self The object pointer
1996 # @param Obj for whom attribute is got
1999 def __GetFvAttributes(self
, FvObj
):
2001 while self
.__GetNextWord
():
2003 if name
not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
2004 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
2005 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
2006 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
2007 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
2008 "WRITE_POLICY_RELIABLE"):
2012 if not self
.__IsToken
( "="):
2013 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2015 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2016 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2018 FvObj
.FvAttributeDict
[name
] = self
.__Token
2022 ## __GetFvNameGuid() method
2024 # Get FV GUID for FV
2026 # @param self The object pointer
2027 # @param Obj for whom GUID is got
2030 def __GetFvNameGuid(self
, FvObj
):
2032 if not self
.__IsKeyword
( "FvNameGuid"):
2035 if not self
.__IsToken
( "="):
2036 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2038 if not self
.__GetNextGuid
():
2039 raise Warning("expected FV GUID value", self
.FileName
, self
.CurrentLineNumber
)
2041 FvObj
.FvNameGuid
= self
.__Token
2045 def __GetFvExtEntryStatement(self
, FvObj
):
2047 if not self
.__IsKeyword
( "FV_EXT_ENTRY"):
2050 if not self
.__IsKeyword
("TYPE"):
2051 raise Warning("expected 'TYPE'", self
.FileName
, self
.CurrentLineNumber
)
2053 if not self
.__IsToken
( "="):
2054 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2056 if not self
.__GetNextHexNumber
() and not self
.__GetNextDecimalNumber
():
2057 raise Warning("expected Hex FV extension entry type value At Line ", self
.FileName
, self
.CurrentLineNumber
)
2059 FvObj
.FvExtEntryTypeValue
+= [self
.__Token
]
2061 if not self
.__IsToken
( "{"):
2062 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2064 if not self
.__IsKeyword
("FILE") and not self
.__IsKeyword
("DATA"):
2065 raise Warning("expected 'FILE' or 'DATA'", self
.FileName
, self
.CurrentLineNumber
)
2067 FvObj
.FvExtEntryType
+= [self
.__Token
]
2069 if self
.__Token
== 'DATA':
2071 if not self
.__IsToken
( "="):
2072 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2074 if not self
.__IsToken
( "{"):
2075 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2077 if not self
.__GetNextHexNumber
():
2078 raise Warning("expected Hex byte", self
.FileName
, self
.CurrentLineNumber
)
2080 if len(self
.__Token
) > 4:
2081 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2083 DataString
= self
.__Token
2086 while self
.__IsToken
(","):
2087 if not self
.__GetNextHexNumber
():
2088 raise Warning("Invalid Hex number", self
.FileName
, self
.CurrentLineNumber
)
2089 if len(self
.__Token
) > 4:
2090 raise Warning("Hex byte(must be 2 digits) too long", self
.FileName
, self
.CurrentLineNumber
)
2091 DataString
+= self
.__Token
2094 if not self
.__IsToken
( "}"):
2095 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2097 if not self
.__IsToken
( "}"):
2098 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2100 DataString
= DataString
.rstrip(",")
2101 FvObj
.FvExtEntryData
+= [DataString
]
2103 if self
.__Token
== 'FILE':
2105 if not self
.__IsToken
( "="):
2106 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2108 if not self
.__GetNextToken
():
2109 raise Warning("expected FV Extension Entry file path At Line ", self
.FileName
, self
.CurrentLineNumber
)
2111 FvObj
.FvExtEntryData
+= [self
.__Token
]
2113 if not self
.__IsToken
( "}"):
2114 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2118 ## __GetAprioriSection() method
2120 # Get token statements
2122 # @param self The object pointer
2123 # @param FvObj for whom apriori is got
2124 # @param MacroDict dictionary used to replace macro
2125 # @retval True Successfully find apriori statement
2126 # @retval False Not able to find apriori statement
2128 def __GetAprioriSection(self
, FvObj
, MacroDict
= {}):
2130 if not self
.__IsKeyword
( "APRIORI"):
2133 if not self
.__IsKeyword
("PEI") and not self
.__IsKeyword
("DXE"):
2134 raise Warning("expected Apriori file type", self
.FileName
, self
.CurrentLineNumber
)
2135 AprType
= self
.__Token
2137 if not self
.__IsToken
( "{"):
2138 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2140 AprSectionObj
= AprioriSection
.AprioriSection()
2141 AprSectionObj
.AprioriType
= AprType
2143 self
.__GetDefineStatements
(AprSectionObj
)
2144 MacroDict
.update(AprSectionObj
.DefineVarDict
)
2147 IsInf
= self
.__GetInfStatement
( AprSectionObj
, MacroDict
= MacroDict
)
2148 IsFile
= self
.__GetFileStatement
( AprSectionObj
)
2149 if not IsInf
and not IsFile
:
2152 if not self
.__IsToken
( "}"):
2153 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2155 FvObj
.AprioriSectionList
.append(AprSectionObj
)
2158 ## __GetInfStatement() method
2160 # Get INF statements
2162 # @param self The object pointer
2163 # @param Obj for whom inf statement is got
2164 # @param MacroDict dictionary used to replace macro
2165 # @retval True Successfully find inf statement
2166 # @retval False Not able to find inf statement
2168 def __GetInfStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2170 if not self
.__IsKeyword
( "INF"):
2173 ffsInf
= FfsInfStatement
.FfsInfStatement()
2174 self
.__GetInfOptions
( ffsInf
)
2176 if not self
.__GetNextToken
():
2177 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
2178 ffsInf
.InfFileName
= self
.__Token
2179 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2180 #do case sensitive check for file path
2181 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2183 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2185 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
2186 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
2188 if self
.__IsToken
('|'):
2189 if self
.__IsKeyword
('RELOCS_STRIPPED'):
2190 ffsInf
.KeepReloc
= False
2191 elif self
.__IsKeyword
('RELOCS_RETAINED'):
2192 ffsInf
.KeepReloc
= True
2194 raise Warning("Unknown reloc strip flag '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2196 ffsInf
.CurrentLineNum
= self
.CurrentLineNumber
2197 ffsInf
.CurrentLineContent
= self
.__CurrentLine
()
2200 capsuleFfs
= CapsuleData
.CapsuleFfs()
2201 capsuleFfs
.Ffs
= ffsInf
2202 Obj
.CapsuleDataList
.append(capsuleFfs
)
2204 Obj
.FfsList
.append(ffsInf
)
2207 ## __GetInfOptions() method
2209 # Get options for INF
2211 # @param self The object pointer
2212 # @param FfsInfObj for whom option is got
2214 def __GetInfOptions(self
, FfsInfObj
):
2216 if self
.__IsKeyword
( "RuleOverride"):
2217 if not self
.__IsToken
( "="):
2218 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2219 if not self
.__GetNextToken
():
2220 raise Warning("expected Rule name", self
.FileName
, self
.CurrentLineNumber
)
2221 FfsInfObj
.Rule
= self
.__Token
2223 if self
.__IsKeyword
( "VERSION"):
2224 if not self
.__IsToken
( "="):
2225 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2226 if not self
.__GetNextToken
():
2227 raise Warning("expected Version", self
.FileName
, self
.CurrentLineNumber
)
2229 if self
.__GetStringData
():
2230 FfsInfObj
.Version
= self
.__Token
2232 if self
.__IsKeyword
( "UI"):
2233 if not self
.__IsToken
( "="):
2234 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2235 if not self
.__GetNextToken
():
2236 raise Warning("expected UI name", self
.FileName
, self
.CurrentLineNumber
)
2238 if self
.__GetStringData
():
2239 FfsInfObj
.Ui
= self
.__Token
2241 if self
.__IsKeyword
( "USE"):
2242 if not self
.__IsToken
( "="):
2243 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2244 if not self
.__GetNextToken
():
2245 raise Warning("expected ARCH name", self
.FileName
, self
.CurrentLineNumber
)
2246 FfsInfObj
.UseArch
= self
.__Token
2249 if self
.__GetNextToken
():
2250 p
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2251 if p
.match(self
.__Token
):
2252 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2253 if not self
.__IsToken
(","):
2259 while self
.__GetNextToken
():
2260 if not p
.match(self
.__Token
):
2261 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2262 FfsInfObj
.KeyStringList
.append(self
.__Token
)
2264 if not self
.__IsToken
(","):
2267 ## __GetFileStatement() method
2269 # Get FILE statements
2271 # @param self The object pointer
2272 # @param Obj for whom FILE statement is got
2273 # @param MacroDict dictionary used to replace macro
2274 # @retval True Successfully find FILE statement
2275 # @retval False Not able to find FILE statement
2277 def __GetFileStatement(self
, Obj
, ForCapsule
= False, MacroDict
= {}):
2279 if not self
.__IsKeyword
( "FILE"):
2282 if not self
.__GetNextWord
():
2283 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
2285 if ForCapsule
and self
.__Token
== 'DATA':
2290 FfsFileObj
= FfsFileStatement
.FileStatement()
2291 FfsFileObj
.FvFileType
= self
.__Token
2293 if not self
.__IsToken
( "="):
2294 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2296 if not self
.__GetNextGuid
():
2297 if not self
.__GetNextWord
():
2298 raise Warning("expected File GUID", self
.FileName
, self
.CurrentLineNumber
)
2299 if self
.__Token
== 'PCD':
2300 if not self
.__IsToken
( "("):
2301 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
2302 PcdPair
= self
.__GetNextPcdName
()
2303 if not self
.__IsToken
( ")"):
2304 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
2305 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
2307 FfsFileObj
.NameGuid
= self
.__Token
2309 FfsFileObj
.CurrentLineNum
= self
.CurrentLineNumber
2310 FfsFileObj
.CurrentLineContent
= self
.__CurrentLine
()
2312 self
.__GetFilePart
( FfsFileObj
, MacroDict
.copy())
2315 capsuleFfs
= CapsuleData
.CapsuleFfs()
2316 capsuleFfs
.Ffs
= FfsFileObj
2317 Obj
.CapsuleDataList
.append(capsuleFfs
)
2319 Obj
.FfsList
.append(FfsFileObj
)
2323 ## __FileCouldHaveRelocFlag() method
2325 # Check whether reloc strip flag can be set for a file type.
2327 # @param self The object pointer
2328 # @param FileType The file type to check with
2329 # @retval True This type could have relocation strip flag
2330 # @retval False No way to have it
2333 def __FileCouldHaveRelocFlag (self
, FileType
):
2334 if FileType
in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
2339 ## __SectionCouldHaveRelocFlag() method
2341 # Check whether reloc strip flag can be set for a section type.
2343 # @param self The object pointer
2344 # @param SectionType The section type to check with
2345 # @retval True This type could have relocation strip flag
2346 # @retval False No way to have it
2349 def __SectionCouldHaveRelocFlag (self
, SectionType
):
2350 if SectionType
in ('TE', 'PE32'):
2355 ## __GetFilePart() method
2357 # Get components for FILE statement
2359 # @param self The object pointer
2360 # @param FfsFileObj for whom component is got
2361 # @param MacroDict dictionary used to replace macro
2363 def __GetFilePart(self
, FfsFileObj
, MacroDict
= {}):
2365 self
.__GetFileOpts
( FfsFileObj
)
2367 if not self
.__IsToken
("{"):
2368 # if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
2369 # if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
2370 # if self.__Token == 'RELOCS_STRIPPED':
2371 # FfsFileObj.KeepReloc = False
2373 # FfsFileObj.KeepReloc = True
2375 # raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
2377 # if not self.__IsToken("{"):
2378 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2380 if not self
.__GetNextToken
():
2381 raise Warning("expected File name or section data", self
.FileName
, self
.CurrentLineNumber
)
2383 if self
.__Token
== "FV":
2384 if not self
.__IsToken
( "="):
2385 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2386 if not self
.__GetNextToken
():
2387 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2388 FfsFileObj
.FvName
= self
.__Token
2390 elif self
.__Token
== "FD":
2391 if not self
.__IsToken
( "="):
2392 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2393 if not self
.__GetNextToken
():
2394 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2395 FfsFileObj
.FdName
= self
.__Token
2397 elif self
.__Token
in ("DEFINE", "APRIORI", "SECTION"):
2399 self
.__GetSectionData
( FfsFileObj
, MacroDict
)
2401 FfsFileObj
.FileName
= self
.__Token
2402 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2404 # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase.
2406 if not GlobalData
.gAutoGenPhase
:
2407 #do case sensitive check for file path
2408 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2410 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2412 if not InputMacroDict
["OUTPUT_DIRECTORY"] in FfsFileObj
.FileName
:
2413 #do case sensitive check for file path
2414 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2416 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2419 if not self
.__IsToken
( "}"):
2420 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2422 ## __GetFileOpts() method
2424 # Get options for FILE statement
2426 # @param self The object pointer
2427 # @param FfsFileObj for whom options is got
2429 def __GetFileOpts(self
, FfsFileObj
):
2431 if self
.__GetNextToken
():
2432 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
2433 if Pattern
.match(self
.__Token
):
2434 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2435 if self
.__IsToken
(","):
2436 while self
.__GetNextToken
():
2437 if not Pattern
.match(self
.__Token
):
2438 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
2439 FfsFileObj
.KeyStringList
.append(self
.__Token
)
2441 if not self
.__IsToken
(","):
2447 if self
.__IsKeyword
( "FIXED", True):
2448 FfsFileObj
.Fixed
= True
2450 if self
.__IsKeyword
( "CHECKSUM", True):
2451 FfsFileObj
.CheckSum
= True
2453 if self
.__GetAlignment
():
2454 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2455 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2456 #For FFS, Auto is default option same to ""
2457 if not self
.__Token
== "Auto":
2458 FfsFileObj
.Alignment
= self
.__Token
2460 ## __GetAlignment() method
2462 # Return the alignment value
2464 # @param self The object pointer
2465 # @retval True Successfully find alignment
2466 # @retval False Not able to find alignment
2468 def __GetAlignment(self
):
2469 if self
.__IsKeyword
( "Align", True):
2470 if not self
.__IsToken
( "="):
2471 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2473 if not self
.__GetNextToken
():
2474 raise Warning("expected alignment value", self
.FileName
, self
.CurrentLineNumber
)
2479 ## __GetFilePart() method
2481 # Get section data for FILE statement
2483 # @param self The object pointer
2484 # @param FfsFileObj for whom section is got
2485 # @param MacroDict dictionary used to replace macro
2487 def __GetSectionData(self
, FfsFileObj
, MacroDict
= {}):
2489 Dict
.update(MacroDict
)
2491 self
.__GetDefineStatements
(FfsFileObj
)
2493 Dict
.update(FfsFileObj
.DefineVarDict
)
2494 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2495 self
.__GetAprioriSection
(FfsFileObj
, Dict
.copy())
2498 IsLeafSection
= self
.__GetLeafSection
(FfsFileObj
, Dict
)
2499 IsEncapSection
= self
.__GetEncapsulationSec
(FfsFileObj
)
2500 if not IsLeafSection
and not IsEncapSection
:
2503 ## __GetLeafSection() method
2505 # Get leaf section for Obj
2507 # @param self The object pointer
2508 # @param Obj for whom leaf section is got
2509 # @param MacroDict dictionary used to replace macro
2510 # @retval True Successfully find section statement
2511 # @retval False Not able to find section statement
2513 def __GetLeafSection(self
, Obj
, MacroDict
= {}):
2515 OldPos
= self
.GetFileBufferPos()
2517 if not self
.__IsKeyword
( "SECTION"):
2518 if len(Obj
.SectionList
) == 0:
2519 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2524 if self
.__GetAlignment
():
2525 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2526 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2527 AlignValue
= self
.__Token
2530 if self
.__IsKeyword
( "BUILD_NUM"):
2531 if not self
.__IsToken
( "="):
2532 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2534 if not self
.__GetNextToken
():
2535 raise Warning("expected Build number value", self
.FileName
, self
.CurrentLineNumber
)
2537 BuildNum
= self
.__Token
2539 if self
.__IsKeyword
( "VERSION"):
2540 if AlignValue
== 'Auto':
2541 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2542 if not self
.__IsToken
( "="):
2543 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2544 if not self
.__GetNextToken
():
2545 raise Warning("expected version", self
.FileName
, self
.CurrentLineNumber
)
2546 VerSectionObj
= VerSection
.VerSection()
2547 VerSectionObj
.Alignment
= AlignValue
2548 VerSectionObj
.BuildNum
= BuildNum
2549 if self
.__GetStringData
():
2550 VerSectionObj
.StringData
= self
.__Token
2552 VerSectionObj
.FileName
= self
.__Token
2553 Obj
.SectionList
.append(VerSectionObj
)
2555 elif self
.__IsKeyword
( "UI"):
2556 if AlignValue
== 'Auto':
2557 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2558 if not self
.__IsToken
( "="):
2559 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2560 if not self
.__GetNextToken
():
2561 raise Warning("expected UI", self
.FileName
, self
.CurrentLineNumber
)
2562 UiSectionObj
= UiSection
.UiSection()
2563 UiSectionObj
.Alignment
= AlignValue
2564 if self
.__GetStringData
():
2565 UiSectionObj
.StringData
= self
.__Token
2567 UiSectionObj
.FileName
= self
.__Token
2568 Obj
.SectionList
.append(UiSectionObj
)
2570 elif self
.__IsKeyword
( "FV_IMAGE"):
2571 if AlignValue
== 'Auto':
2572 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2573 if not self
.__IsToken
( "="):
2574 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2575 if not self
.__GetNextToken
():
2576 raise Warning("expected FV name or FV file path", self
.FileName
, self
.CurrentLineNumber
)
2578 FvName
= self
.__Token
2581 if self
.__IsToken
( "{"):
2583 FvObj
.UiFvName
= FvName
.upper()
2584 self
.__GetDefineStatements
(FvObj
)
2585 MacroDict
.update(FvObj
.DefineVarDict
)
2586 self
.__GetBlockStatement
(FvObj
)
2587 self
.__GetSetStatements
(FvObj
)
2588 self
.__GetFvAlignment
(FvObj
)
2589 self
.__GetFvAttributes
(FvObj
)
2590 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2591 self
.__GetAprioriSection
(FvObj
, MacroDict
.copy())
2594 IsInf
= self
.__GetInfStatement
(FvObj
, MacroDict
.copy())
2595 IsFile
= self
.__GetFileStatement
(FvObj
, MacroDict
.copy())
2596 if not IsInf
and not IsFile
:
2599 if not self
.__IsToken
( "}"):
2600 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2602 FvImageSectionObj
= FvImageSection
.FvImageSection()
2603 FvImageSectionObj
.Alignment
= AlignValue
2605 FvImageSectionObj
.Fv
= FvObj
2606 FvImageSectionObj
.FvName
= None
2608 FvImageSectionObj
.FvName
= FvName
.upper()
2609 FvImageSectionObj
.FvFileName
= FvName
2611 Obj
.SectionList
.append(FvImageSectionObj
)
2613 elif self
.__IsKeyword
("PEI_DEPEX_EXP") or self
.__IsKeyword
("DXE_DEPEX_EXP") or self
.__IsKeyword
("SMM_DEPEX_EXP"):
2614 if AlignValue
== 'Auto':
2615 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2616 DepexSectionObj
= DepexSection
.DepexSection()
2617 DepexSectionObj
.Alignment
= AlignValue
2618 DepexSectionObj
.DepexType
= self
.__Token
2620 if not self
.__IsToken
( "="):
2621 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2622 if not self
.__IsToken
( "{"):
2623 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2624 if not self
.__SkipToToken
( "}"):
2625 raise Warning("expected Depex expression ending '}'", self
.FileName
, self
.CurrentLineNumber
)
2627 DepexSectionObj
.Expression
= self
.__SkippedChars
.rstrip('}')
2628 Obj
.SectionList
.append(DepexSectionObj
)
2631 if not self
.__GetNextWord
():
2632 raise Warning("expected section type", self
.FileName
, self
.CurrentLineNumber
)
2634 # Encapsulation section appear, UndoToken and return
2635 if self
.__Token
== "COMPRESS" or self
.__Token
== "GUIDED":
2636 self
.SetFileBufferPos(OldPos
)
2639 if self
.__Token
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
2640 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
2641 raise Warning("Unknown section type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2642 if AlignValue
== 'Auto'and (not self
.__Token
== 'PE32') and (not self
.__Token
== 'TE'):
2643 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
2646 DataSectionObj
= DataSection
.DataSection()
2647 DataSectionObj
.Alignment
= AlignValue
2648 DataSectionObj
.SecType
= self
.__Token
2650 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
2651 if self
.__FileCouldHaveRelocFlag
(Obj
.FvFileType
) and self
.__SectionCouldHaveRelocFlag
(DataSectionObj
.SecType
):
2652 if self
.__Token
== 'RELOCS_STRIPPED':
2653 DataSectionObj
.KeepReloc
= False
2655 DataSectionObj
.KeepReloc
= True
2657 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
)
2659 if self
.__IsToken
("="):
2660 if not self
.__GetNextToken
():
2661 raise Warning("expected section file path", self
.FileName
, self
.CurrentLineNumber
)
2662 DataSectionObj
.SectFileName
= self
.__Token
2663 if DataSectionObj
.SectFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
2664 #do case sensitive check for file path
2665 ErrorCode
, ErrorInfo
= PathClass(NormPath(DataSectionObj
.SectFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
2667 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
2669 if not self
.__GetCglSection
(DataSectionObj
):
2672 Obj
.SectionList
.append(DataSectionObj
)
2676 ## __GetCglSection() method
2678 # Get compressed or GUIDed section for Obj
2680 # @param self The object pointer
2681 # @param Obj for whom leaf section is got
2682 # @param AlignValue alignment value for complex section
2683 # @retval True Successfully find section statement
2684 # @retval False Not able to find section statement
2686 def __GetCglSection(self
, Obj
, AlignValue
= None):
2688 if self
.__IsKeyword
( "COMPRESS"):
2690 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
2693 if not self
.__IsToken
("{"):
2694 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2696 CompressSectionObj
= CompressSection
.CompressSection()
2697 CompressSectionObj
.Alignment
= AlignValue
2698 CompressSectionObj
.CompType
= type
2699 # Recursive sections...
2701 IsLeafSection
= self
.__GetLeafSection
(CompressSectionObj
)
2702 IsEncapSection
= self
.__GetEncapsulationSec
(CompressSectionObj
)
2703 if not IsLeafSection
and not IsEncapSection
:
2707 if not self
.__IsToken
( "}"):
2708 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2709 Obj
.SectionList
.append(CompressSectionObj
)
2712 # raise Warning("Compress type not known")
2716 elif self
.__IsKeyword
( "GUIDED"):
2718 if self
.__GetNextGuid
():
2719 GuidValue
= self
.__Token
2721 AttribDict
= self
.__GetGuidAttrib
()
2722 if not self
.__IsToken
("{"):
2723 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
2724 GuidSectionObj
= GuidSection
.GuidSection()
2725 GuidSectionObj
.Alignment
= AlignValue
2726 GuidSectionObj
.NameGuid
= GuidValue
2727 GuidSectionObj
.SectionType
= "GUIDED"
2728 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
2729 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
2730 # Recursive sections...
2732 IsLeafSection
= self
.__GetLeafSection
(GuidSectionObj
)
2733 IsEncapSection
= self
.__GetEncapsulationSec
(GuidSectionObj
)
2734 if not IsLeafSection
and not IsEncapSection
:
2737 if not self
.__IsToken
( "}"):
2738 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
2739 Obj
.SectionList
.append(GuidSectionObj
)
2745 ## __GetGuidAttri() method
2747 # Get attributes for GUID section
2749 # @param self The object pointer
2750 # @retval AttribDict Dictionary of key-value pair of section attributes
2752 def __GetGuidAttrib(self
):
2755 AttribDict
["PROCESSING_REQUIRED"] = "NONE"
2756 AttribDict
["AUTH_STATUS_VALID"] = "NONE"
2757 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2758 AttribKey
= self
.__Token
2760 if not self
.__IsToken
("="):
2761 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2763 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2764 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2765 AttribDict
[AttribKey
] = self
.__Token
2767 if self
.__IsKeyword
("PROCESSING_REQUIRED") or self
.__IsKeyword
("AUTH_STATUS_VALID"):
2768 AttribKey
= self
.__Token
2770 if not self
.__IsToken
("="):
2771 raise Warning("expected '='")
2773 if not self
.__GetNextToken
() or self
.__Token
.upper() not in ("TRUE", "FALSE", "1", "0"):
2774 raise Warning("expected TRUE/FALSE (1/0)", self
.FileName
, self
.CurrentLineNumber
)
2775 AttribDict
[AttribKey
] = self
.__Token
2779 ## __GetEncapsulationSec() method
2781 # Get encapsulation section for FILE
2783 # @param self The object pointer
2784 # @param FfsFile for whom section is got
2785 # @retval True Successfully find section statement
2786 # @retval False Not able to find section statement
2788 def __GetEncapsulationSec(self
, FfsFileObj
):
2790 OldPos
= self
.GetFileBufferPos()
2791 if not self
.__IsKeyword
( "SECTION"):
2792 if len(FfsFileObj
.SectionList
) == 0:
2793 raise Warning("expected SECTION", self
.FileName
, self
.CurrentLineNumber
)
2798 if self
.__GetAlignment
():
2799 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
2800 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
2801 AlignValue
= self
.__Token
2803 if not self
.__GetCglSection
(FfsFileObj
, AlignValue
):
2804 self
.SetFileBufferPos(OldPos
)
2809 ## __GetCapsule() method
2811 # Get capsule section contents and store its data into capsule list of self.Profile
2813 # @param self The object pointer
2814 # @retval True Successfully find a capsule
2815 # @retval False Not able to find a capsule
2817 def __GetCapsule(self
):
2819 if not self
.__GetNextToken
():
2822 S
= self
.__Token
.upper()
2823 if S
.startswith("[") and not S
.startswith("[CAPSULE."):
2824 if not S
.startswith("[VTF.") and not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
2825 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
2830 if not self
.__IsToken
("[CAPSULE.", True):
2831 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
2832 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
2833 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
2834 raise Warning("expected [Capsule.]", self
.FileName
, self
.CurrentLineNumber
)
2836 CapsuleObj
= Capsule
.Capsule()
2838 CapsuleName
= self
.__GetUiName
()
2840 raise Warning("expected capsule name", self
.FileName
, self
.CurrentLineNumber
)
2842 CapsuleObj
.UiCapsuleName
= CapsuleName
.upper()
2844 if not self
.__IsToken
( "]"):
2845 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
2847 if self
.__IsKeyword
("CREATE_FILE"):
2848 if not self
.__IsToken
( "="):
2849 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2851 if not self
.__GetNextToken
():
2852 raise Warning("expected file name", self
.FileName
, self
.CurrentLineNumber
)
2854 CapsuleObj
.CreateFile
= self
.__Token
2856 self
.__GetCapsuleStatements
(CapsuleObj
)
2857 self
.Profile
.CapsuleDict
[CapsuleObj
.UiCapsuleName
] = CapsuleObj
2860 ## __GetCapsuleStatements() method
2862 # Get statements for capsule
2864 # @param self The object pointer
2865 # @param Obj for whom statements are got
2867 def __GetCapsuleStatements(self
, Obj
):
2868 self
.__GetCapsuleTokens
(Obj
)
2869 self
.__GetDefineStatements
(Obj
)
2870 self
.__GetSetStatements
(Obj
)
2871 self
.__GetCapsuleData
(Obj
)
2873 ## __GetCapsuleTokens() method
2875 # Get token statements for capsule
2877 # @param self The object pointer
2878 # @param Obj for whom token statements are got
2880 def __GetCapsuleTokens(self
, Obj
):
2881 if not self
.__GetNextToken
():
2883 while self
.__Token
in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):
2884 Name
= self
.__Token
.strip()
2885 if not self
.__IsToken
("="):
2886 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2887 if not self
.__GetNextToken
():
2888 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2889 if Name
== 'CAPSULE_FLAGS':
2890 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2891 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2892 Value
= self
.__Token
.strip()
2893 while self
.__IsToken
(","):
2895 if not self
.__GetNextToken
():
2896 raise Warning("expected value", self
.FileName
, self
.CurrentLineNumber
)
2897 if not self
.__Token
in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):
2898 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self
.FileName
, self
.CurrentLineNumber
)
2899 Value
+= self
.__Token
.strip()
2901 Value
= self
.__Token
.strip()
2902 Obj
.TokensDict
[Name
] = Value
2903 if not self
.__GetNextToken
():
2907 ## __GetCapsuleData() method
2909 # Get capsule data for capsule
2911 # @param self The object pointer
2912 # @param Obj for whom capsule data are got
2914 def __GetCapsuleData(self
, Obj
):
2917 IsInf
= self
.__GetInfStatement
(Obj
, True)
2918 IsFile
= self
.__GetFileStatement
(Obj
, True)
2919 IsFv
= self
.__GetFvStatement
(Obj
)
2920 IsFd
= self
.__GetFdStatement
(Obj
)
2921 IsAnyFile
= self
.__GetAnyFileStatement
(Obj
)
2922 if not (IsInf
or IsFile
or IsFv
or IsFd
or IsAnyFile
):
2925 ## __GetFvStatement() method
2927 # Get FV for capsule
2929 # @param self The object pointer
2930 # @param CapsuleObj for whom FV is got
2931 # @retval True Successfully find a FV statement
2932 # @retval False Not able to find a FV statement
2934 def __GetFvStatement(self
, CapsuleObj
):
2936 if not self
.__IsKeyword
("FV"):
2939 if not self
.__IsToken
("="):
2940 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2942 if not self
.__GetNextToken
():
2943 raise Warning("expected FV name", self
.FileName
, self
.CurrentLineNumber
)
2945 CapsuleFv
= CapsuleData
.CapsuleFv()
2946 CapsuleFv
.FvName
= self
.__Token
2947 CapsuleObj
.CapsuleDataList
.append(CapsuleFv
)
2950 ## __GetFdStatement() method
2952 # Get FD for capsule
2954 # @param self The object pointer
2955 # @param CapsuleObj for whom FD is got
2956 # @retval True Successfully find a FD statement
2957 # @retval False Not able to find a FD statement
2959 def __GetFdStatement(self
, CapsuleObj
):
2961 if not self
.__IsKeyword
("FD"):
2964 if not self
.__IsToken
("="):
2965 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2967 if not self
.__GetNextToken
():
2968 raise Warning("expected FD name", self
.FileName
, self
.CurrentLineNumber
)
2970 CapsuleFd
= CapsuleData
.CapsuleFd()
2971 CapsuleFd
.FdName
= self
.__Token
2972 CapsuleObj
.CapsuleDataList
.append(CapsuleFd
)
2975 ## __GetAnyFileStatement() method
2977 # Get AnyFile for capsule
2979 # @param self The object pointer
2980 # @param CapsuleObj for whom AnyFile is got
2981 # @retval True Successfully find a Anyfile statement
2982 # @retval False Not able to find a AnyFile statement
2984 def __GetAnyFileStatement(self
, CapsuleObj
):
2986 if not self
.__IsKeyword
("FILE"):
2989 if not self
.__IsKeyword
("DATA"):
2993 if not self
.__IsToken
("="):
2994 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
2996 if not self
.__GetNextToken
():
2997 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
2999 AnyFileName
= self
.__Token
3000 AnyFileName
= GenFdsGlobalVariable
.ReplaceWorkspaceMacro(AnyFileName
)
3001 if not os
.path
.exists(AnyFileName
):
3002 raise Warning("File %s not exists"%AnyFileName
, self
.FileName
, self
.CurrentLineNumber
)
3004 CapsuleAnyFile
= CapsuleData
.CapsuleAnyFile()
3005 CapsuleAnyFile
.FileName
= AnyFileName
3006 CapsuleObj
.CapsuleDataList
.append(CapsuleAnyFile
)
3009 ## __GetRule() method
3011 # Get Rule section contents and store its data into rule list of self.Profile
3013 # @param self The object pointer
3014 # @retval True Successfully find a Rule
3015 # @retval False Not able to find a Rule
3017 def __GetRule(self
):
3019 if not self
.__GetNextToken
():
3022 S
= self
.__Token
.upper()
3023 if S
.startswith("[") and not S
.startswith("[RULE."):
3024 if not S
.startswith("[OPTIONROM."):
3025 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3029 if not self
.__IsToken
("[Rule.", True):
3030 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3031 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3032 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3033 raise Warning("expected [Rule.]", self
.FileName
, self
.CurrentLineNumber
)
3035 if not self
.__SkipToToken
("."):
3036 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3038 Arch
= self
.__SkippedChars
.rstrip(".")
3039 if Arch
.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):
3040 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3042 ModuleType
= self
.__GetModuleType
()
3045 if self
.__IsToken
("."):
3046 if not self
.__GetNextWord
():
3047 raise Warning("expected template name", self
.FileName
, self
.CurrentLineNumber
)
3048 TemplateName
= self
.__Token
3050 if not self
.__IsToken
( "]"):
3051 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3053 RuleObj
= self
.__GetRuleFileStatements
()
3054 RuleObj
.Arch
= Arch
.upper()
3055 RuleObj
.ModuleType
= ModuleType
3056 RuleObj
.TemplateName
= TemplateName
3057 if TemplateName
== '' :
3058 self
.Profile
.RuleDict
['RULE' + \
3062 ModuleType
.upper() ] = RuleObj
3064 self
.Profile
.RuleDict
['RULE' + \
3068 ModuleType
.upper() + \
3070 TemplateName
.upper() ] = RuleObj
3071 # self.Profile.RuleList.append(rule)
3074 ## __GetModuleType() method
3076 # Return the module type
3078 # @param self The object pointer
3079 # @retval string module type
3081 def __GetModuleType(self
):
3083 if not self
.__GetNextWord
():
3084 raise Warning("expected Module type", self
.FileName
, self
.CurrentLineNumber
)
3085 if self
.__Token
.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
3086 "DXE_DRIVER", "DXE_SAL_DRIVER", \
3087 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
3088 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
3089 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
3090 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):
3091 raise Warning("Unknown Module type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3094 ## __GetFileExtension() method
3096 # Return the file extension
3098 # @param self The object pointer
3099 # @retval string file name extension
3101 def __GetFileExtension(self
):
3102 if not self
.__IsToken
("."):
3103 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3106 if self
.__GetNextToken
():
3107 Pattern
= re
.compile(r
'([a-zA-Z][a-zA-Z0-9]*)')
3108 if Pattern
.match(self
.__Token
):
3112 raise Warning("Unknown file extension '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3115 raise Warning("expected file extension", self
.FileName
, self
.CurrentLineNumber
)
3117 ## __GetRuleFileStatement() method
3121 # @param self The object pointer
3122 # @retval Rule Rule object
3124 def __GetRuleFileStatements(self
):
3126 if not self
.__IsKeyword
("FILE"):
3127 raise Warning("expected FILE", self
.FileName
, self
.CurrentLineNumber
)
3129 if not self
.__GetNextWord
():
3130 raise Warning("expected FFS type", self
.FileName
, self
.CurrentLineNumber
)
3132 Type
= self
.__Token
.strip().upper()
3133 if Type
not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
3134 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):
3135 raise Warning("Unknown FV type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3137 if not self
.__IsToken
("="):
3138 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3140 if not self
.__IsKeyword
("$(NAMED_GUID)"):
3141 if not self
.__GetNextWord
():
3142 raise Warning("expected $(NAMED_GUID)", self
.FileName
, self
.CurrentLineNumber
)
3143 if self
.__Token
== 'PCD':
3144 if not self
.__IsToken
( "("):
3145 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3146 PcdPair
= self
.__GetNextPcdName
()
3147 if not self
.__IsToken
( ")"):
3148 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3149 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3151 NameGuid
= self
.__Token
3154 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3155 if self
.__FileCouldHaveRelocFlag
(Type
):
3156 if self
.__Token
== 'RELOCS_STRIPPED':
3161 raise Warning("File type %s could not have reloc strip flag%d" % (Type
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3164 if self
.__GetNextToken
():
3165 Pattern
= re
.compile(r
'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
3166 if Pattern
.match(self
.__Token
):
3167 KeyStringList
.append(self
.__Token
)
3168 if self
.__IsToken
(","):
3169 while self
.__GetNextToken
():
3170 if not Pattern
.match(self
.__Token
):
3171 raise Warning("expected KeyString \"Target_Tag_Arch\"", self
.FileName
, self
.CurrentLineNumber
)
3172 KeyStringList
.append(self
.__Token
)
3174 if not self
.__IsToken
(","):
3182 if self
.__IsKeyword
("Fixed", True):
3186 if self
.__IsKeyword
("CheckSum", True):
3190 if self
.__GetAlignment
():
3191 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3192 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3193 #For FFS, Auto is default option same to ""
3194 if not self
.__Token
== "Auto":
3195 AlignValue
= self
.__Token
3197 if self
.__IsToken
("{"):
3198 # Complex file rule expected
3199 Rule
= RuleComplexFile
.RuleComplexFile()
3200 Rule
.FvFileType
= Type
3201 Rule
.NameGuid
= NameGuid
3202 Rule
.Alignment
= AlignValue
3203 Rule
.CheckSum
= CheckSum
3205 Rule
.KeyStringList
= KeyStringList
3206 if KeepReloc
!= None:
3207 Rule
.KeepReloc
= KeepReloc
3210 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(Rule
)
3211 IsLeaf
= self
.__GetEfiSection
(Rule
)
3212 if not IsEncapsulate
and not IsLeaf
:
3215 if not self
.__IsToken
("}"):
3216 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3221 # Simple file rule expected
3222 if not self
.__GetNextWord
():
3223 raise Warning("expected leaf section type", self
.FileName
, self
.CurrentLineNumber
)
3225 SectionName
= self
.__Token
3227 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3228 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
3229 raise Warning("Unknown leaf section name '%s'" % SectionName
, self
.FileName
, self
.CurrentLineNumber
)
3232 if self
.__IsKeyword
("Fixed", True):
3235 if self
.__IsKeyword
("CheckSum", True):
3239 if self
.__GetAlignment
():
3240 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3241 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3242 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3243 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3244 SectAlignment
= self
.__Token
3247 if self
.__IsToken
('|'):
3248 Ext
= self
.__GetFileExtension
()
3249 elif not self
.__GetNextToken
():
3250 raise Warning("expected File name", self
.FileName
, self
.CurrentLineNumber
)
3252 Rule
= RuleSimpleFile
.RuleSimpleFile()
3253 Rule
.SectionType
= SectionName
3254 Rule
.FvFileType
= Type
3255 Rule
.NameGuid
= NameGuid
3256 Rule
.Alignment
= AlignValue
3257 Rule
.SectAlignment
= SectAlignment
3258 Rule
.CheckSum
= CheckSum
3260 Rule
.KeyStringList
= KeyStringList
3261 if KeepReloc
!= None:
3262 Rule
.KeepReloc
= KeepReloc
3263 Rule
.FileExtension
= Ext
3264 Rule
.FileName
= self
.__Token
3267 ## __GetEfiSection() method
3269 # Get section list for Rule
3271 # @param self The object pointer
3272 # @param Obj for whom section is got
3273 # @retval True Successfully find section statement
3274 # @retval False Not able to find section statement
3276 def __GetEfiSection(self
, Obj
):
3278 OldPos
= self
.GetFileBufferPos()
3279 if not self
.__GetNextWord
():
3281 SectionName
= self
.__Token
3283 if SectionName
not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3284 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3288 if SectionName
== "FV_IMAGE":
3289 FvImageSectionObj
= FvImageSection
.FvImageSection()
3290 if self
.__IsKeyword
("FV_IMAGE"):
3292 if self
.__IsToken
( "{"):
3294 self
.__GetDefineStatements
(FvObj
)
3295 self
.__GetBlockStatement
(FvObj
)
3296 self
.__GetSetStatements
(FvObj
)
3297 self
.__GetFvAlignment
(FvObj
)
3298 self
.__GetFvAttributes
(FvObj
)
3299 self
.__GetAprioriSection
(FvObj
)
3300 self
.__GetAprioriSection
(FvObj
)
3303 IsInf
= self
.__GetInfStatement
(FvObj
)
3304 IsFile
= self
.__GetFileStatement
(FvObj
)
3305 if not IsInf
and not IsFile
:
3308 if not self
.__IsToken
( "}"):
3309 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3310 FvImageSectionObj
.Fv
= FvObj
3311 FvImageSectionObj
.FvName
= None
3314 if not self
.__IsKeyword
("FV"):
3315 raise Warning("expected 'FV'", self
.FileName
, self
.CurrentLineNumber
)
3316 FvImageSectionObj
.FvFileType
= self
.__Token
3318 if self
.__GetAlignment
():
3319 if self
.__Token
not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3320 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3321 FvImageSectionObj
.Alignment
= self
.__Token
3323 if self
.__IsToken
('|'):
3324 FvImageSectionObj
.FvFileExtension
= self
.__GetFileExtension
()
3325 elif self
.__GetNextToken
():
3326 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3327 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3328 FvImageSectionObj
.FvFileName
= self
.__Token
3332 raise Warning("expected FV file name", self
.FileName
, self
.CurrentLineNumber
)
3334 Obj
.SectionList
.append(FvImageSectionObj
)
3337 EfiSectionObj
= EfiSection
.EfiSection()
3338 EfiSectionObj
.SectionType
= SectionName
3340 if not self
.__GetNextToken
():
3341 raise Warning("expected file type", self
.FileName
, self
.CurrentLineNumber
)
3343 if self
.__Token
== "STRING":
3344 if not self
.__RuleSectionCouldHaveString
(EfiSectionObj
.SectionType
):
3345 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3347 if not self
.__IsToken
('='):
3348 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3350 if not self
.__GetNextToken
():
3351 raise Warning("expected Quoted String", self
.FileName
, self
.CurrentLineNumber
)
3353 if self
.__GetStringData
():
3354 EfiSectionObj
.StringData
= self
.__Token
3356 if self
.__IsKeyword
("BUILD_NUM"):
3357 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3358 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3360 if not self
.__IsToken
("="):
3361 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3362 if not self
.__GetNextToken
():
3363 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3364 EfiSectionObj
.BuildNum
= self
.__Token
3367 EfiSectionObj
.FileType
= self
.__Token
3368 self
.__CheckRuleSectionFileType
(EfiSectionObj
.SectionType
, EfiSectionObj
.FileType
)
3370 if self
.__IsKeyword
("Optional"):
3371 if not self
.__RuleSectionCouldBeOptional
(EfiSectionObj
.SectionType
):
3372 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3373 EfiSectionObj
.Optional
= True
3375 if self
.__IsKeyword
("BUILD_NUM"):
3376 if not self
.__RuleSectionCouldHaveBuildNum
(EfiSectionObj
.SectionType
):
3377 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj
.SectionType
, self
.CurrentLineNumber
), self
.FileName
, self
.CurrentLineNumber
)
3379 if not self
.__IsToken
("="):
3380 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3381 if not self
.__GetNextToken
():
3382 raise Warning("expected Build number", self
.FileName
, self
.CurrentLineNumber
)
3383 EfiSectionObj
.BuildNum
= self
.__Token
3385 if self
.__GetAlignment
():
3386 if self
.__Token
not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):
3387 raise Warning("Incorrect alignment '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3388 if self
.__Token
== 'Auto' and (not SectionName
== 'PE32') and (not SectionName
== 'TE'):
3389 raise Warning("Auto alignment can only be used in PE32 or TE section ", self
.FileName
, self
.CurrentLineNumber
)
3390 EfiSectionObj
.Alignment
= self
.__Token
3392 if self
.__IsKeyword
('RELOCS_STRIPPED') or self
.__IsKeyword
('RELOCS_RETAINED'):
3393 if self
.__SectionCouldHaveRelocFlag
(EfiSectionObj
.SectionType
):
3394 if self
.__Token
== 'RELOCS_STRIPPED':
3395 EfiSectionObj
.KeepReloc
= False
3397 EfiSectionObj
.KeepReloc
= True
3398 if Obj
.KeepReloc
!= None and Obj
.KeepReloc
!= EfiSectionObj
.KeepReloc
:
3399 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3401 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj
.SectionType
, self
.FileName
, self
.CurrentLineNumber
)
3404 if self
.__IsToken
('|'):
3405 EfiSectionObj
.FileExtension
= self
.__GetFileExtension
()
3406 elif self
.__GetNextToken
():
3407 if self
.__Token
not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
3408 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
3410 if self
.__Token
.startswith('PCD'):
3412 self
.__GetNextWord
()
3414 if self
.__Token
== 'PCD':
3415 if not self
.__IsToken
( "("):
3416 raise Warning("expected '('", self
.FileName
, self
.CurrentLineNumber
)
3417 PcdPair
= self
.__GetNextPcdName
()
3418 if not self
.__IsToken
( ")"):
3419 raise Warning("expected ')'", self
.FileName
, self
.CurrentLineNumber
)
3420 self
.__Token
= 'PCD('+PcdPair
[1]+'.'+PcdPair
[0]+')'
3422 EfiSectionObj
.FileName
= self
.__Token
3427 raise Warning("expected section file name", self
.FileName
, self
.CurrentLineNumber
)
3429 Obj
.SectionList
.append(EfiSectionObj
)
3432 ## __RuleSectionCouldBeOptional() method
3434 # Get whether a section could be optional
3436 # @param self The object pointer
3437 # @param SectionType The section type to check
3438 # @retval True section could be optional
3439 # @retval False section never optional
3441 def __RuleSectionCouldBeOptional(self
, SectionType
):
3442 if SectionType
in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
3447 ## __RuleSectionCouldHaveBuildNum() method
3449 # Get whether a section could have build number information
3451 # @param self The object pointer
3452 # @param SectionType The section type to check
3453 # @retval True section could have build number information
3454 # @retval False section never have build number information
3456 def __RuleSectionCouldHaveBuildNum(self
, SectionType
):
3457 if SectionType
in ("VERSION"):
3462 ## __RuleSectionCouldHaveString() method
3464 # Get whether a section could have string
3466 # @param self The object pointer
3467 # @param SectionType The section type to check
3468 # @retval True section could have string
3469 # @retval False section never have string
3471 def __RuleSectionCouldHaveString(self
, SectionType
):
3472 if SectionType
in ("UI", "VERSION"):
3477 ## __CheckRuleSectionFileType() method
3479 # Get whether a section matches a file type
3481 # @param self The object pointer
3482 # @param SectionType The section type to check
3483 # @param FileType The file type to check
3485 def __CheckRuleSectionFileType(self
, SectionType
, FileType
):
3486 if SectionType
== "COMPAT16":
3487 if FileType
not in ("COMPAT16", "SEC_COMPAT16"):
3488 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3489 elif SectionType
== "PE32":
3490 if FileType
not in ("PE32", "SEC_PE32"):
3491 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3492 elif SectionType
== "PIC":
3493 if FileType
not in ("PIC", "PIC"):
3494 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3495 elif SectionType
== "TE":
3496 if FileType
not in ("TE", "SEC_TE"):
3497 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3498 elif SectionType
== "RAW":
3499 if FileType
not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
3500 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3501 elif SectionType
== "DXE_DEPEX" or SectionType
== "SMM_DEPEX":
3502 if FileType
not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
3503 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3504 elif SectionType
== "UI":
3505 if FileType
not in ("UI", "SEC_UI"):
3506 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3507 elif SectionType
== "VERSION":
3508 if FileType
not in ("VERSION", "SEC_VERSION"):
3509 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3510 elif SectionType
== "PEI_DEPEX":
3511 if FileType
not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
3512 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3513 elif SectionType
== "GUID":
3514 if FileType
not in ("PE32", "SEC_GUID"):
3515 raise Warning("Incorrect section file type '%s'" % FileType
, self
.FileName
, self
.CurrentLineNumber
)
3517 ## __GetRuleEncapsulationSection() method
3519 # Get encapsulation section for Rule
3521 # @param self The object pointer
3522 # @param Rule for whom section is got
3523 # @retval True Successfully find section statement
3524 # @retval False Not able to find section statement
3526 def __GetRuleEncapsulationSection(self
, Rule
):
3528 if self
.__IsKeyword
( "COMPRESS"):
3530 if self
.__IsKeyword
("PI_STD") or self
.__IsKeyword
("PI_NONE"):
3533 if not self
.__IsToken
("{"):
3534 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3536 CompressSectionObj
= CompressSection
.CompressSection()
3538 CompressSectionObj
.CompType
= Type
3539 # Recursive sections...
3541 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(CompressSectionObj
)
3542 IsLeaf
= self
.__GetEfiSection
(CompressSectionObj
)
3543 if not IsEncapsulate
and not IsLeaf
:
3546 if not self
.__IsToken
( "}"):
3547 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3548 Rule
.SectionList
.append(CompressSectionObj
)
3552 elif self
.__IsKeyword
( "GUIDED"):
3554 if self
.__GetNextGuid
():
3555 GuidValue
= self
.__Token
3557 if self
.__IsKeyword
( "$(NAMED_GUID)"):
3558 GuidValue
= self
.__Token
3560 AttribDict
= self
.__GetGuidAttrib
()
3562 if not self
.__IsToken
("{"):
3563 raise Warning("expected '{'", self
.FileName
, self
.CurrentLineNumber
)
3564 GuidSectionObj
= GuidSection
.GuidSection()
3565 GuidSectionObj
.NameGuid
= GuidValue
3566 GuidSectionObj
.SectionType
= "GUIDED"
3567 GuidSectionObj
.ProcessRequired
= AttribDict
["PROCESSING_REQUIRED"]
3568 GuidSectionObj
.AuthStatusValid
= AttribDict
["AUTH_STATUS_VALID"]
3572 IsEncapsulate
= self
.__GetRuleEncapsulationSection
(GuidSectionObj
)
3573 IsLeaf
= self
.__GetEfiSection
(GuidSectionObj
)
3574 if not IsEncapsulate
and not IsLeaf
:
3577 if not self
.__IsToken
( "}"):
3578 raise Warning("expected '}'", self
.FileName
, self
.CurrentLineNumber
)
3579 Rule
.SectionList
.append(GuidSectionObj
)
3585 ## __GetVtf() method
3587 # Get VTF section contents and store its data into VTF list of self.Profile
3589 # @param self The object pointer
3590 # @retval True Successfully find a VTF
3591 # @retval False Not able to find a VTF
3595 if not self
.__GetNextToken
():
3598 S
= self
.__Token
.upper()
3599 if S
.startswith("[") and not S
.startswith("[VTF."):
3600 if not S
.startswith("[RULE.") and not S
.startswith("[OPTIONROM."):
3601 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3606 if not self
.__IsToken
("[VTF.", True):
3607 FileLineTuple
= GetRealFileLine(self
.FileName
, self
.CurrentLineNumber
)
3608 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
3609 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
3610 raise Warning("expected [VTF.]", self
.FileName
, self
.CurrentLineNumber
)
3612 if not self
.__SkipToToken
("."):
3613 raise Warning("expected '.'", self
.FileName
, self
.CurrentLineNumber
)
3615 Arch
= self
.__SkippedChars
.rstrip(".").upper()
3616 if Arch
not in ("IA32", "X64", "IPF", "ARM"):
3617 raise Warning("Unknown Arch '%s'" % Arch
, self
.FileName
, self
.CurrentLineNumber
)
3619 if not self
.__GetNextWord
():
3620 raise Warning("expected VTF name", self
.FileName
, self
.CurrentLineNumber
)
3621 Name
= self
.__Token
.upper()
3624 VtfObj
.UiName
= Name
3625 VtfObj
.KeyArch
= Arch
3627 if self
.__IsToken
(","):
3628 if not self
.__GetNextWord
():
3629 raise Warning("expected Arch list", self
.FileName
, self
.CurrentLineNumber
)
3630 if self
.__Token
.upper() not in ("IA32", "X64", "IPF", "ARM"):
3631 raise Warning("Unknown Arch '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3632 VtfObj
.ArchList
= self
.__Token
.upper()
3634 if not self
.__IsToken
( "]"):
3635 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3637 if self
.__IsKeyword
("IA32_RST_BIN"):
3638 if not self
.__IsToken
("="):
3639 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3641 if not self
.__GetNextToken
():
3642 raise Warning("expected Reset file", self
.FileName
, self
.CurrentLineNumber
)
3644 VtfObj
.ResetBin
= self
.__Token
3645 if VtfObj
.ResetBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3646 #check for file path
3647 ErrorCode
, ErrorInfo
= PathClass(NormPath(VtfObj
.ResetBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3649 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3651 while self
.__GetComponentStatement
(VtfObj
):
3654 self
.Profile
.VtfList
.append(VtfObj
)
3657 ## __GetComponentStatement() method
3659 # Get components in VTF
3661 # @param self The object pointer
3662 # @param VtfObj for whom component is got
3663 # @retval True Successfully find a component
3664 # @retval False Not able to find a component
3666 def __GetComponentStatement(self
, VtfObj
):
3668 if not self
.__IsKeyword
("COMP_NAME"):
3671 if not self
.__IsToken
("="):
3672 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3674 if not self
.__GetNextWord
():
3675 raise Warning("expected Component Name", self
.FileName
, self
.CurrentLineNumber
)
3677 CompStatementObj
= ComponentStatement
.ComponentStatement()
3678 CompStatementObj
.CompName
= self
.__Token
3680 if not self
.__IsKeyword
("COMP_LOC"):
3681 raise Warning("expected COMP_LOC", self
.FileName
, self
.CurrentLineNumber
)
3683 if not self
.__IsToken
("="):
3684 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3686 CompStatementObj
.CompLoc
= ""
3687 if self
.__GetNextWord
():
3688 CompStatementObj
.CompLoc
= self
.__Token
3689 if self
.__IsToken
('|'):
3690 if not self
.__GetNextWord
():
3691 raise Warning("Expected Region Name", self
.FileName
, self
.CurrentLineNumber
)
3693 if self
.__Token
not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support
3694 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3696 CompStatementObj
.FilePos
= self
.__Token
3698 self
.CurrentLineNumber
+= 1
3699 self
.CurrentOffsetWithinLine
= 0
3701 if not self
.__IsKeyword
("COMP_TYPE"):
3702 raise Warning("expected COMP_TYPE", self
.FileName
, self
.CurrentLineNumber
)
3704 if not self
.__IsToken
("="):
3705 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3707 if not self
.__GetNextToken
():
3708 raise Warning("expected Component type", self
.FileName
, self
.CurrentLineNumber
)
3709 if self
.__Token
not in ("FIT", "PAL_B", "PAL_A", "OEM"):
3710 if not self
.__Token
.startswith("0x") or len(self
.__Token
) < 3 or len(self
.__Token
) > 4 or \
3711 not self
.__HexDigit
(self
.__Token
[2]) or not self
.__HexDigit
(self
.__Token
[-1]):
3712 raise Warning("Unknown location type '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3713 CompStatementObj
.CompType
= self
.__Token
3715 if not self
.__IsKeyword
("COMP_VER"):
3716 raise Warning("expected COMP_VER", self
.FileName
, self
.CurrentLineNumber
)
3718 if not self
.__IsToken
("="):
3719 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3721 if not self
.__GetNextToken
():
3722 raise Warning("expected Component version", self
.FileName
, self
.CurrentLineNumber
)
3724 Pattern
= re
.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re
.DOTALL
)
3725 if Pattern
.match(self
.__Token
) == None:
3726 raise Warning("Unknown version format '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3727 CompStatementObj
.CompVer
= self
.__Token
3729 if not self
.__IsKeyword
("COMP_CS"):
3730 raise Warning("expected COMP_CS", self
.FileName
, self
.CurrentLineNumber
)
3732 if not self
.__IsToken
("="):
3733 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3735 if not self
.__GetNextToken
():
3736 raise Warning("expected Component CS", self
.FileName
, self
.CurrentLineNumber
)
3737 if self
.__Token
not in ("1", "0"):
3738 raise Warning("Unknown Component CS '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3739 CompStatementObj
.CompCs
= self
.__Token
3742 if not self
.__IsKeyword
("COMP_BIN"):
3743 raise Warning("expected COMP_BIN", self
.FileName
, self
.CurrentLineNumber
)
3745 if not self
.__IsToken
("="):
3746 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3748 if not self
.__GetNextToken
():
3749 raise Warning("expected Component file", self
.FileName
, self
.CurrentLineNumber
)
3751 CompStatementObj
.CompBin
= self
.__Token
3752 if CompStatementObj
.CompBin
!= '-' and CompStatementObj
.CompBin
.replace('$(WORKSPACE)', '').find('$') == -1:
3753 #check for file path
3754 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompBin
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3756 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3758 if not self
.__IsKeyword
("COMP_SYM"):
3759 raise Warning("expected COMP_SYM", self
.FileName
, self
.CurrentLineNumber
)
3761 if not self
.__IsToken
("="):
3762 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3764 if not self
.__GetNextToken
():
3765 raise Warning("expected Component symbol file", self
.FileName
, self
.CurrentLineNumber
)
3767 CompStatementObj
.CompSym
= self
.__Token
3768 if CompStatementObj
.CompSym
!= '-' and CompStatementObj
.CompSym
.replace('$(WORKSPACE)', '').find('$') == -1:
3769 #check for file path
3770 ErrorCode
, ErrorInfo
= PathClass(NormPath(CompStatementObj
.CompSym
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3772 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3774 if not self
.__IsKeyword
("COMP_SIZE"):
3775 raise Warning("expected COMP_SIZE", self
.FileName
, self
.CurrentLineNumber
)
3777 if not self
.__IsToken
("="):
3778 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3780 if self
.__IsToken
("-"):
3781 CompStatementObj
.CompSize
= self
.__Token
3782 elif self
.__GetNextDecimalNumber
():
3783 CompStatementObj
.CompSize
= self
.__Token
3784 elif self
.__GetNextHexNumber
():
3785 CompStatementObj
.CompSize
= self
.__Token
3787 raise Warning("Unknown size '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3789 VtfObj
.ComponentStatementList
.append(CompStatementObj
)
3792 ## __GetOptionRom() method
3794 # Get OptionROM section contents and store its data into OptionROM list of self.Profile
3796 # @param self The object pointer
3797 # @retval True Successfully find a OptionROM
3798 # @retval False Not able to find a OptionROM
3800 def __GetOptionRom(self
):
3802 if not self
.__GetNextToken
():
3805 S
= self
.__Token
.upper()
3806 if S
.startswith("[") and not S
.startswith("[OPTIONROM."):
3807 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self
.FileName
, self
.CurrentLineNumber
)
3810 if not self
.__IsToken
("[OptionRom.", True):
3811 raise Warning("Unknown Keyword '%s'" % self
.__Token
, self
.FileName
, self
.CurrentLineNumber
)
3813 OptRomName
= self
.__GetUiName
()
3815 if not self
.__IsToken
( "]"):
3816 raise Warning("expected ']'", self
.FileName
, self
.CurrentLineNumber
)
3818 OptRomObj
= OptionRom
.OPTIONROM()
3819 OptRomObj
.DriverName
= OptRomName
3820 self
.Profile
.OptRomDict
[OptRomName
] = OptRomObj
3823 isInf
= self
.__GetOptRomInfStatement
(OptRomObj
)
3824 isFile
= self
.__GetOptRomFileStatement
(OptRomObj
)
3825 if not isInf
and not isFile
:
3830 ## __GetOptRomInfStatement() method
3832 # Get INF statements
3834 # @param self The object pointer
3835 # @param Obj for whom inf statement is got
3836 # @retval True Successfully find inf statement
3837 # @retval False Not able to find inf statement
3839 def __GetOptRomInfStatement(self
, Obj
):
3841 if not self
.__IsKeyword
( "INF"):
3844 ffsInf
= OptRomInfStatement
.OptRomInfStatement()
3845 self
.__GetInfOptions
( ffsInf
)
3847 if not self
.__GetNextToken
():
3848 raise Warning("expected INF file path", self
.FileName
, self
.CurrentLineNumber
)
3849 ffsInf
.InfFileName
= self
.__Token
3850 if ffsInf
.InfFileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3851 #check for file path
3852 ErrorCode
, ErrorInfo
= PathClass(NormPath(ffsInf
.InfFileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3854 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3856 if not ffsInf
.InfFileName
in self
.Profile
.InfList
:
3857 self
.Profile
.InfList
.append(ffsInf
.InfFileName
)
3860 self
.__GetOptRomOverrides
(ffsInf
)
3862 Obj
.FfsList
.append(ffsInf
)
3865 ## __GetOptRomOverrides() method
3867 # Get overrides for OptROM INF & FILE
3869 # @param self The object pointer
3870 # @param FfsInfObj for whom overrides is got
3872 def __GetOptRomOverrides(self
, Obj
):
3873 if self
.__IsToken
('{'):
3874 Overrides
= OptionRom
.OverrideAttribs()
3876 if self
.__IsKeyword
( "PCI_VENDOR_ID"):
3877 if not self
.__IsToken
( "="):
3878 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3879 if not self
.__GetNextHexNumber
():
3880 raise Warning("expected Hex vendor id", self
.FileName
, self
.CurrentLineNumber
)
3881 Overrides
.PciVendorId
= self
.__Token
3884 if self
.__IsKeyword
( "PCI_CLASS_CODE"):
3885 if not self
.__IsToken
( "="):
3886 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3887 if not self
.__GetNextHexNumber
():
3888 raise Warning("expected Hex class code", self
.FileName
, self
.CurrentLineNumber
)
3889 Overrides
.PciClassCode
= self
.__Token
3892 if self
.__IsKeyword
( "PCI_DEVICE_ID"):
3893 if not self
.__IsToken
( "="):
3894 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3895 if not self
.__GetNextHexNumber
():
3896 raise Warning("expected Hex device id", self
.FileName
, self
.CurrentLineNumber
)
3898 Overrides
.PciDeviceId
= self
.__Token
3901 if self
.__IsKeyword
( "PCI_REVISION"):
3902 if not self
.__IsToken
( "="):
3903 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3904 if not self
.__GetNextHexNumber
():
3905 raise Warning("expected Hex revision", self
.FileName
, self
.CurrentLineNumber
)
3906 Overrides
.PciRevision
= self
.__Token
3909 if self
.__IsKeyword
( "PCI_COMPRESS"):
3910 if not self
.__IsToken
( "="):
3911 raise Warning("expected '='", self
.FileName
, self
.CurrentLineNumber
)
3912 if not self
.__GetNextToken
():
3913 raise Warning("expected TRUE/FALSE for compress", self
.FileName
, self
.CurrentLineNumber
)
3914 Overrides
.NeedCompress
= self
.__Token
.upper() == 'TRUE'
3917 if self
.__IsToken
( "}"):
3920 EdkLogger
.error("FdfParser", FORMAT_INVALID
, File
=self
.FileName
, Line
=self
.CurrentLineNumber
)
3922 Obj
.OverrideAttribs
= Overrides
3924 ## __GetOptRomFileStatement() method
3926 # Get FILE statements
3928 # @param self The object pointer
3929 # @param Obj for whom FILE statement is got
3930 # @retval True Successfully find FILE statement
3931 # @retval False Not able to find FILE statement
3933 def __GetOptRomFileStatement(self
, Obj
):
3935 if not self
.__IsKeyword
( "FILE"):
3938 FfsFileObj
= OptRomFileStatement
.OptRomFileStatement()
3940 if not self
.__IsKeyword
("EFI") and not self
.__IsKeyword
("BIN"):
3941 raise Warning("expected Binary type (EFI/BIN)", self
.FileName
, self
.CurrentLineNumber
)
3942 FfsFileObj
.FileType
= self
.__Token
3944 if not self
.__GetNextToken
():
3945 raise Warning("expected File path", self
.FileName
, self
.CurrentLineNumber
)
3946 FfsFileObj
.FileName
= self
.__Token
3947 if FfsFileObj
.FileName
.replace('$(WORKSPACE)', '').find('$') == -1:
3948 #check for file path
3949 ErrorCode
, ErrorInfo
= PathClass(NormPath(FfsFileObj
.FileName
), GenFdsGlobalVariable
.WorkSpaceDir
).Validate()
3951 EdkLogger
.error("GenFds", ErrorCode
, ExtraData
=ErrorInfo
)
3953 if FfsFileObj
.FileType
== 'EFI':
3954 self
.__GetOptRomOverrides
(FfsFileObj
)
3956 Obj
.FfsList
.append(FfsFileObj
)
3960 ## __GetCapInFd() method
3962 # Get Cap list contained in FD
3964 # @param self The object pointer
3965 # @param FdName FD name
3966 # @retval CapList List of Capsule in FD
3968 def __GetCapInFd (self
, FdName
):
3971 if FdName
.upper() in self
.Profile
.FdDict
.keys():
3972 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
3973 for elementRegion
in FdObj
.RegionList
:
3974 if elementRegion
.RegionType
== 'CAPSULE':
3975 for elementRegionData
in elementRegion
.RegionDataList
:
3976 if elementRegionData
.endswith(".cap"):
3978 if elementRegionData
!= None and elementRegionData
.upper() not in CapList
:
3979 CapList
.append(elementRegionData
.upper())
3982 ## __GetReferencedFdCapTuple() method
3984 # Get FV and FD list referenced by a capsule image
3986 # @param self The object pointer
3987 # @param CapObj Capsule section to be searched
3988 # @param RefFdList referenced FD by section
3989 # @param RefFvList referenced FV by section
3991 def __GetReferencedFdCapTuple(self
, CapObj
, RefFdList
= [], RefFvList
= []):
3993 for CapsuleDataObj
in CapObj
.CapsuleDataList
:
3994 if hasattr(CapsuleDataObj
, 'FvName') and CapsuleDataObj
.FvName
!= None and CapsuleDataObj
.FvName
.upper() not in RefFvList
:
3995 RefFvList
.append (CapsuleDataObj
.FvName
.upper())
3996 elif hasattr(CapsuleDataObj
, 'FdName') and CapsuleDataObj
.FdName
!= None and CapsuleDataObj
.FdName
.upper() not in RefFdList
:
3997 RefFdList
.append (CapsuleDataObj
.FdName
.upper())
3998 elif CapsuleDataObj
.Ffs
!= None:
3999 if isinstance(CapsuleDataObj
.Ffs
, FfsFileStatement
.FileStatement
):
4000 if CapsuleDataObj
.Ffs
.FvName
!= None and CapsuleDataObj
.Ffs
.FvName
.upper() not in RefFvList
:
4001 RefFvList
.append(CapsuleDataObj
.Ffs
.FvName
.upper())
4002 elif CapsuleDataObj
.Ffs
.FdName
!= None and CapsuleDataObj
.Ffs
.FdName
.upper() not in RefFdList
:
4003 RefFdList
.append(CapsuleDataObj
.Ffs
.FdName
.upper())
4005 self
.__GetReferencedFdFvTupleFromSection
(CapsuleDataObj
.Ffs
, RefFdList
, RefFvList
)
4007 ## __GetFvInFd() method
4009 # Get FV list contained in FD
4011 # @param self The object pointer
4012 # @param FdName FD name
4013 # @retval FvList list of FV in FD
4015 def __GetFvInFd (self
, FdName
):
4018 if FdName
.upper() in self
.Profile
.FdDict
.keys():
4019 FdObj
= self
.Profile
.FdDict
[FdName
.upper()]
4020 for elementRegion
in FdObj
.RegionList
:
4021 if elementRegion
.RegionType
== 'FV':
4022 for elementRegionData
in elementRegion
.RegionDataList
:
4023 if elementRegionData
.endswith(".fv"):
4025 if elementRegionData
!= None and elementRegionData
.upper() not in FvList
:
4026 FvList
.append(elementRegionData
.upper())
4029 ## __GetReferencedFdFvTuple() method
4031 # Get FD and FV list referenced by a FFS file
4033 # @param self The object pointer
4034 # @param FfsFile contains sections to be searched
4035 # @param RefFdList referenced FD by section
4036 # @param RefFvList referenced FV by section
4038 def __GetReferencedFdFvTuple(self
, FvObj
, RefFdList
= [], RefFvList
= []):
4040 for FfsObj
in FvObj
.FfsList
:
4041 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
4042 if FfsObj
.FvName
!= None and FfsObj
.FvName
.upper() not in RefFvList
:
4043 RefFvList
.append(FfsObj
.FvName
.upper())
4044 elif FfsObj
.FdName
!= None and FfsObj
.FdName
.upper() not in RefFdList
:
4045 RefFdList
.append(FfsObj
.FdName
.upper())
4047 self
.__GetReferencedFdFvTupleFromSection
(FfsObj
, RefFdList
, RefFvList
)
4049 ## __GetReferencedFdFvTupleFromSection() method
4051 # Get FD and FV list referenced by a FFS section
4053 # @param self The object pointer
4054 # @param FfsFile contains sections to be searched
4055 # @param FdList referenced FD by section
4056 # @param FvList referenced FV by section
4058 def __GetReferencedFdFvTupleFromSection(self
, FfsFile
, FdList
= [], FvList
= []):
4061 SectionStack
.extend(FfsFile
.SectionList
)
4062 while SectionStack
!= []:
4063 SectionObj
= SectionStack
.pop()
4064 if isinstance(SectionObj
, FvImageSection
.FvImageSection
):
4065 if SectionObj
.FvName
!= None and SectionObj
.FvName
.upper() not in FvList
:
4066 FvList
.append(SectionObj
.FvName
.upper())
4067 if SectionObj
.Fv
!= None and SectionObj
.Fv
.UiFvName
!= None and SectionObj
.Fv
.UiFvName
.upper() not in FvList
:
4068 FvList
.append(SectionObj
.Fv
.UiFvName
.upper())
4069 self
.__GetReferencedFdFvTuple
(SectionObj
.Fv
, FdList
, FvList
)
4071 if isinstance(SectionObj
, CompressSection
.CompressSection
) or isinstance(SectionObj
, GuidSection
.GuidSection
):
4072 SectionStack
.extend(SectionObj
.SectionList
)
4074 ## CycleReferenceCheck() method
4076 # Check whether cycle reference exists in FDF
4078 # @param self The object pointer
4079 # @retval True cycle reference exists
4080 # @retval False Not exists cycle reference
4082 def CycleReferenceCheck(self
):
4084 # Check the cycle between FV and FD image
4086 MaxLength
= len (self
.Profile
.FvDict
)
4087 for FvName
in self
.Profile
.FvDict
.keys():
4088 LogStr
= "\nCycle Reference Checking for FV: %s\n" % FvName
4090 RefFvStack
.append(FvName
)
4094 while RefFvStack
!= [] and Index
< MaxLength
:
4096 FvNameFromStack
= RefFvStack
.pop()
4097 if FvNameFromStack
.upper() in self
.Profile
.FvDict
.keys():
4098 FvObj
= self
.Profile
.FvDict
[FvNameFromStack
.upper()]
4104 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4106 for RefFdName
in RefFdList
:
4107 if RefFdName
in FdAnalyzedList
:
4110 LogStr
+= "FV %s contains FD %s\n" % (FvNameFromStack
, RefFdName
)
4111 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4112 if FvInFdList
!= []:
4113 for FvNameInFd
in FvInFdList
:
4114 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4115 if FvNameInFd
not in RefFvStack
:
4116 RefFvStack
.append(FvNameInFd
)
4118 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4119 EdkLogger
.info(LogStr
)
4121 FdAnalyzedList
.append(RefFdName
)
4123 for RefFvName
in RefFvList
:
4124 LogStr
+= "FV %s contains FV %s\n" % (FvNameFromStack
, RefFvName
)
4125 if RefFvName
not in RefFvStack
:
4126 RefFvStack
.append(RefFvName
)
4128 if FvName
in RefFvStack
or FvNameFromStack
in RefFvStack
:
4129 EdkLogger
.info(LogStr
)
4133 # Check the cycle between Capsule and FD image
4135 MaxLength
= len (self
.Profile
.CapsuleDict
)
4136 for CapName
in self
.Profile
.CapsuleDict
.keys():
4138 # Capsule image to be checked.
4140 LogStr
= "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName
4142 RefCapStack
.append(CapName
)
4147 while RefCapStack
!= [] and Index
< MaxLength
:
4149 CapNameFromStack
= RefCapStack
.pop()
4150 if CapNameFromStack
.upper() in self
.Profile
.CapsuleDict
.keys():
4151 CapObj
= self
.Profile
.CapsuleDict
[CapNameFromStack
.upper()]
4157 self
.__GetReferencedFdCapTuple
(CapObj
, RefFdList
, RefFvList
)
4161 while FvListLength
< len (RefFvList
) or FdListLength
< len (RefFdList
):
4162 for RefFdName
in RefFdList
:
4163 if RefFdName
in FdAnalyzedList
:
4166 LogStr
+= "Capsule %s contains FD %s\n" % (CapNameFromStack
, RefFdName
)
4167 CapInFdList
= self
.__GetCapInFd
(RefFdName
)
4168 if CapInFdList
!= []:
4169 for CapNameInFd
in CapInFdList
:
4170 LogStr
+= "FD %s contains Capsule %s\n" % (RefFdName
,CapNameInFd
)
4171 if CapNameInFd
not in RefCapStack
:
4172 RefCapStack
.append(CapNameInFd
)
4174 if CapName
in RefCapStack
or CapNameFromStack
in RefCapStack
:
4175 EdkLogger
.info(LogStr
)
4178 FvInFdList
= self
.__GetFvInFd
(RefFdName
)
4179 if FvInFdList
!= []:
4180 for FvNameInFd
in FvInFdList
:
4181 LogStr
+= "FD %s contains FV %s\n" % (RefFdName
,FvNameInFd
)
4182 if FvNameInFd
not in RefFvList
:
4183 RefFvList
.append(FvNameInFd
)
4185 FdAnalyzedList
.append(RefFdName
)
4187 # the number of the parsed FV and FD image
4189 FvListLength
= len (RefFvList
)
4190 FdListLength
= len (RefFdList
)
4191 for RefFvName
in RefFvList
:
4192 if RefFvName
in FvAnalyzedList
:
4194 LogStr
+= "Capsule %s contains FV %s\n" % (CapNameFromStack
, RefFvName
)
4195 if RefFvName
.upper() in self
.Profile
.FvDict
.keys():
4196 FvObj
= self
.Profile
.FvDict
[RefFvName
.upper()]
4199 self
.__GetReferencedFdFvTuple
(FvObj
, RefFdList
, RefFvList
)
4200 FvAnalyzedList
.append(RefFvName
)
4204 if __name__
== "__main__":
4207 test_file
= sys
.argv
[1]
4208 except IndexError, v
:
4209 print "Usage: %s filename" % sys
.argv
[0]
4212 parser
= FdfParser(test_file
)
4215 parser
.CycleReferenceCheck()