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