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