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