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