]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FdfParser.py
Sync EDKII BaseTools to BaseTools project r1988
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
CommitLineData
30fdf114
LG
1## @file\r
2# parse FDF file\r
3#\r
40d841f6 4# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
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
52302d4d 43from GenFdsGlobalVariable import GenFdsGlobalVariable\r
30fdf114
LG
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
52302d4d 176 self.FdNameNotSet = False\r
30fdf114 177 self.FvDict = {}\r
fd171542 178 self.CapsuleDict = {}\r
30fdf114
LG
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
d5d56f1b
LG
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
30fdf114
LG
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
d5d56f1b 563 \r
30fdf114
LG
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
d5d56f1b
LG
602 \r
603 MacroName, NotFlag = self.__GetMacroName() \r
30fdf114
LG
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
d5d56f1b 657 MacroName, NotFlag = self.__GetMacroName() \r
30fdf114
LG
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
52302d4d
LG
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
30fdf114 1313 self.CurrentFdName = FdName.upper()\r
52302d4d
LG
1314 \r
1315 if self.CurrentFdName in self.Profile.FdDict:\r
1316 raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
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
52302d4d
LG
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
30fdf114
LG
1328 Status = self.__GetCreateFile(FdObj)\r
1329 if not Status:\r
1330 raise Warning("FD name error", self.FileName, self.CurrentLineNumber)\r
1331\r
52302d4d 1332 self.__GetTokenStatements(FdObj)\r
30fdf114
LG
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
30fdf114
LG
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
52302d4d 1436 self.__GetBlockStatements(Obj)\r
30fdf114
LG
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
30fdf114
LG
1475 #\r
1476 def __GetBlockStatements(self, Obj):\r
1477\r
1478 if not self.__GetBlockStatement(Obj):\r
52302d4d
LG
1479 #set default block size is 1\r
1480 Obj.BlockSizeList.append((1, Obj.Size, None))\r
1481 return\r
30fdf114
LG
1482\r
1483 while self.__GetBlockStatement(Obj):\r
1484 pass\r
52302d4d
LG
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
30fdf114
LG
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
52302d4d 1515 BlockSize = long(BlockSize, 0)\r
30fdf114
LG
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
fd171542 1641 if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):\r
30fdf114
LG
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
fd171542 1658 elif self.__Token == "FV":\r
30fdf114
LG
1659 self.__UndoToken()\r
1660 self.__GetRegionFvType( RegionObj)\r
1661\r
fd171542 1662 elif self.__Token == "CAPSULE":\r
1663 self.__UndoToken()\r
1664 self.__GetRegionCapType( RegionObj)\r
1665\r
30fdf114
LG
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
fd171542 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
30fdf114
LG
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
636f2be6
LG
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
30fdf114
LG
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
636f2be6
LG
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
30fdf114
LG
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
b303ea72
LG
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
30fdf114
LG
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
b303ea72
LG
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
30fdf114
LG
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
30fdf114
LG
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
9053bc51 2391 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2392 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2393 #For FFS, Auto is default option same to ""\r
2394 if not self.__Token == "Auto":\r
2395 FfsFileObj.Alignment = self.__Token\r
30fdf114
LG
2396\r
2397 ## __GetAlignment() method\r
2398 #\r
2399 # Return the alignment value\r
2400 #\r
2401 # @param self The object pointer\r
2402 # @retval True Successfully find alignment\r
2403 # @retval False Not able to find alignment\r
2404 #\r
2405 def __GetAlignment(self):\r
2406 if self.__IsKeyword( "Align", True):\r
2407 if not self.__IsToken( "="):\r
2408 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2409\r
2410 if not self.__GetNextToken():\r
2411 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2412 return True\r
2413\r
2414 return False\r
2415\r
2416 ## __GetFilePart() method\r
2417 #\r
2418 # Get section data for FILE statement\r
2419 #\r
2420 # @param self The object pointer\r
2421 # @param FfsFileObj for whom section is got\r
2422 # @param MacroDict dictionary used to replace macro\r
2423 #\r
2424 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2425 Dict = {}\r
2426 Dict.update(MacroDict)\r
2427\r
2428 self.__GetDefineStatements(FfsFileObj)\r
2429\r
2430 Dict.update(FfsFileObj.DefineVarDict)\r
2431 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2432 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2433\r
2434 while True:\r
2435 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2436 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2437 if not IsLeafSection and not IsEncapSection:\r
2438 break\r
2439\r
2440 ## __GetLeafSection() method\r
2441 #\r
2442 # Get leaf section for Obj\r
2443 #\r
2444 # @param self The object pointer\r
2445 # @param Obj for whom leaf section is got\r
2446 # @param MacroDict dictionary used to replace macro\r
2447 # @retval True Successfully find section statement\r
2448 # @retval False Not able to find section statement\r
2449 #\r
2450 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2451\r
2452 OldPos = self.GetFileBufferPos()\r
2453\r
2454 if not self.__IsKeyword( "SECTION"):\r
2455 if len(Obj.SectionList) == 0:\r
2456 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2457 else:\r
2458 return False\r
2459\r
2460 AlignValue = None\r
2461 if self.__GetAlignment():\r
52302d4d
LG
2462 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2463 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2464 AlignValue = self.__Token\r
2465\r
2466 BuildNum = None\r
2467 if self.__IsKeyword( "BUILD_NUM"):\r
2468 if not self.__IsToken( "="):\r
2469 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2470\r
2471 if not self.__GetNextToken():\r
2472 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2473\r
2474 BuildNum = self.__Token\r
2475\r
2476 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2477 if AlignValue == 'Auto':\r
2478 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2479 if not self.__IsToken( "="):\r
2480 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2481 if not self.__GetNextToken():\r
2482 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2483 VerSectionObj = VerSection.VerSection()\r
2484 VerSectionObj.Alignment = AlignValue\r
2485 VerSectionObj.BuildNum = BuildNum\r
2486 if self.__GetStringData():\r
2487 VerSectionObj.StringData = self.__Token\r
2488 else:\r
2489 VerSectionObj.FileName = self.__Token\r
2490 Obj.SectionList.append(VerSectionObj)\r
52302d4d 2491 \r
30fdf114 2492 elif self.__IsKeyword( "UI"):\r
52302d4d
LG
2493 if AlignValue == 'Auto':\r
2494 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2495 if not self.__IsToken( "="):\r
2496 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2497 if not self.__GetNextToken():\r
2498 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2499 UiSectionObj = UiSection.UiSection()\r
2500 UiSectionObj.Alignment = AlignValue\r
2501 if self.__GetStringData():\r
2502 UiSectionObj.StringData = self.__Token\r
2503 else:\r
2504 UiSectionObj.FileName = self.__Token\r
2505 Obj.SectionList.append(UiSectionObj)\r
2506\r
2507 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2508 if AlignValue == 'Auto':\r
2509 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2510 if not self.__IsToken( "="):\r
2511 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2512 if not self.__GetNextToken():\r
2513 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2514\r
2515 FvName = self.__Token\r
2516 FvObj = None\r
2517\r
2518 if self.__IsToken( "{"):\r
2519 FvObj = Fv.FV()\r
2520 FvObj.UiFvName = FvName.upper()\r
2521 self.__GetDefineStatements(FvObj)\r
2522 MacroDict.update(FvObj.DefineVarDict)\r
2523 self.__GetBlockStatement(FvObj)\r
2524 self.__GetSetStatements(FvObj)\r
2525 self.__GetFvAlignment(FvObj)\r
2526 self.__GetFvAttributes(FvObj)\r
2527 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2528 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2529\r
2530 while True:\r
2531 IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
2532 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2533 if not IsInf and not IsFile:\r
2534 break\r
2535\r
2536 if not self.__IsToken( "}"):\r
2537 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2538\r
2539 FvImageSectionObj = FvImageSection.FvImageSection()\r
2540 FvImageSectionObj.Alignment = AlignValue\r
2541 if FvObj != None:\r
2542 FvImageSectionObj.Fv = FvObj\r
2543 FvImageSectionObj.FvName = None\r
2544 else:\r
2545 FvImageSectionObj.FvName = FvName.upper()\r
2546 FvImageSectionObj.FvFileName = FvName\r
2547\r
2548 Obj.SectionList.append(FvImageSectionObj)\r
2549\r
2550 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
2551 if AlignValue == 'Auto':\r
2552 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2553 DepexSectionObj = DepexSection.DepexSection()\r
2554 DepexSectionObj.Alignment = AlignValue\r
2555 DepexSectionObj.DepexType = self.__Token\r
2556\r
2557 if not self.__IsToken( "="):\r
2558 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2559 if not self.__IsToken( "{"):\r
2560 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2561 if not self.__SkipToToken( "}"):\r
2562 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
2563\r
2564 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2565 Obj.SectionList.append(DepexSectionObj)\r
2566\r
2567 else:\r
30fdf114
LG
2568 if not self.__GetNextWord():\r
2569 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
2570\r
2571 # Encapsulation section appear, UndoToken and return\r
2572 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2573 self.SetFileBufferPos(OldPos)\r
2574 return False\r
2575\r
2576 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2577 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2578 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2579 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2580 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2581\r
30fdf114
LG
2582 # DataSection\r
2583 DataSectionObj = DataSection.DataSection()\r
2584 DataSectionObj.Alignment = AlignValue\r
2585 DataSectionObj.SecType = self.__Token\r
2586\r
2587 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2588 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2589 if self.__Token == 'RELOCS_STRIPPED':\r
2590 DataSectionObj.KeepReloc = False\r
2591 else:\r
2592 DataSectionObj.KeepReloc = True\r
2593 else:\r
2594 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
2595\r
2596 if self.__IsToken("="):\r
2597 if not self.__GetNextToken():\r
2598 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
2599 DataSectionObj.SectFileName = self.__Token\r
2600 else:\r
2601 if not self.__GetCglSection(DataSectionObj):\r
2602 return False\r
2603\r
2604 Obj.SectionList.append(DataSectionObj)\r
2605\r
2606 return True\r
2607\r
2608 ## __GetCglSection() method\r
2609 #\r
2610 # Get compressed or GUIDed section for Obj\r
2611 #\r
2612 # @param self The object pointer\r
2613 # @param Obj for whom leaf section is got\r
2614 # @param AlignValue alignment value for complex section\r
2615 # @retval True Successfully find section statement\r
2616 # @retval False Not able to find section statement\r
2617 #\r
2618 def __GetCglSection(self, Obj, AlignValue = None):\r
2619\r
2620 if self.__IsKeyword( "COMPRESS"):\r
2621 type = "PI_STD"\r
2622 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
2623 type = self.__Token\r
2624\r
2625 if not self.__IsToken("{"):\r
2626 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2627\r
2628 CompressSectionObj = CompressSection.CompressSection()\r
2629 CompressSectionObj.Alignment = AlignValue\r
2630 CompressSectionObj.CompType = type\r
2631 # Recursive sections...\r
2632 while True:\r
2633 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
2634 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
2635 if not IsLeafSection and not IsEncapSection:\r
2636 break\r
2637\r
2638\r
2639 if not self.__IsToken( "}"):\r
2640 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2641 Obj.SectionList.append(CompressSectionObj)\r
2642\r
2643# else:\r
2644# raise Warning("Compress type not known")\r
2645\r
2646 return True\r
2647\r
2648 elif self.__IsKeyword( "GUIDED"):\r
2649 GuidValue = None\r
2650 if self.__GetNextGuid():\r
2651 GuidValue = self.__Token\r
2652\r
2653 AttribDict = self.__GetGuidAttrib()\r
2654 if not self.__IsToken("{"):\r
2655 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2656 GuidSectionObj = GuidSection.GuidSection()\r
2657 GuidSectionObj.Alignment = AlignValue\r
2658 GuidSectionObj.NameGuid = GuidValue\r
2659 GuidSectionObj.SectionType = "GUIDED"\r
2660 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
2661 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
2662 # Recursive sections...\r
2663 while True:\r
2664 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
2665 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
2666 if not IsLeafSection and not IsEncapSection:\r
2667 break\r
2668\r
2669 if not self.__IsToken( "}"):\r
2670 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2671 Obj.SectionList.append(GuidSectionObj)\r
2672\r
2673 return True\r
2674\r
2675 return False\r
2676\r
2677 ## __GetGuidAttri() method\r
2678 #\r
2679 # Get attributes for GUID section\r
2680 #\r
2681 # @param self The object pointer\r
2682 # @retval AttribDict Dictionary of key-value pair of section attributes\r
2683 #\r
2684 def __GetGuidAttrib(self):\r
2685\r
2686 AttribDict = {}\r
2687 AttribDict["PROCESSING_REQUIRED"] = False\r
2688 AttribDict["AUTH_STATUS_VALID"] = False\r
2689 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2690 AttribKey = self.__Token\r
2691\r
2692 if not self.__IsToken("="):\r
2693 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2694\r
2695 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2696 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2697 AttribDict[AttribKey] = self.__Token\r
2698\r
2699 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2700 AttribKey = self.__Token\r
2701\r
2702 if not self.__IsToken("="):\r
2703 raise Warning("expected '='")\r
2704\r
2705 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2706 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2707 AttribDict[AttribKey] = self.__Token\r
2708\r
2709 return AttribDict\r
2710\r
2711 ## __GetEncapsulationSec() method\r
2712 #\r
2713 # Get encapsulation section for FILE\r
2714 #\r
2715 # @param self The object pointer\r
2716 # @param FfsFile for whom section is got\r
2717 # @retval True Successfully find section statement\r
2718 # @retval False Not able to find section statement\r
2719 #\r
2720 def __GetEncapsulationSec(self, FfsFileObj):\r
2721\r
2722 OldPos = self.GetFileBufferPos()\r
2723 if not self.__IsKeyword( "SECTION"):\r
2724 if len(FfsFileObj.SectionList) == 0:\r
2725 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2726 else:\r
2727 return False\r
2728\r
2729 AlignValue = None\r
2730 if self.__GetAlignment():\r
52302d4d
LG
2731 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2732 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2733 AlignValue = self.__Token\r
2734\r
2735 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
2736 self.SetFileBufferPos(OldPos)\r
2737 return False\r
2738 else:\r
2739 return True\r
2740\r
2741 ## __GetCapsule() method\r
2742 #\r
2743 # Get capsule section contents and store its data into capsule list of self.Profile\r
2744 #\r
2745 # @param self The object pointer\r
2746 # @retval True Successfully find a capsule\r
2747 # @retval False Not able to find a capsule\r
2748 #\r
2749 def __GetCapsule(self):\r
2750\r
2751 if not self.__GetNextToken():\r
2752 return False\r
2753\r
2754 S = self.__Token.upper()\r
2755 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
2756 if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
2757 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
2758 self.__UndoToken()\r
2759 return False\r
2760\r
2761 self.__UndoToken()\r
2762 if not self.__IsToken("[CAPSULE.", True):\r
2763 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2764 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2765 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2766 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
2767\r
2768 CapsuleObj = Capsule.Capsule()\r
2769\r
2770 CapsuleName = self.__GetUiName()\r
2771 if not CapsuleName:\r
2772 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
2773\r
2774 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
2775\r
2776 if not self.__IsToken( "]"):\r
2777 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2778\r
2779 if self.__IsKeyword("CREATE_FILE"):\r
2780 if not self.__IsToken( "="):\r
2781 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2782\r
2783 if not self.__GetNextToken():\r
2784 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
2785\r
2786 CapsuleObj.CreateFile = self.__Token\r
2787\r
2788 self.__GetCapsuleStatements(CapsuleObj)\r
fd171542 2789 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
30fdf114
LG
2790 return True\r
2791\r
2792 ## __GetCapsuleStatements() method\r
2793 #\r
2794 # Get statements for capsule\r
2795 #\r
2796 # @param self The object pointer\r
2797 # @param Obj for whom statements are got\r
2798 #\r
2799 def __GetCapsuleStatements(self, Obj):\r
2800 self.__GetCapsuleTokens(Obj)\r
2801 self.__GetDefineStatements(Obj)\r
2802 self.__GetSetStatements(Obj)\r
30fdf114
LG
2803 self.__GetCapsuleData(Obj)\r
2804\r
fd171542 2805 ## __GetCapsuleTokens() method\r
30fdf114
LG
2806 #\r
2807 # Get token statements for capsule\r
2808 #\r
2809 # @param self The object pointer\r
2810 # @param Obj for whom token statements are got\r
2811 #\r
2812 def __GetCapsuleTokens(self, Obj):\r
b303ea72
LG
2813 if not self.__GetNextToken():\r
2814 return False\r
2815 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):\r
2816 Name = self.__Token.strip()\r
2817 if not self.__IsToken("="):\r
2818 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2819 if not self.__GetNextToken():\r
2820 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2821 if Name == 'CAPSULE_FLAGS':\r
2822 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2823 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2824 Value = self.__Token.strip()\r
2825 while self.__IsToken(","):\r
2826 Value += ','\r
2827 if not self.__GetNextToken():\r
2828 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2829 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2830 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2831 Value += self.__Token.strip()\r
2832 else:\r
2833 Value = self.__Token.strip()\r
2834 Obj.TokensDict[Name] = Value \r
2835 if not self.__GetNextToken():\r
2836 return False\r
2837 self.__UndoToken()\r
30fdf114
LG
2838\r
2839 ## __GetCapsuleData() method\r
2840 #\r
2841 # Get capsule data for capsule\r
2842 #\r
2843 # @param self The object pointer\r
2844 # @param Obj for whom capsule data are got\r
2845 #\r
2846 def __GetCapsuleData(self, Obj):\r
2847\r
2848 while True:\r
2849 IsInf = self.__GetInfStatement(Obj, True)\r
2850 IsFile = self.__GetFileStatement(Obj, True)\r
2851 IsFv = self.__GetFvStatement(Obj)\r
2852 if not IsInf and not IsFile and not IsFv:\r
2853 break\r
2854\r
2855 ## __GetFvStatement() method\r
2856 #\r
2857 # Get FV for capsule\r
2858 #\r
2859 # @param self The object pointer\r
2860 # @param CapsuleObj for whom FV is got\r
2861 # @retval True Successfully find a FV statement\r
2862 # @retval False Not able to find a FV statement\r
2863 #\r
2864 def __GetFvStatement(self, CapsuleObj):\r
2865\r
2866 if not self.__IsKeyword("FV"):\r
2867 return False\r
2868\r
2869 if not self.__IsToken("="):\r
2870 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2871\r
2872 if not self.__GetNextToken():\r
2873 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2874\r
2875 CapsuleFv = CapsuleData.CapsuleFv()\r
2876 CapsuleFv.FvName = self.__Token\r
2877 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
2878 return True\r
2879\r
2880 ## __GetRule() method\r
2881 #\r
2882 # Get Rule section contents and store its data into rule list of self.Profile\r
2883 #\r
2884 # @param self The object pointer\r
2885 # @retval True Successfully find a Rule\r
2886 # @retval False Not able to find a Rule\r
2887 #\r
2888 def __GetRule(self):\r
2889\r
2890 if not self.__GetNextToken():\r
2891 return False\r
2892\r
2893 S = self.__Token.upper()\r
2894 if S.startswith("[") and not S.startswith("[RULE."):\r
2895 if not S.startswith("[OPTIONROM."):\r
2896 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
2897 self.__UndoToken()\r
2898 return False\r
2899 self.__UndoToken()\r
2900 if not self.__IsToken("[Rule.", True):\r
2901 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2902 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2903 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2904 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
2905\r
2906 if not self.__SkipToToken("."):\r
2907 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
2908\r
2909 Arch = self.__SkippedChars.rstrip(".")\r
2910 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):\r
2911 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
2912\r
2913 ModuleType = self.__GetModuleType()\r
2914\r
2915 TemplateName = ""\r
2916 if self.__IsToken("."):\r
2917 if not self.__GetNextWord():\r
2918 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
2919 TemplateName = self.__Token\r
2920\r
2921 if not self.__IsToken( "]"):\r
2922 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2923\r
2924 RuleObj = self.__GetRuleFileStatements()\r
2925 RuleObj.Arch = Arch.upper()\r
2926 RuleObj.ModuleType = ModuleType\r
2927 RuleObj.TemplateName = TemplateName\r
2928 if TemplateName == '' :\r
2929 self.Profile.RuleDict['RULE' + \\r
2930 '.' + \\r
2931 Arch.upper() + \\r
2932 '.' + \\r
2933 ModuleType.upper() ] = RuleObj\r
2934 else :\r
2935 self.Profile.RuleDict['RULE' + \\r
2936 '.' + \\r
2937 Arch.upper() + \\r
2938 '.' + \\r
2939 ModuleType.upper() + \\r
2940 '.' + \\r
2941 TemplateName.upper() ] = RuleObj\r
2942# self.Profile.RuleList.append(rule)\r
2943 return True\r
2944\r
2945 ## __GetModuleType() method\r
2946 #\r
2947 # Return the module type\r
2948 #\r
2949 # @param self The object pointer\r
2950 # @retval string module type\r
2951 #\r
2952 def __GetModuleType(self):\r
2953\r
2954 if not self.__GetNextWord():\r
2955 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
2956 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
2957 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
2958 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
2959 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
2960 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
b303ea72 2961 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):\r
30fdf114
LG
2962 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2963 return self.__Token\r
2964\r
2965 ## __GetFileExtension() method\r
2966 #\r
2967 # Return the file extension\r
2968 #\r
2969 # @param self The object pointer\r
2970 # @retval string file name extension\r
2971 #\r
2972 def __GetFileExtension(self):\r
2973 if not self.__IsToken("."):\r
2974 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
2975\r
2976 Ext = ""\r
2977 if self.__GetNextToken():\r
2978 Pattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
2979 if Pattern.match(self.__Token):\r
2980 Ext = self.__Token\r
2981 return '.' + Ext\r
2982 else:\r
2983 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2984\r
2985 else:\r
2986 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
2987\r
2988 ## __GetRuleFileStatement() method\r
2989 #\r
2990 # Get rule contents\r
2991 #\r
2992 # @param self The object pointer\r
2993 # @retval Rule Rule object\r
2994 #\r
2995 def __GetRuleFileStatements(self):\r
2996\r
2997 if not self.__IsKeyword("FILE"):\r
2998 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
2999\r
3000 if not self.__GetNextWord():\r
3001 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
3002\r
3003 Type = self.__Token.strip().upper()\r
3004 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
b303ea72 3005 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):\r
30fdf114
LG
3006 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3007\r
3008 if not self.__IsToken("="):\r
3009 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3010\r
3011 if not self.__IsKeyword("$(NAMED_GUID)"):\r
3012 if not self.__GetNextWord():\r
3013 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
3014 if self.__Token == 'PCD':\r
3015 if not self.__IsToken( "("):\r
3016 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3017 PcdPair = self.__GetNextPcdName()\r
3018 if not self.__IsToken( ")"):\r
3019 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3020 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3021 \r
3022 NameGuid = self.__Token\r
3023\r
3024 KeepReloc = None\r
3025 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3026 if self.__FileCouldHaveRelocFlag(Type):\r
3027 if self.__Token == 'RELOCS_STRIPPED':\r
3028 KeepReloc = False\r
3029 else:\r
3030 KeepReloc = True\r
3031 else:\r
3032 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3033\r
3034 KeyStringList = []\r
3035 if self.__GetNextToken():\r
3036 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
3037 if Pattern.match(self.__Token):\r
3038 KeyStringList.append(self.__Token)\r
3039 if self.__IsToken(","):\r
3040 while self.__GetNextToken():\r
3041 if not Pattern.match(self.__Token):\r
3042 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
3043 KeyStringList.append(self.__Token)\r
3044\r
3045 if not self.__IsToken(","):\r
3046 break\r
3047\r
3048 else:\r
3049 self.__UndoToken()\r
3050\r
3051\r
3052 Fixed = False\r
3053 if self.__IsKeyword("Fixed", True):\r
3054 Fixed = True\r
3055\r
3056 CheckSum = False\r
3057 if self.__IsKeyword("CheckSum", True):\r
3058 CheckSum = True\r
3059\r
3060 AlignValue = ""\r
3061 if self.__GetAlignment():\r
52302d4d 3062 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
30fdf114 3063 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3064 #For FFS, Auto is default option same to ""\r
3065 if not self.__Token == "Auto":\r
3066 AlignValue = self.__Token\r
30fdf114
LG
3067\r
3068 if self.__IsToken("{"):\r
3069 # Complex file rule expected\r
3070 Rule = RuleComplexFile.RuleComplexFile()\r
3071 Rule.FvFileType = Type\r
3072 Rule.NameGuid = NameGuid\r
3073 Rule.Alignment = AlignValue\r
3074 Rule.CheckSum = CheckSum\r
3075 Rule.Fixed = Fixed\r
3076 Rule.KeyStringList = KeyStringList\r
3077 if KeepReloc != None:\r
3078 Rule.KeepReloc = KeepReloc\r
3079\r
3080 while True:\r
3081 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3082 IsLeaf = self.__GetEfiSection(Rule)\r
3083 if not IsEncapsulate and not IsLeaf:\r
3084 break\r
3085\r
3086 if not self.__IsToken("}"):\r
3087 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3088\r
3089 return Rule\r
3090\r
30fdf114
LG
3091 else:\r
3092 # Simple file rule expected\r
3093 if not self.__GetNextWord():\r
3094 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3095\r
3096 SectionName = self.__Token\r
3097\r
3098 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3099 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
3100 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3101\r
3102\r
3103 if self.__IsKeyword("Fixed", True):\r
3104 Fixed = True\r
3105\r
3106 if self.__IsKeyword("CheckSum", True):\r
3107 CheckSum = True\r
3108\r
52302d4d 3109 SectAlignment = ""\r
30fdf114 3110 if self.__GetAlignment():\r
52302d4d 3111 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
30fdf114 3112 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3113 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3114 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3115 SectAlignment = self.__Token\r
3116\r
3117 Ext = None\r
3118 if self.__IsToken('|'):\r
3119 Ext = self.__GetFileExtension()\r
3120 elif not self.__GetNextToken():\r
30fdf114
LG
3121 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3122\r
3123 Rule = RuleSimpleFile.RuleSimpleFile()\r
3124 Rule.SectionType = SectionName\r
3125 Rule.FvFileType = Type\r
3126 Rule.NameGuid = NameGuid\r
3127 Rule.Alignment = AlignValue\r
52302d4d 3128 Rule.SectAlignment = SectAlignment\r
30fdf114
LG
3129 Rule.CheckSum = CheckSum\r
3130 Rule.Fixed = Fixed\r
30fdf114
LG
3131 Rule.KeyStringList = KeyStringList\r
3132 if KeepReloc != None:\r
3133 Rule.KeepReloc = KeepReloc\r
52302d4d
LG
3134 Rule.FileExtension = Ext\r
3135 Rule.FileName = self.__Token\r
30fdf114
LG
3136 return Rule\r
3137\r
3138 ## __GetEfiSection() method\r
3139 #\r
3140 # Get section list for Rule\r
3141 #\r
3142 # @param self The object pointer\r
3143 # @param Obj for whom section is got\r
3144 # @retval True Successfully find section statement\r
3145 # @retval False Not able to find section statement\r
3146 #\r
3147 def __GetEfiSection(self, Obj):\r
3148\r
3149 OldPos = self.GetFileBufferPos()\r
3150 if not self.__GetNextWord():\r
3151 return False\r
3152 SectionName = self.__Token\r
3153\r
3154 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3155 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3156 self.__UndoToken()\r
3157 return False\r
3158\r
3159 if SectionName == "FV_IMAGE":\r
3160 FvImageSectionObj = FvImageSection.FvImageSection()\r
3161 if self.__IsKeyword("FV_IMAGE"):\r
3162 pass\r
3163 if self.__IsToken( "{"):\r
3164 FvObj = Fv.FV()\r
3165 self.__GetDefineStatements(FvObj)\r
3166 self.__GetBlockStatement(FvObj)\r
3167 self.__GetSetStatements(FvObj)\r
3168 self.__GetFvAlignment(FvObj)\r
3169 self.__GetFvAttributes(FvObj)\r
3170 self.__GetAprioriSection(FvObj)\r
3171 self.__GetAprioriSection(FvObj)\r
3172\r
3173 while True:\r
3174 IsInf = self.__GetInfStatement(FvObj)\r
3175 IsFile = self.__GetFileStatement(FvObj)\r
3176 if not IsInf and not IsFile:\r
3177 break\r
3178\r
3179 if not self.__IsToken( "}"):\r
3180 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3181 FvImageSectionObj.Fv = FvObj\r
3182 FvImageSectionObj.FvName = None\r
3183\r
3184 else:\r
3185 if not self.__IsKeyword("FV"):\r
3186 raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
3187 FvImageSectionObj.FvFileType = self.__Token\r
3188\r
30fdf114
LG
3189 if self.__GetAlignment():\r
3190 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3191 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3192 FvImageSectionObj.Alignment = self.__Token\r
3193\r
3194 if self.__IsToken('|'):\r
3195 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3196 elif self.__GetNextToken():\r
3197 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3198 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3199 FvImageSectionObj.FvFileName = self.__Token\r
3200 else:\r
3201 self.__UndoToken()\r
3202 else:\r
3203 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3204\r
3205 Obj.SectionList.append(FvImageSectionObj)\r
3206 return True\r
3207\r
3208 EfiSectionObj = EfiSection.EfiSection()\r
3209 EfiSectionObj.SectionType = SectionName\r
3210\r
3211 if not self.__GetNextToken():\r
3212 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3213\r
3214 if self.__Token == "STRING":\r
3215 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3216 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3217\r
3218 if not self.__IsToken('='):\r
3219 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3220\r
3221 if not self.__GetNextToken():\r
3222 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3223\r
3224 if self.__GetStringData():\r
3225 EfiSectionObj.StringData = self.__Token\r
3226\r
3227 if self.__IsKeyword("BUILD_NUM"):\r
3228 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3229 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3230\r
3231 if not self.__IsToken("="):\r
3232 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3233 if not self.__GetNextToken():\r
3234 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3235 EfiSectionObj.BuildNum = self.__Token\r
3236\r
3237 else:\r
3238 EfiSectionObj.FileType = self.__Token\r
3239 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3240\r
3241 if self.__IsKeyword("Optional"):\r
3242 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3243 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3244 EfiSectionObj.Optional = True\r
3245\r
3246 if self.__IsKeyword("BUILD_NUM"):\r
3247 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3248 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3249\r
3250 if not self.__IsToken("="):\r
3251 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3252 if not self.__GetNextToken():\r
3253 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3254 EfiSectionObj.BuildNum = self.__Token\r
3255\r
3256 if self.__GetAlignment():\r
52302d4d
LG
3257 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3258 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3259 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3260 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3261 EfiSectionObj.Alignment = self.__Token\r
3262\r
3263 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3264 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3265 if self.__Token == 'RELOCS_STRIPPED':\r
3266 EfiSectionObj.KeepReloc = False\r
3267 else:\r
3268 EfiSectionObj.KeepReloc = True\r
3269 if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
3270 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3271 else:\r
3272 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3273\r
3274\r
3275 if self.__IsToken('|'):\r
3276 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3277 elif self.__GetNextToken():\r
3278 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3279 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3280 \r
3281 if self.__Token.startswith('PCD'):\r
3282 self.__UndoToken()\r
3283 self.__GetNextWord()\r
3284 \r
3285 if self.__Token == 'PCD':\r
3286 if not self.__IsToken( "("):\r
3287 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3288 PcdPair = self.__GetNextPcdName()\r
3289 if not self.__IsToken( ")"):\r
3290 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3291 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3292 \r
3293 EfiSectionObj.FileName = self.__Token \r
3294 \r
3295 else:\r
3296 self.__UndoToken()\r
3297 else:\r
3298 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
3299\r
3300 Obj.SectionList.append(EfiSectionObj)\r
3301 return True\r
3302\r
3303 ## __RuleSectionCouldBeOptional() method\r
3304 #\r
3305 # Get whether a section could be optional\r
3306 #\r
3307 # @param self The object pointer\r
3308 # @param SectionType The section type to check\r
3309 # @retval True section could be optional\r
3310 # @retval False section never optional\r
3311 #\r
3312 def __RuleSectionCouldBeOptional(self, SectionType):\r
3313 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3314 return True\r
3315 else:\r
3316 return False\r
3317\r
3318 ## __RuleSectionCouldHaveBuildNum() method\r
3319 #\r
3320 # Get whether a section could have build number information\r
3321 #\r
3322 # @param self The object pointer\r
3323 # @param SectionType The section type to check\r
3324 # @retval True section could have build number information\r
3325 # @retval False section never have build number information\r
3326 #\r
3327 def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
3328 if SectionType in ("VERSION"):\r
3329 return True\r
3330 else:\r
3331 return False\r
3332\r
3333 ## __RuleSectionCouldHaveString() method\r
3334 #\r
3335 # Get whether a section could have string\r
3336 #\r
3337 # @param self The object pointer\r
3338 # @param SectionType The section type to check\r
3339 # @retval True section could have string\r
3340 # @retval False section never have string\r
3341 #\r
3342 def __RuleSectionCouldHaveString(self, SectionType):\r
3343 if SectionType in ("UI", "VERSION"):\r
3344 return True\r
3345 else:\r
3346 return False\r
3347\r
3348 ## __CheckRuleSectionFileType() method\r
3349 #\r
3350 # Get whether a section matches a file type\r
3351 #\r
3352 # @param self The object pointer\r
3353 # @param SectionType The section type to check\r
3354 # @param FileType The file type to check\r
3355 #\r
3356 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
3357 if SectionType == "COMPAT16":\r
3358 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
3359 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3360 elif SectionType == "PE32":\r
3361 if FileType not in ("PE32", "SEC_PE32"):\r
3362 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3363 elif SectionType == "PIC":\r
3364 if FileType not in ("PIC", "PIC"):\r
3365 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3366 elif SectionType == "TE":\r
3367 if FileType not in ("TE", "SEC_TE"):\r
3368 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3369 elif SectionType == "RAW":\r
3370 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
3371 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
3372 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
3373 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
3374 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3375 elif SectionType == "UI":\r
3376 if FileType not in ("UI", "SEC_UI"):\r
3377 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3378 elif SectionType == "VERSION":\r
3379 if FileType not in ("VERSION", "SEC_VERSION"):\r
3380 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3381 elif SectionType == "PEI_DEPEX":\r
3382 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
3383 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3384 elif SectionType == "GUID":\r
3385 if FileType not in ("PE32", "SEC_GUID"):\r
3386 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3387\r
3388 ## __GetRuleEncapsulationSection() method\r
3389 #\r
3390 # Get encapsulation section for Rule\r
3391 #\r
3392 # @param self The object pointer\r
3393 # @param Rule for whom section is got\r
3394 # @retval True Successfully find section statement\r
3395 # @retval False Not able to find section statement\r
3396 #\r
3397 def __GetRuleEncapsulationSection(self, Rule):\r
3398\r
3399 if self.__IsKeyword( "COMPRESS"):\r
3400 Type = "PI_STD"\r
3401 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3402 Type = self.__Token\r
3403\r
3404 if not self.__IsToken("{"):\r
3405 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3406\r
3407 CompressSectionObj = CompressSection.CompressSection()\r
3408\r
3409 CompressSectionObj.CompType = Type\r
3410 # Recursive sections...\r
3411 while True:\r
3412 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
3413 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
3414 if not IsEncapsulate and not IsLeaf:\r
3415 break\r
3416\r
3417 if not self.__IsToken( "}"):\r
3418 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3419 Rule.SectionList.append(CompressSectionObj)\r
3420\r
3421 return True\r
3422\r
3423 elif self.__IsKeyword( "GUIDED"):\r
3424 GuidValue = None\r
3425 if self.__GetNextGuid():\r
3426 GuidValue = self.__Token\r
3427\r
3428 if self.__IsKeyword( "$(NAMED_GUID)"):\r
3429 GuidValue = self.__Token\r
3430\r
3431 AttribDict = self.__GetGuidAttrib()\r
3432\r
3433 if not self.__IsToken("{"):\r
3434 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3435 GuidSectionObj = GuidSection.GuidSection()\r
3436 GuidSectionObj.NameGuid = GuidValue\r
3437 GuidSectionObj.SectionType = "GUIDED"\r
3438 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3439 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
3440\r
3441 # Efi sections...\r
3442 while True:\r
3443 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
3444 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
3445 if not IsEncapsulate and not IsLeaf:\r
3446 break\r
3447\r
3448 if not self.__IsToken( "}"):\r
3449 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3450 Rule.SectionList.append(GuidSectionObj)\r
3451\r
3452 return True\r
3453\r
3454 return False\r
3455\r
3456 ## __GetVtf() method\r
3457 #\r
3458 # Get VTF section contents and store its data into VTF list of self.Profile\r
3459 #\r
3460 # @param self The object pointer\r
3461 # @retval True Successfully find a VTF\r
3462 # @retval False Not able to find a VTF\r
3463 #\r
3464 def __GetVtf(self):\r
3465\r
3466 if not self.__GetNextToken():\r
3467 return False\r
3468\r
3469 S = self.__Token.upper()\r
3470 if S.startswith("[") and not S.startswith("[VTF."):\r
3471 if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
3472 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
3473 self.__UndoToken()\r
3474 return False\r
3475\r
3476 self.__UndoToken()\r
3477 if not self.__IsToken("[VTF.", True):\r
3478 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3479 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3480 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3481 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
3482\r
3483 if not self.__SkipToToken("."):\r
3484 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3485\r
3486 Arch = self.__SkippedChars.rstrip(".").upper()\r
3487 if Arch not in ("IA32", "X64", "IPF", "ARM"):\r
3488 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3489\r
3490 if not self.__GetNextWord():\r
3491 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
3492 Name = self.__Token.upper()\r
3493\r
3494 VtfObj = Vtf.Vtf()\r
3495 VtfObj.UiName = Name\r
3496 VtfObj.KeyArch = Arch\r
3497\r
3498 if self.__IsToken(","):\r
3499 if not self.__GetNextWord():\r
3500 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
3501 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM"):\r
3502 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3503 VtfObj.ArchList = self.__Token.upper()\r
3504\r
3505 if not self.__IsToken( "]"):\r
3506 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3507\r
3508 if self.__IsKeyword("IA32_RST_BIN"):\r
3509 if not self.__IsToken("="):\r
3510 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3511\r
3512 if not self.__GetNextToken():\r
3513 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
3514\r
3515 VtfObj.ResetBin = self.__Token\r
3516\r
3517 while self.__GetComponentStatement(VtfObj):\r
3518 pass\r
3519\r
3520 self.Profile.VtfList.append(VtfObj)\r
3521 return True\r
3522\r
3523 ## __GetComponentStatement() method\r
3524 #\r
3525 # Get components in VTF\r
3526 #\r
3527 # @param self The object pointer\r
3528 # @param VtfObj for whom component is got\r
3529 # @retval True Successfully find a component\r
3530 # @retval False Not able to find a component\r
3531 #\r
3532 def __GetComponentStatement(self, VtfObj):\r
3533\r
3534 if not self.__IsKeyword("COMP_NAME"):\r
3535 return False\r
3536\r
3537 if not self.__IsToken("="):\r
3538 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3539\r
3540 if not self.__GetNextWord():\r
3541 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
3542\r
3543 CompStatementObj = ComponentStatement.ComponentStatement()\r
3544 CompStatementObj.CompName = self.__Token\r
3545\r
3546 if not self.__IsKeyword("COMP_LOC"):\r
3547 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
3548\r
3549 if not self.__IsToken("="):\r
3550 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3551\r
3552 CompStatementObj.CompLoc = ""\r
3553 if self.__GetNextWord():\r
3554 CompStatementObj.CompLoc = self.__Token\r
3555 if self.__IsToken('|'):\r
3556 if not self.__GetNextWord():\r
3557 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
3558\r
3559 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
3560 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3561\r
3562 CompStatementObj.FilePos = self.__Token\r
3563 else:\r
3564 self.CurrentLineNumber += 1\r
3565 self.CurrentOffsetWithinLine = 0\r
3566\r
3567 if not self.__IsKeyword("COMP_TYPE"):\r
3568 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
3569\r
3570 if not self.__IsToken("="):\r
3571 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3572\r
3573 if not self.__GetNextToken():\r
3574 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
3575 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
3576 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
3577 not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
3578 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3579 CompStatementObj.CompType = self.__Token\r
3580\r
3581 if not self.__IsKeyword("COMP_VER"):\r
3582 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
3583\r
3584 if not self.__IsToken("="):\r
3585 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3586\r
3587 if not self.__GetNextToken():\r
3588 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
3589\r
3590 Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')\r
3591 if Pattern.match(self.__Token) == None:\r
3592 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3593 CompStatementObj.CompVer = self.__Token\r
3594\r
3595 if not self.__IsKeyword("COMP_CS"):\r
3596 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
3597\r
3598 if not self.__IsToken("="):\r
3599 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3600\r
3601 if not self.__GetNextToken():\r
3602 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
3603 if self.__Token not in ("1", "0"):\r
3604 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3605 CompStatementObj.CompCs = self.__Token\r
3606\r
3607\r
3608 if not self.__IsKeyword("COMP_BIN"):\r
3609 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
3610\r
3611 if not self.__IsToken("="):\r
3612 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3613\r
3614 if not self.__GetNextToken():\r
3615 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
3616\r
3617 CompStatementObj.CompBin = self.__Token\r
3618\r
3619 if not self.__IsKeyword("COMP_SYM"):\r
3620 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
3621\r
3622 if not self.__IsToken("="):\r
3623 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3624\r
3625 if not self.__GetNextToken():\r
3626 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
3627\r
3628 CompStatementObj.CompSym = self.__Token\r
3629\r
3630 if not self.__IsKeyword("COMP_SIZE"):\r
3631 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
3632\r
3633 if not self.__IsToken("="):\r
3634 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3635\r
3636 if self.__IsToken("-"):\r
3637 CompStatementObj.CompSize = self.__Token\r
3638 elif self.__GetNextDecimalNumber():\r
3639 CompStatementObj.CompSize = self.__Token\r
3640 elif self.__GetNextHexNumber():\r
3641 CompStatementObj.CompSize = self.__Token\r
3642 else:\r
3643 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3644\r
3645 VtfObj.ComponentStatementList.append(CompStatementObj)\r
3646 return True\r
3647\r
3648 ## __GetOptionRom() method\r
3649 #\r
3650 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
3651 #\r
3652 # @param self The object pointer\r
3653 # @retval True Successfully find a OptionROM\r
3654 # @retval False Not able to find a OptionROM\r
3655 #\r
3656 def __GetOptionRom(self):\r
3657\r
3658 if not self.__GetNextToken():\r
3659 return False\r
3660\r
3661 S = self.__Token.upper()\r
3662 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
3663 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
3664 \r
3665 self.__UndoToken()\r
3666 if not self.__IsToken("[OptionRom.", True):\r
3667 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3668\r
3669 OptRomName = self.__GetUiName()\r
3670\r
3671 if not self.__IsToken( "]"):\r
3672 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3673\r
3674 OptRomObj = OptionRom.OPTIONROM()\r
3675 OptRomObj.DriverName = OptRomName\r
3676 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
3677\r
3678 while True:\r
3679 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
3680 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
3681 if not isInf and not isFile:\r
3682 break\r
3683 \r
3684 return True\r
3685\r
3686 ## __GetOptRomInfStatement() method\r
3687 #\r
3688 # Get INF statements\r
3689 #\r
3690 # @param self The object pointer\r
3691 # @param Obj for whom inf statement is got\r
3692 # @retval True Successfully find inf statement\r
3693 # @retval False Not able to find inf statement\r
3694 #\r
3695 def __GetOptRomInfStatement(self, Obj):\r
3696\r
3697 if not self.__IsKeyword( "INF"):\r
3698 return False\r
3699\r
3700 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
3701 self.__GetInfOptions( ffsInf)\r
3702\r
3703 if not self.__GetNextToken():\r
3704 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
3705 ffsInf.InfFileName = self.__Token\r
3706\r
3707 if not ffsInf.InfFileName in self.Profile.InfList:\r
3708 self.Profile.InfList.append(ffsInf.InfFileName)\r
3709\r
3710 \r
3711 self.__GetOptRomOverrides (ffsInf)\r
3712 \r
3713 Obj.FfsList.append(ffsInf)\r
3714 return True\r
3715\r
3716 ## __GetOptRomOverrides() method\r
3717 #\r
3718 # Get overrides for OptROM INF & FILE\r
3719 #\r
3720 # @param self The object pointer\r
3721 # @param FfsInfObj for whom overrides is got\r
3722 #\r
3723 def __GetOptRomOverrides(self, Obj):\r
3724 if self.__IsToken('{'):\r
3725 Overrides = OptionRom.OverrideAttribs()\r
fd171542 3726 while True:\r
3727 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
3728 if not self.__IsToken( "="):\r
3729 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3730 if not self.__GetNextHexNumber():\r
3731 raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
3732 Overrides.PciVendorId = self.__Token\r
3733 continue\r
3734\r
3735 if self.__IsKeyword( "PCI_CLASS_CODE"):\r
3736 if not self.__IsToken( "="):\r
3737 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3738 if not self.__GetNextHexNumber():\r
3739 raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
3740 Overrides.PciClassCode = self.__Token\r
3741 continue\r
3742\r
3743 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
3744 if not self.__IsToken( "="):\r
3745 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3746 if not self.__GetNextHexNumber():\r
3747 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
3748\r
3749 Overrides.PciDeviceId = self.__Token\r
3750 continue\r
3751\r
3752 if self.__IsKeyword( "PCI_REVISION"):\r
3753 if not self.__IsToken( "="):\r
3754 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3755 if not self.__GetNextHexNumber():\r
3756 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
3757 Overrides.PciRevision = self.__Token\r
3758 continue\r
3759\r
3760 if self.__IsKeyword( "COMPRESS"):\r
3761 if not self.__IsToken( "="):\r
3762 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3763 if not self.__GetNextToken():\r
3764 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
3765 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
3766 continue\r
3767\r
3768 if self.__IsToken( "}"):\r
3769 break\r
3770 else:\r
3771 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
3772\r
30fdf114
LG
3773 Obj.OverrideAttribs = Overrides\r
3774 \r
3775 ## __GetOptRomFileStatement() method\r
3776 #\r
3777 # Get FILE statements\r
3778 #\r
3779 # @param self The object pointer\r
3780 # @param Obj for whom FILE statement is got\r
3781 # @retval True Successfully find FILE statement\r
3782 # @retval False Not able to find FILE statement\r
3783 #\r
3784 def __GetOptRomFileStatement(self, Obj):\r
3785\r
3786 if not self.__IsKeyword( "FILE"):\r
3787 return False\r
3788\r
3789 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
3790\r
3791 if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
3792 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
3793 FfsFileObj.FileType = self.__Token\r
3794\r
3795 if not self.__GetNextToken():\r
3796 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
3797 FfsFileObj.FileName = self.__Token\r
3798\r
3799 if FfsFileObj.FileType == 'EFI':\r
3800 self.__GetOptRomOverrides(FfsFileObj)\r
3801 \r
3802 Obj.FfsList.append(FfsFileObj)\r
3803\r
3804 return True\r
fd171542 3805\r
3806 ## __GetCapInFd() method\r
3807 #\r
3808 # Get Cap list contained in FD\r
3809 #\r
3810 # @param self The object pointer\r
3811 # @param FdName FD name\r
3812 # @retval CapList List of Capsule in FD\r
3813 #\r
3814 def __GetCapInFd (self, FdName):\r
3815\r
3816 CapList = []\r
3817 if FdName.upper() in self.Profile.FdDict.keys():\r
3818 FdObj = self.Profile.FdDict[FdName.upper()]\r
3819 for elementRegion in FdObj.RegionList:\r
3820 if elementRegion.RegionType == 'CAPSULE':\r
3821 for elementRegionData in elementRegion.RegionDataList:\r
3822 if elementRegionData.endswith(".cap"):\r
3823 continue\r
3824 if elementRegionData != None and elementRegionData.upper() not in CapList:\r
3825 CapList.append(elementRegionData.upper())\r
3826 return CapList\r
3827\r
3828 ## __GetReferencedFdCapTuple() method\r
3829 #\r
3830 # Get FV and FD list referenced by a capsule image\r
3831 #\r
3832 # @param self The object pointer\r
3833 # @param CapObj Capsule section to be searched\r
3834 # @param RefFdList referenced FD by section\r
3835 # @param RefFvList referenced FV by section\r
3836 #\r
3837 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
3838\r
3839 for CapsuleDataObj in CapObj.CapsuleDataList :\r
3840 if CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
3841 RefFvList.append (CapsuleDataObj.FvName.upper())\r
3842 elif CapsuleDataObj.Ffs != None:\r
3843 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
3844 if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
3845 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
3846 elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
3847 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
3848 else:\r
3849 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
3850\r
30fdf114
LG
3851 ## __GetFvInFd() method\r
3852 #\r
3853 # Get FV list contained in FD\r
3854 #\r
3855 # @param self The object pointer\r
3856 # @param FdName FD name\r
3857 # @retval FvList list of FV in FD\r
3858 #\r
3859 def __GetFvInFd (self, FdName):\r
3860\r
3861 FvList = []\r
3862 if FdName.upper() in self.Profile.FdDict.keys():\r
3863 FdObj = self.Profile.FdDict[FdName.upper()]\r
3864 for elementRegion in FdObj.RegionList:\r
3865 if elementRegion.RegionType == 'FV':\r
3866 for elementRegionData in elementRegion.RegionDataList:\r
fd171542 3867 if elementRegionData.endswith(".fv"):\r
3868 continue\r
30fdf114
LG
3869 if elementRegionData != None and elementRegionData.upper() not in FvList:\r
3870 FvList.append(elementRegionData.upper())\r
3871 return FvList\r
3872\r
3873 ## __GetReferencedFdFvTuple() method\r
3874 #\r
3875 # Get FD and FV list referenced by a FFS file\r
3876 #\r
3877 # @param self The object pointer\r
3878 # @param FfsFile contains sections to be searched\r
3879 # @param RefFdList referenced FD by section\r
3880 # @param RefFvList referenced FV by section\r
3881 #\r
3882 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
3883\r
3884 for FfsObj in FvObj.FfsList:\r
3885 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
3886 if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList:\r
3887 RefFvList.append(FfsObj.FvName.upper())\r
3888 elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList:\r
3889 RefFdList.append(FfsObj.FdName.upper())\r
3890 else:\r
3891 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
3892\r
3893 ## __GetReferencedFdFvTupleFromSection() method\r
3894 #\r
3895 # Get FD and FV list referenced by a FFS section\r
3896 #\r
3897 # @param self The object pointer\r
3898 # @param FfsFile contains sections to be searched\r
3899 # @param FdList referenced FD by section\r
3900 # @param FvList referenced FV by section\r
3901 #\r
3902 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
3903\r
3904 SectionStack = []\r
3905 SectionStack.extend(FfsFile.SectionList)\r
3906 while SectionStack != []:\r
3907 SectionObj = SectionStack.pop()\r
3908 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
3909 if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList:\r
3910 FvList.append(SectionObj.FvName.upper())\r
3911 if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
3912 FvList.append(SectionObj.Fv.UiFvName.upper())\r
3913 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
3914\r
3915 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
3916 SectionStack.extend(SectionObj.SectionList)\r
3917\r
3918 ## CycleReferenceCheck() method\r
3919 #\r
3920 # Check whether cycle reference exists in FDF\r
3921 #\r
3922 # @param self The object pointer\r
3923 # @retval True cycle reference exists\r
3924 # @retval False Not exists cycle reference\r
3925 #\r
3926 def CycleReferenceCheck(self):\r
fd171542 3927 #\r
3928 # Check the cycle between FV and FD image\r
3929 #\r
3930 MaxLength = len (self.Profile.FvDict)\r
3931 for FvName in self.Profile.FvDict.keys():\r
3932 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
3933 RefFvStack = []\r
3934 RefFvStack.append(FvName)\r
3935 FdAnalyzedList = []\r
3936 \r
3937 Index = 0\r
3938 while RefFvStack != [] and Index < MaxLength:\r
3939 Index = Index + 1\r
3940 FvNameFromStack = RefFvStack.pop()\r
3941 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
3942 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
3943 else:\r
3944 continue\r
30fdf114 3945\r
fd171542 3946 RefFdList = []\r
3947 RefFvList = []\r
3948 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
30fdf114 3949\r
fd171542 3950 for RefFdName in RefFdList:\r
3951 if RefFdName in FdAnalyzedList:\r
30fdf114
LG
3952 continue\r
3953\r
fd171542 3954 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
3955 FvInFdList = self.__GetFvInFd(RefFdName)\r
3956 if FvInFdList != []:\r
3957 for FvNameInFd in FvInFdList:\r
3958 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
3959 if FvNameInFd not in RefFvStack:\r
3960 RefFvStack.append(FvNameInFd)\r
3961\r
3962 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
3963 EdkLogger.info(LogStr)\r
3964 return True\r
3965 FdAnalyzedList.append(RefFdName)\r
30fdf114 3966\r
fd171542 3967 for RefFvName in RefFvList:\r
3968 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
3969 if RefFvName not in RefFvStack:\r
3970 RefFvStack.append(RefFvName)\r
3971\r
3972 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
3973 EdkLogger.info(LogStr)\r
3974 return True\r
3975\r
3976 #\r
3977 # Check the cycle between Capsule and FD image\r
3978 #\r
3979 MaxLength = len (self.Profile.CapsuleDict)\r
3980 for CapName in self.Profile.CapsuleDict.keys():\r
3981 #\r
3982 # Capsule image to be checked.\r
3983 #\r
3984 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
3985 RefCapStack = []\r
3986 RefCapStack.append(CapName)\r
3987 FdAnalyzedList = []\r
3988 FvAnalyzedList = []\r
3989 \r
3990 Index = 0\r
3991 while RefCapStack != [] and Index < MaxLength:\r
3992 Index = Index + 1\r
3993 CapNameFromStack = RefCapStack.pop()\r
3994 if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
3995 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
3996 else:\r
3997 continue\r
3998\r
3999 RefFvList = []\r
4000 RefFdList = []\r
4001 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
4002\r
4003 FvListLength = 0\r
4004 FdListLength = 0\r
4005 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
30fdf114
LG
4006 for RefFdName in RefFdList:\r
4007 if RefFdName in FdAnalyzedList:\r
4008 continue\r
4009\r
fd171542 4010 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
4011 CapInFdList = self.__GetCapInFd(RefFdName)\r
4012 if CapInFdList != []:\r
4013 for CapNameInFd in CapInFdList:\r
4014 LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
4015 if CapNameInFd not in RefCapStack:\r
4016 RefCapStack.append(CapNameInFd)\r
4017\r
4018 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
4019 EdkLogger.info(LogStr)\r
4020 return True\r
4021\r
30fdf114
LG
4022 FvInFdList = self.__GetFvInFd(RefFdName)\r
4023 if FvInFdList != []:\r
fd171542 4024 for FvNameInFd in FvInFdList:\r
4025 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4026 if FvNameInFd not in RefFvList:\r
4027 RefFvList.append(FvNameInFd)\r
30fdf114 4028\r
fd171542 4029 FdAnalyzedList.append(RefFdName)\r
4030 #\r
4031 # the number of the parsed FV and FD image\r
4032 #\r
4033 FvListLength = len (RefFvList)\r
4034 FdListLength = len (RefFdList)\r
30fdf114 4035 for RefFvName in RefFvList:\r
fd171542 4036 if RefFvName in FvAnalyzedList:\r
4037 continue\r
4038 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
4039 if RefFvName.upper() in self.Profile.FvDict.keys():\r
4040 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4041 else:\r
4042 continue\r
4043 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4044 FvAnalyzedList.append(RefFvName)\r
30fdf114 4045\r
fd171542 4046 return False\r
30fdf114
LG
4047\r
4048if __name__ == "__main__":\r
4049 parser = FdfParser("..\LakeportX64Pkg.fdf")\r
4050 try:\r
4051 parser.ParseFile()\r
4052 parser.CycleReferenceCheck()\r
4053 except Warning, X:\r
4054 print str(X)\r
4055 else:\r
4056 print "Success!"\r
4057\r