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