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