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