]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/GenFds/FdfParser.py
Enable EFI_BROWSER_ACTION_CHANGED callback type for browser.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
... / ...
CommitLineData
1## @file\r
2# parse FDF file\r
3#\r
4# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
5#\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18import re\r
19\r
20import Fd\r
21import Region\r
22import Fv\r
23import AprioriSection\r
24import FfsInfStatement\r
25import FfsFileStatement\r
26import VerSection\r
27import UiSection\r
28import FvImageSection\r
29import DataSection\r
30import DepexSection\r
31import CompressSection\r
32import GuidSection\r
33import Capsule\r
34import CapsuleData\r
35import Rule\r
36import RuleComplexFile\r
37import RuleSimpleFile\r
38import EfiSection\r
39import Vtf\r
40import ComponentStatement\r
41import OptionRom\r
42import OptRomInfStatement\r
43import OptRomFileStatement\r
44\r
45from GenFdsGlobalVariable import GenFdsGlobalVariable\r
46from Common.BuildToolError import *\r
47from Common import EdkLogger\r
48from Common.Misc import PathClass\r
49from Common.String import NormPath\r
50import Common.GlobalData as GlobalData\r
51from Common.Expression import *\r
52from Common import GlobalData\r
53from Common.String import ReplaceMacro\r
54\r
55import re\r
56import os\r
57\r
58##define T_CHAR_SPACE ' '\r
59##define T_CHAR_NULL '\0'\r
60##define T_CHAR_CR '\r'\r
61##define T_CHAR_TAB '\t'\r
62##define T_CHAR_LF '\n'\r
63##define T_CHAR_SLASH '/'\r
64##define T_CHAR_BACKSLASH '\\'\r
65##define T_CHAR_DOUBLE_QUOTE '\"'\r
66##define T_CHAR_SINGLE_QUOTE '\''\r
67##define T_CHAR_STAR '*'\r
68##define T_CHAR_HASH '#'\r
69\r
70(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \\r
71T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
72(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
73\r
74SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')\r
75\r
76RegionSizePattern = re.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")\r
77RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")\r
78\r
79IncludeFileList = []\r
80# Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF\r
81InputMacroDict = {}\r
82# All Macro values when parsing file, not replace existing Macro\r
83AllMacroList = []\r
84\r
85def GetRealFileLine (File, Line):\r
86\r
87 InsertedLines = 0\r
88 for Profile in IncludeFileList:\r
89 if Line >= Profile.InsertStartLineNumber and Line < Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
90 return (Profile.FileName, Line - Profile.InsertStartLineNumber + 1)\r
91 if Line >= Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):\r
92 InsertedLines += Profile.InsertAdjust + len(Profile.FileLinesList)\r
93\r
94 return (File, Line - InsertedLines)\r
95\r
96## The exception class that used to report error messages when parsing FDF\r
97#\r
98# Currently the "ToolName" is set to be "FDF Parser".\r
99#\r
100class Warning (Exception):\r
101 ## The constructor\r
102 #\r
103 # @param self The object pointer\r
104 # @param Str The message to record\r
105 # @param File The FDF name\r
106 # @param Line The Line number that error occurs\r
107 #\r
108 def __init__(self, Str, File = None, Line = None):\r
109\r
110 FileLineTuple = GetRealFileLine(File, Line)\r
111 self.FileName = FileLineTuple[0]\r
112 self.LineNumber = FileLineTuple[1]\r
113 self.Message = Str\r
114 self.ToolName = 'FdfParser'\r
115\r
116 def __str__(self):\r
117 return self.Message\r
118\r
119## The MACRO class that used to record macro value data when parsing include file\r
120#\r
121#\r
122class MacroProfile :\r
123 ## The constructor\r
124 #\r
125 # @param self The object pointer\r
126 # @param FileName The file that to be parsed\r
127 #\r
128 def __init__(self, FileName, Line):\r
129 self.FileName = FileName\r
130 self.DefinedAtLine = Line\r
131 self.MacroName = None\r
132 self.MacroValue = None\r
133\r
134## The Include file content class that used to record file data when parsing include file\r
135#\r
136# May raise Exception when opening file.\r
137#\r
138class IncludeFileProfile :\r
139 ## The constructor\r
140 #\r
141 # @param self The object pointer\r
142 # @param FileName The file that to be parsed\r
143 #\r
144 def __init__(self, FileName):\r
145 self.FileName = FileName\r
146 self.FileLinesList = []\r
147 try:\r
148 fsock = open(FileName, "rb", 0)\r
149 try:\r
150 self.FileLinesList = fsock.readlines()\r
151 finally:\r
152 fsock.close()\r
153\r
154 except:\r
155 EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName)\r
156\r
157 self.InsertStartLineNumber = None\r
158 self.InsertAdjust = 0\r
159\r
160## The FDF content class that used to record file data when parsing FDF\r
161#\r
162# May raise Exception when opening file.\r
163#\r
164class FileProfile :\r
165 ## The constructor\r
166 #\r
167 # @param self The object pointer\r
168 # @param FileName The file that to be parsed\r
169 #\r
170 def __init__(self, FileName):\r
171 self.FileLinesList = []\r
172 try:\r
173 fsock = open(FileName, "rb", 0)\r
174 try:\r
175 self.FileLinesList = fsock.readlines()\r
176 finally:\r
177 fsock.close()\r
178\r
179 except:\r
180 EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName)\r
181\r
182\r
183 self.PcdDict = {}\r
184 self.InfList = []\r
185\r
186 self.FdDict = {}\r
187 self.FdNameNotSet = False\r
188 self.FvDict = {}\r
189 self.CapsuleDict = {}\r
190 self.VtfList = []\r
191 self.RuleDict = {}\r
192 self.OptRomDict = {}\r
193\r
194## The syntax parser for FDF\r
195#\r
196# PreprocessFile method should be called prior to ParseFile\r
197# CycleReferenceCheck method can detect cycles in FDF contents\r
198#\r
199# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
200# Get*** procedures mean these procedures will make judgement on current token only.\r
201#\r
202class FdfParser:\r
203 ## The constructor\r
204 #\r
205 # @param self The object pointer\r
206 # @param FileName The file that to be parsed\r
207 #\r
208 def __init__(self, FileName):\r
209 self.Profile = FileProfile(FileName)\r
210 self.FileName = FileName\r
211 self.CurrentLineNumber = 1\r
212 self.CurrentOffsetWithinLine = 0\r
213 self.CurrentFdName = None\r
214 self.CurrentFvName = None\r
215 self.__Token = ""\r
216 self.__SkippedChars = ""\r
217\r
218 self.__WipeOffArea = []\r
219 if GenFdsGlobalVariable.WorkSpaceDir == '':\r
220 GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE")\r
221\r
222 InputMacroDict.update(GlobalData.gPlatformDefines)\r
223 InputMacroDict.update(GlobalData.gGlobalDefines)\r
224 InputMacroDict.update(GlobalData.gCommandLineDefines)\r
225\r
226 ## __IsWhiteSpace() method\r
227 #\r
228 # Whether char at current FileBufferPos is whitespace\r
229 #\r
230 # @param self The object pointer\r
231 # @param Char The char to test\r
232 # @retval True The char is a kind of white space\r
233 # @retval False The char is NOT a kind of white space\r
234 #\r
235 def __IsWhiteSpace(self, Char):\r
236 if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
237 return True\r
238 else:\r
239 return False\r
240\r
241 ## __SkipWhiteSpace() method\r
242 #\r
243 # Skip white spaces from current char, return number of chars skipped\r
244 #\r
245 # @param self The object pointer\r
246 # @retval Count The number of chars skipped\r
247 #\r
248 def __SkipWhiteSpace(self):\r
249 Count = 0\r
250 while not self.__EndOfFile():\r
251 Count += 1\r
252 if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):\r
253 self.__SkippedChars += str(self.__CurrentChar())\r
254 self.__GetOneChar()\r
255\r
256 else:\r
257 Count = Count - 1\r
258 return Count\r
259\r
260 ## __EndOfFile() method\r
261 #\r
262 # Judge current buffer pos is at file end\r
263 #\r
264 # @param self The object pointer\r
265 # @retval True Current File buffer position is at file end\r
266 # @retval False Current File buffer position is NOT at file end\r
267 #\r
268 def __EndOfFile(self):\r
269 NumberOfLines = len(self.Profile.FileLinesList)\r
270 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
271 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
272 return True\r
273 elif self.CurrentLineNumber > NumberOfLines:\r
274 return True\r
275 else:\r
276 return False\r
277\r
278 ## __EndOfLine() method\r
279 #\r
280 # Judge current buffer pos is at line end\r
281 #\r
282 # @param self The object pointer\r
283 # @retval True Current File buffer position is at line end\r
284 # @retval False Current File buffer position is NOT at line end\r
285 #\r
286 def __EndOfLine(self):\r
287 if self.CurrentLineNumber > len(self.Profile.FileLinesList):\r
288 return True\r
289 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
290 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine:\r
291 return True\r
292 else:\r
293 return False\r
294\r
295 ## Rewind() method\r
296 #\r
297 # Reset file data buffer to the initial state\r
298 #\r
299 # @param self The object pointer\r
300 #\r
301 def Rewind(self):\r
302 self.CurrentLineNumber = 1\r
303 self.CurrentOffsetWithinLine = 0\r
304\r
305 ## __UndoOneChar() method\r
306 #\r
307 # Go back one char in the file buffer\r
308 #\r
309 # @param self The object pointer\r
310 # @retval True Successfully go back one char\r
311 # @retval False Not able to go back one char as file beginning reached\r
312 #\r
313 def __UndoOneChar(self):\r
314\r
315 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
316 return False\r
317 elif self.CurrentOffsetWithinLine == 0:\r
318 self.CurrentLineNumber -= 1\r
319 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
320 else:\r
321 self.CurrentOffsetWithinLine -= 1\r
322 return True\r
323\r
324 ## __GetOneChar() method\r
325 #\r
326 # Move forward one char in the file buffer\r
327 #\r
328 # @param self The object pointer\r
329 #\r
330 def __GetOneChar(self):\r
331 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
332 self.CurrentLineNumber += 1\r
333 self.CurrentOffsetWithinLine = 0\r
334 else:\r
335 self.CurrentOffsetWithinLine += 1\r
336\r
337 ## __CurrentChar() method\r
338 #\r
339 # Get the char pointed to by the file buffer pointer\r
340 #\r
341 # @param self The object pointer\r
342 # @retval Char Current char\r
343 #\r
344 def __CurrentChar(self):\r
345 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
346\r
347 ## __NextChar() method\r
348 #\r
349 # Get the one char pass the char pointed to by the file buffer pointer\r
350 #\r
351 # @param self The object pointer\r
352 # @retval Char Next char\r
353 #\r
354 def __NextChar(self):\r
355 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
356 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
357 else:\r
358 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
359\r
360 ## __SetCurrentCharValue() method\r
361 #\r
362 # Modify the value of current char\r
363 #\r
364 # @param self The object pointer\r
365 # @param Value The new value of current char\r
366 #\r
367 def __SetCurrentCharValue(self, Value):\r
368 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
369\r
370 ## __CurrentLine() method\r
371 #\r
372 # Get the list that contains current line contents\r
373 #\r
374 # @param self The object pointer\r
375 # @retval List current line contents\r
376 #\r
377 def __CurrentLine(self):\r
378 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
379\r
380 def __StringToList(self):\r
381 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList]\r
382 self.Profile.FileLinesList[-1].append(' ')\r
383\r
384 def __ReplaceMacros(self, Str, File, Line):\r
385 MacroEnd = 0\r
386 while Str.find('$(', MacroEnd) >= 0:\r
387 MacroStart = Str.find('$(', MacroEnd)\r
388 if Str.find(')', MacroStart) > 0:\r
389 MacroEnd = Str.find(')', MacroStart)\r
390 Name = Str[MacroStart + 2 : MacroEnd]\r
391 Value = None\r
392 if Name in InputMacroDict:\r
393 Value = InputMacroDict[Name]\r
394\r
395 else:\r
396 for Profile in AllMacroList:\r
397 if Profile.FileName == File and Profile.MacroName == Name and Profile.DefinedAtLine <= Line:\r
398 Value = Profile.MacroValue\r
399\r
400 if Value != None:\r
401 Str = Str.replace('$(' + Name + ')', Value)\r
402 MacroEnd = MacroStart + len(Value)\r
403\r
404 else:\r
405 raise Warning("Macro not complete", self.FileName, self.CurrentLineNumber)\r
406 return Str\r
407\r
408 def __ReplaceFragment(self, StartPos, EndPos, Value = ' '):\r
409 if StartPos[0] == EndPos[0]:\r
410 Offset = StartPos[1]\r
411 while Offset <= EndPos[1]:\r
412 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
413 Offset += 1\r
414 return\r
415\r
416 Offset = StartPos[1]\r
417 while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'):\r
418 self.Profile.FileLinesList[StartPos[0]][Offset] = Value\r
419 Offset += 1\r
420\r
421 Line = StartPos[0]\r
422 while Line < EndPos[0]:\r
423 Offset = 0\r
424 while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'):\r
425 self.Profile.FileLinesList[Line][Offset] = Value\r
426 Offset += 1\r
427 Line += 1\r
428\r
429 Offset = 0\r
430 while Offset <= EndPos[1]:\r
431 self.Profile.FileLinesList[EndPos[0]][Offset] = Value\r
432 Offset += 1\r
433\r
434\r
435 def __GetMacroName(self):\r
436 if not self.__GetNextToken():\r
437 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
438 MacroName = self.__Token\r
439 NotFlag = False\r
440 if MacroName.startswith('!'):\r
441 NotFlag = True\r
442 MacroName = MacroName[1:].strip()\r
443 \r
444 if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
445 raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
446 self.FileName, self.CurrentLineNumber)\r
447 MacroName = MacroName[2:-1]\r
448 return MacroName, NotFlag\r
449 \r
450 ## PreprocessFile() method\r
451 #\r
452 # Preprocess file contents, replace comments with spaces.\r
453 # In the end, rewind the file buffer pointer to the beginning\r
454 # BUGBUG: No !include statement processing contained in this procedure\r
455 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
456 #\r
457 # @param self The object pointer\r
458 #\r
459 def PreprocessFile(self):\r
460\r
461 self.Rewind()\r
462 InComment = False\r
463 DoubleSlashComment = False\r
464 HashComment = False\r
465 # HashComment in quoted string " " is ignored.\r
466 InString = False\r
467\r
468 while not self.__EndOfFile():\r
469\r
470 if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment:\r
471 InString = not InString\r
472 # meet new line, then no longer in a comment for // and '#'\r
473 if self.__CurrentChar() == T_CHAR_LF:\r
474 self.CurrentLineNumber += 1\r
475 self.CurrentOffsetWithinLine = 0\r
476 if InComment and DoubleSlashComment:\r
477 InComment = False\r
478 DoubleSlashComment = False\r
479 if InComment and HashComment:\r
480 InComment = False\r
481 HashComment = False\r
482 # check for */ comment end\r
483 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
484 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
485 self.__GetOneChar()\r
486 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
487 self.__GetOneChar()\r
488 InComment = False\r
489 # set comments to spaces\r
490 elif InComment:\r
491 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
492 self.__GetOneChar()\r
493 # check for // comment\r
494 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine():\r
495 InComment = True\r
496 DoubleSlashComment = True\r
497 # check for '#' comment\r
498 elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString:\r
499 InComment = True\r
500 HashComment = True\r
501 # check for /* comment start\r
502 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
503 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
504 self.__GetOneChar()\r
505 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
506 self.__GetOneChar()\r
507 InComment = True\r
508 else:\r
509 self.__GetOneChar()\r
510\r
511 # restore from ListOfList to ListOfString\r
512 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
513 self.Rewind()\r
514\r
515 ## PreprocessIncludeFile() method\r
516 #\r
517 # Preprocess file contents, replace !include statements with file contents.\r
518 # In the end, rewind the file buffer pointer to the beginning\r
519 #\r
520 # @param self The object pointer\r
521 #\r
522 def PreprocessIncludeFile(self):\r
523\r
524 while self.__GetNextToken():\r
525\r
526 if self.__Token == '!include':\r
527 IncludeLine = self.CurrentLineNumber\r
528 IncludeOffset = self.CurrentOffsetWithinLine - len('!include')\r
529 if not self.__GetNextToken():\r
530 raise Warning("expected include file name", self.FileName, self.CurrentLineNumber)\r
531 IncFileName = self.__Token\r
532 __IncludeMacros = {}\r
533 __IncludeMacros['WORKSPACE'] = InputMacroDict['WORKSPACE']\r
534 __IncludeMacros['ECP_SOURCE'] = InputMacroDict['ECP_SOURCE']\r
535 __IncludeMacros['EFI_SOURCE'] = InputMacroDict['EFI_SOURCE']\r
536 __IncludeMacros['EDK_SOURCE'] = InputMacroDict['EDK_SOURCE']\r
537 \r
538 IncludedFile = NormPath(ReplaceMacro(IncFileName, __IncludeMacros, RaiseError=True))\r
539 #\r
540 # First search the include file under the same directory as FDF file\r
541 #\r
542 IncludedFile1 = PathClass(IncludedFile, os.path.dirname(self.FileName))\r
543 ErrorCode = IncludedFile1.Validate()[0]\r
544 if ErrorCode != 0:\r
545 #\r
546 # Then search the include file under the same directory as DSC file\r
547 #\r
548 IncludedFile1 = PathClass(IncludedFile, GenFdsGlobalVariable.ActivePlatform.Dir)\r
549 ErrorCode = IncludedFile1.Validate()[0]\r
550 if ErrorCode != 0:\r
551 #\r
552 # Also search file under the WORKSPACE directory\r
553 #\r
554 IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)\r
555 ErrorCode = IncludedFile1.Validate()[0]\r
556 if ErrorCode != 0:\r
557 raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), GenFdsGlobalVariable.ActivePlatform.Dir, GlobalData.gWorkspace), \r
558 self.FileName, self.CurrentLineNumber)\r
559\r
560 IncFileProfile = IncludeFileProfile(IncludedFile1.Path)\r
561\r
562 CurrentLine = self.CurrentLineNumber\r
563 CurrentOffset = self.CurrentOffsetWithinLine\r
564 # list index of the insertion, note that line number is 'CurrentLine + 1'\r
565 InsertAtLine = CurrentLine\r
566 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
567 # deal with remaining portions after "!include filename", if exists.\r
568 if self.__GetNextToken():\r
569 if self.CurrentLineNumber == CurrentLine:\r
570 RemainingLine = self.__CurrentLine()[CurrentOffset:]\r
571 self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine)\r
572 IncFileProfile.InsertAdjust += 1\r
573 self.CurrentLineNumber += 1\r
574 self.CurrentOffsetWithinLine = 0\r
575\r
576 for Line in IncFileProfile.FileLinesList:\r
577 self.Profile.FileLinesList.insert(InsertAtLine, Line)\r
578 self.CurrentLineNumber += 1\r
579 InsertAtLine += 1\r
580\r
581 IncludeFileList.append(IncFileProfile)\r
582\r
583 # comment out the processed include file statement\r
584 TempList = list(self.Profile.FileLinesList[IncludeLine - 1])\r
585 TempList.insert(IncludeOffset, '#')\r
586 self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)\r
587\r
588 self.Rewind()\r
589 \r
590 def __GetIfListCurrentItemStat(self, IfList):\r
591 if len(IfList) == 0:\r
592 return True\r
593 \r
594 for Item in IfList:\r
595 if Item[1] == False:\r
596 return False\r
597 \r
598 return True\r
599 \r
600 ## PreprocessConditionalStatement() method\r
601 #\r
602 # Preprocess conditional statement.\r
603 # In the end, rewind the file buffer pointer to the beginning\r
604 #\r
605 # @param self The object pointer\r
606 #\r
607 def PreprocessConditionalStatement(self):\r
608 # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]\r
609 IfList = []\r
610 RegionLayoutLine = 0\r
611 while self.__GetNextToken():\r
612 if self.__Token == 'DEFINE':\r
613 if self.__GetIfListCurrentItemStat(IfList): \r
614 DefineLine = self.CurrentLineNumber - 1\r
615 DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')\r
616 if not self.__GetNextToken():\r
617 raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
618 Macro = self.__Token\r
619 if not self.__IsToken( "="):\r
620 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
621 \r
622 if not self.__GetNextToken():\r
623 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
624 \r
625 if self.__GetStringData():\r
626 pass\r
627 Value = self.__Token\r
628 if not Macro in InputMacroDict:\r
629 FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)\r
630 MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
631 MacProfile.MacroName = Macro\r
632 MacProfile.MacroValue = Value\r
633 AllMacroList.append(MacProfile)\r
634 InputMacroDict[MacProfile.MacroName] = MacProfile.MacroValue\r
635 self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
636 elif self.__Token == 'SET':\r
637 PcdPair = self.__GetNextPcdName()\r
638 PcdName = "%s.%s" % (PcdPair[1], PcdPair[0])\r
639 if not self.__IsToken( "="):\r
640 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
641\r
642 if not self.__GetNextToken():\r
643 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
644\r
645 Value = self.__Token\r
646 if Value.startswith("{"):\r
647 # deal with value with {}\r
648 if not self.__SkipToToken( "}"):\r
649 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
650 Value += self.__SkippedChars\r
651\r
652 InputMacroDict[PcdName] = Value\r
653 elif self.__Token in ('!ifdef', '!ifndef', '!if'):\r
654 IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
655 IfList.append([IfStartPos, None, None])\r
656\r
657 CondLabel = self.__Token\r
658 Expression = self.__GetExpression()\r
659 \r
660 if CondLabel == '!if':\r
661 ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval')\r
662 else:\r
663 ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'in')\r
664 if CondLabel == '!ifndef':\r
665 ConditionSatisfied = not ConditionSatisfied\r
666\r
667 BranchDetermined = ConditionSatisfied\r
668 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
669 if ConditionSatisfied:\r
670 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1))) \r
671 elif self.__Token in ('!elseif', '!else'):\r
672 ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
673 if len(IfList) <= 0:\r
674 raise Warning("Missing !if statement", self.FileName, self.CurrentLineNumber)\r
675\r
676 if IfList[-1][1]:\r
677 IfList[-1] = [ElseStartPos, False, True]\r
678 self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
679 else:\r
680 self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))\r
681 IfList[-1] = [ElseStartPos, True, IfList[-1][2]]\r
682 if self.__Token == '!elseif':\r
683 Expression = self.__GetExpression()\r
684 ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval')\r
685 IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]]\r
686\r
687 if IfList[-1][1]:\r
688 if IfList[-1][2]:\r
689 IfList[-1][1] = False\r
690 else:\r
691 IfList[-1][2] = True\r
692 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
693 elif self.__Token == '!endif':\r
694 if IfList[-1][1]:\r
695 self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
696 else:\r
697 self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
698\r
699 IfList.pop()\r
700 elif not IfList: # Don't use PCDs inside conditional directive\r
701 if self.CurrentLineNumber <= RegionLayoutLine:\r
702 # Don't try the same line twice\r
703 continue\r
704 RegionSize = RegionSizePattern.match(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
705 if not RegionSize:\r
706 RegionLayoutLine = self.CurrentLineNumber\r
707 continue\r
708 RegionSizeGuid = RegionSizeGuidPattern.match(self.Profile.FileLinesList[self.CurrentLineNumber])\r
709 if not RegionSizeGuid:\r
710 RegionLayoutLine = self.CurrentLineNumber + 1\r
711 continue\r
712 InputMacroDict[RegionSizeGuid.group('base')] = RegionSize.group('base')\r
713 InputMacroDict[RegionSizeGuid.group('size')] = RegionSize.group('size')\r
714 RegionLayoutLine = self.CurrentLineNumber + 1\r
715\r
716 if IfList:\r
717 raise Warning("Missing !endif", self.FileName, self.CurrentLineNumber)\r
718 self.Rewind()\r
719\r
720 def __EvaluateConditional(self, Expression, Line, Op = None, Value = None):\r
721 FileLineTuple = GetRealFileLine(self.FileName, Line)\r
722 if Op == 'eval':\r
723 try:\r
724 return ValueExpression(Expression, InputMacroDict)()\r
725 except SymbolNotFound:\r
726 return False\r
727 except WrnExpression, Excpt:\r
728 # \r
729 # Catch expression evaluation warning here. We need to report\r
730 # the precise number of line and return the evaluation result\r
731 #\r
732 EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt),\r
733 File=self.FileName, ExtraData=self.__CurrentLine(), \r
734 Line=Line)\r
735 return Excpt.result\r
736 except Exception, Excpt:\r
737 raise Warning("Invalid expression", *FileLineTuple)\r
738 else:\r
739 if Expression.startswith('$(') and Expression[-1] == ')':\r
740 Expression = Expression[2:-1] \r
741 return Expression in InputMacroDict\r
742\r
743 ## __IsToken() method\r
744 #\r
745 # Check whether input string is found from current char position along\r
746 # If found, the string value is put into self.__Token\r
747 #\r
748 # @param self The object pointer\r
749 # @param String The string to search\r
750 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
751 # @retval True Successfully find string, file buffer pointer moved forward\r
752 # @retval False Not able to find string, file buffer pointer not changed\r
753 #\r
754 def __IsToken(self, String, IgnoreCase = False):\r
755 self.__SkipWhiteSpace()\r
756\r
757 # Only consider the same line, no multi-line token allowed\r
758 StartPos = self.CurrentOffsetWithinLine\r
759 index = -1\r
760 if IgnoreCase:\r
761 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper())\r
762 else:\r
763 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
764 if index == 0:\r
765 self.CurrentOffsetWithinLine += len(String)\r
766 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
767 return True\r
768 return False\r
769\r
770 ## __IsKeyword() method\r
771 #\r
772 # Check whether input keyword is found from current char position along, whole word only!\r
773 # If found, the string value is put into self.__Token\r
774 #\r
775 # @param self The object pointer\r
776 # @param Keyword The string to search\r
777 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
778 # @retval True Successfully find string, file buffer pointer moved forward\r
779 # @retval False Not able to find string, file buffer pointer not changed\r
780 #\r
781 def __IsKeyword(self, KeyWord, IgnoreCase = False):\r
782 self.__SkipWhiteSpace()\r
783\r
784 # Only consider the same line, no multi-line token allowed\r
785 StartPos = self.CurrentOffsetWithinLine\r
786 index = -1\r
787 if IgnoreCase:\r
788 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper())\r
789 else:\r
790 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord)\r
791 if index == 0:\r
792 followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)]\r
793 if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE:\r
794 return False\r
795 self.CurrentOffsetWithinLine += len(KeyWord)\r
796 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
797 return True\r
798 return False\r
799\r
800 def __GetExpression(self):\r
801 Line = self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
802 Index = len(Line) - 1\r
803 while Line[Index] in ['\r', '\n']:\r
804 Index -= 1\r
805 ExpressionString = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:Index+1]\r
806 self.CurrentOffsetWithinLine += len(ExpressionString)\r
807 ExpressionString = ExpressionString.strip()\r
808 return ExpressionString\r
809\r
810 ## __GetNextWord() method\r
811 #\r
812 # Get next C name from file lines\r
813 # If found, the string value is put into self.__Token\r
814 #\r
815 # @param self The object pointer\r
816 # @retval True Successfully find a C name string, file buffer pointer moved forward\r
817 # @retval False Not able to find a C name string, file buffer pointer not changed\r
818 #\r
819 def __GetNextWord(self):\r
820 self.__SkipWhiteSpace()\r
821 if self.__EndOfFile():\r
822 return False\r
823\r
824 TempChar = self.__CurrentChar()\r
825 StartPos = self.CurrentOffsetWithinLine\r
826 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_':\r
827 self.__GetOneChar()\r
828 while not self.__EndOfLine():\r
829 TempChar = self.__CurrentChar()\r
830 if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \\r
831 or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-':\r
832 self.__GetOneChar()\r
833\r
834 else:\r
835 break\r
836\r
837 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
838 return True\r
839\r
840 return False\r
841\r
842 ## __GetNextToken() method\r
843 #\r
844 # Get next token unit before a seperator\r
845 # If found, the string value is put into self.__Token\r
846 #\r
847 # @param self The object pointer\r
848 # @retval True Successfully find a token unit, file buffer pointer moved forward\r
849 # @retval False Not able to find a token unit, file buffer pointer not changed\r
850 #\r
851 def __GetNextToken(self):\r
852 # Skip leading spaces, if exist.\r
853 self.__SkipWhiteSpace()\r
854 if self.__EndOfFile():\r
855 return False\r
856 # Record the token start position, the position of the first non-space char.\r
857 StartPos = self.CurrentOffsetWithinLine\r
858 StartLine = self.CurrentLineNumber\r
859 while not self.__EndOfLine():\r
860 TempChar = self.__CurrentChar()\r
861 # Try to find the end char that is not a space and not in seperator tuple.\r
862 # That is, when we got a space or any char in the tuple, we got the end of token.\r
863 if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE:\r
864 self.__GetOneChar()\r
865 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
866 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
867 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
868 self.__GetOneChar()\r
869 break\r
870 else:\r
871 break\r
872# else:\r
873# return False\r
874\r
875 EndPos = self.CurrentOffsetWithinLine\r
876 if self.CurrentLineNumber != StartLine:\r
877 EndPos = len(self.Profile.FileLinesList[StartLine-1])\r
878 self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos]\r
879 if StartPos != self.CurrentOffsetWithinLine:\r
880 return True\r
881 else:\r
882 return False\r
883\r
884 def __GetNextOp(self):\r
885 # Skip leading spaces, if exist.\r
886 self.__SkipWhiteSpace()\r
887 if self.__EndOfFile():\r
888 return False\r
889 # Record the token start position, the position of the first non-space char.\r
890 StartPos = self.CurrentOffsetWithinLine\r
891 while not self.__EndOfLine():\r
892 TempChar = self.__CurrentChar()\r
893 # Try to find the end char that is not a space\r
894 if not str(TempChar).isspace():\r
895 self.__GetOneChar()\r
896 else:\r
897 break\r
898 else:\r
899 return False\r
900\r
901 if StartPos != self.CurrentOffsetWithinLine:\r
902 self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
903 return True\r
904 else:\r
905 return False\r
906 ## __GetNextGuid() method\r
907 #\r
908 # Get next token unit before a seperator\r
909 # If found, the GUID string is put into self.__Token\r
910 #\r
911 # @param self The object pointer\r
912 # @retval True Successfully find a registry format GUID, file buffer pointer moved forward\r
913 # @retval False Not able to find a registry format GUID, file buffer pointer not changed\r
914 #\r
915 def __GetNextGuid(self):\r
916\r
917 if not self.__GetNextToken():\r
918 return False\r
919 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}')\r
920 if p.match(self.__Token) != None:\r
921 return True\r
922 else:\r
923 self.__UndoToken()\r
924 return False\r
925\r
926 ## __UndoToken() method\r
927 #\r
928 # Go back one token unit in file buffer\r
929 #\r
930 # @param self The object pointer\r
931 #\r
932 def __UndoToken(self):\r
933 self.__UndoOneChar()\r
934 while self.__CurrentChar().isspace():\r
935 if not self.__UndoOneChar():\r
936 self.__GetOneChar()\r
937 return\r
938\r
939\r
940 StartPos = self.CurrentOffsetWithinLine\r
941 CurrentLine = self.CurrentLineNumber\r
942 while CurrentLine == self.CurrentLineNumber:\r
943\r
944 TempChar = self.__CurrentChar()\r
945 # Try to find the end char that is not a space and not in seperator tuple.\r
946 # That is, when we got a space or any char in the tuple, we got the end of token.\r
947 if not str(TempChar).isspace() and not TempChar in SEPERATOR_TUPLE:\r
948 if not self.__UndoOneChar():\r
949 break\r
950 # if we happen to meet a seperator as the first char, we must proceed to get it.\r
951 # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
952 elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:\r
953 return\r
954 else:\r
955 break\r
956\r
957 self.__GetOneChar()\r
958\r
959 ## __HexDigit() method\r
960 #\r
961 # Whether char input is a Hex data bit\r
962 #\r
963 # @param self The object pointer\r
964 # @param TempChar The char to test\r
965 # @retval True The char is a Hex data bit\r
966 # @retval False The char is NOT a Hex data bit\r
967 #\r
968 def __HexDigit(self, TempChar):\r
969 if (TempChar >= 'a' and TempChar <= 'f') or (TempChar >= 'A' and TempChar <= 'F') \\r
970 or (TempChar >= '0' and TempChar <= '9'):\r
971 return True\r
972 else:\r
973 return False\r
974\r
975 def __IsHex(self, HexStr):\r
976 if not HexStr.upper().startswith("0X"):\r
977 return False\r
978 if len(self.__Token) <= 2:\r
979 return False\r
980 charList = [c for c in HexStr[2 : ] if not self.__HexDigit( c)]\r
981 if len(charList) == 0:\r
982 return True\r
983 else:\r
984 return False\r
985 ## __GetNextHexNumber() method\r
986 #\r
987 # Get next HEX data before a seperator\r
988 # If found, the HEX data is put into self.__Token\r
989 #\r
990 # @param self The object pointer\r
991 # @retval True Successfully find a HEX data, file buffer pointer moved forward\r
992 # @retval False Not able to find a HEX data, file buffer pointer not changed\r
993 #\r
994 def __GetNextHexNumber(self):\r
995 if not self.__GetNextToken():\r
996 return False\r
997 if self.__IsHex(self.__Token):\r
998 return True\r
999 else:\r
1000 self.__UndoToken()\r
1001 return False\r
1002\r
1003 ## __GetNextDecimalNumber() method\r
1004 #\r
1005 # Get next decimal data before a seperator\r
1006 # If found, the decimal data is put into self.__Token\r
1007 #\r
1008 # @param self The object pointer\r
1009 # @retval True Successfully find a decimal data, file buffer pointer moved forward\r
1010 # @retval False Not able to find a decimal data, file buffer pointer not changed\r
1011 #\r
1012 def __GetNextDecimalNumber(self):\r
1013 if not self.__GetNextToken():\r
1014 return False\r
1015 if self.__Token.isdigit():\r
1016 return True\r
1017 else:\r
1018 self.__UndoToken()\r
1019 return False\r
1020\r
1021 ## __GetNextPcdName() method\r
1022 #\r
1023 # Get next PCD token space C name and PCD C name pair before a seperator\r
1024 # If found, the decimal data is put into self.__Token\r
1025 #\r
1026 # @param self The object pointer\r
1027 # @retval Tuple PCD C name and PCD token space C name pair\r
1028 #\r
1029 def __GetNextPcdName(self):\r
1030 if not self.__GetNextWord():\r
1031 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1032 pcdTokenSpaceCName = self.__Token\r
1033\r
1034 if not self.__IsToken( "."):\r
1035 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1036\r
1037 if not self.__GetNextWord():\r
1038 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1039 pcdCName = self.__Token\r
1040\r
1041 return (pcdCName, pcdTokenSpaceCName)\r
1042\r
1043 ## __GetStringData() method\r
1044 #\r
1045 # Get string contents quoted in ""\r
1046 # If found, the decimal data is put into self.__Token\r
1047 #\r
1048 # @param self The object pointer\r
1049 # @retval True Successfully find a string data, file buffer pointer moved forward\r
1050 # @retval False Not able to find a string data, file buffer pointer not changed\r
1051 #\r
1052 def __GetStringData(self):\r
1053 if self.__Token.startswith("\"") or self.__Token.startswith("L\""):\r
1054 self.__UndoToken()\r
1055 self.__SkipToToken("\"")\r
1056 currentLineNumber = self.CurrentLineNumber\r
1057\r
1058 if not self.__SkipToToken("\""):\r
1059 raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
1060 if currentLineNumber != self.CurrentLineNumber:\r
1061 raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
1062 self.__Token = self.__SkippedChars.rstrip('\"')\r
1063 return True\r
1064\r
1065 elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"):\r
1066 self.__UndoToken()\r
1067 self.__SkipToToken("\'")\r
1068 currentLineNumber = self.CurrentLineNumber\r
1069\r
1070 if not self.__SkipToToken("\'"):\r
1071 raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
1072 if currentLineNumber != self.CurrentLineNumber:\r
1073 raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
1074 self.__Token = self.__SkippedChars.rstrip('\'')\r
1075 return True\r
1076\r
1077 else:\r
1078 return False\r
1079\r
1080 ## __SkipToToken() method\r
1081 #\r
1082 # Search forward in file buffer for the string\r
1083 # The skipped chars are put into self.__SkippedChars\r
1084 #\r
1085 # @param self The object pointer\r
1086 # @param String The string to search\r
1087 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
1088 # @retval True Successfully find the string, file buffer pointer moved forward\r
1089 # @retval False Not able to find the string, file buffer pointer not changed\r
1090 #\r
1091 def __SkipToToken(self, String, IgnoreCase = False):\r
1092 StartPos = self.GetFileBufferPos()\r
1093\r
1094 self.__SkippedChars = ""\r
1095 while not self.__EndOfFile():\r
1096 index = -1\r
1097 if IgnoreCase:\r
1098 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper())\r
1099 else:\r
1100 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
1101 if index == 0:\r
1102 self.CurrentOffsetWithinLine += len(String)\r
1103 self.__SkippedChars += String\r
1104 return True\r
1105 self.__SkippedChars += str(self.__CurrentChar())\r
1106 self.__GetOneChar()\r
1107\r
1108 self.SetFileBufferPos( StartPos)\r
1109 self.__SkippedChars = ""\r
1110 return False\r
1111\r
1112 ## GetFileBufferPos() method\r
1113 #\r
1114 # Return the tuple of current line and offset within the line\r
1115 #\r
1116 # @param self The object pointer\r
1117 # @retval Tuple Line number and offset pair\r
1118 #\r
1119 def GetFileBufferPos(self):\r
1120 return (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
1121\r
1122 ## SetFileBufferPos() method\r
1123 #\r
1124 # Restore the file buffer position\r
1125 #\r
1126 # @param self The object pointer\r
1127 # @param Pos The new file buffer position\r
1128 #\r
1129 def SetFileBufferPos(self, Pos):\r
1130 (self.CurrentLineNumber, self.CurrentOffsetWithinLine) = Pos\r
1131\r
1132 ## Preprocess() method\r
1133 #\r
1134 # Preprocess comment, conditional directive, include directive, replace macro.\r
1135 # Exception will be raised if syntax error found\r
1136 #\r
1137 # @param self The object pointer\r
1138 #\r
1139 def Preprocess(self):\r
1140 self.__StringToList()\r
1141 self.PreprocessFile()\r
1142 self.PreprocessIncludeFile()\r
1143 self.__StringToList()\r
1144 self.PreprocessFile()\r
1145 self.PreprocessConditionalStatement()\r
1146 self.__StringToList()\r
1147 for Pos in self.__WipeOffArea:\r
1148 self.__ReplaceFragment(Pos[0], Pos[1])\r
1149 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
1150\r
1151 while self.__GetDefines():\r
1152 pass\r
1153 \r
1154 Index = 0\r
1155 while Index < len(self.Profile.FileLinesList):\r
1156 FileLineTuple = GetRealFileLine(self.FileName, Index + 1)\r
1157 self.Profile.FileLinesList[Index] = self.__ReplaceMacros(self.Profile.FileLinesList[Index], FileLineTuple[0], FileLineTuple[1])\r
1158 Index += 1\r
1159\r
1160 ## ParseFile() method\r
1161 #\r
1162 # Parse the file profile buffer to extract fd, fv ... information\r
1163 # Exception will be raised if syntax error found\r
1164 #\r
1165 # @param self The object pointer\r
1166 #\r
1167 def ParseFile(self):\r
1168\r
1169 try:\r
1170 self.Preprocess()\r
1171 while self.__GetFd():\r
1172 pass\r
1173\r
1174 while self.__GetFv():\r
1175 pass\r
1176\r
1177 while self.__GetCapsule():\r
1178 pass\r
1179\r
1180 while self.__GetVtf():\r
1181 pass\r
1182\r
1183 while self.__GetRule():\r
1184 pass\r
1185 \r
1186 while self.__GetOptionRom():\r
1187 pass\r
1188\r
1189 except Warning, X:\r
1190 self.__UndoToken()\r
1191 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1192 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
1193 X.Message += ' near line %d, column %d: %s' \\r
1194 % (FileLineTuple[1], self.CurrentOffsetWithinLine + 1, self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'))\r
1195 raise\r
1196\r
1197 ## __GetDefines() method\r
1198 #\r
1199 # Get Defines section contents and store its data into AllMacrosList\r
1200 #\r
1201 # @param self The object pointer\r
1202 # @retval True Successfully find a Defines\r
1203 # @retval False Not able to find a Defines\r
1204 #\r
1205 def __GetDefines(self):\r
1206\r
1207 if not self.__GetNextToken():\r
1208 return False\r
1209\r
1210 S = self.__Token.upper()\r
1211 if S.startswith("[") and not S.startswith("[DEFINES"):\r
1212 if not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1213 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1214 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)\r
1215 self.__UndoToken()\r
1216 return False\r
1217\r
1218 self.__UndoToken()\r
1219 if not self.__IsToken("[DEFINES", True):\r
1220 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1221 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1222 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1223 raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)\r
1224\r
1225 if not self.__IsToken( "]"):\r
1226 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1227\r
1228 while self.__GetNextWord():\r
1229 # handle the SET statement\r
1230 if self.__Token == 'SET':\r
1231 self.__UndoToken()\r
1232 self.__GetSetStatement(None)\r
1233 continue\r
1234 \r
1235 Macro = self.__Token\r
1236 \r
1237 if not self.__IsToken("="):\r
1238 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1239 if not self.__GetNextToken() or self.__Token.startswith('['):\r
1240 raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)\r
1241 Value = self.__Token\r
1242 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1243 MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
1244 MacProfile.MacroName = Macro\r
1245 MacProfile.MacroValue = Value\r
1246 AllMacroList.append(MacProfile)\r
1247\r
1248 return False\r
1249\r
1250 ## __GetFd() method\r
1251 #\r
1252 # Get FD section contents and store its data into FD dictionary of self.Profile\r
1253 #\r
1254 # @param self The object pointer\r
1255 # @retval True Successfully find a FD\r
1256 # @retval False Not able to find a FD\r
1257 #\r
1258 def __GetFd(self):\r
1259\r
1260 if not self.__GetNextToken():\r
1261 return False\r
1262\r
1263 S = self.__Token.upper()\r
1264 if S.startswith("[") and not S.startswith("[FD."):\r
1265 if not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1266 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1267 raise Warning("Unknown section", self.FileName, self.CurrentLineNumber)\r
1268 self.__UndoToken()\r
1269 return False\r
1270\r
1271 self.__UndoToken()\r
1272 if not self.__IsToken("[FD.", True):\r
1273 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1274 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1275 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1276 raise Warning("expected [FD.]", self.FileName, self.CurrentLineNumber)\r
1277\r
1278 FdName = self.__GetUiName()\r
1279 if FdName == "":\r
1280 if len (self.Profile.FdDict) == 0:\r
1281 FdName = GenFdsGlobalVariable.PlatformName\r
1282 self.Profile.FdNameNotSet = True\r
1283 else:\r
1284 raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
1285 self.CurrentFdName = FdName.upper()\r
1286 \r
1287 if self.CurrentFdName in self.Profile.FdDict:\r
1288 raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
1289\r
1290 if not self.__IsToken( "]"):\r
1291 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1292\r
1293 FdObj = Fd.FD()\r
1294 FdObj.FdUiName = self.CurrentFdName\r
1295 self.Profile.FdDict[self.CurrentFdName] = FdObj\r
1296\r
1297 if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet:\r
1298 raise Warning("expected all FDs have their name", self.FileName, self.CurrentLineNumber)\r
1299\r
1300 Status = self.__GetCreateFile(FdObj)\r
1301 if not Status:\r
1302 raise Warning("FD name error", self.FileName, self.CurrentLineNumber)\r
1303\r
1304 self.__GetTokenStatements(FdObj)\r
1305\r
1306 self.__GetDefineStatements(FdObj)\r
1307\r
1308 self.__GetSetStatements(FdObj)\r
1309\r
1310 if not self.__GetRegionLayout(FdObj):\r
1311 raise Warning("expected region layout", self.FileName, self.CurrentLineNumber)\r
1312\r
1313 while self.__GetRegionLayout(FdObj):\r
1314 pass\r
1315 return True\r
1316\r
1317 ## __GetUiName() method\r
1318 #\r
1319 # Return the UI name of a section\r
1320 #\r
1321 # @param self The object pointer\r
1322 # @retval FdName UI name\r
1323 #\r
1324 def __GetUiName(self):\r
1325 Name = ""\r
1326 if self.__GetNextWord():\r
1327 Name = self.__Token\r
1328\r
1329 return Name\r
1330\r
1331 ## __GetCreateFile() method\r
1332 #\r
1333 # Return the output file name of object\r
1334 #\r
1335 # @param self The object pointer\r
1336 # @param Obj object whose data will be stored in file\r
1337 # @retval FdName UI name\r
1338 #\r
1339 def __GetCreateFile(self, Obj):\r
1340\r
1341 if self.__IsKeyword( "CREATE_FILE"):\r
1342 if not self.__IsToken( "="):\r
1343 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1344\r
1345 if not self.__GetNextToken():\r
1346 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
1347\r
1348 FileName = self.__Token\r
1349 Obj.CreateFileName = FileName\r
1350\r
1351 return True\r
1352\r
1353 ## __GetTokenStatements() method\r
1354 #\r
1355 # Get token statements\r
1356 #\r
1357 # @param self The object pointer\r
1358 # @param Obj for whom token statement is got\r
1359 #\r
1360 def __GetTokenStatements(self, Obj):\r
1361 if not self.__IsKeyword( "BaseAddress"):\r
1362 raise Warning("BaseAddress missing", self.FileName, self.CurrentLineNumber)\r
1363\r
1364 if not self.__IsToken( "="):\r
1365 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1366\r
1367 if not self.__GetNextHexNumber():\r
1368 raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
1369\r
1370 Obj.BaseAddress = self.__Token\r
1371\r
1372 if self.__IsToken( "|"):\r
1373 pcdPair = self.__GetNextPcdName()\r
1374 Obj.BaseAddressPcd = pcdPair\r
1375 self.Profile.PcdDict[pcdPair] = Obj.BaseAddress\r
1376\r
1377 if not self.__IsKeyword( "Size"):\r
1378 raise Warning("Size missing", self.FileName, self.CurrentLineNumber)\r
1379\r
1380 if not self.__IsToken( "="):\r
1381 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1382\r
1383 if not self.__GetNextHexNumber():\r
1384 raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
1385\r
1386\r
1387 Size = self.__Token\r
1388 if self.__IsToken( "|"):\r
1389 pcdPair = self.__GetNextPcdName()\r
1390 Obj.SizePcd = pcdPair\r
1391 self.Profile.PcdDict[pcdPair] = Size\r
1392 Obj.Size = long(Size, 0)\r
1393\r
1394 if not self.__IsKeyword( "ErasePolarity"):\r
1395 raise Warning("ErasePolarity missing", self.FileName, self.CurrentLineNumber)\r
1396\r
1397 if not self.__IsToken( "="):\r
1398 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1399\r
1400 if not self.__GetNextToken():\r
1401 raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\r
1402\r
1403 if self.__Token != "1" and self.__Token != "0":\r
1404 raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
1405\r
1406 Obj.ErasePolarity = self.__Token\r
1407\r
1408 self.__GetBlockStatements(Obj)\r
1409\r
1410 ## __GetAddressStatements() method\r
1411 #\r
1412 # Get address statements\r
1413 #\r
1414 # @param self The object pointer\r
1415 # @param Obj for whom address statement is got\r
1416 # @retval True Successfully find\r
1417 # @retval False Not able to find\r
1418 #\r
1419 def __GetAddressStatements(self, Obj):\r
1420\r
1421 if self.__IsKeyword("BsBaseAddress"):\r
1422 if not self.__IsToken( "="):\r
1423 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1424\r
1425 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1426 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1427\r
1428 BsAddress = long(self.__Token, 0)\r
1429 Obj.BsBaseAddress = BsAddress\r
1430\r
1431 if self.__IsKeyword("RtBaseAddress"):\r
1432 if not self.__IsToken( "="):\r
1433 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1434\r
1435 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1436 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1437\r
1438 RtAddress = long(self.__Token, 0)\r
1439 Obj.RtBaseAddress = RtAddress\r
1440\r
1441 ## __GetBlockStatements() method\r
1442 #\r
1443 # Get block statements\r
1444 #\r
1445 # @param self The object pointer\r
1446 # @param Obj for whom block statement is got\r
1447 #\r
1448 def __GetBlockStatements(self, Obj):\r
1449\r
1450 if not self.__GetBlockStatement(Obj):\r
1451 #set default block size is 1\r
1452 Obj.BlockSizeList.append((1, Obj.Size, None))\r
1453 return\r
1454\r
1455 while self.__GetBlockStatement(Obj):\r
1456 pass\r
1457 \r
1458 for Item in Obj.BlockSizeList:\r
1459 if Item[0] == None or Item[1] == None:\r
1460 raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
1461\r
1462 ## __GetBlockStatement() method\r
1463 #\r
1464 # Get block statement\r
1465 #\r
1466 # @param self The object pointer\r
1467 # @param Obj for whom block statement is got\r
1468 # @retval True Successfully find\r
1469 # @retval False Not able to find\r
1470 #\r
1471 def __GetBlockStatement(self, Obj):\r
1472 if not self.__IsKeyword( "BlockSize"):\r
1473 return False\r
1474\r
1475 if not self.__IsToken( "="):\r
1476 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1477\r
1478 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
1479 raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
1480\r
1481 BlockSize = self.__Token\r
1482 BlockSizePcd = None\r
1483 if self.__IsToken( "|"):\r
1484 PcdPair = self.__GetNextPcdName()\r
1485 BlockSizePcd = PcdPair\r
1486 self.Profile.PcdDict[PcdPair] = BlockSize\r
1487 BlockSize = long(BlockSize, 0)\r
1488\r
1489 BlockNumber = None\r
1490 if self.__IsKeyword( "NumBlocks"):\r
1491 if not self.__IsToken( "="):\r
1492 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1493\r
1494 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1495 raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber)\r
1496\r
1497 BlockNumber = long(self.__Token, 0)\r
1498\r
1499 Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
1500 return True\r
1501\r
1502 ## __GetDefineStatements() method\r
1503 #\r
1504 # Get define statements\r
1505 #\r
1506 # @param self The object pointer\r
1507 # @param Obj for whom define statement is got\r
1508 # @retval True Successfully find\r
1509 # @retval False Not able to find\r
1510 #\r
1511 def __GetDefineStatements(self, Obj):\r
1512 while self.__GetDefineStatement( Obj):\r
1513 pass\r
1514\r
1515 ## __GetDefineStatement() method\r
1516 #\r
1517 # Get define statement\r
1518 #\r
1519 # @param self The object pointer\r
1520 # @param Obj for whom define statement is got\r
1521 # @retval True Successfully find\r
1522 # @retval False Not able to find\r
1523 #\r
1524 def __GetDefineStatement(self, Obj):\r
1525 if self.__IsKeyword("DEFINE"):\r
1526 self.__GetNextToken()\r
1527 Macro = self.__Token\r
1528 if not self.__IsToken( "="):\r
1529 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1530\r
1531 if not self.__GetNextToken():\r
1532 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
1533\r
1534 Value = self.__Token\r
1535 Macro = '$(' + Macro + ')'\r
1536 Obj.DefineVarDict[Macro] = Value\r
1537 return True\r
1538\r
1539 return False\r
1540\r
1541 ## __GetSetStatements() method\r
1542 #\r
1543 # Get set statements\r
1544 #\r
1545 # @param self The object pointer\r
1546 # @param Obj for whom set statement is got\r
1547 # @retval True Successfully find\r
1548 # @retval False Not able to find\r
1549 #\r
1550 def __GetSetStatements(self, Obj):\r
1551 while self.__GetSetStatement(Obj):\r
1552 pass\r
1553\r
1554 ## __GetSetStatement() method\r
1555 #\r
1556 # Get set statement\r
1557 #\r
1558 # @param self The object pointer\r
1559 # @param Obj for whom set statement is got\r
1560 # @retval True Successfully find\r
1561 # @retval False Not able to find\r
1562 #\r
1563 def __GetSetStatement(self, Obj):\r
1564 if self.__IsKeyword("SET"):\r
1565 PcdPair = self.__GetNextPcdName()\r
1566\r
1567 if not self.__IsToken( "="):\r
1568 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1569\r
1570 if not self.__GetNextToken():\r
1571 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
1572\r
1573 Value = self.__Token\r
1574 if Value.startswith("{"):\r
1575 # deal with value with {}\r
1576 if not self.__SkipToToken( "}"):\r
1577 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
1578 Value += self.__SkippedChars\r
1579\r
1580 if Obj:\r
1581 Obj.SetVarDict[PcdPair] = Value\r
1582 self.Profile.PcdDict[PcdPair] = Value\r
1583 return True\r
1584\r
1585 return False\r
1586\r
1587 ## __GetRegionLayout() method\r
1588 #\r
1589 # Get region layout for FD\r
1590 #\r
1591 # @param self The object pointer\r
1592 # @param Fd for whom region is got\r
1593 # @retval True Successfully find\r
1594 # @retval False Not able to find\r
1595 #\r
1596 def __GetRegionLayout(self, Fd):\r
1597 if not self.__GetNextHexNumber():\r
1598 return False\r
1599\r
1600 RegionObj = Region.Region()\r
1601 RegionObj.Offset = long(self.__Token, 0)\r
1602 Fd.RegionList.append(RegionObj)\r
1603\r
1604 if not self.__IsToken( "|"):\r
1605 raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
1606\r
1607 if not self.__GetNextHexNumber():\r
1608 raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
1609 RegionObj.Size = long(self.__Token, 0)\r
1610\r
1611 if not self.__GetNextWord():\r
1612 return True\r
1613\r
1614 if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):\r
1615 self.__UndoToken()\r
1616 RegionObj.PcdOffset = self.__GetNextPcdName()\r
1617 self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0))\r
1618 if self.__IsToken( "|"):\r
1619 RegionObj.PcdSize = self.__GetNextPcdName()\r
1620 self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size\r
1621\r
1622 if not self.__GetNextWord():\r
1623 return True\r
1624\r
1625 if self.__Token == "SET":\r
1626 self.__UndoToken()\r
1627 self.__GetSetStatements( RegionObj)\r
1628 if not self.__GetNextWord():\r
1629 return True\r
1630\r
1631 elif self.__Token == "FV":\r
1632 self.__UndoToken()\r
1633 self.__GetRegionFvType( RegionObj)\r
1634\r
1635 elif self.__Token == "CAPSULE":\r
1636 self.__UndoToken()\r
1637 self.__GetRegionCapType( RegionObj)\r
1638\r
1639 elif self.__Token == "FILE":\r
1640 self.__UndoToken()\r
1641 self.__GetRegionFileType( RegionObj)\r
1642\r
1643 elif self.__Token == "DATA":\r
1644 self.__UndoToken()\r
1645 self.__GetRegionDataType( RegionObj)\r
1646 else:\r
1647 raise Warning("A valid region type was not found. "\r
1648 "Valid types are [SET, FV, CAPSULE, FILE, DATA]. This error occurred",\r
1649 self.FileName, self.CurrentLineNumber)\r
1650\r
1651 return True\r
1652\r
1653 ## __GetRegionFvType() method\r
1654 #\r
1655 # Get region fv data for region\r
1656 #\r
1657 # @param self The object pointer\r
1658 # @param RegionObj for whom region data is got\r
1659 #\r
1660 def __GetRegionFvType(self, RegionObj):\r
1661\r
1662 if not self.__IsKeyword( "FV"):\r
1663 raise Warning("expected Keyword 'FV'", self.FileName, self.CurrentLineNumber)\r
1664\r
1665 if not self.__IsToken( "="):\r
1666 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1667\r
1668 if not self.__GetNextToken():\r
1669 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1670\r
1671 RegionObj.RegionType = "FV"\r
1672 RegionObj.RegionDataList.append(self.__Token)\r
1673\r
1674 while self.__IsKeyword( "FV"):\r
1675\r
1676 if not self.__IsToken( "="):\r
1677 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1678\r
1679 if not self.__GetNextToken():\r
1680 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1681\r
1682 RegionObj.RegionDataList.append(self.__Token)\r
1683\r
1684 ## __GetRegionCapType() method\r
1685 #\r
1686 # Get region capsule data for region\r
1687 #\r
1688 # @param self The object pointer\r
1689 # @param RegionObj for whom region data is got\r
1690 #\r
1691 def __GetRegionCapType(self, RegionObj):\r
1692\r
1693 if not self.__IsKeyword("CAPSULE"):\r
1694 raise Warning("expected Keyword 'CAPSULE'", self.FileName, self.CurrentLineNumber)\r
1695\r
1696 if not self.__IsToken("="):\r
1697 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1698\r
1699 if not self.__GetNextToken():\r
1700 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
1701\r
1702 RegionObj.RegionType = "CAPSULE"\r
1703 RegionObj.RegionDataList.append(self.__Token)\r
1704\r
1705 while self.__IsKeyword("CAPSULE"):\r
1706\r
1707 if not self.__IsToken("="):\r
1708 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1709\r
1710 if not self.__GetNextToken():\r
1711 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
1712\r
1713 RegionObj.RegionDataList.append(self.__Token)\r
1714\r
1715 ## __GetRegionFileType() method\r
1716 #\r
1717 # Get region file data for region\r
1718 #\r
1719 # @param self The object pointer\r
1720 # @param RegionObj for whom region data is got\r
1721 #\r
1722 def __GetRegionFileType(self, RegionObj):\r
1723\r
1724 if not self.__IsKeyword( "FILE"):\r
1725 raise Warning("expected Keyword 'FILE'", self.FileName, self.CurrentLineNumber)\r
1726\r
1727 if not self.__IsToken( "="):\r
1728 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1729\r
1730 if not self.__GetNextToken():\r
1731 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
1732\r
1733 RegionObj.RegionType = "FILE"\r
1734 RegionObj.RegionDataList.append( self.__Token)\r
1735\r
1736 while self.__IsKeyword( "FILE"):\r
1737\r
1738 if not self.__IsToken( "="):\r
1739 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1740\r
1741 if not self.__GetNextToken():\r
1742 raise Warning("expected FILE name", self.FileName, self.CurrentLineNumber)\r
1743\r
1744 RegionObj.RegionDataList.append(self.__Token)\r
1745\r
1746 ## __GetRegionDataType() method\r
1747 #\r
1748 # Get region array data for region\r
1749 #\r
1750 # @param self The object pointer\r
1751 # @param RegionObj for whom region data is got\r
1752 #\r
1753 def __GetRegionDataType(self, RegionObj):\r
1754\r
1755 if not self.__IsKeyword( "DATA"):\r
1756 raise Warning("expected Region Data type", self.FileName, self.CurrentLineNumber)\r
1757\r
1758 if not self.__IsToken( "="):\r
1759 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1760\r
1761 if not self.__IsToken( "{"):\r
1762 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
1763\r
1764 if not self.__GetNextHexNumber():\r
1765 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
1766\r
1767 if len(self.__Token) > 18:\r
1768 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
1769\r
1770 # convert hex string value to byte hex string array\r
1771 AllString = self.__Token\r
1772 AllStrLen = len (AllString)\r
1773 DataString = ""\r
1774 while AllStrLen > 4:\r
1775 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
1776 AllStrLen = AllStrLen - 2\r
1777 DataString = DataString + AllString[:AllStrLen] + ","\r
1778\r
1779 # byte value array\r
1780 if len (self.__Token) <= 4:\r
1781 while self.__IsToken(","):\r
1782 if not self.__GetNextHexNumber():\r
1783 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
1784 if len(self.__Token) > 4:\r
1785 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
1786 DataString += self.__Token\r
1787 DataString += ","\r
1788\r
1789 if not self.__IsToken( "}"):\r
1790 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
1791\r
1792 DataString = DataString.rstrip(",")\r
1793 RegionObj.RegionType = "DATA"\r
1794 RegionObj.RegionDataList.append( DataString)\r
1795\r
1796 while self.__IsKeyword( "DATA"):\r
1797\r
1798 if not self.__IsToken( "="):\r
1799 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1800\r
1801 if not self.__IsToken( "{"):\r
1802 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
1803\r
1804 if not self.__GetNextHexNumber():\r
1805 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
1806\r
1807 if len(self.__Token) > 18:\r
1808 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
1809\r
1810 # convert hex string value to byte hex string array\r
1811 AllString = self.__Token\r
1812 AllStrLen = len (AllString)\r
1813 DataString = ""\r
1814 while AllStrLen > 4:\r
1815 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
1816 AllStrLen = AllStrLen - 2\r
1817 DataString = DataString + AllString[:AllStrLen] + ","\r
1818\r
1819 # byte value array\r
1820 if len (self.__Token) <= 4:\r
1821 while self.__IsToken(","):\r
1822 if not self.__GetNextHexNumber():\r
1823 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
1824 if len(self.__Token) > 4:\r
1825 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
1826 DataString += self.__Token\r
1827 DataString += ","\r
1828\r
1829 if not self.__IsToken( "}"):\r
1830 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
1831\r
1832 DataString = DataString.rstrip(",")\r
1833 RegionObj.RegionDataList.append( DataString)\r
1834\r
1835 ## __GetFv() method\r
1836 #\r
1837 # Get FV section contents and store its data into FV dictionary of self.Profile\r
1838 #\r
1839 # @param self The object pointer\r
1840 # @retval True Successfully find a FV\r
1841 # @retval False Not able to find a FV\r
1842 #\r
1843 def __GetFv(self):\r
1844 if not self.__GetNextToken():\r
1845 return False\r
1846\r
1847 S = self.__Token.upper()\r
1848 if S.startswith("[") and not S.startswith("[FV."):\r
1849 if not S.startswith("[CAPSULE.") \\r
1850 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1851 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
1852 self.__UndoToken()\r
1853 return False\r
1854\r
1855 self.__UndoToken()\r
1856 if not self.__IsToken("[FV.", True):\r
1857 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1858 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1859 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1860 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1861\r
1862 FvName = self.__GetUiName()\r
1863 self.CurrentFvName = FvName.upper()\r
1864\r
1865 if not self.__IsToken( "]"):\r
1866 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1867\r
1868 FvObj = Fv.FV()\r
1869 FvObj.UiFvName = self.CurrentFvName\r
1870 self.Profile.FvDict[self.CurrentFvName] = FvObj\r
1871\r
1872 Status = self.__GetCreateFile(FvObj)\r
1873 if not Status:\r
1874 raise Warning("FV name error", self.FileName, self.CurrentLineNumber)\r
1875\r
1876 self.__GetDefineStatements(FvObj)\r
1877\r
1878 self.__GetAddressStatements(FvObj)\r
1879\r
1880 while self.__GetBlockStatement(FvObj):\r
1881 pass\r
1882\r
1883 self.__GetSetStatements(FvObj)\r
1884 \r
1885 self.__GetFvBaseAddress(FvObj)\r
1886 \r
1887 self.__GetFvForceRebase(FvObj)\r
1888\r
1889 self.__GetFvAlignment(FvObj)\r
1890\r
1891 self.__GetFvAttributes(FvObj)\r
1892 \r
1893 self.__GetFvNameGuid(FvObj)\r
1894\r
1895 FvObj.FvExtEntryTypeValue = []\r
1896 FvObj.FvExtEntryType = []\r
1897 FvObj.FvExtEntryData = []\r
1898 while True:\r
1899 isFvExtEntry = self.__GetFvExtEntryStatement(FvObj)\r
1900 if not isFvExtEntry:\r
1901 break\r
1902\r
1903 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1904 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1905\r
1906 while True:\r
1907 isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1908 isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1909 if not isInf and not isFile:\r
1910 break\r
1911\r
1912 return True\r
1913\r
1914 ## __GetFvAlignment() method\r
1915 #\r
1916 # Get alignment for FV\r
1917 #\r
1918 # @param self The object pointer\r
1919 # @param Obj for whom alignment is got\r
1920 # @retval True Successfully find a alignment statement\r
1921 # @retval False Not able to find a alignment statement\r
1922 #\r
1923 def __GetFvAlignment(self, Obj):\r
1924\r
1925 if not self.__IsKeyword( "FvAlignment"):\r
1926 return False\r
1927\r
1928 if not self.__IsToken( "="):\r
1929 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1930\r
1931 if not self.__GetNextToken():\r
1932 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
1933\r
1934 if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
1935 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
1936 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \\r
1937 "1G", "2G"):\r
1938 raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1939 Obj.FvAlignment = self.__Token\r
1940 return True\r
1941 \r
1942 ## __GetFvBaseAddress() method\r
1943 #\r
1944 # Get BaseAddress for FV\r
1945 #\r
1946 # @param self The object pointer\r
1947 # @param Obj for whom FvBaseAddress is got\r
1948 # @retval True Successfully find a FvBaseAddress statement\r
1949 # @retval False Not able to find a FvBaseAddress statement\r
1950 #\r
1951 def __GetFvBaseAddress(self, Obj):\r
1952\r
1953 if not self.__IsKeyword("FvBaseAddress"):\r
1954 return False\r
1955\r
1956 if not self.__IsToken( "="):\r
1957 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1958\r
1959 if not self.__GetNextToken():\r
1960 raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
1961\r
1962 IsValidBaseAddrValue = re.compile('^0[x|X][0-9a-fA-F]+')\r
1963\r
1964 if not IsValidBaseAddrValue.match(self.__Token.upper()):\r
1965 raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1966 Obj.FvBaseAddress = self.__Token\r
1967 return True \r
1968 \r
1969 ## __GetFvForceRebase() method\r
1970 #\r
1971 # Get FvForceRebase for FV\r
1972 #\r
1973 # @param self The object pointer\r
1974 # @param Obj for whom FvForceRebase is got\r
1975 # @retval True Successfully find a FvForceRebase statement\r
1976 # @retval False Not able to find a FvForceRebase statement\r
1977 #\r
1978 def __GetFvForceRebase(self, Obj):\r
1979\r
1980 if not self.__IsKeyword("FvForceRebase"):\r
1981 return False\r
1982\r
1983 if not self.__IsToken( "="):\r
1984 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1985\r
1986 if not self.__GetNextToken():\r
1987 raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber)\r
1988\r
1989 if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:\r
1990 raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1991 \r
1992 if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]:\r
1993 Obj.FvForceRebase = True\r
1994 elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]:\r
1995 Obj.FvForceRebase = False\r
1996 else:\r
1997 Obj.FvForceRebase = None\r
1998 \r
1999 return True\r
2000\r
2001\r
2002 ## __GetFvAttributes() method\r
2003 #\r
2004 # Get attributes for FV\r
2005 #\r
2006 # @param self The object pointer\r
2007 # @param Obj for whom attribute is got\r
2008 # @retval None\r
2009 #\r
2010 def __GetFvAttributes(self, FvObj):\r
2011\r
2012 while self.__GetNextWord():\r
2013 name = self.__Token\r
2014 if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \\r
2015 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \\r
2016 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
2017 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
2018 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
2019 "WRITE_POLICY_RELIABLE"):\r
2020 self.__UndoToken()\r
2021 return\r
2022\r
2023 if not self.__IsToken( "="):\r
2024 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2025\r
2026 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2027 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2028\r
2029 FvObj.FvAttributeDict[name] = self.__Token\r
2030\r
2031 return\r
2032 \r
2033 ## __GetFvNameGuid() method\r
2034 #\r
2035 # Get FV GUID for FV\r
2036 #\r
2037 # @param self The object pointer\r
2038 # @param Obj for whom GUID is got\r
2039 # @retval None\r
2040 #\r
2041 def __GetFvNameGuid(self, FvObj):\r
2042\r
2043 if not self.__IsKeyword( "FvNameGuid"):\r
2044 return\r
2045\r
2046 if not self.__IsToken( "="):\r
2047 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2048\r
2049 if not self.__GetNextGuid():\r
2050 raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
2051\r
2052 FvObj.FvNameGuid = self.__Token\r
2053\r
2054 return\r
2055\r
2056 def __GetFvExtEntryStatement(self, FvObj):\r
2057\r
2058 if not self.__IsKeyword( "FV_EXT_ENTRY"):\r
2059 return False\r
2060\r
2061 if not self.__IsKeyword ("TYPE"):\r
2062 raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
2063 \r
2064 if not self.__IsToken( "="):\r
2065 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2066\r
2067 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
2068 raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
2069\r
2070 FvObj.FvExtEntryTypeValue += [self.__Token]\r
2071\r
2072 if not self.__IsToken( "{"):\r
2073 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2074\r
2075 if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
2076 raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
2077\r
2078 FvObj.FvExtEntryType += [self.__Token]\r
2079\r
2080 if self.__Token == 'DATA':\r
2081\r
2082 if not self.__IsToken( "="):\r
2083 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2084 \r
2085 if not self.__IsToken( "{"):\r
2086 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2087\r
2088 if not self.__GetNextHexNumber():\r
2089 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2090\r
2091 if len(self.__Token) > 4:\r
2092 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2093\r
2094 DataString = self.__Token\r
2095 DataString += ","\r
2096\r
2097 while self.__IsToken(","):\r
2098 if not self.__GetNextHexNumber():\r
2099 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2100 if len(self.__Token) > 4:\r
2101 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2102 DataString += self.__Token\r
2103 DataString += ","\r
2104\r
2105 if not self.__IsToken( "}"):\r
2106 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2107\r
2108 if not self.__IsToken( "}"):\r
2109 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2110\r
2111 DataString = DataString.rstrip(",")\r
2112 FvObj.FvExtEntryData += [DataString]\r
2113\r
2114 if self.__Token == 'FILE':\r
2115 \r
2116 if not self.__IsToken( "="):\r
2117 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2118 \r
2119 if not self.__GetNextToken():\r
2120 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
2121 \r
2122 FvObj.FvExtEntryData += [self.__Token]\r
2123\r
2124 if not self.__IsToken( "}"):\r
2125 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2126\r
2127 return True\r
2128\r
2129 ## __GetAprioriSection() method\r
2130 #\r
2131 # Get token statements\r
2132 #\r
2133 # @param self The object pointer\r
2134 # @param FvObj for whom apriori is got\r
2135 # @param MacroDict dictionary used to replace macro\r
2136 # @retval True Successfully find apriori statement\r
2137 # @retval False Not able to find apriori statement\r
2138 #\r
2139 def __GetAprioriSection(self, FvObj, MacroDict = {}):\r
2140\r
2141 if not self.__IsKeyword( "APRIORI"):\r
2142 return False\r
2143\r
2144 if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):\r
2145 raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber)\r
2146 AprType = self.__Token\r
2147\r
2148 if not self.__IsToken( "{"):\r
2149 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2150\r
2151 AprSectionObj = AprioriSection.AprioriSection()\r
2152 AprSectionObj.AprioriType = AprType\r
2153\r
2154 self.__GetDefineStatements(AprSectionObj)\r
2155 MacroDict.update(AprSectionObj.DefineVarDict)\r
2156\r
2157 while True:\r
2158 IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)\r
2159 IsFile = self.__GetFileStatement( AprSectionObj)\r
2160 if not IsInf and not IsFile:\r
2161 break\r
2162\r
2163 if not self.__IsToken( "}"):\r
2164 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2165\r
2166 FvObj.AprioriSectionList.append(AprSectionObj)\r
2167 return True\r
2168\r
2169 ## __GetInfStatement() method\r
2170 #\r
2171 # Get INF statements\r
2172 #\r
2173 # @param self The object pointer\r
2174 # @param Obj for whom inf statement is got\r
2175 # @param MacroDict dictionary used to replace macro\r
2176 # @retval True Successfully find inf statement\r
2177 # @retval False Not able to find inf statement\r
2178 #\r
2179 def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2180\r
2181 if not self.__IsKeyword( "INF"):\r
2182 return False\r
2183\r
2184 ffsInf = FfsInfStatement.FfsInfStatement()\r
2185 self.__GetInfOptions( ffsInf)\r
2186\r
2187 if not self.__GetNextToken():\r
2188 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
2189 ffsInf.InfFileName = self.__Token\r
2190 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2191 #do case sensitive check for file path\r
2192 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2193 if ErrorCode != 0:\r
2194 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
2195\r
2196 if not ffsInf.InfFileName in self.Profile.InfList:\r
2197 self.Profile.InfList.append(ffsInf.InfFileName)\r
2198\r
2199 if self.__IsToken('|'):\r
2200 if self.__IsKeyword('RELOCS_STRIPPED'):\r
2201 ffsInf.KeepReloc = False\r
2202 elif self.__IsKeyword('RELOCS_RETAINED'):\r
2203 ffsInf.KeepReloc = True\r
2204 else:\r
2205 raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2206 \r
2207 ffsInf.CurrentLineNum = self.CurrentLineNumber\r
2208 ffsInf.CurrentLineContent = self.__CurrentLine()\r
2209 \r
2210 if ForCapsule:\r
2211 capsuleFfs = CapsuleData.CapsuleFfs()\r
2212 capsuleFfs.Ffs = ffsInf\r
2213 Obj.CapsuleDataList.append(capsuleFfs)\r
2214 else:\r
2215 Obj.FfsList.append(ffsInf)\r
2216 return True\r
2217\r
2218 ## __GetInfOptions() method\r
2219 #\r
2220 # Get options for INF\r
2221 #\r
2222 # @param self The object pointer\r
2223 # @param FfsInfObj for whom option is got\r
2224 #\r
2225 def __GetInfOptions(self, FfsInfObj):\r
2226\r
2227 if self.__IsKeyword( "RuleOverride"):\r
2228 if not self.__IsToken( "="):\r
2229 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2230 if not self.__GetNextToken():\r
2231 raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
2232 FfsInfObj.Rule = self.__Token\r
2233\r
2234 if self.__IsKeyword( "VERSION"):\r
2235 if not self.__IsToken( "="):\r
2236 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2237 if not self.__GetNextToken():\r
2238 raise Warning("expected Version", self.FileName, self.CurrentLineNumber)\r
2239\r
2240 if self.__GetStringData():\r
2241 FfsInfObj.Version = self.__Token\r
2242\r
2243 if self.__IsKeyword( "UI"):\r
2244 if not self.__IsToken( "="):\r
2245 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2246 if not self.__GetNextToken():\r
2247 raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
2248\r
2249 if self.__GetStringData():\r
2250 FfsInfObj.Ui = self.__Token\r
2251\r
2252 if self.__IsKeyword( "USE"):\r
2253 if not self.__IsToken( "="):\r
2254 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2255 if not self.__GetNextToken():\r
2256 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2257 FfsInfObj.UseArch = self.__Token\r
2258\r
2259 \r
2260 if self.__GetNextToken():\r
2261 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2262 if p.match(self.__Token):\r
2263 FfsInfObj.KeyStringList.append(self.__Token)\r
2264 if not self.__IsToken(","):\r
2265 return\r
2266 else:\r
2267 self.__UndoToken()\r
2268 return\r
2269\r
2270 while self.__GetNextToken():\r
2271 if not p.match(self.__Token):\r
2272 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2273 FfsInfObj.KeyStringList.append(self.__Token)\r
2274\r
2275 if not self.__IsToken(","):\r
2276 break\r
2277\r
2278 ## __GetFileStatement() method\r
2279 #\r
2280 # Get FILE statements\r
2281 #\r
2282 # @param self The object pointer\r
2283 # @param Obj for whom FILE statement is got\r
2284 # @param MacroDict dictionary used to replace macro\r
2285 # @retval True Successfully find FILE statement\r
2286 # @retval False Not able to find FILE statement\r
2287 #\r
2288 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2289\r
2290 if not self.__IsKeyword( "FILE"):\r
2291 return False\r
2292\r
2293 if not self.__GetNextWord():\r
2294 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
2295\r
2296 if ForCapsule and self.__Token == 'DATA':\r
2297 self.__UndoToken()\r
2298 self.__UndoToken()\r
2299 return False\r
2300 \r
2301 FfsFileObj = FfsFileStatement.FileStatement()\r
2302 FfsFileObj.FvFileType = self.__Token\r
2303\r
2304 if not self.__IsToken( "="):\r
2305 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2306\r
2307 if not self.__GetNextGuid():\r
2308 if not self.__GetNextWord():\r
2309 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2310 if self.__Token == 'PCD':\r
2311 if not self.__IsToken( "("):\r
2312 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2313 PcdPair = self.__GetNextPcdName()\r
2314 if not self.__IsToken( ")"):\r
2315 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2316 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2317 \r
2318 FfsFileObj.NameGuid = self.__Token\r
2319 \r
2320 FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
2321 FfsFileObj.CurrentLineContent = self.__CurrentLine()\r
2322 \r
2323 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2324\r
2325 if ForCapsule:\r
2326 capsuleFfs = CapsuleData.CapsuleFfs()\r
2327 capsuleFfs.Ffs = FfsFileObj\r
2328 Obj.CapsuleDataList.append(capsuleFfs)\r
2329 else:\r
2330 Obj.FfsList.append(FfsFileObj)\r
2331\r
2332 return True\r
2333\r
2334 ## __FileCouldHaveRelocFlag() method\r
2335 #\r
2336 # Check whether reloc strip flag can be set for a file type.\r
2337 #\r
2338 # @param self The object pointer\r
2339 # @param FileType The file type to check with\r
2340 # @retval True This type could have relocation strip flag\r
2341 # @retval False No way to have it\r
2342 #\r
2343\r
2344 def __FileCouldHaveRelocFlag (self, FileType):\r
2345 if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
2346 return True\r
2347 else:\r
2348 return False\r
2349\r
2350 ## __SectionCouldHaveRelocFlag() method\r
2351 #\r
2352 # Check whether reloc strip flag can be set for a section type.\r
2353 #\r
2354 # @param self The object pointer\r
2355 # @param SectionType The section type to check with\r
2356 # @retval True This type could have relocation strip flag\r
2357 # @retval False No way to have it\r
2358 #\r
2359\r
2360 def __SectionCouldHaveRelocFlag (self, SectionType):\r
2361 if SectionType in ('TE', 'PE32'):\r
2362 return True\r
2363 else:\r
2364 return False\r
2365\r
2366 ## __GetFilePart() method\r
2367 #\r
2368 # Get components for FILE statement\r
2369 #\r
2370 # @param self The object pointer\r
2371 # @param FfsFileObj for whom component is got\r
2372 # @param MacroDict dictionary used to replace macro\r
2373 #\r
2374 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2375\r
2376 self.__GetFileOpts( FfsFileObj)\r
2377\r
2378 if not self.__IsToken("{"):\r
2379# if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2380# if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2381# if self.__Token == 'RELOCS_STRIPPED':\r
2382# FfsFileObj.KeepReloc = False\r
2383# else:\r
2384# FfsFileObj.KeepReloc = True\r
2385# else:\r
2386# raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2387#\r
2388# if not self.__IsToken("{"):\r
2389 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2390\r
2391 if not self.__GetNextToken():\r
2392 raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
2393\r
2394 if self.__Token == "FV":\r
2395 if not self.__IsToken( "="):\r
2396 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2397 if not self.__GetNextToken():\r
2398 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2399 FfsFileObj.FvName = self.__Token\r
2400\r
2401 elif self.__Token == "FD":\r
2402 if not self.__IsToken( "="):\r
2403 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2404 if not self.__GetNextToken():\r
2405 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
2406 FfsFileObj.FdName = self.__Token\r
2407\r
2408 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2409 self.__UndoToken()\r
2410 self.__GetSectionData( FfsFileObj, MacroDict)\r
2411 else:\r
2412 FfsFileObj.FileName = self.__Token\r
2413 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2414 #\r
2415 # For file in OUTPUT_DIRECTORY will not check whether it exist or not at AutoGen phase.\r
2416 #\r
2417 if not GlobalData.gAutoGenPhase:\r
2418 #do case sensitive check for file path\r
2419 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2420 if ErrorCode != 0:\r
2421 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
2422 else:\r
2423 if not InputMacroDict["OUTPUT_DIRECTORY"] in FfsFileObj.FileName:\r
2424 #do case sensitive check for file path\r
2425 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2426 if ErrorCode != 0:\r
2427 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo) \r
2428\r
2429\r
2430 if not self.__IsToken( "}"):\r
2431 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2432\r
2433 ## __GetFileOpts() method\r
2434 #\r
2435 # Get options for FILE statement\r
2436 #\r
2437 # @param self The object pointer\r
2438 # @param FfsFileObj for whom options is got\r
2439 #\r
2440 def __GetFileOpts(self, FfsFileObj):\r
2441\r
2442 if self.__GetNextToken():\r
2443 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2444 if Pattern.match(self.__Token):\r
2445 FfsFileObj.KeyStringList.append(self.__Token)\r
2446 if self.__IsToken(","):\r
2447 while self.__GetNextToken():\r
2448 if not Pattern.match(self.__Token):\r
2449 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2450 FfsFileObj.KeyStringList.append(self.__Token)\r
2451\r
2452 if not self.__IsToken(","):\r
2453 break\r
2454\r
2455 else:\r
2456 self.__UndoToken()\r
2457\r
2458 if self.__IsKeyword( "FIXED", True):\r
2459 FfsFileObj.Fixed = True\r
2460\r
2461 if self.__IsKeyword( "CHECKSUM", True):\r
2462 FfsFileObj.CheckSum = True\r
2463\r
2464 if self.__GetAlignment():\r
2465 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2466 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2467 #For FFS, Auto is default option same to ""\r
2468 if not self.__Token == "Auto":\r
2469 FfsFileObj.Alignment = self.__Token\r
2470\r
2471 ## __GetAlignment() method\r
2472 #\r
2473 # Return the alignment value\r
2474 #\r
2475 # @param self The object pointer\r
2476 # @retval True Successfully find alignment\r
2477 # @retval False Not able to find alignment\r
2478 #\r
2479 def __GetAlignment(self):\r
2480 if self.__IsKeyword( "Align", True):\r
2481 if not self.__IsToken( "="):\r
2482 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2483\r
2484 if not self.__GetNextToken():\r
2485 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2486 return True\r
2487\r
2488 return False\r
2489\r
2490 ## __GetFilePart() method\r
2491 #\r
2492 # Get section data for FILE statement\r
2493 #\r
2494 # @param self The object pointer\r
2495 # @param FfsFileObj for whom section is got\r
2496 # @param MacroDict dictionary used to replace macro\r
2497 #\r
2498 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2499 Dict = {}\r
2500 Dict.update(MacroDict)\r
2501\r
2502 self.__GetDefineStatements(FfsFileObj)\r
2503\r
2504 Dict.update(FfsFileObj.DefineVarDict)\r
2505 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2506 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2507\r
2508 while True:\r
2509 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2510 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2511 if not IsLeafSection and not IsEncapSection:\r
2512 break\r
2513\r
2514 ## __GetLeafSection() method\r
2515 #\r
2516 # Get leaf section for Obj\r
2517 #\r
2518 # @param self The object pointer\r
2519 # @param Obj for whom leaf section is got\r
2520 # @param MacroDict dictionary used to replace macro\r
2521 # @retval True Successfully find section statement\r
2522 # @retval False Not able to find section statement\r
2523 #\r
2524 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2525\r
2526 OldPos = self.GetFileBufferPos()\r
2527\r
2528 if not self.__IsKeyword( "SECTION"):\r
2529 if len(Obj.SectionList) == 0:\r
2530 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2531 else:\r
2532 return False\r
2533\r
2534 AlignValue = None\r
2535 if self.__GetAlignment():\r
2536 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2537 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2538 AlignValue = self.__Token\r
2539\r
2540 BuildNum = None\r
2541 if self.__IsKeyword( "BUILD_NUM"):\r
2542 if not self.__IsToken( "="):\r
2543 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2544\r
2545 if not self.__GetNextToken():\r
2546 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2547\r
2548 BuildNum = self.__Token\r
2549\r
2550 if self.__IsKeyword( "VERSION"):\r
2551 if AlignValue == 'Auto':\r
2552 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2553 if not self.__IsToken( "="):\r
2554 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2555 if not self.__GetNextToken():\r
2556 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2557 VerSectionObj = VerSection.VerSection()\r
2558 VerSectionObj.Alignment = AlignValue\r
2559 VerSectionObj.BuildNum = BuildNum\r
2560 if self.__GetStringData():\r
2561 VerSectionObj.StringData = self.__Token\r
2562 else:\r
2563 VerSectionObj.FileName = self.__Token\r
2564 Obj.SectionList.append(VerSectionObj)\r
2565 \r
2566 elif self.__IsKeyword( "UI"):\r
2567 if AlignValue == 'Auto':\r
2568 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2569 if not self.__IsToken( "="):\r
2570 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2571 if not self.__GetNextToken():\r
2572 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2573 UiSectionObj = UiSection.UiSection()\r
2574 UiSectionObj.Alignment = AlignValue\r
2575 if self.__GetStringData():\r
2576 UiSectionObj.StringData = self.__Token\r
2577 else:\r
2578 UiSectionObj.FileName = self.__Token\r
2579 Obj.SectionList.append(UiSectionObj)\r
2580\r
2581 elif self.__IsKeyword( "FV_IMAGE"):\r
2582 if AlignValue == 'Auto':\r
2583 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2584 if not self.__IsToken( "="):\r
2585 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2586 if not self.__GetNextToken():\r
2587 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2588\r
2589 FvName = self.__Token\r
2590 FvObj = None\r
2591\r
2592 if self.__IsToken( "{"):\r
2593 FvObj = Fv.FV()\r
2594 FvObj.UiFvName = FvName.upper()\r
2595 self.__GetDefineStatements(FvObj)\r
2596 MacroDict.update(FvObj.DefineVarDict)\r
2597 self.__GetBlockStatement(FvObj)\r
2598 self.__GetSetStatements(FvObj)\r
2599 self.__GetFvAlignment(FvObj)\r
2600 self.__GetFvAttributes(FvObj)\r
2601 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2602 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2603\r
2604 while True:\r
2605 IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
2606 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2607 if not IsInf and not IsFile:\r
2608 break\r
2609\r
2610 if not self.__IsToken( "}"):\r
2611 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2612\r
2613 FvImageSectionObj = FvImageSection.FvImageSection()\r
2614 FvImageSectionObj.Alignment = AlignValue\r
2615 if FvObj != None:\r
2616 FvImageSectionObj.Fv = FvObj\r
2617 FvImageSectionObj.FvName = None\r
2618 else:\r
2619 FvImageSectionObj.FvName = FvName.upper()\r
2620 FvImageSectionObj.FvFileName = FvName\r
2621\r
2622 Obj.SectionList.append(FvImageSectionObj)\r
2623\r
2624 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
2625 if AlignValue == 'Auto':\r
2626 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2627 DepexSectionObj = DepexSection.DepexSection()\r
2628 DepexSectionObj.Alignment = AlignValue\r
2629 DepexSectionObj.DepexType = self.__Token\r
2630\r
2631 if not self.__IsToken( "="):\r
2632 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2633 if not self.__IsToken( "{"):\r
2634 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2635 if not self.__SkipToToken( "}"):\r
2636 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
2637\r
2638 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2639 Obj.SectionList.append(DepexSectionObj)\r
2640\r
2641 else:\r
2642 if not self.__GetNextWord():\r
2643 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
2644\r
2645 # Encapsulation section appear, UndoToken and return\r
2646 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2647 self.SetFileBufferPos(OldPos)\r
2648 return False\r
2649\r
2650 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2651 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2652 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2653 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2654 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2655\r
2656 # DataSection\r
2657 DataSectionObj = DataSection.DataSection()\r
2658 DataSectionObj.Alignment = AlignValue\r
2659 DataSectionObj.SecType = self.__Token\r
2660\r
2661 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2662 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2663 if self.__Token == 'RELOCS_STRIPPED':\r
2664 DataSectionObj.KeepReloc = False\r
2665 else:\r
2666 DataSectionObj.KeepReloc = True\r
2667 else:\r
2668 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)\r
2669\r
2670 if self.__IsToken("="):\r
2671 if not self.__GetNextToken():\r
2672 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
2673 DataSectionObj.SectFileName = self.__Token\r
2674 if DataSectionObj.SectFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2675 #do case sensitive check for file path\r
2676 ErrorCode, ErrorInfo = PathClass(NormPath(DataSectionObj.SectFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2677 if ErrorCode != 0:\r
2678 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
2679 else:\r
2680 if not self.__GetCglSection(DataSectionObj):\r
2681 return False\r
2682\r
2683 Obj.SectionList.append(DataSectionObj)\r
2684\r
2685 return True\r
2686\r
2687 ## __GetCglSection() method\r
2688 #\r
2689 # Get compressed or GUIDed section for Obj\r
2690 #\r
2691 # @param self The object pointer\r
2692 # @param Obj for whom leaf section is got\r
2693 # @param AlignValue alignment value for complex section\r
2694 # @retval True Successfully find section statement\r
2695 # @retval False Not able to find section statement\r
2696 #\r
2697 def __GetCglSection(self, Obj, AlignValue = None):\r
2698\r
2699 if self.__IsKeyword( "COMPRESS"):\r
2700 type = "PI_STD"\r
2701 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
2702 type = self.__Token\r
2703\r
2704 if not self.__IsToken("{"):\r
2705 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2706\r
2707 CompressSectionObj = CompressSection.CompressSection()\r
2708 CompressSectionObj.Alignment = AlignValue\r
2709 CompressSectionObj.CompType = type\r
2710 # Recursive sections...\r
2711 while True:\r
2712 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
2713 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
2714 if not IsLeafSection and not IsEncapSection:\r
2715 break\r
2716\r
2717\r
2718 if not self.__IsToken( "}"):\r
2719 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2720 Obj.SectionList.append(CompressSectionObj)\r
2721\r
2722# else:\r
2723# raise Warning("Compress type not known")\r
2724\r
2725 return True\r
2726\r
2727 elif self.__IsKeyword( "GUIDED"):\r
2728 GuidValue = None\r
2729 if self.__GetNextGuid():\r
2730 GuidValue = self.__Token\r
2731\r
2732 AttribDict = self.__GetGuidAttrib()\r
2733 if not self.__IsToken("{"):\r
2734 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2735 GuidSectionObj = GuidSection.GuidSection()\r
2736 GuidSectionObj.Alignment = AlignValue\r
2737 GuidSectionObj.NameGuid = GuidValue\r
2738 GuidSectionObj.SectionType = "GUIDED"\r
2739 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
2740 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
2741 # Recursive sections...\r
2742 while True:\r
2743 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
2744 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
2745 if not IsLeafSection and not IsEncapSection:\r
2746 break\r
2747\r
2748 if not self.__IsToken( "}"):\r
2749 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2750 Obj.SectionList.append(GuidSectionObj)\r
2751\r
2752 return True\r
2753\r
2754 return False\r
2755\r
2756 ## __GetGuidAttri() method\r
2757 #\r
2758 # Get attributes for GUID section\r
2759 #\r
2760 # @param self The object pointer\r
2761 # @retval AttribDict Dictionary of key-value pair of section attributes\r
2762 #\r
2763 def __GetGuidAttrib(self):\r
2764\r
2765 AttribDict = {}\r
2766 AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
2767 AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
2768 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2769 AttribKey = self.__Token\r
2770\r
2771 if not self.__IsToken("="):\r
2772 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2773\r
2774 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2775 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2776 AttribDict[AttribKey] = self.__Token\r
2777\r
2778 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2779 AttribKey = self.__Token\r
2780\r
2781 if not self.__IsToken("="):\r
2782 raise Warning("expected '='")\r
2783\r
2784 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2785 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2786 AttribDict[AttribKey] = self.__Token\r
2787\r
2788 return AttribDict\r
2789\r
2790 ## __GetEncapsulationSec() method\r
2791 #\r
2792 # Get encapsulation section for FILE\r
2793 #\r
2794 # @param self The object pointer\r
2795 # @param FfsFile for whom section is got\r
2796 # @retval True Successfully find section statement\r
2797 # @retval False Not able to find section statement\r
2798 #\r
2799 def __GetEncapsulationSec(self, FfsFileObj):\r
2800\r
2801 OldPos = self.GetFileBufferPos()\r
2802 if not self.__IsKeyword( "SECTION"):\r
2803 if len(FfsFileObj.SectionList) == 0:\r
2804 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2805 else:\r
2806 return False\r
2807\r
2808 AlignValue = None\r
2809 if self.__GetAlignment():\r
2810 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2811 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2812 AlignValue = self.__Token\r
2813\r
2814 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
2815 self.SetFileBufferPos(OldPos)\r
2816 return False\r
2817 else:\r
2818 return True\r
2819\r
2820 ## __GetCapsule() method\r
2821 #\r
2822 # Get capsule section contents and store its data into capsule list of self.Profile\r
2823 #\r
2824 # @param self The object pointer\r
2825 # @retval True Successfully find a capsule\r
2826 # @retval False Not able to find a capsule\r
2827 #\r
2828 def __GetCapsule(self):\r
2829\r
2830 if not self.__GetNextToken():\r
2831 return False\r
2832\r
2833 S = self.__Token.upper()\r
2834 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
2835 if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
2836 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
2837 self.__UndoToken()\r
2838 return False\r
2839\r
2840 self.__UndoToken()\r
2841 if not self.__IsToken("[CAPSULE.", True):\r
2842 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2843 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2844 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2845 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
2846\r
2847 CapsuleObj = Capsule.Capsule()\r
2848\r
2849 CapsuleName = self.__GetUiName()\r
2850 if not CapsuleName:\r
2851 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
2852\r
2853 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
2854\r
2855 if not self.__IsToken( "]"):\r
2856 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2857\r
2858 if self.__IsKeyword("CREATE_FILE"):\r
2859 if not self.__IsToken( "="):\r
2860 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2861\r
2862 if not self.__GetNextToken():\r
2863 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
2864\r
2865 CapsuleObj.CreateFile = self.__Token\r
2866\r
2867 self.__GetCapsuleStatements(CapsuleObj)\r
2868 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
2869 return True\r
2870\r
2871 ## __GetCapsuleStatements() method\r
2872 #\r
2873 # Get statements for capsule\r
2874 #\r
2875 # @param self The object pointer\r
2876 # @param Obj for whom statements are got\r
2877 #\r
2878 def __GetCapsuleStatements(self, Obj):\r
2879 self.__GetCapsuleTokens(Obj)\r
2880 self.__GetDefineStatements(Obj)\r
2881 self.__GetSetStatements(Obj)\r
2882 self.__GetCapsuleData(Obj)\r
2883\r
2884 ## __GetCapsuleTokens() method\r
2885 #\r
2886 # Get token statements for capsule\r
2887 #\r
2888 # @param self The object pointer\r
2889 # @param Obj for whom token statements are got\r
2890 #\r
2891 def __GetCapsuleTokens(self, Obj):\r
2892 if not self.__GetNextToken():\r
2893 return False\r
2894 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):\r
2895 Name = self.__Token.strip()\r
2896 if not self.__IsToken("="):\r
2897 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2898 if not self.__GetNextToken():\r
2899 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2900 if Name == 'CAPSULE_FLAGS':\r
2901 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2902 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2903 Value = self.__Token.strip()\r
2904 while self.__IsToken(","):\r
2905 Value += ','\r
2906 if not self.__GetNextToken():\r
2907 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2908 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2909 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2910 Value += self.__Token.strip()\r
2911 else:\r
2912 Value = self.__Token.strip()\r
2913 Obj.TokensDict[Name] = Value \r
2914 if not self.__GetNextToken():\r
2915 return False\r
2916 self.__UndoToken()\r
2917\r
2918 ## __GetCapsuleData() method\r
2919 #\r
2920 # Get capsule data for capsule\r
2921 #\r
2922 # @param self The object pointer\r
2923 # @param Obj for whom capsule data are got\r
2924 #\r
2925 def __GetCapsuleData(self, Obj):\r
2926\r
2927 while True:\r
2928 IsInf = self.__GetInfStatement(Obj, True)\r
2929 IsFile = self.__GetFileStatement(Obj, True)\r
2930 IsFv = self.__GetFvStatement(Obj)\r
2931 IsFd = self.__GetFdStatement(Obj)\r
2932 IsAnyFile = self.__GetAnyFileStatement(Obj)\r
2933 if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile):\r
2934 break\r
2935\r
2936 ## __GetFvStatement() method\r
2937 #\r
2938 # Get FV for capsule\r
2939 #\r
2940 # @param self The object pointer\r
2941 # @param CapsuleObj for whom FV is got\r
2942 # @retval True Successfully find a FV statement\r
2943 # @retval False Not able to find a FV statement\r
2944 #\r
2945 def __GetFvStatement(self, CapsuleObj):\r
2946\r
2947 if not self.__IsKeyword("FV"):\r
2948 return False\r
2949\r
2950 if not self.__IsToken("="):\r
2951 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2952\r
2953 if not self.__GetNextToken():\r
2954 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2955\r
2956 if self.__Token.upper() not in self.Profile.FvDict.keys():\r
2957 raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
2958\r
2959 CapsuleFv = CapsuleData.CapsuleFv()\r
2960 CapsuleFv.FvName = self.__Token\r
2961 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
2962 return True\r
2963\r
2964 ## __GetFdStatement() method\r
2965 #\r
2966 # Get FD for capsule\r
2967 #\r
2968 # @param self The object pointer\r
2969 # @param CapsuleObj for whom FD is got\r
2970 # @retval True Successfully find a FD statement\r
2971 # @retval False Not able to find a FD statement\r
2972 #\r
2973 def __GetFdStatement(self, CapsuleObj):\r
2974\r
2975 if not self.__IsKeyword("FD"):\r
2976 return False\r
2977\r
2978 if not self.__IsToken("="):\r
2979 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2980\r
2981 if not self.__GetNextToken():\r
2982 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
2983\r
2984 if self.__Token.upper() not in self.Profile.FdDict.keys():\r
2985 raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
2986\r
2987 CapsuleFd = CapsuleData.CapsuleFd()\r
2988 CapsuleFd.FdName = self.__Token\r
2989 CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
2990 return True\r
2991\r
2992 ## __GetAnyFileStatement() method\r
2993 #\r
2994 # Get AnyFile for capsule\r
2995 #\r
2996 # @param self The object pointer\r
2997 # @param CapsuleObj for whom AnyFile is got\r
2998 # @retval True Successfully find a Anyfile statement\r
2999 # @retval False Not able to find a AnyFile statement\r
3000 #\r
3001 def __GetAnyFileStatement(self, CapsuleObj):\r
3002\r
3003 if not self.__IsKeyword("FILE"):\r
3004 return False\r
3005\r
3006 if not self.__IsKeyword("DATA"):\r
3007 self.__UndoToken()\r
3008 return False\r
3009\r
3010 if not self.__IsToken("="):\r
3011 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3012\r
3013 if not self.__GetNextToken():\r
3014 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3015 \r
3016 AnyFileName = self.__Token\r
3017 AnyFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AnyFileName)\r
3018 if not os.path.exists(AnyFileName):\r
3019 raise Warning("File %s not exists"%AnyFileName, self.FileName, self.CurrentLineNumber)\r
3020\r
3021 CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
3022 CapsuleAnyFile.FileName = AnyFileName\r
3023 CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
3024 return True\r
3025\r
3026 ## __GetRule() method\r
3027 #\r
3028 # Get Rule section contents and store its data into rule list of self.Profile\r
3029 #\r
3030 # @param self The object pointer\r
3031 # @retval True Successfully find a Rule\r
3032 # @retval False Not able to find a Rule\r
3033 #\r
3034 def __GetRule(self):\r
3035\r
3036 if not self.__GetNextToken():\r
3037 return False\r
3038\r
3039 S = self.__Token.upper()\r
3040 if S.startswith("[") and not S.startswith("[RULE."):\r
3041 if not S.startswith("[OPTIONROM."):\r
3042 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
3043 self.__UndoToken()\r
3044 return False\r
3045 self.__UndoToken()\r
3046 if not self.__IsToken("[Rule.", True):\r
3047 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3048 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3049 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3050 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
3051\r
3052 if not self.__SkipToToken("."):\r
3053 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3054\r
3055 Arch = self.__SkippedChars.rstrip(".")\r
3056 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):\r
3057 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3058\r
3059 ModuleType = self.__GetModuleType()\r
3060\r
3061 TemplateName = ""\r
3062 if self.__IsToken("."):\r
3063 if not self.__GetNextWord():\r
3064 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
3065 TemplateName = self.__Token\r
3066\r
3067 if not self.__IsToken( "]"):\r
3068 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3069\r
3070 RuleObj = self.__GetRuleFileStatements()\r
3071 RuleObj.Arch = Arch.upper()\r
3072 RuleObj.ModuleType = ModuleType\r
3073 RuleObj.TemplateName = TemplateName\r
3074 if TemplateName == '' :\r
3075 self.Profile.RuleDict['RULE' + \\r
3076 '.' + \\r
3077 Arch.upper() + \\r
3078 '.' + \\r
3079 ModuleType.upper() ] = RuleObj\r
3080 else :\r
3081 self.Profile.RuleDict['RULE' + \\r
3082 '.' + \\r
3083 Arch.upper() + \\r
3084 '.' + \\r
3085 ModuleType.upper() + \\r
3086 '.' + \\r
3087 TemplateName.upper() ] = RuleObj\r
3088# self.Profile.RuleList.append(rule)\r
3089 return True\r
3090\r
3091 ## __GetModuleType() method\r
3092 #\r
3093 # Return the module type\r
3094 #\r
3095 # @param self The object pointer\r
3096 # @retval string module type\r
3097 #\r
3098 def __GetModuleType(self):\r
3099\r
3100 if not self.__GetNextWord():\r
3101 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
3102 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
3103 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
3104 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
3105 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
3106 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
3107 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):\r
3108 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3109 return self.__Token\r
3110\r
3111 ## __GetFileExtension() method\r
3112 #\r
3113 # Return the file extension\r
3114 #\r
3115 # @param self The object pointer\r
3116 # @retval string file name extension\r
3117 #\r
3118 def __GetFileExtension(self):\r
3119 if not self.__IsToken("."):\r
3120 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3121\r
3122 Ext = ""\r
3123 if self.__GetNextToken():\r
3124 Pattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
3125 if Pattern.match(self.__Token):\r
3126 Ext = self.__Token\r
3127 return '.' + Ext\r
3128 else:\r
3129 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3130\r
3131 else:\r
3132 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
3133\r
3134 ## __GetRuleFileStatement() method\r
3135 #\r
3136 # Get rule contents\r
3137 #\r
3138 # @param self The object pointer\r
3139 # @retval Rule Rule object\r
3140 #\r
3141 def __GetRuleFileStatements(self):\r
3142\r
3143 if not self.__IsKeyword("FILE"):\r
3144 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
3145\r
3146 if not self.__GetNextWord():\r
3147 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
3148\r
3149 Type = self.__Token.strip().upper()\r
3150 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
3151 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):\r
3152 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3153\r
3154 if not self.__IsToken("="):\r
3155 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3156\r
3157 if not self.__IsKeyword("$(NAMED_GUID)"):\r
3158 if not self.__GetNextWord():\r
3159 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
3160 if self.__Token == 'PCD':\r
3161 if not self.__IsToken( "("):\r
3162 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3163 PcdPair = self.__GetNextPcdName()\r
3164 if not self.__IsToken( ")"):\r
3165 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3166 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3167 \r
3168 NameGuid = self.__Token\r
3169\r
3170 KeepReloc = None\r
3171 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3172 if self.__FileCouldHaveRelocFlag(Type):\r
3173 if self.__Token == 'RELOCS_STRIPPED':\r
3174 KeepReloc = False\r
3175 else:\r
3176 KeepReloc = True\r
3177 else:\r
3178 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3179\r
3180 KeyStringList = []\r
3181 if self.__GetNextToken():\r
3182 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
3183 if Pattern.match(self.__Token):\r
3184 KeyStringList.append(self.__Token)\r
3185 if self.__IsToken(","):\r
3186 while self.__GetNextToken():\r
3187 if not Pattern.match(self.__Token):\r
3188 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
3189 KeyStringList.append(self.__Token)\r
3190\r
3191 if not self.__IsToken(","):\r
3192 break\r
3193\r
3194 else:\r
3195 self.__UndoToken()\r
3196\r
3197\r
3198 Fixed = False\r
3199 if self.__IsKeyword("Fixed", True):\r
3200 Fixed = True\r
3201\r
3202 CheckSum = False\r
3203 if self.__IsKeyword("CheckSum", True):\r
3204 CheckSum = True\r
3205\r
3206 AlignValue = ""\r
3207 if self.__GetAlignment():\r
3208 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3209 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3210 #For FFS, Auto is default option same to ""\r
3211 if not self.__Token == "Auto":\r
3212 AlignValue = self.__Token\r
3213\r
3214 if self.__IsToken("{"):\r
3215 # Complex file rule expected\r
3216 Rule = RuleComplexFile.RuleComplexFile()\r
3217 Rule.FvFileType = Type\r
3218 Rule.NameGuid = NameGuid\r
3219 Rule.Alignment = AlignValue\r
3220 Rule.CheckSum = CheckSum\r
3221 Rule.Fixed = Fixed\r
3222 Rule.KeyStringList = KeyStringList\r
3223 if KeepReloc != None:\r
3224 Rule.KeepReloc = KeepReloc\r
3225\r
3226 while True:\r
3227 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3228 IsLeaf = self.__GetEfiSection(Rule)\r
3229 if not IsEncapsulate and not IsLeaf:\r
3230 break\r
3231\r
3232 if not self.__IsToken("}"):\r
3233 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3234\r
3235 return Rule\r
3236\r
3237 else:\r
3238 # Simple file rule expected\r
3239 if not self.__GetNextWord():\r
3240 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3241\r
3242 SectionName = self.__Token\r
3243\r
3244 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3245 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
3246 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3247\r
3248\r
3249 if self.__IsKeyword("Fixed", True):\r
3250 Fixed = True\r
3251\r
3252 if self.__IsKeyword("CheckSum", True):\r
3253 CheckSum = True\r
3254\r
3255 SectAlignment = ""\r
3256 if self.__GetAlignment():\r
3257 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3258 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3259 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3260 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3261 SectAlignment = self.__Token\r
3262\r
3263 Ext = None\r
3264 if self.__IsToken('|'):\r
3265 Ext = self.__GetFileExtension()\r
3266 elif not self.__GetNextToken():\r
3267 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3268\r
3269 Rule = RuleSimpleFile.RuleSimpleFile()\r
3270 Rule.SectionType = SectionName\r
3271 Rule.FvFileType = Type\r
3272 Rule.NameGuid = NameGuid\r
3273 Rule.Alignment = AlignValue\r
3274 Rule.SectAlignment = SectAlignment\r
3275 Rule.CheckSum = CheckSum\r
3276 Rule.Fixed = Fixed\r
3277 Rule.KeyStringList = KeyStringList\r
3278 if KeepReloc != None:\r
3279 Rule.KeepReloc = KeepReloc\r
3280 Rule.FileExtension = Ext\r
3281 Rule.FileName = self.__Token\r
3282 return Rule\r
3283\r
3284 ## __GetEfiSection() method\r
3285 #\r
3286 # Get section list for Rule\r
3287 #\r
3288 # @param self The object pointer\r
3289 # @param Obj for whom section is got\r
3290 # @retval True Successfully find section statement\r
3291 # @retval False Not able to find section statement\r
3292 #\r
3293 def __GetEfiSection(self, Obj):\r
3294\r
3295 OldPos = self.GetFileBufferPos()\r
3296 if not self.__GetNextWord():\r
3297 return False\r
3298 SectionName = self.__Token\r
3299\r
3300 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3301 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3302 self.__UndoToken()\r
3303 return False\r
3304\r
3305 if SectionName == "FV_IMAGE":\r
3306 FvImageSectionObj = FvImageSection.FvImageSection()\r
3307 if self.__IsKeyword("FV_IMAGE"):\r
3308 pass\r
3309 if self.__IsToken( "{"):\r
3310 FvObj = Fv.FV()\r
3311 self.__GetDefineStatements(FvObj)\r
3312 self.__GetBlockStatement(FvObj)\r
3313 self.__GetSetStatements(FvObj)\r
3314 self.__GetFvAlignment(FvObj)\r
3315 self.__GetFvAttributes(FvObj)\r
3316 self.__GetAprioriSection(FvObj)\r
3317 self.__GetAprioriSection(FvObj)\r
3318\r
3319 while True:\r
3320 IsInf = self.__GetInfStatement(FvObj)\r
3321 IsFile = self.__GetFileStatement(FvObj)\r
3322 if not IsInf and not IsFile:\r
3323 break\r
3324\r
3325 if not self.__IsToken( "}"):\r
3326 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3327 FvImageSectionObj.Fv = FvObj\r
3328 FvImageSectionObj.FvName = None\r
3329\r
3330 else:\r
3331 if not self.__IsKeyword("FV"):\r
3332 raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
3333 FvImageSectionObj.FvFileType = self.__Token\r
3334\r
3335 if self.__GetAlignment():\r
3336 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3337 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3338 FvImageSectionObj.Alignment = self.__Token\r
3339\r
3340 if self.__IsToken('|'):\r
3341 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3342 elif self.__GetNextToken():\r
3343 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3344 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3345 FvImageSectionObj.FvFileName = self.__Token\r
3346 else:\r
3347 self.__UndoToken()\r
3348 else:\r
3349 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3350\r
3351 Obj.SectionList.append(FvImageSectionObj)\r
3352 return True\r
3353\r
3354 EfiSectionObj = EfiSection.EfiSection()\r
3355 EfiSectionObj.SectionType = SectionName\r
3356\r
3357 if not self.__GetNextToken():\r
3358 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3359\r
3360 if self.__Token == "STRING":\r
3361 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3362 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3363\r
3364 if not self.__IsToken('='):\r
3365 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3366\r
3367 if not self.__GetNextToken():\r
3368 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3369\r
3370 if self.__GetStringData():\r
3371 EfiSectionObj.StringData = self.__Token\r
3372\r
3373 if self.__IsKeyword("BUILD_NUM"):\r
3374 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3375 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3376\r
3377 if not self.__IsToken("="):\r
3378 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3379 if not self.__GetNextToken():\r
3380 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3381 EfiSectionObj.BuildNum = self.__Token\r
3382\r
3383 else:\r
3384 EfiSectionObj.FileType = self.__Token\r
3385 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3386\r
3387 if self.__IsKeyword("Optional"):\r
3388 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3389 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3390 EfiSectionObj.Optional = True\r
3391\r
3392 if self.__IsKeyword("BUILD_NUM"):\r
3393 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3394 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3395\r
3396 if not self.__IsToken("="):\r
3397 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3398 if not self.__GetNextToken():\r
3399 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3400 EfiSectionObj.BuildNum = self.__Token\r
3401\r
3402 if self.__GetAlignment():\r
3403 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3404 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3405 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3406 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3407 EfiSectionObj.Alignment = self.__Token\r
3408\r
3409 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3410 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3411 if self.__Token == 'RELOCS_STRIPPED':\r
3412 EfiSectionObj.KeepReloc = False\r
3413 else:\r
3414 EfiSectionObj.KeepReloc = True\r
3415 if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
3416 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3417 else:\r
3418 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3419\r
3420\r
3421 if self.__IsToken('|'):\r
3422 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3423 elif self.__GetNextToken():\r
3424 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3425 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3426 \r
3427 if self.__Token.startswith('PCD'):\r
3428 self.__UndoToken()\r
3429 self.__GetNextWord()\r
3430 \r
3431 if self.__Token == 'PCD':\r
3432 if not self.__IsToken( "("):\r
3433 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3434 PcdPair = self.__GetNextPcdName()\r
3435 if not self.__IsToken( ")"):\r
3436 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3437 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3438 \r
3439 EfiSectionObj.FileName = self.__Token \r
3440 \r
3441 else:\r
3442 self.__UndoToken()\r
3443 else:\r
3444 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
3445\r
3446 Obj.SectionList.append(EfiSectionObj)\r
3447 return True\r
3448\r
3449 ## __RuleSectionCouldBeOptional() method\r
3450 #\r
3451 # Get whether a section could be optional\r
3452 #\r
3453 # @param self The object pointer\r
3454 # @param SectionType The section type to check\r
3455 # @retval True section could be optional\r
3456 # @retval False section never optional\r
3457 #\r
3458 def __RuleSectionCouldBeOptional(self, SectionType):\r
3459 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3460 return True\r
3461 else:\r
3462 return False\r
3463\r
3464 ## __RuleSectionCouldHaveBuildNum() method\r
3465 #\r
3466 # Get whether a section could have build number information\r
3467 #\r
3468 # @param self The object pointer\r
3469 # @param SectionType The section type to check\r
3470 # @retval True section could have build number information\r
3471 # @retval False section never have build number information\r
3472 #\r
3473 def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
3474 if SectionType in ("VERSION"):\r
3475 return True\r
3476 else:\r
3477 return False\r
3478\r
3479 ## __RuleSectionCouldHaveString() method\r
3480 #\r
3481 # Get whether a section could have string\r
3482 #\r
3483 # @param self The object pointer\r
3484 # @param SectionType The section type to check\r
3485 # @retval True section could have string\r
3486 # @retval False section never have string\r
3487 #\r
3488 def __RuleSectionCouldHaveString(self, SectionType):\r
3489 if SectionType in ("UI", "VERSION"):\r
3490 return True\r
3491 else:\r
3492 return False\r
3493\r
3494 ## __CheckRuleSectionFileType() method\r
3495 #\r
3496 # Get whether a section matches a file type\r
3497 #\r
3498 # @param self The object pointer\r
3499 # @param SectionType The section type to check\r
3500 # @param FileType The file type to check\r
3501 #\r
3502 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
3503 if SectionType == "COMPAT16":\r
3504 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
3505 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3506 elif SectionType == "PE32":\r
3507 if FileType not in ("PE32", "SEC_PE32"):\r
3508 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3509 elif SectionType == "PIC":\r
3510 if FileType not in ("PIC", "PIC"):\r
3511 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3512 elif SectionType == "TE":\r
3513 if FileType not in ("TE", "SEC_TE"):\r
3514 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3515 elif SectionType == "RAW":\r
3516 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
3517 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3518 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
3519 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
3520 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3521 elif SectionType == "UI":\r
3522 if FileType not in ("UI", "SEC_UI"):\r
3523 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3524 elif SectionType == "VERSION":\r
3525 if FileType not in ("VERSION", "SEC_VERSION"):\r
3526 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3527 elif SectionType == "PEI_DEPEX":\r
3528 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
3529 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3530 elif SectionType == "GUID":\r
3531 if FileType not in ("PE32", "SEC_GUID"):\r
3532 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3533\r
3534 ## __GetRuleEncapsulationSection() method\r
3535 #\r
3536 # Get encapsulation section for Rule\r
3537 #\r
3538 # @param self The object pointer\r
3539 # @param Rule for whom section is got\r
3540 # @retval True Successfully find section statement\r
3541 # @retval False Not able to find section statement\r
3542 #\r
3543 def __GetRuleEncapsulationSection(self, Rule):\r
3544\r
3545 if self.__IsKeyword( "COMPRESS"):\r
3546 Type = "PI_STD"\r
3547 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3548 Type = self.__Token\r
3549\r
3550 if not self.__IsToken("{"):\r
3551 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3552\r
3553 CompressSectionObj = CompressSection.CompressSection()\r
3554\r
3555 CompressSectionObj.CompType = Type\r
3556 # Recursive sections...\r
3557 while True:\r
3558 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
3559 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
3560 if not IsEncapsulate and not IsLeaf:\r
3561 break\r
3562\r
3563 if not self.__IsToken( "}"):\r
3564 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3565 Rule.SectionList.append(CompressSectionObj)\r
3566\r
3567 return True\r
3568\r
3569 elif self.__IsKeyword( "GUIDED"):\r
3570 GuidValue = None\r
3571 if self.__GetNextGuid():\r
3572 GuidValue = self.__Token\r
3573\r
3574 if self.__IsKeyword( "$(NAMED_GUID)"):\r
3575 GuidValue = self.__Token\r
3576\r
3577 AttribDict = self.__GetGuidAttrib()\r
3578\r
3579 if not self.__IsToken("{"):\r
3580 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3581 GuidSectionObj = GuidSection.GuidSection()\r
3582 GuidSectionObj.NameGuid = GuidValue\r
3583 GuidSectionObj.SectionType = "GUIDED"\r
3584 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3585 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
3586\r
3587 # Efi sections...\r
3588 while True:\r
3589 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
3590 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
3591 if not IsEncapsulate and not IsLeaf:\r
3592 break\r
3593\r
3594 if not self.__IsToken( "}"):\r
3595 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3596 Rule.SectionList.append(GuidSectionObj)\r
3597\r
3598 return True\r
3599\r
3600 return False\r
3601\r
3602 ## __GetVtf() method\r
3603 #\r
3604 # Get VTF section contents and store its data into VTF list of self.Profile\r
3605 #\r
3606 # @param self The object pointer\r
3607 # @retval True Successfully find a VTF\r
3608 # @retval False Not able to find a VTF\r
3609 #\r
3610 def __GetVtf(self):\r
3611\r
3612 if not self.__GetNextToken():\r
3613 return False\r
3614\r
3615 S = self.__Token.upper()\r
3616 if S.startswith("[") and not S.startswith("[VTF."):\r
3617 if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
3618 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
3619 self.__UndoToken()\r
3620 return False\r
3621\r
3622 self.__UndoToken()\r
3623 if not self.__IsToken("[VTF.", True):\r
3624 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3625 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3626 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3627 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
3628\r
3629 if not self.__SkipToToken("."):\r
3630 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3631\r
3632 Arch = self.__SkippedChars.rstrip(".").upper()\r
3633 if Arch not in ("IA32", "X64", "IPF", "ARM"):\r
3634 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3635\r
3636 if not self.__GetNextWord():\r
3637 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
3638 Name = self.__Token.upper()\r
3639\r
3640 VtfObj = Vtf.Vtf()\r
3641 VtfObj.UiName = Name\r
3642 VtfObj.KeyArch = Arch\r
3643\r
3644 if self.__IsToken(","):\r
3645 if not self.__GetNextWord():\r
3646 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
3647 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM"):\r
3648 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3649 VtfObj.ArchList = self.__Token.upper()\r
3650\r
3651 if not self.__IsToken( "]"):\r
3652 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3653\r
3654 if self.__IsKeyword("IA32_RST_BIN"):\r
3655 if not self.__IsToken("="):\r
3656 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3657\r
3658 if not self.__GetNextToken():\r
3659 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
3660\r
3661 VtfObj.ResetBin = self.__Token\r
3662 if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
3663 #check for file path\r
3664 ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3665 if ErrorCode != 0:\r
3666 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3667\r
3668 while self.__GetComponentStatement(VtfObj):\r
3669 pass\r
3670\r
3671 self.Profile.VtfList.append(VtfObj)\r
3672 return True\r
3673\r
3674 ## __GetComponentStatement() method\r
3675 #\r
3676 # Get components in VTF\r
3677 #\r
3678 # @param self The object pointer\r
3679 # @param VtfObj for whom component is got\r
3680 # @retval True Successfully find a component\r
3681 # @retval False Not able to find a component\r
3682 #\r
3683 def __GetComponentStatement(self, VtfObj):\r
3684\r
3685 if not self.__IsKeyword("COMP_NAME"):\r
3686 return False\r
3687\r
3688 if not self.__IsToken("="):\r
3689 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3690\r
3691 if not self.__GetNextWord():\r
3692 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
3693\r
3694 CompStatementObj = ComponentStatement.ComponentStatement()\r
3695 CompStatementObj.CompName = self.__Token\r
3696\r
3697 if not self.__IsKeyword("COMP_LOC"):\r
3698 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
3699\r
3700 if not self.__IsToken("="):\r
3701 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3702\r
3703 CompStatementObj.CompLoc = ""\r
3704 if self.__GetNextWord():\r
3705 CompStatementObj.CompLoc = self.__Token\r
3706 if self.__IsToken('|'):\r
3707 if not self.__GetNextWord():\r
3708 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
3709\r
3710 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
3711 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3712\r
3713 CompStatementObj.FilePos = self.__Token\r
3714 else:\r
3715 self.CurrentLineNumber += 1\r
3716 self.CurrentOffsetWithinLine = 0\r
3717\r
3718 if not self.__IsKeyword("COMP_TYPE"):\r
3719 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
3720\r
3721 if not self.__IsToken("="):\r
3722 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3723\r
3724 if not self.__GetNextToken():\r
3725 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
3726 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
3727 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
3728 not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
3729 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3730 CompStatementObj.CompType = self.__Token\r
3731\r
3732 if not self.__IsKeyword("COMP_VER"):\r
3733 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
3734\r
3735 if not self.__IsToken("="):\r
3736 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3737\r
3738 if not self.__GetNextToken():\r
3739 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
3740\r
3741 Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
3742 if Pattern.match(self.__Token) == None:\r
3743 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3744 CompStatementObj.CompVer = self.__Token\r
3745\r
3746 if not self.__IsKeyword("COMP_CS"):\r
3747 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
3748\r
3749 if not self.__IsToken("="):\r
3750 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3751\r
3752 if not self.__GetNextToken():\r
3753 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
3754 if self.__Token not in ("1", "0"):\r
3755 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3756 CompStatementObj.CompCs = self.__Token\r
3757\r
3758\r
3759 if not self.__IsKeyword("COMP_BIN"):\r
3760 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
3761\r
3762 if not self.__IsToken("="):\r
3763 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3764\r
3765 if not self.__GetNextToken():\r
3766 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
3767\r
3768 CompStatementObj.CompBin = self.__Token\r
3769 if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
3770 #check for file path\r
3771 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3772 if ErrorCode != 0:\r
3773 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3774\r
3775 if not self.__IsKeyword("COMP_SYM"):\r
3776 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
3777\r
3778 if not self.__IsToken("="):\r
3779 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3780\r
3781 if not self.__GetNextToken():\r
3782 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
3783\r
3784 CompStatementObj.CompSym = self.__Token\r
3785 if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1:\r
3786 #check for file path\r
3787 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3788 if ErrorCode != 0:\r
3789 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3790\r
3791 if not self.__IsKeyword("COMP_SIZE"):\r
3792 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
3793\r
3794 if not self.__IsToken("="):\r
3795 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3796\r
3797 if self.__IsToken("-"):\r
3798 CompStatementObj.CompSize = self.__Token\r
3799 elif self.__GetNextDecimalNumber():\r
3800 CompStatementObj.CompSize = self.__Token\r
3801 elif self.__GetNextHexNumber():\r
3802 CompStatementObj.CompSize = self.__Token\r
3803 else:\r
3804 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3805\r
3806 VtfObj.ComponentStatementList.append(CompStatementObj)\r
3807 return True\r
3808\r
3809 ## __GetOptionRom() method\r
3810 #\r
3811 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
3812 #\r
3813 # @param self The object pointer\r
3814 # @retval True Successfully find a OptionROM\r
3815 # @retval False Not able to find a OptionROM\r
3816 #\r
3817 def __GetOptionRom(self):\r
3818\r
3819 if not self.__GetNextToken():\r
3820 return False\r
3821\r
3822 S = self.__Token.upper()\r
3823 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
3824 raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)\r
3825 \r
3826 self.__UndoToken()\r
3827 if not self.__IsToken("[OptionRom.", True):\r
3828 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3829\r
3830 OptRomName = self.__GetUiName()\r
3831\r
3832 if not self.__IsToken( "]"):\r
3833 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3834\r
3835 OptRomObj = OptionRom.OPTIONROM()\r
3836 OptRomObj.DriverName = OptRomName\r
3837 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
3838\r
3839 while True:\r
3840 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
3841 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
3842 if not isInf and not isFile:\r
3843 break\r
3844 \r
3845 return True\r
3846\r
3847 ## __GetOptRomInfStatement() method\r
3848 #\r
3849 # Get INF statements\r
3850 #\r
3851 # @param self The object pointer\r
3852 # @param Obj for whom inf statement is got\r
3853 # @retval True Successfully find inf statement\r
3854 # @retval False Not able to find inf statement\r
3855 #\r
3856 def __GetOptRomInfStatement(self, Obj):\r
3857\r
3858 if not self.__IsKeyword( "INF"):\r
3859 return False\r
3860\r
3861 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
3862 self.__GetInfOptions( ffsInf)\r
3863\r
3864 if not self.__GetNextToken():\r
3865 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
3866 ffsInf.InfFileName = self.__Token\r
3867 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
3868 #check for file path\r
3869 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3870 if ErrorCode != 0:\r
3871 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3872\r
3873 if not ffsInf.InfFileName in self.Profile.InfList:\r
3874 self.Profile.InfList.append(ffsInf.InfFileName)\r
3875\r
3876 \r
3877 self.__GetOptRomOverrides (ffsInf)\r
3878 \r
3879 Obj.FfsList.append(ffsInf)\r
3880 return True\r
3881\r
3882 ## __GetOptRomOverrides() method\r
3883 #\r
3884 # Get overrides for OptROM INF & FILE\r
3885 #\r
3886 # @param self The object pointer\r
3887 # @param FfsInfObj for whom overrides is got\r
3888 #\r
3889 def __GetOptRomOverrides(self, Obj):\r
3890 if self.__IsToken('{'):\r
3891 Overrides = OptionRom.OverrideAttribs()\r
3892 while True:\r
3893 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
3894 if not self.__IsToken( "="):\r
3895 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3896 if not self.__GetNextHexNumber():\r
3897 raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
3898 Overrides.PciVendorId = self.__Token\r
3899 continue\r
3900\r
3901 if self.__IsKeyword( "PCI_CLASS_CODE"):\r
3902 if not self.__IsToken( "="):\r
3903 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3904 if not self.__GetNextHexNumber():\r
3905 raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
3906 Overrides.PciClassCode = self.__Token\r
3907 continue\r
3908\r
3909 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
3910 if not self.__IsToken( "="):\r
3911 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3912 if not self.__GetNextHexNumber():\r
3913 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
3914\r
3915 Overrides.PciDeviceId = self.__Token\r
3916 continue\r
3917\r
3918 if self.__IsKeyword( "PCI_REVISION"):\r
3919 if not self.__IsToken( "="):\r
3920 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3921 if not self.__GetNextHexNumber():\r
3922 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
3923 Overrides.PciRevision = self.__Token\r
3924 continue\r
3925\r
3926 if self.__IsKeyword( "PCI_COMPRESS"):\r
3927 if not self.__IsToken( "="):\r
3928 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3929 if not self.__GetNextToken():\r
3930 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
3931 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
3932 continue\r
3933\r
3934 if self.__IsToken( "}"):\r
3935 break\r
3936 else:\r
3937 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
3938\r
3939 Obj.OverrideAttribs = Overrides\r
3940 \r
3941 ## __GetOptRomFileStatement() method\r
3942 #\r
3943 # Get FILE statements\r
3944 #\r
3945 # @param self The object pointer\r
3946 # @param Obj for whom FILE statement is got\r
3947 # @retval True Successfully find FILE statement\r
3948 # @retval False Not able to find FILE statement\r
3949 #\r
3950 def __GetOptRomFileStatement(self, Obj):\r
3951\r
3952 if not self.__IsKeyword( "FILE"):\r
3953 return False\r
3954\r
3955 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
3956\r
3957 if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
3958 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
3959 FfsFileObj.FileType = self.__Token\r
3960\r
3961 if not self.__GetNextToken():\r
3962 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
3963 FfsFileObj.FileName = self.__Token\r
3964 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
3965 #check for file path\r
3966 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3967 if ErrorCode != 0:\r
3968 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3969\r
3970 if FfsFileObj.FileType == 'EFI':\r
3971 self.__GetOptRomOverrides(FfsFileObj)\r
3972 \r
3973 Obj.FfsList.append(FfsFileObj)\r
3974\r
3975 return True\r
3976\r
3977 ## __GetCapInFd() method\r
3978 #\r
3979 # Get Cap list contained in FD\r
3980 #\r
3981 # @param self The object pointer\r
3982 # @param FdName FD name\r
3983 # @retval CapList List of Capsule in FD\r
3984 #\r
3985 def __GetCapInFd (self, FdName):\r
3986\r
3987 CapList = []\r
3988 if FdName.upper() in self.Profile.FdDict.keys():\r
3989 FdObj = self.Profile.FdDict[FdName.upper()]\r
3990 for elementRegion in FdObj.RegionList:\r
3991 if elementRegion.RegionType == 'CAPSULE':\r
3992 for elementRegionData in elementRegion.RegionDataList:\r
3993 if elementRegionData.endswith(".cap"):\r
3994 continue\r
3995 if elementRegionData != None and elementRegionData.upper() not in CapList:\r
3996 CapList.append(elementRegionData.upper())\r
3997 return CapList\r
3998\r
3999 ## __GetReferencedFdCapTuple() method\r
4000 #\r
4001 # Get FV and FD list referenced by a capsule image\r
4002 #\r
4003 # @param self The object pointer\r
4004 # @param CapObj Capsule section to be searched\r
4005 # @param RefFdList referenced FD by section\r
4006 # @param RefFvList referenced FV by section\r
4007 #\r
4008 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
4009\r
4010 for CapsuleDataObj in CapObj.CapsuleDataList :\r
4011 if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
4012 RefFvList.append (CapsuleDataObj.FvName.upper())\r
4013 elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName != None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
4014 RefFdList.append (CapsuleDataObj.FdName.upper()) \r
4015 elif CapsuleDataObj.Ffs != None:\r
4016 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
4017 if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
4018 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
4019 elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
4020 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
4021 else:\r
4022 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
4023\r
4024 ## __GetFvInFd() method\r
4025 #\r
4026 # Get FV list contained in FD\r
4027 #\r
4028 # @param self The object pointer\r
4029 # @param FdName FD name\r
4030 # @retval FvList list of FV in FD\r
4031 #\r
4032 def __GetFvInFd (self, FdName):\r
4033\r
4034 FvList = []\r
4035 if FdName.upper() in self.Profile.FdDict.keys():\r
4036 FdObj = self.Profile.FdDict[FdName.upper()]\r
4037 for elementRegion in FdObj.RegionList:\r
4038 if elementRegion.RegionType == 'FV':\r
4039 for elementRegionData in elementRegion.RegionDataList:\r
4040 if elementRegionData.endswith(".fv"):\r
4041 continue\r
4042 if elementRegionData != None and elementRegionData.upper() not in FvList:\r
4043 FvList.append(elementRegionData.upper())\r
4044 return FvList\r
4045\r
4046 ## __GetReferencedFdFvTuple() method\r
4047 #\r
4048 # Get FD and FV list referenced by a FFS file\r
4049 #\r
4050 # @param self The object pointer\r
4051 # @param FfsFile contains sections to be searched\r
4052 # @param RefFdList referenced FD by section\r
4053 # @param RefFvList referenced FV by section\r
4054 #\r
4055 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
4056\r
4057 for FfsObj in FvObj.FfsList:\r
4058 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
4059 if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList:\r
4060 RefFvList.append(FfsObj.FvName.upper())\r
4061 elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList:\r
4062 RefFdList.append(FfsObj.FdName.upper())\r
4063 else:\r
4064 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
4065\r
4066 ## __GetReferencedFdFvTupleFromSection() method\r
4067 #\r
4068 # Get FD and FV list referenced by a FFS section\r
4069 #\r
4070 # @param self The object pointer\r
4071 # @param FfsFile contains sections to be searched\r
4072 # @param FdList referenced FD by section\r
4073 # @param FvList referenced FV by section\r
4074 #\r
4075 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
4076\r
4077 SectionStack = []\r
4078 SectionStack.extend(FfsFile.SectionList)\r
4079 while SectionStack != []:\r
4080 SectionObj = SectionStack.pop()\r
4081 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
4082 if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList:\r
4083 FvList.append(SectionObj.FvName.upper())\r
4084 if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
4085 FvList.append(SectionObj.Fv.UiFvName.upper())\r
4086 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
4087\r
4088 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
4089 SectionStack.extend(SectionObj.SectionList)\r
4090\r
4091 ## CycleReferenceCheck() method\r
4092 #\r
4093 # Check whether cycle reference exists in FDF\r
4094 #\r
4095 # @param self The object pointer\r
4096 # @retval True cycle reference exists\r
4097 # @retval False Not exists cycle reference\r
4098 #\r
4099 def CycleReferenceCheck(self):\r
4100 #\r
4101 # Check the cycle between FV and FD image\r
4102 #\r
4103 MaxLength = len (self.Profile.FvDict)\r
4104 for FvName in self.Profile.FvDict.keys():\r
4105 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
4106 RefFvStack = []\r
4107 RefFvStack.append(FvName)\r
4108 FdAnalyzedList = []\r
4109 \r
4110 Index = 0\r
4111 while RefFvStack != [] and Index < MaxLength:\r
4112 Index = Index + 1\r
4113 FvNameFromStack = RefFvStack.pop()\r
4114 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
4115 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
4116 else:\r
4117 continue\r
4118\r
4119 RefFdList = []\r
4120 RefFvList = []\r
4121 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4122\r
4123 for RefFdName in RefFdList:\r
4124 if RefFdName in FdAnalyzedList:\r
4125 continue\r
4126\r
4127 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
4128 FvInFdList = self.__GetFvInFd(RefFdName)\r
4129 if FvInFdList != []:\r
4130 for FvNameInFd in FvInFdList:\r
4131 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4132 if FvNameInFd not in RefFvStack:\r
4133 RefFvStack.append(FvNameInFd)\r
4134\r
4135 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4136 EdkLogger.info(LogStr)\r
4137 return True\r
4138 FdAnalyzedList.append(RefFdName)\r
4139\r
4140 for RefFvName in RefFvList:\r
4141 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
4142 if RefFvName not in RefFvStack:\r
4143 RefFvStack.append(RefFvName)\r
4144\r
4145 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4146 EdkLogger.info(LogStr)\r
4147 return True\r
4148\r
4149 #\r
4150 # Check the cycle between Capsule and FD image\r
4151 #\r
4152 MaxLength = len (self.Profile.CapsuleDict)\r
4153 for CapName in self.Profile.CapsuleDict.keys():\r
4154 #\r
4155 # Capsule image to be checked.\r
4156 #\r
4157 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
4158 RefCapStack = []\r
4159 RefCapStack.append(CapName)\r
4160 FdAnalyzedList = []\r
4161 FvAnalyzedList = []\r
4162 \r
4163 Index = 0\r
4164 while RefCapStack != [] and Index < MaxLength:\r
4165 Index = Index + 1\r
4166 CapNameFromStack = RefCapStack.pop()\r
4167 if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
4168 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
4169 else:\r
4170 continue\r
4171\r
4172 RefFvList = []\r
4173 RefFdList = []\r
4174 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
4175\r
4176 FvListLength = 0\r
4177 FdListLength = 0\r
4178 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
4179 for RefFdName in RefFdList:\r
4180 if RefFdName in FdAnalyzedList:\r
4181 continue\r
4182\r
4183 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
4184 CapInFdList = self.__GetCapInFd(RefFdName)\r
4185 if CapInFdList != []:\r
4186 for CapNameInFd in CapInFdList:\r
4187 LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
4188 if CapNameInFd not in RefCapStack:\r
4189 RefCapStack.append(CapNameInFd)\r
4190\r
4191 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
4192 EdkLogger.info(LogStr)\r
4193 return True\r
4194\r
4195 FvInFdList = self.__GetFvInFd(RefFdName)\r
4196 if FvInFdList != []:\r
4197 for FvNameInFd in FvInFdList:\r
4198 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4199 if FvNameInFd not in RefFvList:\r
4200 RefFvList.append(FvNameInFd)\r
4201\r
4202 FdAnalyzedList.append(RefFdName)\r
4203 #\r
4204 # the number of the parsed FV and FD image\r
4205 #\r
4206 FvListLength = len (RefFvList)\r
4207 FdListLength = len (RefFdList)\r
4208 for RefFvName in RefFvList:\r
4209 if RefFvName in FvAnalyzedList:\r
4210 continue\r
4211 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
4212 if RefFvName.upper() in self.Profile.FvDict.keys():\r
4213 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4214 else:\r
4215 continue\r
4216 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4217 FvAnalyzedList.append(RefFvName)\r
4218\r
4219 return False\r
4220\r
4221if __name__ == "__main__":\r
4222 import sys\r
4223 try:\r
4224 test_file = sys.argv[1]\r
4225 except IndexError, v:\r
4226 print "Usage: %s filename" % sys.argv[0]\r
4227 sys.exit(1)\r
4228\r
4229 parser = FdfParser(test_file)\r
4230 try:\r
4231 parser.ParseFile()\r
4232 parser.CycleReferenceCheck()\r
4233 except Warning, X:\r
4234 print str(X)\r
4235 else:\r
4236 print "Success!"\r
4237\r