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