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