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