]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FdfParser.py
Sync tool code to BuildTools project r1739.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
CommitLineData
30fdf114
LG
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
fd171542 176 self.CapsuleDict = {}\r
30fdf114
LG
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
fd171542 1625 if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):\r
30fdf114
LG
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
fd171542 1642 elif self.__Token == "FV":\r
30fdf114
LG
1643 self.__UndoToken()\r
1644 self.__GetRegionFvType( RegionObj)\r
1645\r
fd171542 1646 elif self.__Token == "CAPSULE":\r
1647 self.__UndoToken()\r
1648 self.__GetRegionCapType( RegionObj)\r
1649\r
30fdf114
LG
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
fd171542 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
30fdf114
LG
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
b303ea72
LG
1880 FvObj.FvExtEntryTypeValue = []\r
1881 FvObj.FvExtEntryType = []\r
1882 FvObj.FvExtEntryData = []\r
1883 while True:\r
1884 isFvExtEntry = self.__GetFvExtEntryStatement(FvObj)\r
1885 if not isFvExtEntry:\r
1886 break\r
1887\r
30fdf114
LG
1888 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1889 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1890\r
1891 while True:\r
1892 isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1893 isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1894 if not isInf and not isFile:\r
1895 break\r
1896\r
1897 return True\r
1898\r
1899 ## __GetFvAlignment() method\r
1900 #\r
1901 # Get alignment for FV\r
1902 #\r
1903 # @param self The object pointer\r
1904 # @param Obj for whom alignment is got\r
1905 # @retval True Successfully find a alignment statement\r
1906 # @retval False Not able to find a alignment statement\r
1907 #\r
1908 def __GetFvAlignment(self, Obj):\r
1909\r
1910 if not self.__IsKeyword( "FvAlignment"):\r
1911 return False\r
1912\r
1913 if not self.__IsToken( "="):\r
1914 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1915\r
1916 if not self.__GetNextToken():\r
1917 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
1918\r
1919 if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
1920 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
1921 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \\r
1922 "1G", "2G"):\r
1923 raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1924 Obj.FvAlignment = self.__Token\r
1925 return True\r
1926\r
1927 ## __GetFvAttributes() method\r
1928 #\r
1929 # Get attributes for FV\r
1930 #\r
1931 # @param self The object pointer\r
1932 # @param Obj for whom attribute is got\r
1933 # @retval None\r
1934 #\r
1935 def __GetFvAttributes(self, FvObj):\r
1936\r
1937 while self.__GetNextWord():\r
1938 name = self.__Token\r
1939 if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \\r
1940 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \\r
1941 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
1942 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
1943 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
1944 "WRITE_POLICY_RELIABLE"):\r
1945 self.__UndoToken()\r
1946 return\r
1947\r
1948 if not self.__IsToken( "="):\r
1949 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1950\r
1951 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
1952 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
1953\r
1954 FvObj.FvAttributeDict[name] = self.__Token\r
1955\r
1956 return\r
1957 \r
1958 ## __GetFvNameGuid() method\r
1959 #\r
1960 # Get FV GUID for FV\r
1961 #\r
1962 # @param self The object pointer\r
1963 # @param Obj for whom GUID is got\r
1964 # @retval None\r
1965 #\r
1966 def __GetFvNameGuid(self, FvObj):\r
1967\r
1968 if not self.__IsKeyword( "FvNameGuid"):\r
1969 return\r
1970\r
1971 if not self.__IsToken( "="):\r
1972 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1973\r
1974 if not self.__GetNextGuid():\r
1975 raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
1976\r
1977 FvObj.FvNameGuid = self.__Token\r
1978\r
1979 return\r
1980\r
b303ea72
LG
1981 def __GetFvExtEntryStatement(self, FvObj):\r
1982\r
1983 if not self.__IsKeyword( "FV_EXT_ENTRY"):\r
1984 return False\r
1985\r
1986 if not self.__IsKeyword ("TYPE"):\r
1987 raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
1988 \r
1989 if not self.__IsToken( "="):\r
1990 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1991\r
1992 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
1993 raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
1994\r
1995 FvObj.FvExtEntryTypeValue += [self.__Token]\r
1996\r
1997 if not self.__IsToken( "{"):\r
1998 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
1999\r
2000 if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
2001 raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
2002\r
2003 FvObj.FvExtEntryType += [self.__Token]\r
2004\r
2005 if self.__Token == 'DATA':\r
2006\r
2007 if not self.__IsToken( "="):\r
2008 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2009 \r
2010 if not self.__IsToken( "{"):\r
2011 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2012\r
2013 if not self.__GetNextHexNumber():\r
2014 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2015\r
2016 if len(self.__Token) > 4:\r
2017 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2018\r
2019 DataString = self.__Token\r
2020 DataString += ","\r
2021\r
2022 while self.__IsToken(","):\r
2023 if not self.__GetNextHexNumber():\r
2024 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2025 if len(self.__Token) > 4:\r
2026 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2027 DataString += self.__Token\r
2028 DataString += ","\r
2029\r
2030 if not self.__IsToken( "}"):\r
2031 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2032\r
2033 if not self.__IsToken( "}"):\r
2034 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2035\r
2036 DataString = DataString.rstrip(",")\r
2037 FvObj.FvExtEntryData += [DataString]\r
2038\r
2039 if self.__Token == 'FILE':\r
2040 \r
2041 if not self.__IsToken( "="):\r
2042 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2043 \r
2044 if not self.__GetNextToken():\r
2045 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
2046 \r
2047 FvObj.FvExtEntryData += [self.__Token]\r
2048\r
2049 if not self.__IsToken( "}"):\r
2050 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2051\r
2052 return True\r
2053\r
30fdf114
LG
2054 ## __GetAprioriSection() method\r
2055 #\r
2056 # Get token statements\r
2057 #\r
2058 # @param self The object pointer\r
2059 # @param FvObj for whom apriori is got\r
2060 # @param MacroDict dictionary used to replace macro\r
2061 # @retval True Successfully find apriori statement\r
2062 # @retval False Not able to find apriori statement\r
2063 #\r
2064 def __GetAprioriSection(self, FvObj, MacroDict = {}):\r
2065\r
2066 if not self.__IsKeyword( "APRIORI"):\r
2067 return False\r
2068\r
2069 if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):\r
2070 raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber)\r
2071 AprType = self.__Token\r
2072\r
2073 if not self.__IsToken( "{"):\r
2074 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2075\r
2076 AprSectionObj = AprioriSection.AprioriSection()\r
2077 AprSectionObj.AprioriType = AprType\r
2078\r
2079 self.__GetDefineStatements(AprSectionObj)\r
2080 MacroDict.update(AprSectionObj.DefineVarDict)\r
2081\r
2082 while True:\r
2083 IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)\r
2084 IsFile = self.__GetFileStatement( AprSectionObj)\r
2085 if not IsInf and not IsFile:\r
2086 break\r
2087\r
2088 if not self.__IsToken( "}"):\r
2089 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2090\r
2091 FvObj.AprioriSectionList.append(AprSectionObj)\r
2092 return True\r
2093\r
2094 ## __GetInfStatement() method\r
2095 #\r
2096 # Get INF statements\r
2097 #\r
2098 # @param self The object pointer\r
2099 # @param Obj for whom inf statement is got\r
2100 # @param MacroDict dictionary used to replace macro\r
2101 # @retval True Successfully find inf statement\r
2102 # @retval False Not able to find inf statement\r
2103 #\r
2104 def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2105\r
2106 if not self.__IsKeyword( "INF"):\r
2107 return False\r
2108\r
2109 ffsInf = FfsInfStatement.FfsInfStatement()\r
2110 self.__GetInfOptions( ffsInf)\r
2111\r
2112 if not self.__GetNextToken():\r
2113 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
2114 ffsInf.InfFileName = self.__Token\r
2115\r
2116# if ffsInf.InfFileName.find('$') >= 0:\r
2117# ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)\r
2118\r
2119 if not ffsInf.InfFileName in self.Profile.InfList:\r
2120 self.Profile.InfList.append(ffsInf.InfFileName)\r
2121\r
2122 if self.__IsToken('|'):\r
2123 if self.__IsKeyword('RELOCS_STRIPPED'):\r
2124 ffsInf.KeepReloc = False\r
2125 elif self.__IsKeyword('RELOCS_RETAINED'):\r
2126 ffsInf.KeepReloc = True\r
2127 else:\r
2128 raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2129\r
2130 if ForCapsule:\r
2131 capsuleFfs = CapsuleData.CapsuleFfs()\r
2132 capsuleFfs.Ffs = ffsInf\r
2133 Obj.CapsuleDataList.append(capsuleFfs)\r
2134 else:\r
2135 Obj.FfsList.append(ffsInf)\r
2136 return True\r
2137\r
2138 ## __GetInfOptions() method\r
2139 #\r
2140 # Get options for INF\r
2141 #\r
2142 # @param self The object pointer\r
2143 # @param FfsInfObj for whom option is got\r
2144 #\r
2145 def __GetInfOptions(self, FfsInfObj):\r
2146\r
2147 if self.__IsKeyword( "RuleOverride"):\r
2148 if not self.__IsToken( "="):\r
2149 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2150 if not self.__GetNextToken():\r
2151 raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
2152 FfsInfObj.Rule = self.__Token\r
2153\r
2154 if self.__IsKeyword( "VERSION"):\r
2155 if not self.__IsToken( "="):\r
2156 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2157 if not self.__GetNextToken():\r
2158 raise Warning("expected Version", self.FileName, self.CurrentLineNumber)\r
2159\r
2160 if self.__GetStringData():\r
2161 FfsInfObj.Version = self.__Token\r
2162\r
2163 if self.__IsKeyword( "UI"):\r
2164 if not self.__IsToken( "="):\r
2165 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2166 if not self.__GetNextToken():\r
2167 raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
2168\r
2169 if self.__GetStringData():\r
2170 FfsInfObj.Ui = self.__Token\r
2171\r
2172 if self.__IsKeyword( "USE"):\r
2173 if not self.__IsToken( "="):\r
2174 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2175 if not self.__GetNextToken():\r
2176 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2177 FfsInfObj.UseArch = self.__Token\r
2178\r
2179 \r
2180 if self.__GetNextToken():\r
2181 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2182 if p.match(self.__Token):\r
2183 FfsInfObj.KeyStringList.append(self.__Token)\r
2184 if not self.__IsToken(","):\r
2185 return\r
2186 else:\r
2187 self.__UndoToken()\r
2188 return\r
2189\r
2190 while self.__GetNextToken():\r
2191 if not p.match(self.__Token):\r
2192 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2193 FfsInfObj.KeyStringList.append(self.__Token)\r
2194\r
2195 if not self.__IsToken(","):\r
2196 break\r
2197\r
2198 ## __GetFileStatement() method\r
2199 #\r
2200 # Get FILE statements\r
2201 #\r
2202 # @param self The object pointer\r
2203 # @param Obj for whom FILE statement is got\r
2204 # @param MacroDict dictionary used to replace macro\r
2205 # @retval True Successfully find FILE statement\r
2206 # @retval False Not able to find FILE statement\r
2207 #\r
2208 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2209\r
2210 if not self.__IsKeyword( "FILE"):\r
2211 return False\r
2212\r
2213 FfsFileObj = FfsFileStatement.FileStatement()\r
2214\r
2215 if not self.__GetNextWord():\r
2216 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
2217 FfsFileObj.FvFileType = self.__Token\r
2218\r
2219 if not self.__IsToken( "="):\r
2220 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2221\r
2222 if not self.__GetNextGuid():\r
2223 if not self.__GetNextWord():\r
2224 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2225 if self.__Token == 'PCD':\r
2226 if not self.__IsToken( "("):\r
2227 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2228 PcdPair = self.__GetNextPcdName()\r
2229 if not self.__IsToken( ")"):\r
2230 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2231 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2232 \r
2233 FfsFileObj.NameGuid = self.__Token\r
2234\r
2235 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2236\r
2237 if ForCapsule:\r
2238 capsuleFfs = CapsuleData.CapsuleFfs()\r
2239 capsuleFfs.Ffs = FfsFileObj\r
2240 Obj.CapsuleDataList.append(capsuleFfs)\r
2241 else:\r
2242 Obj.FfsList.append(FfsFileObj)\r
2243\r
2244 return True\r
2245\r
2246 ## __FileCouldHaveRelocFlag() method\r
2247 #\r
2248 # Check whether reloc strip flag can be set for a file type.\r
2249 #\r
2250 # @param self The object pointer\r
2251 # @param FileType The file type to check with\r
2252 # @retval True This type could have relocation strip flag\r
2253 # @retval False No way to have it\r
2254 #\r
2255\r
2256 def __FileCouldHaveRelocFlag (self, FileType):\r
2257 if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
2258 return True\r
2259 else:\r
2260 return False\r
2261\r
2262 ## __SectionCouldHaveRelocFlag() method\r
2263 #\r
2264 # Check whether reloc strip flag can be set for a section type.\r
2265 #\r
2266 # @param self The object pointer\r
2267 # @param SectionType The section type to check with\r
2268 # @retval True This type could have relocation strip flag\r
2269 # @retval False No way to have it\r
2270 #\r
2271\r
2272 def __SectionCouldHaveRelocFlag (self, SectionType):\r
2273 if SectionType in ('TE', 'PE32'):\r
2274 return True\r
2275 else:\r
2276 return False\r
2277\r
2278 ## __GetFilePart() method\r
2279 #\r
2280 # Get components for FILE statement\r
2281 #\r
2282 # @param self The object pointer\r
2283 # @param FfsFileObj for whom component is got\r
2284 # @param MacroDict dictionary used to replace macro\r
2285 #\r
2286 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2287\r
2288 self.__GetFileOpts( FfsFileObj)\r
2289\r
2290 if not self.__IsToken("{"):\r
2291# if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2292# if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2293# if self.__Token == 'RELOCS_STRIPPED':\r
2294# FfsFileObj.KeepReloc = False\r
2295# else:\r
2296# FfsFileObj.KeepReloc = True\r
2297# else:\r
2298# raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2299#\r
2300# if not self.__IsToken("{"):\r
2301 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2302\r
2303 if not self.__GetNextToken():\r
2304 raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
2305\r
2306 if self.__Token == "FV":\r
2307 if not self.__IsToken( "="):\r
2308 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2309 if not self.__GetNextToken():\r
2310 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2311 FfsFileObj.FvName = self.__Token\r
2312\r
2313 elif self.__Token == "FD":\r
2314 if not self.__IsToken( "="):\r
2315 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2316 if not self.__GetNextToken():\r
2317 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
2318 FfsFileObj.FdName = self.__Token\r
2319\r
2320 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2321 self.__UndoToken()\r
2322 self.__GetSectionData( FfsFileObj, MacroDict)\r
2323 else:\r
2324 FfsFileObj.FileName = self.__Token\r
2325\r
2326 if not self.__IsToken( "}"):\r
2327 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2328\r
2329 ## __GetFileOpts() method\r
2330 #\r
2331 # Get options for FILE statement\r
2332 #\r
2333 # @param self The object pointer\r
2334 # @param FfsFileObj for whom options is got\r
2335 #\r
2336 def __GetFileOpts(self, FfsFileObj):\r
2337\r
2338 if self.__GetNextToken():\r
2339 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2340 if Pattern.match(self.__Token):\r
2341 FfsFileObj.KeyStringList.append(self.__Token)\r
2342 if self.__IsToken(","):\r
2343 while self.__GetNextToken():\r
2344 if not Pattern.match(self.__Token):\r
2345 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2346 FfsFileObj.KeyStringList.append(self.__Token)\r
2347\r
2348 if not self.__IsToken(","):\r
2349 break\r
2350\r
2351 else:\r
2352 self.__UndoToken()\r
2353\r
2354 if self.__IsKeyword( "FIXED", True):\r
2355 FfsFileObj.Fixed = True\r
2356\r
2357 if self.__IsKeyword( "CHECKSUM", True):\r
2358 FfsFileObj.CheckSum = True\r
2359\r
2360 if self.__GetAlignment():\r
2361 FfsFileObj.Alignment = self.__Token\r
2362\r
2363\r
2364\r
2365 ## __GetAlignment() method\r
2366 #\r
2367 # Return the alignment value\r
2368 #\r
2369 # @param self The object pointer\r
2370 # @retval True Successfully find alignment\r
2371 # @retval False Not able to find alignment\r
2372 #\r
2373 def __GetAlignment(self):\r
2374 if self.__IsKeyword( "Align", True):\r
2375 if not self.__IsToken( "="):\r
2376 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2377\r
2378 if not self.__GetNextToken():\r
2379 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2380 return True\r
2381\r
2382 return False\r
2383\r
2384 ## __GetFilePart() method\r
2385 #\r
2386 # Get section data for FILE statement\r
2387 #\r
2388 # @param self The object pointer\r
2389 # @param FfsFileObj for whom section is got\r
2390 # @param MacroDict dictionary used to replace macro\r
2391 #\r
2392 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2393 Dict = {}\r
2394 Dict.update(MacroDict)\r
2395\r
2396 self.__GetDefineStatements(FfsFileObj)\r
2397\r
2398 Dict.update(FfsFileObj.DefineVarDict)\r
2399 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2400 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2401\r
2402 while True:\r
2403 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2404 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2405 if not IsLeafSection and not IsEncapSection:\r
2406 break\r
2407\r
2408 ## __GetLeafSection() method\r
2409 #\r
2410 # Get leaf section for Obj\r
2411 #\r
2412 # @param self The object pointer\r
2413 # @param Obj for whom leaf section is got\r
2414 # @param MacroDict dictionary used to replace macro\r
2415 # @retval True Successfully find section statement\r
2416 # @retval False Not able to find section statement\r
2417 #\r
2418 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2419\r
2420 OldPos = self.GetFileBufferPos()\r
2421\r
2422 if not self.__IsKeyword( "SECTION"):\r
2423 if len(Obj.SectionList) == 0:\r
2424 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2425 else:\r
2426 return False\r
2427\r
2428 AlignValue = None\r
2429 if self.__GetAlignment():\r
2430 AlignValue = self.__Token\r
2431\r
2432 BuildNum = None\r
2433 if self.__IsKeyword( "BUILD_NUM"):\r
2434 if not self.__IsToken( "="):\r
2435 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2436\r
2437 if not self.__GetNextToken():\r
2438 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2439\r
2440 BuildNum = self.__Token\r
2441\r
2442 if self.__IsKeyword( "VERSION"):\r
2443 if not self.__IsToken( "="):\r
2444 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2445 if not self.__GetNextToken():\r
2446 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2447 VerSectionObj = VerSection.VerSection()\r
2448 VerSectionObj.Alignment = AlignValue\r
2449 VerSectionObj.BuildNum = BuildNum\r
2450 if self.__GetStringData():\r
2451 VerSectionObj.StringData = self.__Token\r
2452 else:\r
2453 VerSectionObj.FileName = self.__Token\r
2454 Obj.SectionList.append(VerSectionObj)\r
2455\r
2456 elif self.__IsKeyword( "UI"):\r
2457 if not self.__IsToken( "="):\r
2458 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2459 if not self.__GetNextToken():\r
2460 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2461 UiSectionObj = UiSection.UiSection()\r
2462 UiSectionObj.Alignment = AlignValue\r
2463 if self.__GetStringData():\r
2464 UiSectionObj.StringData = self.__Token\r
2465 else:\r
2466 UiSectionObj.FileName = self.__Token\r
2467 Obj.SectionList.append(UiSectionObj)\r
2468\r
2469 elif self.__IsKeyword( "FV_IMAGE"):\r
2470 if not self.__IsToken( "="):\r
2471 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2472 if not self.__GetNextToken():\r
2473 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2474\r
2475 FvName = self.__Token\r
2476 FvObj = None\r
2477\r
2478 if self.__IsToken( "{"):\r
2479 FvObj = Fv.FV()\r
2480 FvObj.UiFvName = FvName.upper()\r
2481 self.__GetDefineStatements(FvObj)\r
2482 MacroDict.update(FvObj.DefineVarDict)\r
2483 self.__GetBlockStatement(FvObj)\r
2484 self.__GetSetStatements(FvObj)\r
2485 self.__GetFvAlignment(FvObj)\r
2486 self.__GetFvAttributes(FvObj)\r
2487 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2488 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2489\r
2490 while True:\r
2491 IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
2492 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2493 if not IsInf and not IsFile:\r
2494 break\r
2495\r
2496 if not self.__IsToken( "}"):\r
2497 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2498\r
2499 FvImageSectionObj = FvImageSection.FvImageSection()\r
2500 FvImageSectionObj.Alignment = AlignValue\r
2501 if FvObj != None:\r
2502 FvImageSectionObj.Fv = FvObj\r
2503 FvImageSectionObj.FvName = None\r
2504 else:\r
2505 FvImageSectionObj.FvName = FvName.upper()\r
2506 FvImageSectionObj.FvFileName = FvName\r
2507\r
2508 Obj.SectionList.append(FvImageSectionObj)\r
2509\r
2510 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
2511 DepexSectionObj = DepexSection.DepexSection()\r
2512 DepexSectionObj.Alignment = AlignValue\r
2513 DepexSectionObj.DepexType = self.__Token\r
2514\r
2515 if not self.__IsToken( "="):\r
2516 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2517 if not self.__IsToken( "{"):\r
2518 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2519 if not self.__SkipToToken( "}"):\r
2520 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
2521\r
2522 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2523 Obj.SectionList.append(DepexSectionObj)\r
2524\r
2525 else:\r
2526\r
2527 if not self.__GetNextWord():\r
2528 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
2529\r
2530 # Encapsulation section appear, UndoToken and return\r
2531 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2532 self.SetFileBufferPos(OldPos)\r
2533 return False\r
2534\r
2535 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2536 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2537 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2538 # DataSection\r
2539 DataSectionObj = DataSection.DataSection()\r
2540 DataSectionObj.Alignment = AlignValue\r
2541 DataSectionObj.SecType = self.__Token\r
2542\r
2543 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2544 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2545 if self.__Token == 'RELOCS_STRIPPED':\r
2546 DataSectionObj.KeepReloc = False\r
2547 else:\r
2548 DataSectionObj.KeepReloc = True\r
2549 else:\r
2550 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
2551\r
2552 if self.__IsToken("="):\r
2553 if not self.__GetNextToken():\r
2554 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
2555 DataSectionObj.SectFileName = self.__Token\r
2556 else:\r
2557 if not self.__GetCglSection(DataSectionObj):\r
2558 return False\r
2559\r
2560 Obj.SectionList.append(DataSectionObj)\r
2561\r
2562 return True\r
2563\r
2564 ## __GetCglSection() method\r
2565 #\r
2566 # Get compressed or GUIDed section for Obj\r
2567 #\r
2568 # @param self The object pointer\r
2569 # @param Obj for whom leaf section is got\r
2570 # @param AlignValue alignment value for complex section\r
2571 # @retval True Successfully find section statement\r
2572 # @retval False Not able to find section statement\r
2573 #\r
2574 def __GetCglSection(self, Obj, AlignValue = None):\r
2575\r
2576 if self.__IsKeyword( "COMPRESS"):\r
2577 type = "PI_STD"\r
2578 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
2579 type = self.__Token\r
2580\r
2581 if not self.__IsToken("{"):\r
2582 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2583\r
2584 CompressSectionObj = CompressSection.CompressSection()\r
2585 CompressSectionObj.Alignment = AlignValue\r
2586 CompressSectionObj.CompType = type\r
2587 # Recursive sections...\r
2588 while True:\r
2589 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
2590 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
2591 if not IsLeafSection and not IsEncapSection:\r
2592 break\r
2593\r
2594\r
2595 if not self.__IsToken( "}"):\r
2596 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2597 Obj.SectionList.append(CompressSectionObj)\r
2598\r
2599# else:\r
2600# raise Warning("Compress type not known")\r
2601\r
2602 return True\r
2603\r
2604 elif self.__IsKeyword( "GUIDED"):\r
2605 GuidValue = None\r
2606 if self.__GetNextGuid():\r
2607 GuidValue = self.__Token\r
2608\r
2609 AttribDict = self.__GetGuidAttrib()\r
2610 if not self.__IsToken("{"):\r
2611 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2612 GuidSectionObj = GuidSection.GuidSection()\r
2613 GuidSectionObj.Alignment = AlignValue\r
2614 GuidSectionObj.NameGuid = GuidValue\r
2615 GuidSectionObj.SectionType = "GUIDED"\r
2616 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
2617 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
2618 # Recursive sections...\r
2619 while True:\r
2620 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
2621 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
2622 if not IsLeafSection and not IsEncapSection:\r
2623 break\r
2624\r
2625 if not self.__IsToken( "}"):\r
2626 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2627 Obj.SectionList.append(GuidSectionObj)\r
2628\r
2629 return True\r
2630\r
2631 return False\r
2632\r
2633 ## __GetGuidAttri() method\r
2634 #\r
2635 # Get attributes for GUID section\r
2636 #\r
2637 # @param self The object pointer\r
2638 # @retval AttribDict Dictionary of key-value pair of section attributes\r
2639 #\r
2640 def __GetGuidAttrib(self):\r
2641\r
2642 AttribDict = {}\r
2643 AttribDict["PROCESSING_REQUIRED"] = False\r
2644 AttribDict["AUTH_STATUS_VALID"] = False\r
2645 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2646 AttribKey = self.__Token\r
2647\r
2648 if not self.__IsToken("="):\r
2649 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2650\r
2651 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2652 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2653 AttribDict[AttribKey] = self.__Token\r
2654\r
2655 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2656 AttribKey = self.__Token\r
2657\r
2658 if not self.__IsToken("="):\r
2659 raise Warning("expected '='")\r
2660\r
2661 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2662 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2663 AttribDict[AttribKey] = self.__Token\r
2664\r
2665 return AttribDict\r
2666\r
2667 ## __GetEncapsulationSec() method\r
2668 #\r
2669 # Get encapsulation section for FILE\r
2670 #\r
2671 # @param self The object pointer\r
2672 # @param FfsFile for whom section is got\r
2673 # @retval True Successfully find section statement\r
2674 # @retval False Not able to find section statement\r
2675 #\r
2676 def __GetEncapsulationSec(self, FfsFileObj):\r
2677\r
2678 OldPos = self.GetFileBufferPos()\r
2679 if not self.__IsKeyword( "SECTION"):\r
2680 if len(FfsFileObj.SectionList) == 0:\r
2681 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2682 else:\r
2683 return False\r
2684\r
2685 AlignValue = None\r
2686 if self.__GetAlignment():\r
2687 AlignValue = self.__Token\r
2688\r
2689 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
2690 self.SetFileBufferPos(OldPos)\r
2691 return False\r
2692 else:\r
2693 return True\r
2694\r
2695 ## __GetCapsule() method\r
2696 #\r
2697 # Get capsule section contents and store its data into capsule list of self.Profile\r
2698 #\r
2699 # @param self The object pointer\r
2700 # @retval True Successfully find a capsule\r
2701 # @retval False Not able to find a capsule\r
2702 #\r
2703 def __GetCapsule(self):\r
2704\r
2705 if not self.__GetNextToken():\r
2706 return False\r
2707\r
2708 S = self.__Token.upper()\r
2709 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
2710 if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
2711 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
2712 self.__UndoToken()\r
2713 return False\r
2714\r
2715 self.__UndoToken()\r
2716 if not self.__IsToken("[CAPSULE.", True):\r
2717 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2718 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2719 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2720 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
2721\r
2722 CapsuleObj = Capsule.Capsule()\r
2723\r
2724 CapsuleName = self.__GetUiName()\r
2725 if not CapsuleName:\r
2726 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
2727\r
2728 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
2729\r
2730 if not self.__IsToken( "]"):\r
2731 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2732\r
2733 if self.__IsKeyword("CREATE_FILE"):\r
2734 if not self.__IsToken( "="):\r
2735 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2736\r
2737 if not self.__GetNextToken():\r
2738 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
2739\r
2740 CapsuleObj.CreateFile = self.__Token\r
2741\r
2742 self.__GetCapsuleStatements(CapsuleObj)\r
fd171542 2743 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
30fdf114
LG
2744 return True\r
2745\r
2746 ## __GetCapsuleStatements() method\r
2747 #\r
2748 # Get statements for capsule\r
2749 #\r
2750 # @param self The object pointer\r
2751 # @param Obj for whom statements are got\r
2752 #\r
2753 def __GetCapsuleStatements(self, Obj):\r
2754 self.__GetCapsuleTokens(Obj)\r
2755 self.__GetDefineStatements(Obj)\r
2756 self.__GetSetStatements(Obj)\r
30fdf114
LG
2757 self.__GetCapsuleData(Obj)\r
2758\r
fd171542 2759 ## __GetCapsuleTokens() method\r
30fdf114
LG
2760 #\r
2761 # Get token statements for capsule\r
2762 #\r
2763 # @param self The object pointer\r
2764 # @param Obj for whom token statements are got\r
2765 #\r
2766 def __GetCapsuleTokens(self, Obj):\r
b303ea72
LG
2767 if not self.__GetNextToken():\r
2768 return False\r
2769 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):\r
2770 Name = self.__Token.strip()\r
2771 if not self.__IsToken("="):\r
2772 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2773 if not self.__GetNextToken():\r
2774 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2775 if Name == 'CAPSULE_FLAGS':\r
2776 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2777 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2778 Value = self.__Token.strip()\r
2779 while self.__IsToken(","):\r
2780 Value += ','\r
2781 if not self.__GetNextToken():\r
2782 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2783 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2784 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2785 Value += self.__Token.strip()\r
2786 else:\r
2787 Value = self.__Token.strip()\r
2788 Obj.TokensDict[Name] = Value \r
2789 if not self.__GetNextToken():\r
2790 return False\r
2791 self.__UndoToken()\r
30fdf114
LG
2792\r
2793 ## __GetCapsuleData() method\r
2794 #\r
2795 # Get capsule data for capsule\r
2796 #\r
2797 # @param self The object pointer\r
2798 # @param Obj for whom capsule data are got\r
2799 #\r
2800 def __GetCapsuleData(self, Obj):\r
2801\r
2802 while True:\r
2803 IsInf = self.__GetInfStatement(Obj, True)\r
2804 IsFile = self.__GetFileStatement(Obj, True)\r
2805 IsFv = self.__GetFvStatement(Obj)\r
2806 if not IsInf and not IsFile and not IsFv:\r
2807 break\r
2808\r
2809 ## __GetFvStatement() method\r
2810 #\r
2811 # Get FV for capsule\r
2812 #\r
2813 # @param self The object pointer\r
2814 # @param CapsuleObj for whom FV is got\r
2815 # @retval True Successfully find a FV statement\r
2816 # @retval False Not able to find a FV statement\r
2817 #\r
2818 def __GetFvStatement(self, CapsuleObj):\r
2819\r
2820 if not self.__IsKeyword("FV"):\r
2821 return False\r
2822\r
2823 if not self.__IsToken("="):\r
2824 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2825\r
2826 if not self.__GetNextToken():\r
2827 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2828\r
2829 CapsuleFv = CapsuleData.CapsuleFv()\r
2830 CapsuleFv.FvName = self.__Token\r
2831 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
2832 return True\r
2833\r
2834 ## __GetRule() method\r
2835 #\r
2836 # Get Rule section contents and store its data into rule list of self.Profile\r
2837 #\r
2838 # @param self The object pointer\r
2839 # @retval True Successfully find a Rule\r
2840 # @retval False Not able to find a Rule\r
2841 #\r
2842 def __GetRule(self):\r
2843\r
2844 if not self.__GetNextToken():\r
2845 return False\r
2846\r
2847 S = self.__Token.upper()\r
2848 if S.startswith("[") and not S.startswith("[RULE."):\r
2849 if not S.startswith("[OPTIONROM."):\r
2850 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
2851 self.__UndoToken()\r
2852 return False\r
2853 self.__UndoToken()\r
2854 if not self.__IsToken("[Rule.", True):\r
2855 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2856 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2857 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2858 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
2859\r
2860 if not self.__SkipToToken("."):\r
2861 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
2862\r
2863 Arch = self.__SkippedChars.rstrip(".")\r
2864 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):\r
2865 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
2866\r
2867 ModuleType = self.__GetModuleType()\r
2868\r
2869 TemplateName = ""\r
2870 if self.__IsToken("."):\r
2871 if not self.__GetNextWord():\r
2872 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
2873 TemplateName = self.__Token\r
2874\r
2875 if not self.__IsToken( "]"):\r
2876 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2877\r
2878 RuleObj = self.__GetRuleFileStatements()\r
2879 RuleObj.Arch = Arch.upper()\r
2880 RuleObj.ModuleType = ModuleType\r
2881 RuleObj.TemplateName = TemplateName\r
2882 if TemplateName == '' :\r
2883 self.Profile.RuleDict['RULE' + \\r
2884 '.' + \\r
2885 Arch.upper() + \\r
2886 '.' + \\r
2887 ModuleType.upper() ] = RuleObj\r
2888 else :\r
2889 self.Profile.RuleDict['RULE' + \\r
2890 '.' + \\r
2891 Arch.upper() + \\r
2892 '.' + \\r
2893 ModuleType.upper() + \\r
2894 '.' + \\r
2895 TemplateName.upper() ] = RuleObj\r
2896# self.Profile.RuleList.append(rule)\r
2897 return True\r
2898\r
2899 ## __GetModuleType() method\r
2900 #\r
2901 # Return the module type\r
2902 #\r
2903 # @param self The object pointer\r
2904 # @retval string module type\r
2905 #\r
2906 def __GetModuleType(self):\r
2907\r
2908 if not self.__GetNextWord():\r
2909 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
2910 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
2911 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
2912 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
2913 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
2914 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
b303ea72 2915 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):\r
30fdf114
LG
2916 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2917 return self.__Token\r
2918\r
2919 ## __GetFileExtension() method\r
2920 #\r
2921 # Return the file extension\r
2922 #\r
2923 # @param self The object pointer\r
2924 # @retval string file name extension\r
2925 #\r
2926 def __GetFileExtension(self):\r
2927 if not self.__IsToken("."):\r
2928 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
2929\r
2930 Ext = ""\r
2931 if self.__GetNextToken():\r
2932 Pattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
2933 if Pattern.match(self.__Token):\r
2934 Ext = self.__Token\r
2935 return '.' + Ext\r
2936 else:\r
2937 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2938\r
2939 else:\r
2940 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
2941\r
2942 ## __GetRuleFileStatement() method\r
2943 #\r
2944 # Get rule contents\r
2945 #\r
2946 # @param self The object pointer\r
2947 # @retval Rule Rule object\r
2948 #\r
2949 def __GetRuleFileStatements(self):\r
2950\r
2951 if not self.__IsKeyword("FILE"):\r
2952 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
2953\r
2954 if not self.__GetNextWord():\r
2955 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
2956\r
2957 Type = self.__Token.strip().upper()\r
2958 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
b303ea72 2959 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):\r
30fdf114
LG
2960 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2961\r
2962 if not self.__IsToken("="):\r
2963 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2964\r
2965 if not self.__IsKeyword("$(NAMED_GUID)"):\r
2966 if not self.__GetNextWord():\r
2967 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
2968 if self.__Token == 'PCD':\r
2969 if not self.__IsToken( "("):\r
2970 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2971 PcdPair = self.__GetNextPcdName()\r
2972 if not self.__IsToken( ")"):\r
2973 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2974 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2975 \r
2976 NameGuid = self.__Token\r
2977\r
2978 KeepReloc = None\r
2979 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2980 if self.__FileCouldHaveRelocFlag(Type):\r
2981 if self.__Token == 'RELOCS_STRIPPED':\r
2982 KeepReloc = False\r
2983 else:\r
2984 KeepReloc = True\r
2985 else:\r
2986 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2987\r
2988 KeyStringList = []\r
2989 if self.__GetNextToken():\r
2990 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2991 if Pattern.match(self.__Token):\r
2992 KeyStringList.append(self.__Token)\r
2993 if self.__IsToken(","):\r
2994 while self.__GetNextToken():\r
2995 if not Pattern.match(self.__Token):\r
2996 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2997 KeyStringList.append(self.__Token)\r
2998\r
2999 if not self.__IsToken(","):\r
3000 break\r
3001\r
3002 else:\r
3003 self.__UndoToken()\r
3004\r
3005\r
3006 Fixed = False\r
3007 if self.__IsKeyword("Fixed", True):\r
3008 Fixed = True\r
3009\r
3010 CheckSum = False\r
3011 if self.__IsKeyword("CheckSum", True):\r
3012 CheckSum = True\r
3013\r
3014 AlignValue = ""\r
3015 if self.__GetAlignment():\r
3016 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3017 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3018 AlignValue = self.__Token\r
3019\r
3020 if self.__IsToken("{"):\r
3021 # Complex file rule expected\r
3022 Rule = RuleComplexFile.RuleComplexFile()\r
3023 Rule.FvFileType = Type\r
3024 Rule.NameGuid = NameGuid\r
3025 Rule.Alignment = AlignValue\r
3026 Rule.CheckSum = CheckSum\r
3027 Rule.Fixed = Fixed\r
3028 Rule.KeyStringList = KeyStringList\r
3029 if KeepReloc != None:\r
3030 Rule.KeepReloc = KeepReloc\r
3031\r
3032 while True:\r
3033 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3034 IsLeaf = self.__GetEfiSection(Rule)\r
3035 if not IsEncapsulate and not IsLeaf:\r
3036 break\r
3037\r
3038 if not self.__IsToken("}"):\r
3039 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3040\r
3041 return Rule\r
3042\r
3043 elif self.__IsToken("|"):\r
3044 # Ext rule expected\r
3045 Ext = self.__GetFileExtension()\r
3046\r
3047 Rule = RuleSimpleFile.RuleSimpleFile()\r
3048\r
3049 Rule.FvFileType = Type\r
3050 Rule.NameGuid = NameGuid\r
3051 Rule.Alignment = AlignValue\r
3052 Rule.CheckSum = CheckSum\r
3053 Rule.Fixed = Fixed\r
3054 Rule.FileExtension = Ext\r
3055 Rule.KeyStringList = KeyStringList\r
3056 if KeepReloc != None:\r
3057 Rule.KeepReloc = KeepReloc\r
3058\r
3059 return Rule\r
3060\r
3061 else:\r
3062 # Simple file rule expected\r
3063 if not self.__GetNextWord():\r
3064 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3065\r
3066 SectionName = self.__Token\r
3067\r
3068 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3069 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
3070 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3071\r
3072\r
3073 if self.__IsKeyword("Fixed", True):\r
3074 Fixed = True\r
3075\r
3076 if self.__IsKeyword("CheckSum", True):\r
3077 CheckSum = True\r
3078\r
3079 if self.__GetAlignment():\r
3080 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3081 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3082 AlignValue = self.__Token\r
3083\r
3084 if not self.__GetNextToken():\r
3085 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3086\r
3087 Rule = RuleSimpleFile.RuleSimpleFile()\r
3088 Rule.SectionType = SectionName\r
3089 Rule.FvFileType = Type\r
3090 Rule.NameGuid = NameGuid\r
3091 Rule.Alignment = AlignValue\r
3092 Rule.CheckSum = CheckSum\r
3093 Rule.Fixed = Fixed\r
3094 Rule.FileName = self.__Token\r
3095 Rule.KeyStringList = KeyStringList\r
3096 if KeepReloc != None:\r
3097 Rule.KeepReloc = KeepReloc\r
3098 return Rule\r
3099\r
3100 ## __GetEfiSection() method\r
3101 #\r
3102 # Get section list for Rule\r
3103 #\r
3104 # @param self The object pointer\r
3105 # @param Obj for whom section is got\r
3106 # @retval True Successfully find section statement\r
3107 # @retval False Not able to find section statement\r
3108 #\r
3109 def __GetEfiSection(self, Obj):\r
3110\r
3111 OldPos = self.GetFileBufferPos()\r
3112 if not self.__GetNextWord():\r
3113 return False\r
3114 SectionName = self.__Token\r
3115\r
3116 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3117 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3118 self.__UndoToken()\r
3119 return False\r
3120\r
3121 if SectionName == "FV_IMAGE":\r
3122 FvImageSectionObj = FvImageSection.FvImageSection()\r
3123 if self.__IsKeyword("FV_IMAGE"):\r
3124 pass\r
3125 if self.__IsToken( "{"):\r
3126 FvObj = Fv.FV()\r
3127 self.__GetDefineStatements(FvObj)\r
3128 self.__GetBlockStatement(FvObj)\r
3129 self.__GetSetStatements(FvObj)\r
3130 self.__GetFvAlignment(FvObj)\r
3131 self.__GetFvAttributes(FvObj)\r
3132 self.__GetAprioriSection(FvObj)\r
3133 self.__GetAprioriSection(FvObj)\r
3134\r
3135 while True:\r
3136 IsInf = self.__GetInfStatement(FvObj)\r
3137 IsFile = self.__GetFileStatement(FvObj)\r
3138 if not IsInf and not IsFile:\r
3139 break\r
3140\r
3141 if not self.__IsToken( "}"):\r
3142 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3143 FvImageSectionObj.Fv = FvObj\r
3144 FvImageSectionObj.FvName = None\r
3145\r
3146 else:\r
3147 if not self.__IsKeyword("FV"):\r
3148 raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
3149 FvImageSectionObj.FvFileType = self.__Token\r
3150\r
3151 if self.__GetAlignment():\r
3152 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3153 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3154 FvImageSectionObj.Alignment = self.__Token\r
3155\r
3156 if self.__IsKeyword("FV"):\r
3157 FvImageSectionObj.FvFileType = self.__Token\r
3158\r
3159 if self.__GetAlignment():\r
3160 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3161 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3162 FvImageSectionObj.Alignment = self.__Token\r
3163\r
3164 if self.__IsToken('|'):\r
3165 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3166 elif self.__GetNextToken():\r
3167 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3168 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3169 FvImageSectionObj.FvFileName = self.__Token\r
3170 else:\r
3171 self.__UndoToken()\r
3172 else:\r
3173 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3174\r
3175 Obj.SectionList.append(FvImageSectionObj)\r
3176 return True\r
3177\r
3178 EfiSectionObj = EfiSection.EfiSection()\r
3179 EfiSectionObj.SectionType = SectionName\r
3180\r
3181 if not self.__GetNextToken():\r
3182 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3183\r
3184 if self.__Token == "STRING":\r
3185 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3186 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3187\r
3188 if not self.__IsToken('='):\r
3189 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3190\r
3191 if not self.__GetNextToken():\r
3192 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3193\r
3194 if self.__GetStringData():\r
3195 EfiSectionObj.StringData = self.__Token\r
3196\r
3197 if self.__IsKeyword("BUILD_NUM"):\r
3198 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3199 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3200\r
3201 if not self.__IsToken("="):\r
3202 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3203 if not self.__GetNextToken():\r
3204 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3205 EfiSectionObj.BuildNum = self.__Token\r
3206\r
3207 else:\r
3208 EfiSectionObj.FileType = self.__Token\r
3209 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3210\r
3211 if self.__IsKeyword("Optional"):\r
3212 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3213 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3214 EfiSectionObj.Optional = True\r
3215\r
3216 if self.__IsKeyword("BUILD_NUM"):\r
3217 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3218 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3219\r
3220 if not self.__IsToken("="):\r
3221 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3222 if not self.__GetNextToken():\r
3223 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3224 EfiSectionObj.BuildNum = self.__Token\r
3225\r
3226 if self.__GetAlignment():\r
3227 EfiSectionObj.Alignment = self.__Token\r
3228\r
3229 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3230 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3231 if self.__Token == 'RELOCS_STRIPPED':\r
3232 EfiSectionObj.KeepReloc = False\r
3233 else:\r
3234 EfiSectionObj.KeepReloc = True\r
3235 if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
3236 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3237 else:\r
3238 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3239\r
3240\r
3241 if self.__IsToken('|'):\r
3242 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3243 elif self.__GetNextToken():\r
3244 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3245 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3246 \r
3247 if self.__Token.startswith('PCD'):\r
3248 self.__UndoToken()\r
3249 self.__GetNextWord()\r
3250 \r
3251 if self.__Token == 'PCD':\r
3252 if not self.__IsToken( "("):\r
3253 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3254 PcdPair = self.__GetNextPcdName()\r
3255 if not self.__IsToken( ")"):\r
3256 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3257 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3258 \r
3259 EfiSectionObj.FileName = self.__Token \r
3260 \r
3261 else:\r
3262 self.__UndoToken()\r
3263 else:\r
3264 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
3265\r
3266 Obj.SectionList.append(EfiSectionObj)\r
3267 return True\r
3268\r
3269 ## __RuleSectionCouldBeOptional() method\r
3270 #\r
3271 # Get whether a section could be optional\r
3272 #\r
3273 # @param self The object pointer\r
3274 # @param SectionType The section type to check\r
3275 # @retval True section could be optional\r
3276 # @retval False section never optional\r
3277 #\r
3278 def __RuleSectionCouldBeOptional(self, SectionType):\r
3279 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3280 return True\r
3281 else:\r
3282 return False\r
3283\r
3284 ## __RuleSectionCouldHaveBuildNum() method\r
3285 #\r
3286 # Get whether a section could have build number information\r
3287 #\r
3288 # @param self The object pointer\r
3289 # @param SectionType The section type to check\r
3290 # @retval True section could have build number information\r
3291 # @retval False section never have build number information\r
3292 #\r
3293 def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
3294 if SectionType in ("VERSION"):\r
3295 return True\r
3296 else:\r
3297 return False\r
3298\r
3299 ## __RuleSectionCouldHaveString() method\r
3300 #\r
3301 # Get whether a section could have string\r
3302 #\r
3303 # @param self The object pointer\r
3304 # @param SectionType The section type to check\r
3305 # @retval True section could have string\r
3306 # @retval False section never have string\r
3307 #\r
3308 def __RuleSectionCouldHaveString(self, SectionType):\r
3309 if SectionType in ("UI", "VERSION"):\r
3310 return True\r
3311 else:\r
3312 return False\r
3313\r
3314 ## __CheckRuleSectionFileType() method\r
3315 #\r
3316 # Get whether a section matches a file type\r
3317 #\r
3318 # @param self The object pointer\r
3319 # @param SectionType The section type to check\r
3320 # @param FileType The file type to check\r
3321 #\r
3322 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
3323 if SectionType == "COMPAT16":\r
3324 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
3325 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3326 elif SectionType == "PE32":\r
3327 if FileType not in ("PE32", "SEC_PE32"):\r
3328 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3329 elif SectionType == "PIC":\r
3330 if FileType not in ("PIC", "PIC"):\r
3331 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3332 elif SectionType == "TE":\r
3333 if FileType not in ("TE", "SEC_TE"):\r
3334 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3335 elif SectionType == "RAW":\r
3336 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
3337 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
3338 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
3339 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
3340 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3341 elif SectionType == "UI":\r
3342 if FileType not in ("UI", "SEC_UI"):\r
3343 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3344 elif SectionType == "VERSION":\r
3345 if FileType not in ("VERSION", "SEC_VERSION"):\r
3346 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3347 elif SectionType == "PEI_DEPEX":\r
3348 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
3349 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3350 elif SectionType == "GUID":\r
3351 if FileType not in ("PE32", "SEC_GUID"):\r
3352 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3353\r
3354 ## __GetRuleEncapsulationSection() method\r
3355 #\r
3356 # Get encapsulation section for Rule\r
3357 #\r
3358 # @param self The object pointer\r
3359 # @param Rule for whom section is got\r
3360 # @retval True Successfully find section statement\r
3361 # @retval False Not able to find section statement\r
3362 #\r
3363 def __GetRuleEncapsulationSection(self, Rule):\r
3364\r
3365 if self.__IsKeyword( "COMPRESS"):\r
3366 Type = "PI_STD"\r
3367 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3368 Type = self.__Token\r
3369\r
3370 if not self.__IsToken("{"):\r
3371 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3372\r
3373 CompressSectionObj = CompressSection.CompressSection()\r
3374\r
3375 CompressSectionObj.CompType = Type\r
3376 # Recursive sections...\r
3377 while True:\r
3378 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
3379 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
3380 if not IsEncapsulate and not IsLeaf:\r
3381 break\r
3382\r
3383 if not self.__IsToken( "}"):\r
3384 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3385 Rule.SectionList.append(CompressSectionObj)\r
3386\r
3387 return True\r
3388\r
3389 elif self.__IsKeyword( "GUIDED"):\r
3390 GuidValue = None\r
3391 if self.__GetNextGuid():\r
3392 GuidValue = self.__Token\r
3393\r
3394 if self.__IsKeyword( "$(NAMED_GUID)"):\r
3395 GuidValue = self.__Token\r
3396\r
3397 AttribDict = self.__GetGuidAttrib()\r
3398\r
3399 if not self.__IsToken("{"):\r
3400 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3401 GuidSectionObj = GuidSection.GuidSection()\r
3402 GuidSectionObj.NameGuid = GuidValue\r
3403 GuidSectionObj.SectionType = "GUIDED"\r
3404 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3405 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
3406\r
3407 # Efi sections...\r
3408 while True:\r
3409 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
3410 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
3411 if not IsEncapsulate and not IsLeaf:\r
3412 break\r
3413\r
3414 if not self.__IsToken( "}"):\r
3415 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3416 Rule.SectionList.append(GuidSectionObj)\r
3417\r
3418 return True\r
3419\r
3420 return False\r
3421\r
3422 ## __GetVtf() method\r
3423 #\r
3424 # Get VTF section contents and store its data into VTF list of self.Profile\r
3425 #\r
3426 # @param self The object pointer\r
3427 # @retval True Successfully find a VTF\r
3428 # @retval False Not able to find a VTF\r
3429 #\r
3430 def __GetVtf(self):\r
3431\r
3432 if not self.__GetNextToken():\r
3433 return False\r
3434\r
3435 S = self.__Token.upper()\r
3436 if S.startswith("[") and not S.startswith("[VTF."):\r
3437 if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
3438 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
3439 self.__UndoToken()\r
3440 return False\r
3441\r
3442 self.__UndoToken()\r
3443 if not self.__IsToken("[VTF.", True):\r
3444 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3445 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3446 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3447 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
3448\r
3449 if not self.__SkipToToken("."):\r
3450 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3451\r
3452 Arch = self.__SkippedChars.rstrip(".").upper()\r
3453 if Arch not in ("IA32", "X64", "IPF", "ARM"):\r
3454 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3455\r
3456 if not self.__GetNextWord():\r
3457 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
3458 Name = self.__Token.upper()\r
3459\r
3460 VtfObj = Vtf.Vtf()\r
3461 VtfObj.UiName = Name\r
3462 VtfObj.KeyArch = Arch\r
3463\r
3464 if self.__IsToken(","):\r
3465 if not self.__GetNextWord():\r
3466 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
3467 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM"):\r
3468 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3469 VtfObj.ArchList = self.__Token.upper()\r
3470\r
3471 if not self.__IsToken( "]"):\r
3472 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3473\r
3474 if self.__IsKeyword("IA32_RST_BIN"):\r
3475 if not self.__IsToken("="):\r
3476 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3477\r
3478 if not self.__GetNextToken():\r
3479 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
3480\r
3481 VtfObj.ResetBin = self.__Token\r
3482\r
3483 while self.__GetComponentStatement(VtfObj):\r
3484 pass\r
3485\r
3486 self.Profile.VtfList.append(VtfObj)\r
3487 return True\r
3488\r
3489 ## __GetComponentStatement() method\r
3490 #\r
3491 # Get components in VTF\r
3492 #\r
3493 # @param self The object pointer\r
3494 # @param VtfObj for whom component is got\r
3495 # @retval True Successfully find a component\r
3496 # @retval False Not able to find a component\r
3497 #\r
3498 def __GetComponentStatement(self, VtfObj):\r
3499\r
3500 if not self.__IsKeyword("COMP_NAME"):\r
3501 return False\r
3502\r
3503 if not self.__IsToken("="):\r
3504 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3505\r
3506 if not self.__GetNextWord():\r
3507 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
3508\r
3509 CompStatementObj = ComponentStatement.ComponentStatement()\r
3510 CompStatementObj.CompName = self.__Token\r
3511\r
3512 if not self.__IsKeyword("COMP_LOC"):\r
3513 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
3514\r
3515 if not self.__IsToken("="):\r
3516 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3517\r
3518 CompStatementObj.CompLoc = ""\r
3519 if self.__GetNextWord():\r
3520 CompStatementObj.CompLoc = self.__Token\r
3521 if self.__IsToken('|'):\r
3522 if not self.__GetNextWord():\r
3523 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
3524\r
3525 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
3526 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3527\r
3528 CompStatementObj.FilePos = self.__Token\r
3529 else:\r
3530 self.CurrentLineNumber += 1\r
3531 self.CurrentOffsetWithinLine = 0\r
3532\r
3533 if not self.__IsKeyword("COMP_TYPE"):\r
3534 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
3535\r
3536 if not self.__IsToken("="):\r
3537 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3538\r
3539 if not self.__GetNextToken():\r
3540 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
3541 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
3542 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
3543 not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
3544 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3545 CompStatementObj.CompType = self.__Token\r
3546\r
3547 if not self.__IsKeyword("COMP_VER"):\r
3548 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
3549\r
3550 if not self.__IsToken("="):\r
3551 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3552\r
3553 if not self.__GetNextToken():\r
3554 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
3555\r
3556 Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')\r
3557 if Pattern.match(self.__Token) == None:\r
3558 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3559 CompStatementObj.CompVer = self.__Token\r
3560\r
3561 if not self.__IsKeyword("COMP_CS"):\r
3562 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
3563\r
3564 if not self.__IsToken("="):\r
3565 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3566\r
3567 if not self.__GetNextToken():\r
3568 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
3569 if self.__Token not in ("1", "0"):\r
3570 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3571 CompStatementObj.CompCs = self.__Token\r
3572\r
3573\r
3574 if not self.__IsKeyword("COMP_BIN"):\r
3575 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
3576\r
3577 if not self.__IsToken("="):\r
3578 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3579\r
3580 if not self.__GetNextToken():\r
3581 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
3582\r
3583 CompStatementObj.CompBin = self.__Token\r
3584\r
3585 if not self.__IsKeyword("COMP_SYM"):\r
3586 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
3587\r
3588 if not self.__IsToken("="):\r
3589 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3590\r
3591 if not self.__GetNextToken():\r
3592 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
3593\r
3594 CompStatementObj.CompSym = self.__Token\r
3595\r
3596 if not self.__IsKeyword("COMP_SIZE"):\r
3597 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
3598\r
3599 if not self.__IsToken("="):\r
3600 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3601\r
3602 if self.__IsToken("-"):\r
3603 CompStatementObj.CompSize = self.__Token\r
3604 elif self.__GetNextDecimalNumber():\r
3605 CompStatementObj.CompSize = self.__Token\r
3606 elif self.__GetNextHexNumber():\r
3607 CompStatementObj.CompSize = self.__Token\r
3608 else:\r
3609 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3610\r
3611 VtfObj.ComponentStatementList.append(CompStatementObj)\r
3612 return True\r
3613\r
3614 ## __GetOptionRom() method\r
3615 #\r
3616 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
3617 #\r
3618 # @param self The object pointer\r
3619 # @retval True Successfully find a OptionROM\r
3620 # @retval False Not able to find a OptionROM\r
3621 #\r
3622 def __GetOptionRom(self):\r
3623\r
3624 if not self.__GetNextToken():\r
3625 return False\r
3626\r
3627 S = self.__Token.upper()\r
3628 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
3629 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
3630 \r
3631 self.__UndoToken()\r
3632 if not self.__IsToken("[OptionRom.", True):\r
3633 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3634\r
3635 OptRomName = self.__GetUiName()\r
3636\r
3637 if not self.__IsToken( "]"):\r
3638 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3639\r
3640 OptRomObj = OptionRom.OPTIONROM()\r
3641 OptRomObj.DriverName = OptRomName\r
3642 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
3643\r
3644 while True:\r
3645 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
3646 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
3647 if not isInf and not isFile:\r
3648 break\r
3649 \r
3650 return True\r
3651\r
3652 ## __GetOptRomInfStatement() method\r
3653 #\r
3654 # Get INF statements\r
3655 #\r
3656 # @param self The object pointer\r
3657 # @param Obj for whom inf statement is got\r
3658 # @retval True Successfully find inf statement\r
3659 # @retval False Not able to find inf statement\r
3660 #\r
3661 def __GetOptRomInfStatement(self, Obj):\r
3662\r
3663 if not self.__IsKeyword( "INF"):\r
3664 return False\r
3665\r
3666 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
3667 self.__GetInfOptions( ffsInf)\r
3668\r
3669 if not self.__GetNextToken():\r
3670 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
3671 ffsInf.InfFileName = self.__Token\r
3672\r
3673 if not ffsInf.InfFileName in self.Profile.InfList:\r
3674 self.Profile.InfList.append(ffsInf.InfFileName)\r
3675\r
3676 \r
3677 self.__GetOptRomOverrides (ffsInf)\r
3678 \r
3679 Obj.FfsList.append(ffsInf)\r
3680 return True\r
3681\r
3682 ## __GetOptRomOverrides() method\r
3683 #\r
3684 # Get overrides for OptROM INF & FILE\r
3685 #\r
3686 # @param self The object pointer\r
3687 # @param FfsInfObj for whom overrides is got\r
3688 #\r
3689 def __GetOptRomOverrides(self, Obj):\r
3690 if self.__IsToken('{'):\r
3691 Overrides = OptionRom.OverrideAttribs()\r
fd171542 3692 while True:\r
3693 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
3694 if not self.__IsToken( "="):\r
3695 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3696 if not self.__GetNextHexNumber():\r
3697 raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
3698 Overrides.PciVendorId = self.__Token\r
3699 continue\r
3700\r
3701 if self.__IsKeyword( "PCI_CLASS_CODE"):\r
3702 if not self.__IsToken( "="):\r
3703 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3704 if not self.__GetNextHexNumber():\r
3705 raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
3706 Overrides.PciClassCode = self.__Token\r
3707 continue\r
3708\r
3709 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
3710 if not self.__IsToken( "="):\r
3711 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3712 if not self.__GetNextHexNumber():\r
3713 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
3714\r
3715 Overrides.PciDeviceId = self.__Token\r
3716 continue\r
3717\r
3718 if self.__IsKeyword( "PCI_REVISION"):\r
3719 if not self.__IsToken( "="):\r
3720 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3721 if not self.__GetNextHexNumber():\r
3722 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
3723 Overrides.PciRevision = self.__Token\r
3724 continue\r
3725\r
3726 if self.__IsKeyword( "COMPRESS"):\r
3727 if not self.__IsToken( "="):\r
3728 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3729 if not self.__GetNextToken():\r
3730 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
3731 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
3732 continue\r
3733\r
3734 if self.__IsToken( "}"):\r
3735 break\r
3736 else:\r
3737 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
3738\r
30fdf114
LG
3739 Obj.OverrideAttribs = Overrides\r
3740 \r
3741 ## __GetOptRomFileStatement() method\r
3742 #\r
3743 # Get FILE statements\r
3744 #\r
3745 # @param self The object pointer\r
3746 # @param Obj for whom FILE statement is got\r
3747 # @retval True Successfully find FILE statement\r
3748 # @retval False Not able to find FILE statement\r
3749 #\r
3750 def __GetOptRomFileStatement(self, Obj):\r
3751\r
3752 if not self.__IsKeyword( "FILE"):\r
3753 return False\r
3754\r
3755 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
3756\r
3757 if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
3758 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
3759 FfsFileObj.FileType = self.__Token\r
3760\r
3761 if not self.__GetNextToken():\r
3762 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
3763 FfsFileObj.FileName = self.__Token\r
3764\r
3765 if FfsFileObj.FileType == 'EFI':\r
3766 self.__GetOptRomOverrides(FfsFileObj)\r
3767 \r
3768 Obj.FfsList.append(FfsFileObj)\r
3769\r
3770 return True\r
fd171542 3771\r
3772 ## __GetCapInFd() method\r
3773 #\r
3774 # Get Cap list contained in FD\r
3775 #\r
3776 # @param self The object pointer\r
3777 # @param FdName FD name\r
3778 # @retval CapList List of Capsule in FD\r
3779 #\r
3780 def __GetCapInFd (self, FdName):\r
3781\r
3782 CapList = []\r
3783 if FdName.upper() in self.Profile.FdDict.keys():\r
3784 FdObj = self.Profile.FdDict[FdName.upper()]\r
3785 for elementRegion in FdObj.RegionList:\r
3786 if elementRegion.RegionType == 'CAPSULE':\r
3787 for elementRegionData in elementRegion.RegionDataList:\r
3788 if elementRegionData.endswith(".cap"):\r
3789 continue\r
3790 if elementRegionData != None and elementRegionData.upper() not in CapList:\r
3791 CapList.append(elementRegionData.upper())\r
3792 return CapList\r
3793\r
3794 ## __GetReferencedFdCapTuple() method\r
3795 #\r
3796 # Get FV and FD list referenced by a capsule image\r
3797 #\r
3798 # @param self The object pointer\r
3799 # @param CapObj Capsule section to be searched\r
3800 # @param RefFdList referenced FD by section\r
3801 # @param RefFvList referenced FV by section\r
3802 #\r
3803 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
3804\r
3805 for CapsuleDataObj in CapObj.CapsuleDataList :\r
3806 if CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
3807 RefFvList.append (CapsuleDataObj.FvName.upper())\r
3808 elif CapsuleDataObj.Ffs != None:\r
3809 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
3810 if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
3811 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
3812 elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
3813 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
3814 else:\r
3815 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
3816\r
30fdf114
LG
3817 ## __GetFvInFd() method\r
3818 #\r
3819 # Get FV list contained in FD\r
3820 #\r
3821 # @param self The object pointer\r
3822 # @param FdName FD name\r
3823 # @retval FvList list of FV in FD\r
3824 #\r
3825 def __GetFvInFd (self, FdName):\r
3826\r
3827 FvList = []\r
3828 if FdName.upper() in self.Profile.FdDict.keys():\r
3829 FdObj = self.Profile.FdDict[FdName.upper()]\r
3830 for elementRegion in FdObj.RegionList:\r
3831 if elementRegion.RegionType == 'FV':\r
3832 for elementRegionData in elementRegion.RegionDataList:\r
fd171542 3833 if elementRegionData.endswith(".fv"):\r
3834 continue\r
30fdf114
LG
3835 if elementRegionData != None and elementRegionData.upper() not in FvList:\r
3836 FvList.append(elementRegionData.upper())\r
3837 return FvList\r
3838\r
3839 ## __GetReferencedFdFvTuple() method\r
3840 #\r
3841 # Get FD and FV list referenced by a FFS file\r
3842 #\r
3843 # @param self The object pointer\r
3844 # @param FfsFile contains sections to be searched\r
3845 # @param RefFdList referenced FD by section\r
3846 # @param RefFvList referenced FV by section\r
3847 #\r
3848 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
3849\r
3850 for FfsObj in FvObj.FfsList:\r
3851 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
3852 if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList:\r
3853 RefFvList.append(FfsObj.FvName.upper())\r
3854 elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList:\r
3855 RefFdList.append(FfsObj.FdName.upper())\r
3856 else:\r
3857 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
3858\r
3859 ## __GetReferencedFdFvTupleFromSection() method\r
3860 #\r
3861 # Get FD and FV list referenced by a FFS section\r
3862 #\r
3863 # @param self The object pointer\r
3864 # @param FfsFile contains sections to be searched\r
3865 # @param FdList referenced FD by section\r
3866 # @param FvList referenced FV by section\r
3867 #\r
3868 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
3869\r
3870 SectionStack = []\r
3871 SectionStack.extend(FfsFile.SectionList)\r
3872 while SectionStack != []:\r
3873 SectionObj = SectionStack.pop()\r
3874 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
3875 if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList:\r
3876 FvList.append(SectionObj.FvName.upper())\r
3877 if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
3878 FvList.append(SectionObj.Fv.UiFvName.upper())\r
3879 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
3880\r
3881 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
3882 SectionStack.extend(SectionObj.SectionList)\r
3883\r
3884 ## CycleReferenceCheck() method\r
3885 #\r
3886 # Check whether cycle reference exists in FDF\r
3887 #\r
3888 # @param self The object pointer\r
3889 # @retval True cycle reference exists\r
3890 # @retval False Not exists cycle reference\r
3891 #\r
3892 def CycleReferenceCheck(self):\r
fd171542 3893 #\r
3894 # Check the cycle between FV and FD image\r
3895 #\r
3896 MaxLength = len (self.Profile.FvDict)\r
3897 for FvName in self.Profile.FvDict.keys():\r
3898 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
3899 RefFvStack = []\r
3900 RefFvStack.append(FvName)\r
3901 FdAnalyzedList = []\r
3902 \r
3903 Index = 0\r
3904 while RefFvStack != [] and Index < MaxLength:\r
3905 Index = Index + 1\r
3906 FvNameFromStack = RefFvStack.pop()\r
3907 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
3908 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
3909 else:\r
3910 continue\r
30fdf114 3911\r
fd171542 3912 RefFdList = []\r
3913 RefFvList = []\r
3914 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
30fdf114 3915\r
fd171542 3916 for RefFdName in RefFdList:\r
3917 if RefFdName in FdAnalyzedList:\r
30fdf114
LG
3918 continue\r
3919\r
fd171542 3920 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
3921 FvInFdList = self.__GetFvInFd(RefFdName)\r
3922 if FvInFdList != []:\r
3923 for FvNameInFd in FvInFdList:\r
3924 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
3925 if FvNameInFd not in RefFvStack:\r
3926 RefFvStack.append(FvNameInFd)\r
3927\r
3928 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
3929 EdkLogger.info(LogStr)\r
3930 return True\r
3931 FdAnalyzedList.append(RefFdName)\r
30fdf114 3932\r
fd171542 3933 for RefFvName in RefFvList:\r
3934 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
3935 if RefFvName not in RefFvStack:\r
3936 RefFvStack.append(RefFvName)\r
3937\r
3938 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
3939 EdkLogger.info(LogStr)\r
3940 return True\r
3941\r
3942 #\r
3943 # Check the cycle between Capsule and FD image\r
3944 #\r
3945 MaxLength = len (self.Profile.CapsuleDict)\r
3946 for CapName in self.Profile.CapsuleDict.keys():\r
3947 #\r
3948 # Capsule image to be checked.\r
3949 #\r
3950 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
3951 RefCapStack = []\r
3952 RefCapStack.append(CapName)\r
3953 FdAnalyzedList = []\r
3954 FvAnalyzedList = []\r
3955 \r
3956 Index = 0\r
3957 while RefCapStack != [] and Index < MaxLength:\r
3958 Index = Index + 1\r
3959 CapNameFromStack = RefCapStack.pop()\r
3960 if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
3961 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
3962 else:\r
3963 continue\r
3964\r
3965 RefFvList = []\r
3966 RefFdList = []\r
3967 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
3968\r
3969 FvListLength = 0\r
3970 FdListLength = 0\r
3971 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
30fdf114
LG
3972 for RefFdName in RefFdList:\r
3973 if RefFdName in FdAnalyzedList:\r
3974 continue\r
3975\r
fd171542 3976 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
3977 CapInFdList = self.__GetCapInFd(RefFdName)\r
3978 if CapInFdList != []:\r
3979 for CapNameInFd in CapInFdList:\r
3980 LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
3981 if CapNameInFd not in RefCapStack:\r
3982 RefCapStack.append(CapNameInFd)\r
3983\r
3984 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
3985 EdkLogger.info(LogStr)\r
3986 return True\r
3987\r
30fdf114
LG
3988 FvInFdList = self.__GetFvInFd(RefFdName)\r
3989 if FvInFdList != []:\r
fd171542 3990 for FvNameInFd in FvInFdList:\r
3991 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
3992 if FvNameInFd not in RefFvList:\r
3993 RefFvList.append(FvNameInFd)\r
30fdf114 3994\r
fd171542 3995 FdAnalyzedList.append(RefFdName)\r
3996 #\r
3997 # the number of the parsed FV and FD image\r
3998 #\r
3999 FvListLength = len (RefFvList)\r
4000 FdListLength = len (RefFdList)\r
30fdf114 4001 for RefFvName in RefFvList:\r
fd171542 4002 if RefFvName in FvAnalyzedList:\r
4003 continue\r
4004 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
4005 if RefFvName.upper() in self.Profile.FvDict.keys():\r
4006 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4007 else:\r
4008 continue\r
4009 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4010 FvAnalyzedList.append(RefFvName)\r
30fdf114 4011\r
fd171542 4012 return False\r
30fdf114
LG
4013\r
4014if __name__ == "__main__":\r
4015 parser = FdfParser("..\LakeportX64Pkg.fdf")\r
4016 try:\r
4017 parser.ParseFile()\r
4018 parser.CycleReferenceCheck()\r
4019 except Warning, X:\r
4020 print str(X)\r
4021 else:\r
4022 print "Success!"\r
4023\r