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