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