]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools: Replace PCD type strings with predefined constant
[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
656d2539 1137 if Scope in [TAB_UINT64, TAB_UINT8]:\r
91ae2988
YZ
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
656d2539 1145 if Scope == TAB_UINT64:\r
91ae2988
YZ
1146 if ValueNumber >= 0x10000000000000000:\r
1147 EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
656d2539 1148 if Scope == TAB_UINT8:\r
91ae2988
YZ
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 ## __GetNextHexNumber() method\r
1187 #\r
1188 # Get next HEX data before a seperator\r
1189 # If found, the HEX data is put into self.__Token\r
1190 #\r
1191 # @param self The object pointer\r
1192 # @retval True Successfully find a HEX data, file buffer pointer moved forward\r
1193 # @retval False Not able to find a HEX data, file buffer pointer not changed\r
1194 #\r
1195 def __GetNextHexNumber(self):\r
1196 if not self.__GetNextToken():\r
1197 return False\r
6553c617 1198 if gHexPatternAll.match(self.__Token):\r
30fdf114
LG
1199 return True\r
1200 else:\r
1201 self.__UndoToken()\r
1202 return False\r
1203\r
1204 ## __GetNextDecimalNumber() method\r
1205 #\r
1206 # Get next decimal data before a seperator\r
1207 # If found, the decimal data is put into self.__Token\r
1208 #\r
1209 # @param self The object pointer\r
1210 # @retval True Successfully find a decimal data, file buffer pointer moved forward\r
1211 # @retval False Not able to find a decimal data, file buffer pointer not changed\r
1212 #\r
1213 def __GetNextDecimalNumber(self):\r
1214 if not self.__GetNextToken():\r
1215 return False\r
1216 if self.__Token.isdigit():\r
1217 return True\r
1218 else:\r
1219 self.__UndoToken()\r
1220 return False\r
1221\r
1222 ## __GetNextPcdName() method\r
1223 #\r
1224 # Get next PCD token space C name and PCD C name pair before a seperator\r
1225 # If found, the decimal data is put into self.__Token\r
1226 #\r
1227 # @param self The object pointer\r
1228 # @retval Tuple PCD C name and PCD token space C name pair\r
1229 #\r
1230 def __GetNextPcdName(self):\r
1231 if not self.__GetNextWord():\r
1232 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1233 pcdTokenSpaceCName = self.__Token\r
1234\r
1235 if not self.__IsToken( "."):\r
1236 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1237\r
1238 if not self.__GetNextWord():\r
1239 raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
1240 pcdCName = self.__Token\r
1241\r
1242 return (pcdCName, pcdTokenSpaceCName)\r
1243\r
1244 ## __GetStringData() method\r
1245 #\r
1246 # Get string contents quoted in ""\r
1247 # If found, the decimal data is put into self.__Token\r
1248 #\r
1249 # @param self The object pointer\r
1250 # @retval True Successfully find a string data, file buffer pointer moved forward\r
1251 # @retval False Not able to find a string data, file buffer pointer not changed\r
1252 #\r
1253 def __GetStringData(self):\r
1254 if self.__Token.startswith("\"") or self.__Token.startswith("L\""):\r
1255 self.__UndoToken()\r
1256 self.__SkipToToken("\"")\r
1257 currentLineNumber = self.CurrentLineNumber\r
1258\r
1259 if not self.__SkipToToken("\""):\r
1260 raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
1261 if currentLineNumber != self.CurrentLineNumber:\r
1262 raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
1263 self.__Token = self.__SkippedChars.rstrip('\"')\r
1264 return True\r
1265\r
1266 elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"):\r
1267 self.__UndoToken()\r
1268 self.__SkipToToken("\'")\r
1269 currentLineNumber = self.CurrentLineNumber\r
1270\r
1271 if not self.__SkipToToken("\'"):\r
1272 raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
1273 if currentLineNumber != self.CurrentLineNumber:\r
1274 raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
1275 self.__Token = self.__SkippedChars.rstrip('\'')\r
1276 return True\r
1277\r
1278 else:\r
1279 return False\r
1280\r
1281 ## __SkipToToken() method\r
1282 #\r
1283 # Search forward in file buffer for the string\r
1284 # The skipped chars are put into self.__SkippedChars\r
1285 #\r
1286 # @param self The object pointer\r
1287 # @param String The string to search\r
1288 # @param IgnoreCase Indicate case sensitive/non-sensitive search, default is case sensitive\r
1289 # @retval True Successfully find the string, file buffer pointer moved forward\r
1290 # @retval False Not able to find the string, file buffer pointer not changed\r
1291 #\r
1292 def __SkipToToken(self, String, IgnoreCase = False):\r
1293 StartPos = self.GetFileBufferPos()\r
1294\r
1295 self.__SkippedChars = ""\r
1296 while not self.__EndOfFile():\r
1297 index = -1\r
1298 if IgnoreCase:\r
1299 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper())\r
1300 else:\r
1301 index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)\r
1302 if index == 0:\r
1303 self.CurrentOffsetWithinLine += len(String)\r
1304 self.__SkippedChars += String\r
1305 return True\r
1306 self.__SkippedChars += str(self.__CurrentChar())\r
1307 self.__GetOneChar()\r
1308\r
1309 self.SetFileBufferPos( StartPos)\r
1310 self.__SkippedChars = ""\r
1311 return False\r
1312\r
1313 ## GetFileBufferPos() method\r
1314 #\r
1315 # Return the tuple of current line and offset within the line\r
1316 #\r
1317 # @param self The object pointer\r
1318 # @retval Tuple Line number and offset pair\r
1319 #\r
1320 def GetFileBufferPos(self):\r
1321 return (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
1322\r
1323 ## SetFileBufferPos() method\r
1324 #\r
1325 # Restore the file buffer position\r
1326 #\r
1327 # @param self The object pointer\r
1328 # @param Pos The new file buffer position\r
1329 #\r
1330 def SetFileBufferPos(self, Pos):\r
1331 (self.CurrentLineNumber, self.CurrentOffsetWithinLine) = Pos\r
1332\r
d40b2ee6
LG
1333 ## Preprocess() method\r
1334 #\r
1335 # Preprocess comment, conditional directive, include directive, replace macro.\r
1336 # Exception will be raised if syntax error found\r
1337 #\r
1338 # @param self The object pointer\r
1339 #\r
1340 def Preprocess(self):\r
1341 self.__StringToList()\r
1342 self.PreprocessFile()\r
1343 self.PreprocessIncludeFile()\r
1344 self.__StringToList()\r
1345 self.PreprocessFile()\r
1346 self.PreprocessConditionalStatement()\r
1347 self.__StringToList()\r
1348 for Pos in self.__WipeOffArea:\r
1349 self.__ReplaceFragment(Pos[0], Pos[1])\r
1350 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
1351\r
1352 while self.__GetDefines():\r
1353 pass\r
d40b2ee6 1354\r
30fdf114
LG
1355 ## ParseFile() method\r
1356 #\r
1357 # Parse the file profile buffer to extract fd, fv ... information\r
1358 # Exception will be raised if syntax error found\r
1359 #\r
1360 # @param self The object pointer\r
1361 #\r
1362 def ParseFile(self):\r
1363\r
1364 try:\r
d40b2ee6 1365 self.Preprocess()\r
dd170333
MK
1366 #\r
1367 # Keep processing sections of the FDF until no new sections or a syntax error is found\r
1368 #\r
1369 while self.__GetFd() or self.__GetFv() or self.__GetFmp() or self.__GetCapsule() or self.__GetVtf() or self.__GetRule() or self.__GetOptionRom():\r
30fdf114
LG
1370 pass\r
1371\r
1372 except Warning, X:\r
1373 self.__UndoToken()\r
30fdf114 1374 #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
118bf096
CS
1375 # At this point, the closest parent would be the included file itself\r
1376 Profile = GetParentAtLine(X.OriginalLineNumber)\r
4231a819 1377 if Profile is not None:\r
118bf096
CS
1378 X.Message += ' near line %d, column %d: %s' \\r
1379 % (X.LineNumber, 0, Profile.FileLinesList[X.LineNumber-1])\r
1380 else:\r
1381 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1382 X.Message += ' near line %d, column %d: %s' \\r
30fdf114
LG
1383 % (FileLineTuple[1], self.CurrentOffsetWithinLine + 1, self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'))\r
1384 raise\r
1385\r
df81077f
YZ
1386 ## SectionParser() method\r
1387 #\r
1388 # Parse the file section info\r
1389 # Exception will be raised if syntax error found\r
1390 #\r
1391 # @param self The object pointer\r
1392 # @param section The section string\r
1393\r
1394 def SectionParser(self, section):\r
1395 S = section.upper()\r
1396 if not S.startswith("[DEFINES") and not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1397 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM.") and not S.startswith('[FMPPAYLOAD.'):\r
1398 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
1399\r
30fdf114
LG
1400 ## __GetDefines() method\r
1401 #\r
1402 # Get Defines section contents and store its data into AllMacrosList\r
1403 #\r
1404 # @param self The object pointer\r
1405 # @retval True Successfully find a Defines\r
1406 # @retval False Not able to find a Defines\r
1407 #\r
1408 def __GetDefines(self):\r
1409\r
1410 if not self.__GetNextToken():\r
1411 return False\r
1412\r
1413 S = self.__Token.upper()\r
1414 if S.startswith("[") and not S.startswith("[DEFINES"):\r
df81077f 1415 self.SectionParser(S)\r
30fdf114
LG
1416 self.__UndoToken()\r
1417 return False\r
1418\r
1419 self.__UndoToken()\r
1420 if not self.__IsToken("[DEFINES", True):\r
1421 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1422 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1423 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1424 raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)\r
1425\r
1426 if not self.__IsToken( "]"):\r
1427 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1428\r
1429 while self.__GetNextWord():\r
6780eef1
LG
1430 # handle the SET statement\r
1431 if self.__Token == 'SET':\r
1432 self.__UndoToken()\r
1433 self.__GetSetStatement(None)\r
1434 continue\r
1435 \r
30fdf114
LG
1436 Macro = self.__Token\r
1437 \r
1438 if not self.__IsToken("="):\r
1439 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1440 if not self.__GetNextToken() or self.__Token.startswith('['):\r
1441 raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)\r
1442 Value = self.__Token\r
30fdf114
LG
1443\r
1444 return False\r
1445\r
1446 ## __GetFd() method\r
1447 #\r
1448 # Get FD section contents and store its data into FD dictionary of self.Profile\r
1449 #\r
1450 # @param self The object pointer\r
1451 # @retval True Successfully find a FD\r
1452 # @retval False Not able to find a FD\r
1453 #\r
1454 def __GetFd(self):\r
1455\r
1456 if not self.__GetNextToken():\r
1457 return False\r
1458\r
1459 S = self.__Token.upper()\r
1460 if S.startswith("[") and not S.startswith("[FD."):\r
a3251d84 1461 if not S.startswith("[FV.") and not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \\r
30fdf114
LG
1462 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1463 raise Warning("Unknown section", self.FileName, self.CurrentLineNumber)\r
1464 self.__UndoToken()\r
1465 return False\r
1466\r
1467 self.__UndoToken()\r
1468 if not self.__IsToken("[FD.", True):\r
1469 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1470 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1471 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1472 raise Warning("expected [FD.]", self.FileName, self.CurrentLineNumber)\r
1473\r
1474 FdName = self.__GetUiName()\r
52302d4d
LG
1475 if FdName == "":\r
1476 if len (self.Profile.FdDict) == 0:\r
1477 FdName = GenFdsGlobalVariable.PlatformName\r
d0acc87a
LG
1478 if FdName == "" and GlobalData.gActivePlatform:\r
1479 FdName = GlobalData.gActivePlatform.PlatformName\r
52302d4d
LG
1480 self.Profile.FdNameNotSet = True\r
1481 else:\r
1482 raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
30fdf114 1483 self.CurrentFdName = FdName.upper()\r
52302d4d
LG
1484 \r
1485 if self.CurrentFdName in self.Profile.FdDict:\r
1486 raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1487\r
1488 if not self.__IsToken( "]"):\r
1489 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1490\r
1491 FdObj = Fd.FD()\r
1492 FdObj.FdUiName = self.CurrentFdName\r
1493 self.Profile.FdDict[self.CurrentFdName] = FdObj\r
52302d4d
LG
1494\r
1495 if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet:\r
1496 raise Warning("expected all FDs have their name", self.FileName, self.CurrentLineNumber)\r
1497\r
30fdf114
LG
1498 Status = self.__GetCreateFile(FdObj)\r
1499 if not Status:\r
1500 raise Warning("FD name error", self.FileName, self.CurrentLineNumber)\r
1501\r
e8a47801
LG
1502 while self.__GetTokenStatements(FdObj):\r
1503 pass\r
1504 for Attr in ("BaseAddress", "Size", "ErasePolarity"):\r
4231a819 1505 if getattr(FdObj, Attr) is None:\r
e8a47801
LG
1506 self.__GetNextToken()\r
1507 raise Warning("Keyword %s missing" % Attr, self.FileName, self.CurrentLineNumber)\r
1508\r
1509 if not FdObj.BlockSizeList:\r
1510 FdObj.BlockSizeList.append((1, FdObj.Size, None))\r
30fdf114
LG
1511\r
1512 self.__GetDefineStatements(FdObj)\r
1513\r
1514 self.__GetSetStatements(FdObj)\r
1515\r
1516 if not self.__GetRegionLayout(FdObj):\r
1517 raise Warning("expected region layout", self.FileName, self.CurrentLineNumber)\r
1518\r
1519 while self.__GetRegionLayout(FdObj):\r
1520 pass\r
1521 return True\r
1522\r
1523 ## __GetUiName() method\r
1524 #\r
1525 # Return the UI name of a section\r
1526 #\r
1527 # @param self The object pointer\r
1528 # @retval FdName UI name\r
1529 #\r
1530 def __GetUiName(self):\r
1531 Name = ""\r
1532 if self.__GetNextWord():\r
1533 Name = self.__Token\r
1534\r
1535 return Name\r
1536\r
1537 ## __GetCreateFile() method\r
1538 #\r
1539 # Return the output file name of object\r
1540 #\r
1541 # @param self The object pointer\r
1542 # @param Obj object whose data will be stored in file\r
1543 # @retval FdName UI name\r
1544 #\r
1545 def __GetCreateFile(self, Obj):\r
1546\r
1547 if self.__IsKeyword( "CREATE_FILE"):\r
1548 if not self.__IsToken( "="):\r
1549 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1550\r
1551 if not self.__GetNextToken():\r
1552 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
1553\r
1554 FileName = self.__Token\r
1555 Obj.CreateFileName = FileName\r
1556\r
1557 return True\r
1558\r
1559 ## __GetTokenStatements() method\r
1560 #\r
1561 # Get token statements\r
1562 #\r
1563 # @param self The object pointer\r
1564 # @param Obj for whom token statement is got\r
30fdf114
LG
1565 #\r
1566 def __GetTokenStatements(self, Obj):\r
e8a47801
LG
1567 if self.__IsKeyword( "BaseAddress"):\r
1568 if not self.__IsToken( "="):\r
1569 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1570 \r
1571 if not self.__GetNextHexNumber():\r
1572 raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
1573 \r
1574 Obj.BaseAddress = self.__Token\r
1575 \r
1576 if self.__IsToken( "|"):\r
1577 pcdPair = self.__GetNextPcdName()\r
1578 Obj.BaseAddressPcd = pcdPair\r
1579 self.Profile.PcdDict[pcdPair] = Obj.BaseAddress\r
1580 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1581 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1582 return True\r
30fdf114 1583\r
e8a47801
LG
1584 if self.__IsKeyword( "Size"):\r
1585 if not self.__IsToken( "="):\r
1586 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1587 \r
1588 if not self.__GetNextHexNumber():\r
1589 raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
30fdf114 1590\r
e8a47801
LG
1591 Size = self.__Token\r
1592 if self.__IsToken( "|"):\r
1593 pcdPair = self.__GetNextPcdName()\r
1594 Obj.SizePcd = pcdPair\r
1595 self.Profile.PcdDict[pcdPair] = Size\r
1596 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1597 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
1598 Obj.Size = long(Size, 0)\r
1599 return True\r
30fdf114 1600\r
e8a47801
LG
1601 if self.__IsKeyword( "ErasePolarity"):\r
1602 if not self.__IsToken( "="):\r
1603 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1604 \r
1605 if not self.__GetNextToken():\r
1606 raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\r
1607 \r
1608 if self.__Token != "1" and self.__Token != "0":\r
1609 raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
1610 \r
1611 Obj.ErasePolarity = self.__Token\r
1612 return True\r
30fdf114 1613\r
e8a47801 1614 return self.__GetBlockStatements(Obj)\r
30fdf114
LG
1615\r
1616 ## __GetAddressStatements() method\r
1617 #\r
1618 # Get address statements\r
1619 #\r
1620 # @param self The object pointer\r
1621 # @param Obj for whom address statement is got\r
1622 # @retval True Successfully find\r
1623 # @retval False Not able to find\r
1624 #\r
1625 def __GetAddressStatements(self, Obj):\r
1626\r
1627 if self.__IsKeyword("BsBaseAddress"):\r
1628 if not self.__IsToken( "="):\r
1629 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1630\r
1631 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1632 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1633\r
1634 BsAddress = long(self.__Token, 0)\r
1635 Obj.BsBaseAddress = BsAddress\r
1636\r
1637 if self.__IsKeyword("RtBaseAddress"):\r
1638 if not self.__IsToken( "="):\r
1639 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1640\r
1641 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1642 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1643\r
1644 RtAddress = long(self.__Token, 0)\r
1645 Obj.RtBaseAddress = RtAddress\r
1646\r
1647 ## __GetBlockStatements() method\r
1648 #\r
1649 # Get block statements\r
1650 #\r
1651 # @param self The object pointer\r
1652 # @param Obj for whom block statement is got\r
30fdf114
LG
1653 #\r
1654 def __GetBlockStatements(self, Obj):\r
e8a47801 1655 IsBlock = False\r
30fdf114 1656 while self.__GetBlockStatement(Obj):\r
e8a47801 1657 IsBlock = True\r
52302d4d 1658 \r
e8a47801 1659 Item = Obj.BlockSizeList[-1]\r
4231a819 1660 if Item[0] is None or Item[1] is None:\r
6780eef1 1661 raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
e8a47801 1662 return IsBlock\r
30fdf114
LG
1663\r
1664 ## __GetBlockStatement() method\r
1665 #\r
1666 # Get block statement\r
1667 #\r
1668 # @param self The object pointer\r
1669 # @param Obj for whom block statement is got\r
1670 # @retval True Successfully find\r
1671 # @retval False Not able to find\r
1672 #\r
1673 def __GetBlockStatement(self, Obj):\r
1674 if not self.__IsKeyword( "BlockSize"):\r
1675 return False\r
1676\r
1677 if not self.__IsToken( "="):\r
1678 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1679\r
1680 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
6780eef1 1681 raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1682\r
1683 BlockSize = self.__Token\r
1684 BlockSizePcd = None\r
1685 if self.__IsToken( "|"):\r
1686 PcdPair = self.__GetNextPcdName()\r
1687 BlockSizePcd = PcdPair\r
1688 self.Profile.PcdDict[PcdPair] = BlockSize\r
d0acc87a
LG
1689 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1690 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
52302d4d 1691 BlockSize = long(BlockSize, 0)\r
30fdf114
LG
1692\r
1693 BlockNumber = None\r
1694 if self.__IsKeyword( "NumBlocks"):\r
1695 if not self.__IsToken( "="):\r
1696 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1697\r
1698 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1699 raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber)\r
1700\r
1701 BlockNumber = long(self.__Token, 0)\r
1702\r
1703 Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
1704 return True\r
1705\r
1706 ## __GetDefineStatements() method\r
1707 #\r
1708 # Get define statements\r
1709 #\r
1710 # @param self The object pointer\r
1711 # @param Obj for whom define statement is got\r
1712 # @retval True Successfully find\r
1713 # @retval False Not able to find\r
1714 #\r
1715 def __GetDefineStatements(self, Obj):\r
1716 while self.__GetDefineStatement( Obj):\r
1717 pass\r
1718\r
1719 ## __GetDefineStatement() method\r
1720 #\r
1721 # Get define statement\r
1722 #\r
1723 # @param self The object pointer\r
1724 # @param Obj for whom define statement is got\r
1725 # @retval True Successfully find\r
1726 # @retval False Not able to find\r
1727 #\r
1728 def __GetDefineStatement(self, Obj):\r
1729 if self.__IsKeyword("DEFINE"):\r
1730 self.__GetNextToken()\r
1731 Macro = self.__Token\r
1732 if not self.__IsToken( "="):\r
1733 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1734\r
1735 if not self.__GetNextToken():\r
1736 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
1737\r
1738 Value = self.__Token\r
1739 Macro = '$(' + Macro + ')'\r
1740 Obj.DefineVarDict[Macro] = Value\r
1741 return True\r
1742\r
1743 return False\r
1744\r
1745 ## __GetSetStatements() method\r
1746 #\r
1747 # Get set statements\r
1748 #\r
1749 # @param self The object pointer\r
1750 # @param Obj for whom set statement is got\r
1751 # @retval True Successfully find\r
1752 # @retval False Not able to find\r
1753 #\r
1754 def __GetSetStatements(self, Obj):\r
1755 while self.__GetSetStatement(Obj):\r
1756 pass\r
1757\r
1758 ## __GetSetStatement() method\r
1759 #\r
1760 # Get set statement\r
1761 #\r
1762 # @param self The object pointer\r
1763 # @param Obj for whom set statement is got\r
1764 # @retval True Successfully find\r
1765 # @retval False Not able to find\r
1766 #\r
1767 def __GetSetStatement(self, Obj):\r
1768 if self.__IsKeyword("SET"):\r
1769 PcdPair = self.__GetNextPcdName()\r
1770\r
1771 if not self.__IsToken( "="):\r
1772 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1773\r
d0acc87a
LG
1774 Value = self.__GetExpression()\r
1775 Value = self.__EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
30fdf114 1776\r
6780eef1
LG
1777 if Obj:\r
1778 Obj.SetVarDict[PcdPair] = Value\r
30fdf114 1779 self.Profile.PcdDict[PcdPair] = Value\r
d0acc87a
LG
1780 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1781 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
30fdf114
LG
1782 return True\r
1783\r
1784 return False\r
1785\r
4afd3d04
LG
1786 ## __CalcRegionExpr(self)\r
1787 #\r
1788 # Calculate expression for offset or size of a region\r
1789 #\r
1790 # @return: None if invalid expression\r
1791 # Calculated number if successfully\r
1792 #\r
1793 def __CalcRegionExpr(self):\r
1794 StartPos = self.GetFileBufferPos()\r
1795 Expr = ''\r
1796 PairCount = 0\r
1797 while not self.__EndOfFile():\r
1798 CurCh = self.__CurrentChar()\r
1799 if CurCh == '(':\r
1800 PairCount += 1\r
1801 elif CurCh == ')':\r
1802 PairCount -= 1\r
1803\r
1804 if CurCh in '|\r\n' and PairCount == 0:\r
1805 break\r
1806 Expr += CurCh\r
1807 self.__GetOneChar()\r
1808 try:\r
1809 return long(\r
1810 ValueExpression(Expr,\r
2bc3256c 1811 self.__CollectMacroPcd()\r
4afd3d04
LG
1812 )(True),0)\r
1813 except Exception:\r
1814 self.SetFileBufferPos(StartPos)\r
1815 return None\r
1816\r
30fdf114
LG
1817 ## __GetRegionLayout() method\r
1818 #\r
1819 # Get region layout for FD\r
1820 #\r
1821 # @param self The object pointer\r
1822 # @param Fd for whom region is got\r
1823 # @retval True Successfully find\r
1824 # @retval False Not able to find\r
1825 #\r
1826 def __GetRegionLayout(self, Fd):\r
4afd3d04 1827 Offset = self.__CalcRegionExpr() \r
4231a819 1828 if Offset is None:\r
30fdf114
LG
1829 return False\r
1830\r
1831 RegionObj = Region.Region()\r
4afd3d04 1832 RegionObj.Offset = Offset\r
30fdf114
LG
1833 Fd.RegionList.append(RegionObj)\r
1834\r
1835 if not self.__IsToken( "|"):\r
1836 raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
1837\r
4afd3d04 1838 Size = self.__CalcRegionExpr()\r
4231a819 1839 if Size is None:\r
30fdf114 1840 raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
4afd3d04 1841 RegionObj.Size = Size\r
30fdf114
LG
1842\r
1843 if not self.__GetNextWord():\r
1844 return True\r
1845\r
b21a13fb 1846 if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):\r
2bc3256c
LG
1847 #\r
1848 # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]\r
1849 # Or it might be next region's offset described by an expression which starts with a PCD.\r
1850 # PcdOffset[|PcdSize] or OffsetPcdExpression|Size\r
1851 #\r
30fdf114 1852 self.__UndoToken()\r
2bc3256c
LG
1853 IsRegionPcd = (RegionSizeGuidPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]) or\r
1854 RegionOffsetPcdPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]))\r
1855 if IsRegionPcd:\r
1856 RegionObj.PcdOffset = self.__GetNextPcdName()\r
1857 self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0))\r
1858 self.__PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionObj.PcdOffset[0])] = "0x%x" % RegionObj.Offset\r
d0acc87a 1859 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2bc3256c
LG
1860 self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple\r
1861 if self.__IsToken( "|"):\r
1862 RegionObj.PcdSize = self.__GetNextPcdName()\r
1863 self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size\r
1864 self.__PcdDict['%s.%s' % (RegionObj.PcdSize[1], RegionObj.PcdSize[0])] = "0x%x" % RegionObj.Size\r
1865 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1866 self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple\r
30fdf114
LG
1867\r
1868 if not self.__GetNextWord():\r
1869 return True\r
1870\r
1871 if self.__Token == "SET":\r
1872 self.__UndoToken()\r
1873 self.__GetSetStatements( RegionObj)\r
1874 if not self.__GetNextWord():\r
1875 return True\r
1876\r
fd171542 1877 elif self.__Token == "FV":\r
30fdf114
LG
1878 self.__UndoToken()\r
1879 self.__GetRegionFvType( RegionObj)\r
1880\r
fd171542 1881 elif self.__Token == "CAPSULE":\r
1882 self.__UndoToken()\r
1883 self.__GetRegionCapType( RegionObj)\r
1884\r
30fdf114
LG
1885 elif self.__Token == "FILE":\r
1886 self.__UndoToken()\r
b21a13fb
YZ
1887 self.__GetRegionFileType(RegionObj)\r
1888\r
1889 elif self.__Token == "INF":\r
1890 self.__UndoToken()\r
1891 RegionObj.RegionType = "INF"\r
1892 while self.__IsKeyword("INF"):\r
1893 self.__UndoToken()\r
1894 ffsInf = self.__ParseInfStatement()\r
1895 if not ffsInf:\r
1896 break\r
1897 RegionObj.RegionDataList.append(ffsInf)\r
30fdf114 1898\r
79b74a03 1899 elif self.__Token == "DATA":\r
30fdf114 1900 self.__UndoToken()\r
b21a13fb 1901 self.__GetRegionDataType(RegionObj)\r
79b74a03 1902 else:\r
2bc3256c
LG
1903 self.__UndoToken()\r
1904 if self.__GetRegionLayout(Fd):\r
1905 return True\r
79b74a03 1906 raise Warning("A valid region type was not found. "\r
b21a13fb 1907 "Valid types are [SET, FV, CAPSULE, FILE, DATA, INF]. This error occurred",\r
79b74a03 1908 self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1909\r
1910 return True\r
1911\r
1912 ## __GetRegionFvType() method\r
1913 #\r
1914 # Get region fv data for region\r
1915 #\r
1916 # @param self The object pointer\r
1917 # @param RegionObj for whom region data is got\r
1918 #\r
1919 def __GetRegionFvType(self, RegionObj):\r
1920\r
1921 if not self.__IsKeyword( "FV"):\r
1922 raise Warning("expected Keyword 'FV'", self.FileName, self.CurrentLineNumber)\r
1923\r
1924 if not self.__IsToken( "="):\r
1925 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1926\r
1927 if not self.__GetNextToken():\r
1928 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1929\r
1930 RegionObj.RegionType = "FV"\r
0199377c 1931 RegionObj.RegionDataList.append((self.__Token).upper())\r
30fdf114
LG
1932\r
1933 while self.__IsKeyword( "FV"):\r
1934\r
1935 if not self.__IsToken( "="):\r
1936 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1937\r
1938 if not self.__GetNextToken():\r
1939 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1940\r
0199377c 1941 RegionObj.RegionDataList.append((self.__Token).upper())\r
30fdf114 1942\r
fd171542 1943 ## __GetRegionCapType() method\r
1944 #\r
1945 # Get region capsule data for region\r
1946 #\r
1947 # @param self The object pointer\r
1948 # @param RegionObj for whom region data is got\r
1949 #\r
1950 def __GetRegionCapType(self, RegionObj):\r
1951\r
1952 if not self.__IsKeyword("CAPSULE"):\r
1953 raise Warning("expected Keyword 'CAPSULE'", self.FileName, self.CurrentLineNumber)\r
1954\r
1955 if not self.__IsToken("="):\r
1956 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1957\r
1958 if not self.__GetNextToken():\r
1959 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
1960\r
1961 RegionObj.RegionType = "CAPSULE"\r
1962 RegionObj.RegionDataList.append(self.__Token)\r
1963\r
1964 while self.__IsKeyword("CAPSULE"):\r
1965\r
1966 if not self.__IsToken("="):\r
1967 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1968\r
1969 if not self.__GetNextToken():\r
1970 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
1971\r
1972 RegionObj.RegionDataList.append(self.__Token)\r
1973\r
30fdf114
LG
1974 ## __GetRegionFileType() method\r
1975 #\r
1976 # Get region file data for region\r
1977 #\r
1978 # @param self The object pointer\r
1979 # @param RegionObj for whom region data is got\r
1980 #\r
1981 def __GetRegionFileType(self, RegionObj):\r
1982\r
1983 if not self.__IsKeyword( "FILE"):\r
1984 raise Warning("expected Keyword 'FILE'", self.FileName, self.CurrentLineNumber)\r
1985\r
1986 if not self.__IsToken( "="):\r
1987 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1988\r
1989 if not self.__GetNextToken():\r
1990 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
1991\r
1992 RegionObj.RegionType = "FILE"\r
1993 RegionObj.RegionDataList.append( self.__Token)\r
1994\r
1995 while self.__IsKeyword( "FILE"):\r
1996\r
1997 if not self.__IsToken( "="):\r
1998 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1999\r
2000 if not self.__GetNextToken():\r
2001 raise Warning("expected FILE name", self.FileName, self.CurrentLineNumber)\r
2002\r
2003 RegionObj.RegionDataList.append(self.__Token)\r
2004\r
2005 ## __GetRegionDataType() method\r
2006 #\r
2007 # Get region array data for region\r
2008 #\r
2009 # @param self The object pointer\r
2010 # @param RegionObj for whom region data is got\r
2011 #\r
2012 def __GetRegionDataType(self, RegionObj):\r
2013\r
2014 if not self.__IsKeyword( "DATA"):\r
2015 raise Warning("expected Region Data type", self.FileName, self.CurrentLineNumber)\r
2016\r
2017 if not self.__IsToken( "="):\r
2018 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2019\r
2020 if not self.__IsToken( "{"):\r
2021 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2022\r
2023 if not self.__GetNextHexNumber():\r
2024 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2025\r
636f2be6
LG
2026 if len(self.__Token) > 18:\r
2027 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
2028\r
2029 # convert hex string value to byte hex string array\r
2030 AllString = self.__Token\r
2031 AllStrLen = len (AllString)\r
2032 DataString = ""\r
2033 while AllStrLen > 4:\r
2034 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
2035 AllStrLen = AllStrLen - 2\r
2036 DataString = DataString + AllString[:AllStrLen] + ","\r
2037\r
2038 # byte value array\r
2039 if len (self.__Token) <= 4:\r
2040 while self.__IsToken(","):\r
2041 if not self.__GetNextHexNumber():\r
2042 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2043 if len(self.__Token) > 4:\r
2044 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2045 DataString += self.__Token\r
2046 DataString += ","\r
30fdf114
LG
2047\r
2048 if not self.__IsToken( "}"):\r
2049 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2050\r
2051 DataString = DataString.rstrip(",")\r
2052 RegionObj.RegionType = "DATA"\r
2053 RegionObj.RegionDataList.append( DataString)\r
2054\r
2055 while self.__IsKeyword( "DATA"):\r
2056\r
2057 if not self.__IsToken( "="):\r
2058 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2059\r
2060 if not self.__IsToken( "{"):\r
2061 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2062\r
2063 if not self.__GetNextHexNumber():\r
2064 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2065\r
636f2be6
LG
2066 if len(self.__Token) > 18:\r
2067 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
2068\r
2069 # convert hex string value to byte hex string array\r
2070 AllString = self.__Token\r
2071 AllStrLen = len (AllString)\r
2072 DataString = ""\r
2073 while AllStrLen > 4:\r
2074 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
2075 AllStrLen = AllStrLen - 2\r
2076 DataString = DataString + AllString[:AllStrLen] + ","\r
2077\r
2078 # byte value array\r
2079 if len (self.__Token) <= 4:\r
2080 while self.__IsToken(","):\r
2081 if not self.__GetNextHexNumber():\r
2082 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2083 if len(self.__Token) > 4:\r
2084 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2085 DataString += self.__Token\r
2086 DataString += ","\r
30fdf114
LG
2087\r
2088 if not self.__IsToken( "}"):\r
2089 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2090\r
2091 DataString = DataString.rstrip(",")\r
2092 RegionObj.RegionDataList.append( DataString)\r
2093\r
2094 ## __GetFv() method\r
2095 #\r
2096 # Get FV section contents and store its data into FV dictionary of self.Profile\r
2097 #\r
2098 # @param self The object pointer\r
2099 # @retval True Successfully find a FV\r
2100 # @retval False Not able to find a FV\r
2101 #\r
2102 def __GetFv(self):\r
2103 if not self.__GetNextToken():\r
2104 return False\r
2105\r
2106 S = self.__Token.upper()\r
2107 if S.startswith("[") and not S.startswith("[FV."):\r
df81077f 2108 self.SectionParser(S)\r
30fdf114
LG
2109 self.__UndoToken()\r
2110 return False\r
2111\r
2112 self.__UndoToken()\r
2113 if not self.__IsToken("[FV.", True):\r
2114 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2115 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2116 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2117 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2118\r
2119 FvName = self.__GetUiName()\r
2120 self.CurrentFvName = FvName.upper()\r
2121\r
2122 if not self.__IsToken( "]"):\r
2123 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2124\r
2125 FvObj = Fv.FV()\r
2126 FvObj.UiFvName = self.CurrentFvName\r
2127 self.Profile.FvDict[self.CurrentFvName] = FvObj\r
2128\r
2129 Status = self.__GetCreateFile(FvObj)\r
2130 if not Status:\r
2131 raise Warning("FV name error", self.FileName, self.CurrentLineNumber)\r
2132\r
2133 self.__GetDefineStatements(FvObj)\r
2134\r
2135 self.__GetAddressStatements(FvObj)\r
2136\r
b303ea72
LG
2137 FvObj.FvExtEntryTypeValue = []\r
2138 FvObj.FvExtEntryType = []\r
2139 FvObj.FvExtEntryData = []\r
2140 while True:\r
e8a47801
LG
2141 self.__GetSetStatements(FvObj)\r
2142\r
2143 if not (self.__GetBlockStatement(FvObj) or self.__GetFvBaseAddress(FvObj) or \r
2144 self.__GetFvForceRebase(FvObj) or self.__GetFvAlignment(FvObj) or \r
2145 self.__GetFvAttributes(FvObj) or self.__GetFvNameGuid(FvObj) or \r
aaf8aa7b 2146 self.__GetFvExtEntryStatement(FvObj) or self.__GetFvNameString(FvObj)):\r
b303ea72
LG
2147 break\r
2148\r
aaf8aa7b
YL
2149 if FvObj.FvNameString == 'TRUE' and not FvObj.FvNameGuid:\r
2150 raise Warning("FvNameString found but FvNameGuid was not found", self.FileName, self.CurrentLineNumber)\r
2151\r
30fdf114
LG
2152 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
2153 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
2154\r
2155 while True:\r
cdc9b0c2 2156 isInf = self.__GetInfStatement(FvObj)\r
30fdf114
LG
2157 isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
2158 if not isInf and not isFile:\r
2159 break\r
2160\r
2161 return True\r
2162\r
2163 ## __GetFvAlignment() method\r
2164 #\r
2165 # Get alignment for FV\r
2166 #\r
2167 # @param self The object pointer\r
2168 # @param Obj for whom alignment is got\r
2169 # @retval True Successfully find a alignment statement\r
2170 # @retval False Not able to find a alignment statement\r
2171 #\r
2172 def __GetFvAlignment(self, Obj):\r
2173\r
2174 if not self.__IsKeyword( "FvAlignment"):\r
2175 return False\r
2176\r
2177 if not self.__IsToken( "="):\r
2178 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2179\r
2180 if not self.__GetNextToken():\r
2181 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2182\r
2183 if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
2184 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
2185 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \\r
2186 "1G", "2G"):\r
2187 raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2188 Obj.FvAlignment = self.__Token\r
2189 return True\r
4234283c
LG
2190 \r
2191 ## __GetFvBaseAddress() method\r
2192 #\r
2193 # Get BaseAddress for FV\r
2194 #\r
2195 # @param self The object pointer\r
2196 # @param Obj for whom FvBaseAddress is got\r
2197 # @retval True Successfully find a FvBaseAddress statement\r
2198 # @retval False Not able to find a FvBaseAddress statement\r
2199 #\r
2200 def __GetFvBaseAddress(self, Obj):\r
2201\r
2202 if not self.__IsKeyword("FvBaseAddress"):\r
2203 return False\r
2204\r
2205 if not self.__IsToken( "="):\r
2206 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2207\r
2208 if not self.__GetNextToken():\r
2209 raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
2210\r
ffe720c5 2211 if not BaseAddrValuePattern.match(self.__Token.upper()):\r
79b74a03 2212 raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4234283c 2213 Obj.FvBaseAddress = self.__Token\r
0d2711a6
LG
2214 return True \r
2215 \r
79b74a03
LG
2216 ## __GetFvForceRebase() method\r
2217 #\r
2218 # Get FvForceRebase for FV\r
2219 #\r
2220 # @param self The object pointer\r
2221 # @param Obj for whom FvForceRebase is got\r
2222 # @retval True Successfully find a FvForceRebase statement\r
2223 # @retval False Not able to find a FvForceRebase statement\r
2224 #\r
2225 def __GetFvForceRebase(self, Obj):\r
2226\r
2227 if not self.__IsKeyword("FvForceRebase"):\r
2228 return False\r
2229\r
2230 if not self.__IsToken( "="):\r
2231 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2232\r
2233 if not self.__GetNextToken():\r
2234 raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber)\r
30fdf114 2235\r
79b74a03
LG
2236 if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:\r
2237 raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2238 \r
2239 if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]:\r
2240 Obj.FvForceRebase = True\r
2241 elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]:\r
2242 Obj.FvForceRebase = False\r
2243 else:\r
2244 Obj.FvForceRebase = None\r
2245 \r
2246 return True\r
0d2711a6
LG
2247\r
2248\r
30fdf114
LG
2249 ## __GetFvAttributes() method\r
2250 #\r
2251 # Get attributes for FV\r
2252 #\r
2253 # @param self The object pointer\r
2254 # @param Obj for whom attribute is got\r
2255 # @retval None\r
2256 #\r
2257 def __GetFvAttributes(self, FvObj):\r
2bc3256c 2258 IsWordToken = False\r
30fdf114 2259 while self.__GetNextWord():\r
2bc3256c 2260 IsWordToken = True\r
30fdf114
LG
2261 name = self.__Token\r
2262 if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \\r
2263 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \\r
2264 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
2265 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
2266 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
9425b349 2267 "WRITE_POLICY_RELIABLE", "WEAK_ALIGNMENT", "FvUsedSizeEnable"):\r
30fdf114 2268 self.__UndoToken()\r
e8a47801 2269 return False\r
30fdf114
LG
2270\r
2271 if not self.__IsToken( "="):\r
2272 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2273\r
2274 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2275 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2276\r
2277 FvObj.FvAttributeDict[name] = self.__Token\r
2278\r
2bc3256c 2279 return IsWordToken\r
30fdf114
LG
2280 \r
2281 ## __GetFvNameGuid() method\r
2282 #\r
2283 # Get FV GUID for FV\r
2284 #\r
2285 # @param self The object pointer\r
2286 # @param Obj for whom GUID is got\r
2287 # @retval None\r
2288 #\r
2289 def __GetFvNameGuid(self, FvObj):\r
2290\r
2291 if not self.__IsKeyword( "FvNameGuid"):\r
e8a47801 2292 return False\r
30fdf114
LG
2293\r
2294 if not self.__IsToken( "="):\r
2295 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2296\r
2297 if not self.__GetNextGuid():\r
2298 raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
2299\r
2300 FvObj.FvNameGuid = self.__Token\r
2301\r
e8a47801 2302 return True\r
30fdf114 2303\r
aaf8aa7b
YL
2304 def __GetFvNameString(self, FvObj):\r
2305\r
2306 if not self.__IsKeyword( "FvNameString"):\r
2307 return False\r
2308\r
2309 if not self.__IsToken( "="):\r
2310 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2311\r
2312 if not self.__GetNextToken() or self.__Token not in ('TRUE', 'FALSE'):\r
2313 raise Warning("expected TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber)\r
2314\r
2315 FvObj.FvNameString = self.__Token\r
2316\r
2317 return True\r
2318\r
b303ea72
LG
2319 def __GetFvExtEntryStatement(self, FvObj):\r
2320\r
92d07e48 2321 if not (self.__IsKeyword( "FV_EXT_ENTRY") or self.__IsKeyword( "FV_EXT_ENTRY_TYPE")):\r
b303ea72
LG
2322 return False\r
2323\r
2324 if not self.__IsKeyword ("TYPE"):\r
2325 raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
2326 \r
2327 if not self.__IsToken( "="):\r
2328 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2329\r
2330 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
2331 raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
2332\r
2333 FvObj.FvExtEntryTypeValue += [self.__Token]\r
2334\r
2335 if not self.__IsToken( "{"):\r
2336 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2337\r
2338 if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
2339 raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
2340\r
2341 FvObj.FvExtEntryType += [self.__Token]\r
2342\r
2343 if self.__Token == 'DATA':\r
2344\r
2345 if not self.__IsToken( "="):\r
2346 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2347 \r
2348 if not self.__IsToken( "{"):\r
2349 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2350\r
2351 if not self.__GetNextHexNumber():\r
2352 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2353\r
2354 if len(self.__Token) > 4:\r
2355 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2356\r
2357 DataString = self.__Token\r
2358 DataString += ","\r
2359\r
2360 while self.__IsToken(","):\r
2361 if not self.__GetNextHexNumber():\r
2362 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2363 if len(self.__Token) > 4:\r
2364 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2365 DataString += self.__Token\r
2366 DataString += ","\r
2367\r
2368 if not self.__IsToken( "}"):\r
2369 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2370\r
2371 if not self.__IsToken( "}"):\r
2372 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2373\r
2374 DataString = DataString.rstrip(",")\r
2375 FvObj.FvExtEntryData += [DataString]\r
2376\r
2377 if self.__Token == 'FILE':\r
2378 \r
2379 if not self.__IsToken( "="):\r
2380 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2381 \r
2382 if not self.__GetNextToken():\r
2383 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
2384 \r
2385 FvObj.FvExtEntryData += [self.__Token]\r
2386\r
2387 if not self.__IsToken( "}"):\r
2388 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2389\r
2390 return True\r
2391\r
30fdf114
LG
2392 ## __GetAprioriSection() method\r
2393 #\r
2394 # Get token statements\r
2395 #\r
2396 # @param self The object pointer\r
2397 # @param FvObj for whom apriori is got\r
2398 # @param MacroDict dictionary used to replace macro\r
2399 # @retval True Successfully find apriori statement\r
2400 # @retval False Not able to find apriori statement\r
2401 #\r
2402 def __GetAprioriSection(self, FvObj, MacroDict = {}):\r
2403\r
2404 if not self.__IsKeyword( "APRIORI"):\r
2405 return False\r
2406\r
2407 if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):\r
2408 raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber)\r
2409 AprType = self.__Token\r
2410\r
2411 if not self.__IsToken( "{"):\r
2412 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2413\r
2414 AprSectionObj = AprioriSection.AprioriSection()\r
2415 AprSectionObj.AprioriType = AprType\r
2416\r
2417 self.__GetDefineStatements(AprSectionObj)\r
2418 MacroDict.update(AprSectionObj.DefineVarDict)\r
2419\r
2420 while True:\r
cdc9b0c2 2421 IsInf = self.__GetInfStatement(AprSectionObj)\r
30fdf114
LG
2422 IsFile = self.__GetFileStatement( AprSectionObj)\r
2423 if not IsInf and not IsFile:\r
2424 break\r
2425\r
2426 if not self.__IsToken( "}"):\r
2427 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2428\r
2429 FvObj.AprioriSectionList.append(AprSectionObj)\r
2430 return True\r
2431\r
b21a13fb
YZ
2432 def __ParseInfStatement(self):\r
2433 if not self.__IsKeyword("INF"):\r
2434 return None\r
30fdf114
LG
2435\r
2436 ffsInf = FfsInfStatement.FfsInfStatement()\r
b21a13fb 2437 self.__GetInfOptions(ffsInf)\r
30fdf114
LG
2438\r
2439 if not self.__GetNextToken():\r
2440 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
2441 ffsInf.InfFileName = self.__Token\r
a87e79d9
YZ
2442 if not ffsInf.InfFileName.endswith('.inf'):\r
2443 raise Warning("expected .inf file path", self.FileName, self.CurrentLineNumber)\r
64b2609f
LG
2444\r
2445 ffsInf.CurrentLineNum = self.CurrentLineNumber\r
2446 ffsInf.CurrentLineContent = self.__CurrentLine()\r
2447\r
97fa0ee9
YL
2448 #Replace $(SAPCE) with real space\r
2449 ffsInf.InfFileName = ffsInf.InfFileName.replace('$(SPACE)', ' ')\r
2450\r
14c48571 2451 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2452 #do case sensitive check for file path\r
2453 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2454 if ErrorCode != 0:\r
2455 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114 2456\r
30fdf114
LG
2457 if not ffsInf.InfFileName in self.Profile.InfList:\r
2458 self.Profile.InfList.append(ffsInf.InfFileName)\r
d0acc87a
LG
2459 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2460 self.Profile.InfFileLineList.append(FileLineTuple)\r
2502b735
YZ
2461 if ffsInf.UseArch:\r
2462 if ffsInf.UseArch not in self.Profile.InfDict:\r
2463 self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
2464 else:\r
2465 self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
2466 else:\r
2467 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
30fdf114
LG
2468\r
2469 if self.__IsToken('|'):\r
2470 if self.__IsKeyword('RELOCS_STRIPPED'):\r
2471 ffsInf.KeepReloc = False\r
2472 elif self.__IsKeyword('RELOCS_RETAINED'):\r
2473 ffsInf.KeepReloc = True\r
2474 else:\r
2475 raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
b21a13fb
YZ
2476 return ffsInf\r
2477\r
2478 ## __GetInfStatement() method\r
2479 #\r
2480 # Get INF statements\r
2481 #\r
2482 # @param self The object pointer\r
2483 # @param Obj for whom inf statement is got\r
b21a13fb
YZ
2484 # @retval True Successfully find inf statement\r
2485 # @retval False Not able to find inf statement\r
2486 #\r
cdc9b0c2 2487 def __GetInfStatement(self, Obj, ForCapsule=False):\r
b21a13fb
YZ
2488 ffsInf = self.__ParseInfStatement()\r
2489 if not ffsInf:\r
2490 return False\r
2491\r
30fdf114
LG
2492 if ForCapsule:\r
2493 capsuleFfs = CapsuleData.CapsuleFfs()\r
2494 capsuleFfs.Ffs = ffsInf\r
2495 Obj.CapsuleDataList.append(capsuleFfs)\r
2496 else:\r
2497 Obj.FfsList.append(ffsInf)\r
2498 return True\r
2499\r
2500 ## __GetInfOptions() method\r
2501 #\r
2502 # Get options for INF\r
2503 #\r
2504 # @param self The object pointer\r
2505 # @param FfsInfObj for whom option is got\r
2506 #\r
2507 def __GetInfOptions(self, FfsInfObj):\r
97fa0ee9
YL
2508 if self.__IsKeyword("FILE_GUID"):\r
2509 if not self.__IsToken("="):\r
2510 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2511 if not self.__GetNextGuid():\r
2512 raise Warning("expected GUID value", self.FileName, self.CurrentLineNumber)\r
2513 FfsInfObj.OverrideGuid = self.__Token\r
30fdf114
LG
2514\r
2515 if self.__IsKeyword( "RuleOverride"):\r
2516 if not self.__IsToken( "="):\r
2517 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2518 if not self.__GetNextToken():\r
2519 raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
2520 FfsInfObj.Rule = self.__Token\r
2521\r
2522 if self.__IsKeyword( "VERSION"):\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 Version", self.FileName, self.CurrentLineNumber)\r
2527\r
2528 if self.__GetStringData():\r
2529 FfsInfObj.Version = self.__Token\r
2530\r
2531 if self.__IsKeyword( "UI"):\r
2532 if not self.__IsToken( "="):\r
2533 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2534 if not self.__GetNextToken():\r
2535 raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
2536\r
2537 if self.__GetStringData():\r
2538 FfsInfObj.Ui = self.__Token\r
2539\r
2540 if self.__IsKeyword( "USE"):\r
2541 if not self.__IsToken( "="):\r
2542 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2543 if not self.__GetNextToken():\r
2544 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2545 FfsInfObj.UseArch = self.__Token\r
2546\r
2547 \r
2548 if self.__GetNextToken():\r
97fa0ee9
YL
2549 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')\r
2550 if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token):\r
30fdf114
LG
2551 FfsInfObj.KeyStringList.append(self.__Token)\r
2552 if not self.__IsToken(","):\r
2553 return\r
2554 else:\r
2555 self.__UndoToken()\r
2556 return\r
2557\r
2558 while self.__GetNextToken():\r
2559 if not p.match(self.__Token):\r
2560 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2561 FfsInfObj.KeyStringList.append(self.__Token)\r
2562\r
2563 if not self.__IsToken(","):\r
2564 break\r
2565\r
2566 ## __GetFileStatement() method\r
2567 #\r
2568 # Get FILE statements\r
2569 #\r
2570 # @param self The object pointer\r
2571 # @param Obj for whom FILE statement is got\r
2572 # @param MacroDict dictionary used to replace macro\r
2573 # @retval True Successfully find FILE statement\r
2574 # @retval False Not able to find FILE statement\r
2575 #\r
2576 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2577\r
2578 if not self.__IsKeyword( "FILE"):\r
2579 return False\r
2580\r
30fdf114
LG
2581 if not self.__GetNextWord():\r
2582 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
b36d134f
LG
2583\r
2584 if ForCapsule and self.__Token == 'DATA':\r
2585 self.__UndoToken()\r
2586 self.__UndoToken()\r
2587 return False\r
2588 \r
2589 FfsFileObj = FfsFileStatement.FileStatement()\r
30fdf114
LG
2590 FfsFileObj.FvFileType = self.__Token\r
2591\r
2592 if not self.__IsToken( "="):\r
2593 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2594\r
2595 if not self.__GetNextGuid():\r
2596 if not self.__GetNextWord():\r
2597 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2598 if self.__Token == 'PCD':\r
2599 if not self.__IsToken( "("):\r
2600 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2601 PcdPair = self.__GetNextPcdName()\r
2602 if not self.__IsToken( ")"):\r
2603 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2604 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2605 \r
2606 FfsFileObj.NameGuid = self.__Token\r
79b74a03 2607 \r
30fdf114
LG
2608 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2609\r
2610 if ForCapsule:\r
2611 capsuleFfs = CapsuleData.CapsuleFfs()\r
2612 capsuleFfs.Ffs = FfsFileObj\r
2613 Obj.CapsuleDataList.append(capsuleFfs)\r
2614 else:\r
2615 Obj.FfsList.append(FfsFileObj)\r
2616\r
2617 return True\r
2618\r
2619 ## __FileCouldHaveRelocFlag() method\r
2620 #\r
2621 # Check whether reloc strip flag can be set for a file type.\r
2622 #\r
30fdf114
LG
2623 # @param FileType The file type to check with\r
2624 # @retval True This type could have relocation strip flag\r
2625 # @retval False No way to have it\r
2626 #\r
5bcf1d56
CJ
2627 @staticmethod\r
2628 def __FileCouldHaveRelocFlag (FileType):\r
8bb63e37 2629 if FileType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, 'PEI_DXE_COMBO'):\r
30fdf114
LG
2630 return True\r
2631 else:\r
2632 return False\r
2633\r
2634 ## __SectionCouldHaveRelocFlag() method\r
2635 #\r
2636 # Check whether reloc strip flag can be set for a section type.\r
2637 #\r
30fdf114
LG
2638 # @param SectionType The section type to check with\r
2639 # @retval True This type could have relocation strip flag\r
2640 # @retval False No way to have it\r
2641 #\r
5bcf1d56
CJ
2642 @staticmethod\r
2643 def __SectionCouldHaveRelocFlag (SectionType):\r
30fdf114
LG
2644 if SectionType in ('TE', 'PE32'):\r
2645 return True\r
2646 else:\r
2647 return False\r
2648\r
2649 ## __GetFilePart() method\r
2650 #\r
2651 # Get components for FILE statement\r
2652 #\r
2653 # @param self The object pointer\r
2654 # @param FfsFileObj for whom component is got\r
2655 # @param MacroDict dictionary used to replace macro\r
2656 #\r
2657 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2658\r
2659 self.__GetFileOpts( FfsFileObj)\r
2660\r
2661 if not self.__IsToken("{"):\r
4afd3d04
LG
2662 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2663 if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2664 if self.__Token == 'RELOCS_STRIPPED':\r
2665 FfsFileObj.KeepReloc = False\r
2666 else:\r
2667 FfsFileObj.KeepReloc = True\r
2668 else:\r
2669 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2670\r
2671 if not self.__IsToken("{"):\r
30fdf114
LG
2672 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2673\r
2674 if not self.__GetNextToken():\r
2675 raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
2676\r
2677 if self.__Token == "FV":\r
2678 if not self.__IsToken( "="):\r
2679 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2680 if not self.__GetNextToken():\r
2681 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2682 FfsFileObj.FvName = self.__Token\r
2683\r
2684 elif self.__Token == "FD":\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 FD name", self.FileName, self.CurrentLineNumber)\r
2689 FfsFileObj.FdName = self.__Token\r
2690\r
2691 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2692 self.__UndoToken()\r
2693 self.__GetSectionData( FfsFileObj, MacroDict)\r
860992ed
YZ
2694\r
2695 elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':\r
2696 self.__UndoToken()\r
2697 self.__GetRAWData(FfsFileObj, MacroDict)\r
2698\r
30fdf114 2699 else:\r
64b2609f
LG
2700 FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
2701 FfsFileObj.CurrentLineContent = self.__CurrentLine()\r
97fa0ee9 2702 FfsFileObj.FileName = self.__Token.replace('$(SPACE)', ' ')\r
2bc3256c 2703 self.__VerifyFile(FfsFileObj.FileName)\r
0d2711a6 2704\r
30fdf114
LG
2705 if not self.__IsToken( "}"):\r
2706 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2707\r
860992ed
YZ
2708 ## __GetRAWData() method\r
2709 #\r
2710 # Get RAW data for FILE statement\r
2711 #\r
2712 # @param self The object pointer\r
2713 # @param FfsFileObj for whom section is got\r
2714 # @param MacroDict dictionary used to replace macro\r
2715 #\r
2716 def __GetRAWData(self, FfsFileObj, MacroDict = {}):\r
2717 FfsFileObj.FileName = []\r
cfaaf99b 2718 FfsFileObj.SubAlignment = []\r
860992ed
YZ
2719 while True:\r
2720 AlignValue = None\r
2721 if self.__GetAlignment():\r
e921f58d
YZ
2722 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2723 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
860992ed 2724 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
f475f1e2
YZ
2725 #For FFS, Auto is default option same to ""\r
2726 if not self.__Token == "Auto":\r
2727 AlignValue = self.__Token\r
860992ed
YZ
2728 if not self.__GetNextToken():\r
2729 raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
2730\r
2731 FileName = self.__Token.replace('$(SPACE)', ' ')\r
2732 if FileName == '}':\r
2733 self.__UndoToken()\r
2734 raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
860992ed
YZ
2735\r
2736 self.__VerifyFile(FileName)\r
2737 File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)\r
2738 FfsFileObj.FileName.append(File.Path)\r
cfaaf99b 2739 FfsFileObj.SubAlignment.append(AlignValue)\r
860992ed
YZ
2740\r
2741 if self.__IsToken( "}"):\r
2742 self.__UndoToken()\r
2743 break\r
2744\r
cfaaf99b
YZ
2745 if len(FfsFileObj.SubAlignment) == 1:\r
2746 FfsFileObj.SubAlignment = FfsFileObj.SubAlignment[0]\r
860992ed
YZ
2747 if len(FfsFileObj.FileName) == 1:\r
2748 FfsFileObj.FileName = FfsFileObj.FileName[0]\r
2749\r
30fdf114
LG
2750 ## __GetFileOpts() method\r
2751 #\r
2752 # Get options for FILE statement\r
2753 #\r
2754 # @param self The object pointer\r
2755 # @param FfsFileObj for whom options is got\r
2756 #\r
2757 def __GetFileOpts(self, FfsFileObj):\r
2758\r
2759 if self.__GetNextToken():\r
147a656b 2760 if TokenFindPattern.match(self.__Token):\r
30fdf114
LG
2761 FfsFileObj.KeyStringList.append(self.__Token)\r
2762 if self.__IsToken(","):\r
2763 while self.__GetNextToken():\r
147a656b 2764 if not TokenFindPattern.match(self.__Token):\r
30fdf114
LG
2765 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2766 FfsFileObj.KeyStringList.append(self.__Token)\r
2767\r
2768 if not self.__IsToken(","):\r
2769 break\r
2770\r
2771 else:\r
2772 self.__UndoToken()\r
2773\r
2774 if self.__IsKeyword( "FIXED", True):\r
2775 FfsFileObj.Fixed = True\r
2776\r
2777 if self.__IsKeyword( "CHECKSUM", True):\r
2778 FfsFileObj.CheckSum = True\r
2779\r
2780 if self.__GetAlignment():\r
e921f58d
YZ
2781 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2782 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
9053bc51 2783 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2784 #For FFS, Auto is default option same to ""\r
2785 if not self.__Token == "Auto":\r
2786 FfsFileObj.Alignment = self.__Token\r
30fdf114
LG
2787\r
2788 ## __GetAlignment() method\r
2789 #\r
2790 # Return the alignment value\r
2791 #\r
2792 # @param self The object pointer\r
2793 # @retval True Successfully find alignment\r
2794 # @retval False Not able to find alignment\r
2795 #\r
2796 def __GetAlignment(self):\r
2797 if self.__IsKeyword( "Align", True):\r
2798 if not self.__IsToken( "="):\r
2799 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2800\r
2801 if not self.__GetNextToken():\r
2802 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2803 return True\r
2804\r
2805 return False\r
2806\r
2807 ## __GetFilePart() method\r
2808 #\r
2809 # Get section data for FILE statement\r
2810 #\r
2811 # @param self The object pointer\r
2812 # @param FfsFileObj for whom section is got\r
2813 # @param MacroDict dictionary used to replace macro\r
2814 #\r
2815 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2816 Dict = {}\r
2817 Dict.update(MacroDict)\r
2818\r
2819 self.__GetDefineStatements(FfsFileObj)\r
2820\r
2821 Dict.update(FfsFileObj.DefineVarDict)\r
2822 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2823 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2824\r
2825 while True:\r
2826 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2827 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2828 if not IsLeafSection and not IsEncapSection:\r
2829 break\r
2830\r
2831 ## __GetLeafSection() method\r
2832 #\r
2833 # Get leaf section for Obj\r
2834 #\r
2835 # @param self The object pointer\r
2836 # @param Obj for whom leaf section is got\r
2837 # @param MacroDict dictionary used to replace macro\r
2838 # @retval True Successfully find section statement\r
2839 # @retval False Not able to find section statement\r
2840 #\r
2841 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2842\r
2843 OldPos = self.GetFileBufferPos()\r
2844\r
2845 if not self.__IsKeyword( "SECTION"):\r
2846 if len(Obj.SectionList) == 0:\r
2847 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2848 else:\r
2849 return False\r
2850\r
2851 AlignValue = None\r
2852 if self.__GetAlignment():\r
e921f58d
YZ
2853 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2854 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2855 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2856 AlignValue = self.__Token\r
2857\r
2858 BuildNum = None\r
2859 if self.__IsKeyword( "BUILD_NUM"):\r
2860 if not self.__IsToken( "="):\r
2861 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2862\r
2863 if not self.__GetNextToken():\r
2864 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2865\r
2866 BuildNum = self.__Token\r
2867\r
2868 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2869 if AlignValue == 'Auto':\r
2870 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2871 if not self.__IsToken( "="):\r
2872 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2873 if not self.__GetNextToken():\r
2874 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2875 VerSectionObj = VerSection.VerSection()\r
2876 VerSectionObj.Alignment = AlignValue\r
2877 VerSectionObj.BuildNum = BuildNum\r
2878 if self.__GetStringData():\r
2879 VerSectionObj.StringData = self.__Token\r
2880 else:\r
2881 VerSectionObj.FileName = self.__Token\r
2882 Obj.SectionList.append(VerSectionObj)\r
52302d4d 2883 \r
30fdf114 2884 elif self.__IsKeyword( "UI"):\r
52302d4d
LG
2885 if AlignValue == 'Auto':\r
2886 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2887 if not self.__IsToken( "="):\r
2888 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2889 if not self.__GetNextToken():\r
2890 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2891 UiSectionObj = UiSection.UiSection()\r
2892 UiSectionObj.Alignment = AlignValue\r
2893 if self.__GetStringData():\r
2894 UiSectionObj.StringData = self.__Token\r
2895 else:\r
2896 UiSectionObj.FileName = self.__Token\r
2897 Obj.SectionList.append(UiSectionObj)\r
2898\r
2899 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2900 if AlignValue == 'Auto':\r
2901 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2902 if not self.__IsToken( "="):\r
2903 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2904 if not self.__GetNextToken():\r
2905 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2906\r
2907 FvName = self.__Token\r
2908 FvObj = None\r
2909\r
2910 if self.__IsToken( "{"):\r
2911 FvObj = Fv.FV()\r
2912 FvObj.UiFvName = FvName.upper()\r
2913 self.__GetDefineStatements(FvObj)\r
2914 MacroDict.update(FvObj.DefineVarDict)\r
2915 self.__GetBlockStatement(FvObj)\r
2916 self.__GetSetStatements(FvObj)\r
2917 self.__GetFvAlignment(FvObj)\r
2918 self.__GetFvAttributes(FvObj)\r
2919 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2920 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2921\r
2922 while True:\r
cdc9b0c2 2923 IsInf = self.__GetInfStatement(FvObj)\r
30fdf114
LG
2924 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2925 if not IsInf and not IsFile:\r
2926 break\r
2927\r
2928 if not self.__IsToken( "}"):\r
2929 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2930\r
2931 FvImageSectionObj = FvImageSection.FvImageSection()\r
2932 FvImageSectionObj.Alignment = AlignValue\r
4231a819 2933 if FvObj is not None:\r
30fdf114
LG
2934 FvImageSectionObj.Fv = FvObj\r
2935 FvImageSectionObj.FvName = None\r
2936 else:\r
2937 FvImageSectionObj.FvName = FvName.upper()\r
2938 FvImageSectionObj.FvFileName = FvName\r
2939\r
2940 Obj.SectionList.append(FvImageSectionObj)\r
2941\r
2942 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
2943 if AlignValue == 'Auto':\r
2944 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2945 DepexSectionObj = DepexSection.DepexSection()\r
2946 DepexSectionObj.Alignment = AlignValue\r
2947 DepexSectionObj.DepexType = self.__Token\r
2948\r
2949 if not self.__IsToken( "="):\r
2950 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2951 if not self.__IsToken( "{"):\r
2952 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2953 if not self.__SkipToToken( "}"):\r
2954 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
2955\r
2956 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2957 Obj.SectionList.append(DepexSectionObj)\r
2958\r
2959 else:\r
30fdf114
LG
2960 if not self.__GetNextWord():\r
2961 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
2962\r
2963 # Encapsulation section appear, UndoToken and return\r
2964 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2965 self.SetFileBufferPos(OldPos)\r
2966 return False\r
2967\r
2968 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2969 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2970 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2971 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2972 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2973\r
30fdf114
LG
2974 # DataSection\r
2975 DataSectionObj = DataSection.DataSection()\r
2976 DataSectionObj.Alignment = AlignValue\r
2977 DataSectionObj.SecType = self.__Token\r
2978\r
2979 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2980 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2981 if self.__Token == 'RELOCS_STRIPPED':\r
2982 DataSectionObj.KeepReloc = False\r
2983 else:\r
2984 DataSectionObj.KeepReloc = True\r
2985 else:\r
2986 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
2987\r
2988 if self.__IsToken("="):\r
2989 if not self.__GetNextToken():\r
2990 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
2991 DataSectionObj.SectFileName = self.__Token\r
2bc3256c 2992 self.__VerifyFile(DataSectionObj.SectFileName)\r
30fdf114
LG
2993 else:\r
2994 if not self.__GetCglSection(DataSectionObj):\r
2995 return False\r
2996\r
2997 Obj.SectionList.append(DataSectionObj)\r
2998\r
2999 return True\r
3000\r
2bc3256c
LG
3001 ## __VerifyFile\r
3002 #\r
3003 # Check if file exists or not:\r
3004 # If current phase if GenFds, the file must exist;\r
3005 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist\r
3006 # @param FileName: File path to be verified.\r
3007 #\r
3008 def __VerifyFile(self, FileName):\r
3009 if FileName.replace('$(WORKSPACE)', '').find('$') != -1:\r
3010 return\r
3011 if not GlobalData.gAutoGenPhase or not self.__GetMacroValue("OUTPUT_DIRECTORY") in FileName:\r
3012 ErrorCode, ErrorInfo = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3013 if ErrorCode != 0:\r
3014 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3015\r
30fdf114
LG
3016 ## __GetCglSection() method\r
3017 #\r
3018 # Get compressed or GUIDed section for Obj\r
3019 #\r
3020 # @param self The object pointer\r
3021 # @param Obj for whom leaf section is got\r
3022 # @param AlignValue alignment value for complex section\r
3023 # @retval True Successfully find section statement\r
3024 # @retval False Not able to find section statement\r
3025 #\r
3026 def __GetCglSection(self, Obj, AlignValue = None):\r
3027\r
3028 if self.__IsKeyword( "COMPRESS"):\r
3029 type = "PI_STD"\r
3030 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3031 type = self.__Token\r
3032\r
3033 if not self.__IsToken("{"):\r
3034 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3035\r
3036 CompressSectionObj = CompressSection.CompressSection()\r
3037 CompressSectionObj.Alignment = AlignValue\r
3038 CompressSectionObj.CompType = type\r
3039 # Recursive sections...\r
3040 while True:\r
3041 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
3042 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
3043 if not IsLeafSection and not IsEncapSection:\r
3044 break\r
3045\r
3046\r
3047 if not self.__IsToken( "}"):\r
3048 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3049 Obj.SectionList.append(CompressSectionObj)\r
3050\r
3051# else:\r
3052# raise Warning("Compress type not known")\r
3053\r
3054 return True\r
3055\r
3056 elif self.__IsKeyword( "GUIDED"):\r
3057 GuidValue = None\r
3058 if self.__GetNextGuid():\r
3059 GuidValue = self.__Token\r
3060\r
3061 AttribDict = self.__GetGuidAttrib()\r
3062 if not self.__IsToken("{"):\r
3063 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3064 GuidSectionObj = GuidSection.GuidSection()\r
3065 GuidSectionObj.Alignment = AlignValue\r
3066 GuidSectionObj.NameGuid = GuidValue\r
3067 GuidSectionObj.SectionType = "GUIDED"\r
3068 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3069 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
25918452 3070 GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
30fdf114
LG
3071 # Recursive sections...\r
3072 while True:\r
3073 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
3074 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
3075 if not IsLeafSection and not IsEncapSection:\r
3076 break\r
3077\r
3078 if not self.__IsToken( "}"):\r
3079 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3080 Obj.SectionList.append(GuidSectionObj)\r
3081\r
3082 return True\r
3083\r
3084 return False\r
3085\r
3086 ## __GetGuidAttri() method\r
3087 #\r
3088 # Get attributes for GUID section\r
3089 #\r
3090 # @param self The object pointer\r
3091 # @retval AttribDict Dictionary of key-value pair of section attributes\r
3092 #\r
3093 def __GetGuidAttrib(self):\r
3094\r
3095 AttribDict = {}\r
14c48571 3096 AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
3097 AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
25918452
LG
3098 AttribDict["EXTRA_HEADER_SIZE"] = -1\r
3099 while self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID") \\r
3100 or self.__IsKeyword("EXTRA_HEADER_SIZE"):\r
30fdf114
LG
3101 AttribKey = self.__Token\r
3102\r
3103 if not self.__IsToken("="):\r
3104 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3105\r
25918452
LG
3106 if not self.__GetNextToken():\r
3107 raise Warning("expected TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber)\r
3108 elif AttribKey == "EXTRA_HEADER_SIZE":\r
3109 Base = 10\r
3110 if self.__Token[0:2].upper() == "0X":\r
3111 Base = 16\r
3112 try:\r
3113 AttribDict[AttribKey] = int(self.__Token, Base)\r
3114 continue\r
3115 except ValueError:\r
3116 raise Warning("expected Number", self.FileName, self.CurrentLineNumber)\r
3117 elif self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
30fdf114
LG
3118 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
3119 AttribDict[AttribKey] = self.__Token\r
3120\r
3121 return AttribDict\r
3122\r
3123 ## __GetEncapsulationSec() method\r
3124 #\r
3125 # Get encapsulation section for FILE\r
3126 #\r
3127 # @param self The object pointer\r
3128 # @param FfsFile for whom section is got\r
3129 # @retval True Successfully find section statement\r
3130 # @retval False Not able to find section statement\r
3131 #\r
3132 def __GetEncapsulationSec(self, FfsFileObj):\r
3133\r
3134 OldPos = self.GetFileBufferPos()\r
3135 if not self.__IsKeyword( "SECTION"):\r
3136 if len(FfsFileObj.SectionList) == 0:\r
3137 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
3138 else:\r
3139 return False\r
3140\r
3141 AlignValue = None\r
3142 if self.__GetAlignment():\r
e921f58d
YZ
3143 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3144 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 3145 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3146 AlignValue = self.__Token\r
3147\r
3148 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
3149 self.SetFileBufferPos(OldPos)\r
3150 return False\r
3151 else:\r
3152 return True\r
3153\r
a3251d84
YL
3154 def __GetFmp(self):\r
3155 if not self.__GetNextToken():\r
3156 return False\r
3157 S = self.__Token.upper()\r
df81077f
YZ
3158 if S.startswith("[") and not S.startswith("[FMPPAYLOAD."):\r
3159 self.SectionParser(S)\r
a3251d84
YL
3160 self.__UndoToken()\r
3161 return False\r
3162\r
3163 self.__UndoToken()\r
3164 self.__SkipToToken("[FMPPAYLOAD.", True)\r
3165 FmpUiName = self.__GetUiName().upper()\r
3166 if FmpUiName in self.Profile.FmpPayloadDict:\r
3167 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName, self.FileName, self.CurrentLineNumber)\r
3168\r
3169 FmpData = CapsuleData.CapsulePayload()\r
3170 FmpData.UiName = FmpUiName\r
3171\r
3172 if not self.__IsToken( "]"):\r
3173 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3174\r
3175 if not self.__GetNextToken():\r
3176 raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber)\r
91ae2988 3177 FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']\r
a3251d84
YL
3178 while self.__Token in FmpKeyList:\r
3179 Name = self.__Token\r
3180 FmpKeyList.remove(Name)\r
3181 if not self.__IsToken("="):\r
3182 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3183 if Name == 'IMAGE_TYPE_ID':\r
3184 if not self.__GetNextGuid():\r
91ae2988 3185 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber)\r
a3251d84 3186 FmpData.ImageTypeId = self.__Token\r
91ae2988
YZ
3187 elif Name == 'CERTIFICATE_GUID':\r
3188 if not self.__GetNextGuid():\r
3189 raise Warning("expected GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
3190 FmpData.Certificate_Guid = self.__Token\r
3191 if uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID:\r
3192 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
3193 else:\r
3194 if not self.__GetNextToken():\r
3195 raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
3196 Value = self.__Token\r
3197 if Name == 'IMAGE_HEADER_INIT_VERSION':\r
227dbb11 3198 if FdfParser.__Verify(Name, Value, 'UINT8'):\r
91ae2988 3199 FmpData.Version = Value\r
a3251d84 3200 elif Name == 'IMAGE_INDEX':\r
227dbb11 3201 if FdfParser.__Verify(Name, Value, 'UINT8'):\r
91ae2988 3202 FmpData.ImageIndex = Value\r
a3251d84 3203 elif Name == 'HARDWARE_INSTANCE':\r
227dbb11 3204 if FdfParser.__Verify(Name, Value, 'UINT8'):\r
91ae2988
YZ
3205 FmpData.HardwareInstance = Value\r
3206 elif Name == 'MONOTONIC_COUNT':\r
227dbb11 3207 if FdfParser.__Verify(Name, Value, 'UINT64'):\r
91ae2988
YZ
3208 FmpData.MonotonicCount = Value\r
3209 if FmpData.MonotonicCount.upper().startswith('0X'):\r
3210 FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
3211 else:\r
3212 FmpData.MonotonicCount = (long)(FmpData.MonotonicCount)\r
a3251d84
YL
3213 if not self.__GetNextToken():\r
3214 break\r
3215 else:\r
3216 self.__UndoToken()\r
3217\r
91ae2988
YZ
3218 if (FmpData.MonotonicCount and not FmpData.Certificate_Guid) or (not FmpData.MonotonicCount and FmpData.Certificate_Guid):\r
3219 EdkLogger.error("FdfParser", FORMAT_INVALID, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")\r
9ce9bf53
YZ
3220\r
3221 # Only the IMAGE_TYPE_ID is required item\r
3222 if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList:\r
3223 raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
19e3aa7a
YZ
3224 # get the Image file and Vendor code file\r
3225 self.__GetFMPCapsuleData(FmpData)\r
3226 if not FmpData.ImageFile:\r
91ae2988 3227 raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
19e3aa7a
YZ
3228 # check whether more than one Vendor code file\r
3229 if len(FmpData.VendorCodeFile) > 1:\r
91ae2988 3230 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
3231 self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
3232 return True\r
3233\r
30fdf114
LG
3234 ## __GetCapsule() method\r
3235 #\r
3236 # Get capsule section contents and store its data into capsule list of self.Profile\r
3237 #\r
3238 # @param self The object pointer\r
3239 # @retval True Successfully find a capsule\r
3240 # @retval False Not able to find a capsule\r
3241 #\r
3242 def __GetCapsule(self):\r
3243\r
3244 if not self.__GetNextToken():\r
3245 return False\r
3246\r
3247 S = self.__Token.upper()\r
3248 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
df81077f 3249 self.SectionParser(S)\r
30fdf114
LG
3250 self.__UndoToken()\r
3251 return False\r
3252\r
3253 self.__UndoToken()\r
3254 if not self.__IsToken("[CAPSULE.", True):\r
3255 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3256 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3257 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3258 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
3259\r
3260 CapsuleObj = Capsule.Capsule()\r
3261\r
3262 CapsuleName = self.__GetUiName()\r
3263 if not CapsuleName:\r
3264 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
3265\r
3266 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
3267\r
3268 if not self.__IsToken( "]"):\r
3269 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3270\r
3271 if self.__IsKeyword("CREATE_FILE"):\r
3272 if not self.__IsToken( "="):\r
3273 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3274\r
3275 if not self.__GetNextToken():\r
3276 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
3277\r
3278 CapsuleObj.CreateFile = self.__Token\r
3279\r
3280 self.__GetCapsuleStatements(CapsuleObj)\r
fd171542 3281 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
30fdf114
LG
3282 return True\r
3283\r
3284 ## __GetCapsuleStatements() method\r
3285 #\r
3286 # Get statements for capsule\r
3287 #\r
3288 # @param self The object pointer\r
3289 # @param Obj for whom statements are got\r
3290 #\r
3291 def __GetCapsuleStatements(self, Obj):\r
3292 self.__GetCapsuleTokens(Obj)\r
3293 self.__GetDefineStatements(Obj)\r
3294 self.__GetSetStatements(Obj)\r
30fdf114
LG
3295 self.__GetCapsuleData(Obj)\r
3296\r
fd171542 3297 ## __GetCapsuleTokens() method\r
30fdf114
LG
3298 #\r
3299 # Get token statements for capsule\r
3300 #\r
3301 # @param self The object pointer\r
3302 # @param Obj for whom token statements are got\r
3303 #\r
3304 def __GetCapsuleTokens(self, Obj):\r
b303ea72
LG
3305 if not self.__GetNextToken():\r
3306 return False\r
a3251d84 3307 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):\r
b303ea72
LG
3308 Name = self.__Token.strip()\r
3309 if not self.__IsToken("="):\r
3310 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3311 if not self.__GetNextToken():\r
3312 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
3313 if Name == 'CAPSULE_FLAGS':\r
3314 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
3315 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
3316 Value = self.__Token.strip()\r
3317 while self.__IsToken(","):\r
3318 Value += ','\r
3319 if not self.__GetNextToken():\r
3320 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\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
e8a47801
LG
3324 elif Name == 'OEM_CAPSULE_FLAGS':\r
3325 Value = self.__Token.strip()\r
2bc3256c
LG
3326 if not Value.upper().startswith('0X'):\r
3327 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801
LG
3328 try:\r
3329 Value = int(Value, 0)\r
3330 except ValueError:\r
2bc3256c 3331 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801 3332 if not 0x0000 <= Value <= 0xFFFF:\r
2bc3256c 3333 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801 3334 Value = self.__Token.strip()\r
b303ea72
LG
3335 else:\r
3336 Value = self.__Token.strip()\r
3337 Obj.TokensDict[Name] = Value \r
3338 if not self.__GetNextToken():\r
3339 return False\r
3340 self.__UndoToken()\r
30fdf114
LG
3341\r
3342 ## __GetCapsuleData() method\r
3343 #\r
3344 # Get capsule data for capsule\r
3345 #\r
3346 # @param self The object pointer\r
3347 # @param Obj for whom capsule data are got\r
3348 #\r
3349 def __GetCapsuleData(self, Obj):\r
3350\r
3351 while True:\r
3352 IsInf = self.__GetInfStatement(Obj, True)\r
3353 IsFile = self.__GetFileStatement(Obj, True)\r
3354 IsFv = self.__GetFvStatement(Obj)\r
b36d134f
LG
3355 IsFd = self.__GetFdStatement(Obj)\r
3356 IsAnyFile = self.__GetAnyFileStatement(Obj)\r
2bc3256c 3357 IsAfile = self.__GetAfileStatement(Obj)\r
a3251d84
YL
3358 IsFmp = self.__GetFmpStatement(Obj)\r
3359 if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile or IsFmp):\r
30fdf114
LG
3360 break\r
3361\r
19e3aa7a
YZ
3362 ## __GetFMPCapsuleData() method\r
3363 #\r
3364 # Get capsule data for FMP capsule\r
3365 #\r
3366 # @param self The object pointer\r
3367 # @param Obj for whom capsule data are got\r
3368 #\r
3369 def __GetFMPCapsuleData(self, Obj):\r
3370\r
3371 while True:\r
3372 IsFv = self.__GetFvStatement(Obj, True)\r
3373 IsFd = self.__GetFdStatement(Obj, True)\r
3374 IsAnyFile = self.__GetAnyFileStatement(Obj, True)\r
3375 if not (IsFv or IsFd or IsAnyFile):\r
3376 break\r
3377\r
30fdf114
LG
3378 ## __GetFvStatement() method\r
3379 #\r
3380 # Get FV for capsule\r
3381 #\r
3382 # @param self The object pointer\r
3383 # @param CapsuleObj for whom FV is got\r
3384 # @retval True Successfully find a FV statement\r
3385 # @retval False Not able to find a FV statement\r
3386 #\r
19e3aa7a 3387 def __GetFvStatement(self, CapsuleObj, FMPCapsule = False):\r
30fdf114
LG
3388\r
3389 if not self.__IsKeyword("FV"):\r
3390 return False\r
3391\r
3392 if not self.__IsToken("="):\r
3393 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3394\r
3395 if not self.__GetNextToken():\r
3396 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
3397\r
9eb87141 3398 if self.__Token.upper() not in self.Profile.FvDict:\r
2bcc713e
LG
3399 raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
3400\r
30fdf114
LG
3401 CapsuleFv = CapsuleData.CapsuleFv()\r
3402 CapsuleFv.FvName = self.__Token\r
19e3aa7a
YZ
3403 if FMPCapsule:\r
3404 if not CapsuleObj.ImageFile:\r
3405 CapsuleObj.ImageFile.append(CapsuleFv)\r
3406 else:\r
3407 CapsuleObj.VendorCodeFile.append(CapsuleFv)\r
3408 else:\r
3409 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
30fdf114
LG
3410 return True\r
3411\r
b36d134f
LG
3412 ## __GetFdStatement() method\r
3413 #\r
3414 # Get FD for capsule\r
3415 #\r
3416 # @param self The object pointer\r
3417 # @param CapsuleObj for whom FD is got\r
3418 # @retval True Successfully find a FD statement\r
3419 # @retval False Not able to find a FD statement\r
3420 #\r
19e3aa7a 3421 def __GetFdStatement(self, CapsuleObj, FMPCapsule = False):\r
b36d134f
LG
3422\r
3423 if not self.__IsKeyword("FD"):\r
3424 return False\r
3425\r
3426 if not self.__IsToken("="):\r
3427 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3428\r
3429 if not self.__GetNextToken():\r
3430 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
3431\r
9eb87141 3432 if self.__Token.upper() not in self.Profile.FdDict:\r
2bcc713e
LG
3433 raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
3434\r
b36d134f
LG
3435 CapsuleFd = CapsuleData.CapsuleFd()\r
3436 CapsuleFd.FdName = self.__Token\r
19e3aa7a
YZ
3437 if FMPCapsule:\r
3438 if not CapsuleObj.ImageFile:\r
3439 CapsuleObj.ImageFile.append(CapsuleFd)\r
3440 else:\r
3441 CapsuleObj.VendorCodeFile.append(CapsuleFd)\r
3442 else:\r
3443 CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
b36d134f
LG
3444 return True\r
3445\r
a3251d84 3446 def __GetFmpStatement(self, CapsuleObj):\r
df81077f
YZ
3447 if not self.__IsKeyword("FMP_PAYLOAD"):\r
3448 if not self.__IsKeyword("FMP"):\r
3449 return False\r
b36d134f 3450\r
df81077f
YZ
3451 if not self.__IsKeyword("PAYLOAD"):\r
3452 self.__UndoToken()\r
3453 return False\r
b36d134f 3454\r
a3251d84
YL
3455 if not self.__IsToken("="):\r
3456 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3457\r
3458 if not self.__GetNextToken():\r
df81077f 3459 raise Warning("expected payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
a3251d84
YL
3460 Payload = self.__Token.upper()\r
3461 if Payload not in self.Profile.FmpPayloadDict:\r
3462 raise Warning("This FMP Payload does not exist: %s" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3463 CapsuleObj.FmpPayloadList.append(self.Profile.FmpPayloadDict[Payload])\r
3464 return True\r
3465\r
3466 def __ParseRawFileStatement(self):\r
3467 if not self.__IsKeyword("FILE"):\r
3468 return None\r
3469\r
b36d134f
LG
3470 if not self.__IsKeyword("DATA"):\r
3471 self.__UndoToken()\r
a3251d84 3472 return None\r
b36d134f
LG
3473\r
3474 if not self.__IsToken("="):\r
3475 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3476\r
3477 if not self.__GetNextToken():\r
3478 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3479 \r
3480 AnyFileName = self.__Token\r
35217a33
YZ
3481 self.__VerifyFile(AnyFileName)\r
3482\r
94e4bcbb
YZ
3483 if not os.path.isabs(AnyFileName):\r
3484 AnyFileName = mws.join(GenFdsGlobalVariable.WorkSpaceDir, AnyFileName)\r
3485\r
a3251d84
YL
3486 return AnyFileName\r
3487\r
3488 ## __GetAnyFileStatement() method\r
3489 #\r
3490 # Get AnyFile for capsule\r
3491 #\r
3492 # @param self The object pointer\r
3493 # @param CapsuleObj for whom AnyFile is got\r
3494 # @retval True Successfully find a Anyfile statement\r
3495 # @retval False Not able to find a AnyFile statement\r
3496 #\r
19e3aa7a 3497 def __GetAnyFileStatement(self, CapsuleObj, FMPCapsule = False):\r
a3251d84
YL
3498 AnyFileName = self.__ParseRawFileStatement()\r
3499 if not AnyFileName:\r
3500 return False\r
b36d134f
LG
3501\r
3502 CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
3503 CapsuleAnyFile.FileName = AnyFileName\r
19e3aa7a
YZ
3504 if FMPCapsule:\r
3505 if not CapsuleObj.ImageFile:\r
3506 CapsuleObj.ImageFile.append(CapsuleAnyFile)\r
3507 else:\r
3508 CapsuleObj.VendorCodeFile.append(CapsuleAnyFile)\r
3509 else:\r
3510 CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
b36d134f 3511 return True\r
2bc3256c
LG
3512 \r
3513 ## __GetAfileStatement() method\r
3514 #\r
3515 # Get Afile for capsule\r
3516 #\r
3517 # @param self The object pointer\r
3518 # @param CapsuleObj for whom Afile is got\r
3519 # @retval True Successfully find a Afile statement\r
3520 # @retval False Not able to find a Afile statement\r
3521 #\r
3522 def __GetAfileStatement(self, CapsuleObj):\r
3523\r
3524 if not self.__IsKeyword("APPEND"):\r
3525 return False\r
3526\r
3527 if not self.__IsToken("="):\r
3528 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3529\r
3530 if not self.__GetNextToken():\r
3531 raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber)\r
3532 \r
3533 AfileName = self.__Token\r
3534 AfileBaseName = os.path.basename(AfileName)\r
3535 \r
3536 if os.path.splitext(AfileBaseName)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:\r
3537 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \\r
3538 self.FileName, self.CurrentLineNumber)\r
3539 \r
3540 if not os.path.isabs(AfileName):\r
3541 AfileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AfileName)\r
3542 self.__VerifyFile(AfileName)\r
3543 else:\r
3544 if not os.path.exists(AfileName):\r
3545 raise Warning('%s does not exist' % AfileName, self.FileName, self.CurrentLineNumber)\r
3546 else:\r
3547 pass\r
3548\r
3549 CapsuleAfile = CapsuleData.CapsuleAfile()\r
3550 CapsuleAfile.FileName = AfileName\r
3551 CapsuleObj.CapsuleDataList.append(CapsuleAfile)\r
3552 return True\r
b36d134f 3553\r
30fdf114
LG
3554 ## __GetRule() method\r
3555 #\r
3556 # Get Rule section contents and store its data into rule list of self.Profile\r
3557 #\r
3558 # @param self The object pointer\r
3559 # @retval True Successfully find a Rule\r
3560 # @retval False Not able to find a Rule\r
3561 #\r
3562 def __GetRule(self):\r
3563\r
3564 if not self.__GetNextToken():\r
3565 return False\r
3566\r
3567 S = self.__Token.upper()\r
3568 if S.startswith("[") and not S.startswith("[RULE."):\r
df81077f 3569 self.SectionParser(S)\r
30fdf114
LG
3570 self.__UndoToken()\r
3571 return False\r
3572 self.__UndoToken()\r
3573 if not self.__IsToken("[Rule.", True):\r
3574 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3575 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3576 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3577 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
3578\r
3579 if not self.__SkipToToken("."):\r
3580 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3581\r
3582 Arch = self.__SkippedChars.rstrip(".")\r
eece4292 3583 if Arch.upper() not in ARCH_SET_FULL:\r
30fdf114
LG
3584 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3585\r
3586 ModuleType = self.__GetModuleType()\r
3587\r
3588 TemplateName = ""\r
3589 if self.__IsToken("."):\r
3590 if not self.__GetNextWord():\r
3591 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
3592 TemplateName = self.__Token\r
3593\r
3594 if not self.__IsToken( "]"):\r
3595 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3596\r
3597 RuleObj = self.__GetRuleFileStatements()\r
3598 RuleObj.Arch = Arch.upper()\r
3599 RuleObj.ModuleType = ModuleType\r
3600 RuleObj.TemplateName = TemplateName\r
3601 if TemplateName == '' :\r
3602 self.Profile.RuleDict['RULE' + \\r
3603 '.' + \\r
3604 Arch.upper() + \\r
3605 '.' + \\r
3606 ModuleType.upper() ] = RuleObj\r
3607 else :\r
3608 self.Profile.RuleDict['RULE' + \\r
3609 '.' + \\r
3610 Arch.upper() + \\r
3611 '.' + \\r
3612 ModuleType.upper() + \\r
3613 '.' + \\r
3614 TemplateName.upper() ] = RuleObj\r
3615# self.Profile.RuleList.append(rule)\r
3616 return True\r
3617\r
3618 ## __GetModuleType() method\r
3619 #\r
3620 # Return the module type\r
3621 #\r
3622 # @param self The object pointer\r
3623 # @retval string module type\r
3624 #\r
3625 def __GetModuleType(self):\r
3626\r
3627 if not self.__GetNextWord():\r
3628 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
8bb63e37
CJ
3629 if self.__Token.upper() not in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_DXE_CORE, \\r
3630 SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, \\r
3631 SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, \\r
3632 SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, "DEFAULT", SUP_MODULE_BASE, \\r
0c60e60b
CJ
3633 EDK_COMPONENT_TYPE_SECURITY_CORE, EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER, EDK_COMPONENT_TYPE_PIC_PEIM, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM, \\r
3634 "PE32_PEIM", EDK_COMPONENT_TYPE_BS_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, EDK_COMPONENT_TYPE_SAL_RT_DRIVER, EDK_COMPONENT_TYPE_APPLICATION, "ACPITABLE", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE):\r
30fdf114
LG
3635 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3636 return self.__Token\r
3637\r
3638 ## __GetFileExtension() method\r
3639 #\r
3640 # Return the file extension\r
3641 #\r
3642 # @param self The object pointer\r
3643 # @retval string file name extension\r
3644 #\r
3645 def __GetFileExtension(self):\r
3646 if not self.__IsToken("."):\r
df81077f 3647 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3648\r
3649 Ext = ""\r
3650 if self.__GetNextToken():\r
4d603daa 3651 if FileExtensionPattern.match(self.__Token):\r
30fdf114
LG
3652 Ext = self.__Token\r
3653 return '.' + Ext\r
3654 else:\r
3655 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3656\r
3657 else:\r
3658 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
3659\r
3660 ## __GetRuleFileStatement() method\r
3661 #\r
3662 # Get rule contents\r
3663 #\r
3664 # @param self The object pointer\r
3665 # @retval Rule Rule object\r
3666 #\r
3667 def __GetRuleFileStatements(self):\r
3668\r
3669 if not self.__IsKeyword("FILE"):\r
3670 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
3671\r
3672 if not self.__GetNextWord():\r
3673 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
3674\r
3675 Type = self.__Token.strip().upper()\r
8bb63e37 3676 if Type not in ("RAW", "FREEFORM", SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\\r
0c60e60b 3677 "PEI_DXE_COMBO", "DRIVER", SUP_MODULE_DXE_CORE, EDK_COMPONENT_TYPE_APPLICATION, "FV_IMAGE", "SMM", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE):\r
30fdf114
LG
3678 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3679\r
3680 if not self.__IsToken("="):\r
3681 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3682\r
3683 if not self.__IsKeyword("$(NAMED_GUID)"):\r
3684 if not self.__GetNextWord():\r
3685 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
3686 if self.__Token == 'PCD':\r
3687 if not self.__IsToken( "("):\r
3688 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3689 PcdPair = self.__GetNextPcdName()\r
3690 if not self.__IsToken( ")"):\r
3691 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3692 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3693 \r
3694 NameGuid = self.__Token\r
3695\r
3696 KeepReloc = None\r
3697 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3698 if self.__FileCouldHaveRelocFlag(Type):\r
3699 if self.__Token == 'RELOCS_STRIPPED':\r
3700 KeepReloc = False\r
3701 else:\r
3702 KeepReloc = True\r
3703 else:\r
3704 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3705\r
3706 KeyStringList = []\r
3707 if self.__GetNextToken():\r
147a656b 3708 if TokenFindPattern.match(self.__Token):\r
30fdf114
LG
3709 KeyStringList.append(self.__Token)\r
3710 if self.__IsToken(","):\r
3711 while self.__GetNextToken():\r
147a656b 3712 if not TokenFindPattern.match(self.__Token):\r
30fdf114
LG
3713 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
3714 KeyStringList.append(self.__Token)\r
3715\r
3716 if not self.__IsToken(","):\r
3717 break\r
3718\r
3719 else:\r
3720 self.__UndoToken()\r
3721\r
3722\r
3723 Fixed = False\r
3724 if self.__IsKeyword("Fixed", True):\r
3725 Fixed = True\r
3726\r
3727 CheckSum = False\r
3728 if self.__IsKeyword("CheckSum", True):\r
3729 CheckSum = True\r
3730\r
3731 AlignValue = ""\r
3732 if self.__GetAlignment():\r
e921f58d
YZ
3733 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3734 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 3735 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3736 #For FFS, Auto is default option same to ""\r
3737 if not self.__Token == "Auto":\r
3738 AlignValue = self.__Token\r
30fdf114
LG
3739\r
3740 if self.__IsToken("{"):\r
3741 # Complex file rule expected\r
3742 Rule = RuleComplexFile.RuleComplexFile()\r
3743 Rule.FvFileType = Type\r
3744 Rule.NameGuid = NameGuid\r
3745 Rule.Alignment = AlignValue\r
3746 Rule.CheckSum = CheckSum\r
3747 Rule.Fixed = Fixed\r
3748 Rule.KeyStringList = KeyStringList\r
4231a819 3749 if KeepReloc is not None:\r
30fdf114
LG
3750 Rule.KeepReloc = KeepReloc\r
3751\r
3752 while True:\r
3753 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3754 IsLeaf = self.__GetEfiSection(Rule)\r
3755 if not IsEncapsulate and not IsLeaf:\r
3756 break\r
3757\r
3758 if not self.__IsToken("}"):\r
3759 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3760\r
3761 return Rule\r
3762\r
30fdf114
LG
3763 else:\r
3764 # Simple file rule expected\r
3765 if not self.__GetNextWord():\r
3766 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3767\r
3768 SectionName = self.__Token\r
3769\r
3770 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3771 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
3772 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3773\r
3774\r
3775 if self.__IsKeyword("Fixed", True):\r
3776 Fixed = True\r
3777\r
3778 if self.__IsKeyword("CheckSum", True):\r
3779 CheckSum = True\r
3780\r
52302d4d 3781 SectAlignment = ""\r
30fdf114 3782 if self.__GetAlignment():\r
e921f58d
YZ
3783 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3784 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 3785 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3786 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3787 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3788 SectAlignment = self.__Token\r
3789\r
3790 Ext = None\r
3791 if self.__IsToken('|'):\r
3792 Ext = self.__GetFileExtension()\r
3793 elif not self.__GetNextToken():\r
30fdf114
LG
3794 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3795\r
3796 Rule = RuleSimpleFile.RuleSimpleFile()\r
3797 Rule.SectionType = SectionName\r
3798 Rule.FvFileType = Type\r
3799 Rule.NameGuid = NameGuid\r
3800 Rule.Alignment = AlignValue\r
52302d4d 3801 Rule.SectAlignment = SectAlignment\r
30fdf114
LG
3802 Rule.CheckSum = CheckSum\r
3803 Rule.Fixed = Fixed\r
30fdf114 3804 Rule.KeyStringList = KeyStringList\r
4231a819 3805 if KeepReloc is not None:\r
30fdf114 3806 Rule.KeepReloc = KeepReloc\r
52302d4d
LG
3807 Rule.FileExtension = Ext\r
3808 Rule.FileName = self.__Token\r
30fdf114
LG
3809 return Rule\r
3810\r
3811 ## __GetEfiSection() method\r
3812 #\r
3813 # Get section list for Rule\r
3814 #\r
3815 # @param self The object pointer\r
3816 # @param Obj for whom section is got\r
3817 # @retval True Successfully find section statement\r
3818 # @retval False Not able to find section statement\r
3819 #\r
3820 def __GetEfiSection(self, Obj):\r
3821\r
3822 OldPos = self.GetFileBufferPos()\r
3823 if not self.__GetNextWord():\r
3824 return False\r
3825 SectionName = self.__Token\r
3826\r
3827 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3828 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3829 self.__UndoToken()\r
3830 return False\r
3831\r
3832 if SectionName == "FV_IMAGE":\r
3833 FvImageSectionObj = FvImageSection.FvImageSection()\r
3834 if self.__IsKeyword("FV_IMAGE"):\r
3835 pass\r
3836 if self.__IsToken( "{"):\r
3837 FvObj = Fv.FV()\r
3838 self.__GetDefineStatements(FvObj)\r
3839 self.__GetBlockStatement(FvObj)\r
3840 self.__GetSetStatements(FvObj)\r
3841 self.__GetFvAlignment(FvObj)\r
3842 self.__GetFvAttributes(FvObj)\r
3843 self.__GetAprioriSection(FvObj)\r
3844 self.__GetAprioriSection(FvObj)\r
3845\r
3846 while True:\r
3847 IsInf = self.__GetInfStatement(FvObj)\r
3848 IsFile = self.__GetFileStatement(FvObj)\r
3849 if not IsInf and not IsFile:\r
3850 break\r
3851\r
3852 if not self.__IsToken( "}"):\r
3853 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3854 FvImageSectionObj.Fv = FvObj\r
3855 FvImageSectionObj.FvName = None\r
3856\r
3857 else:\r
3858 if not self.__IsKeyword("FV"):\r
3859 raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
3860 FvImageSectionObj.FvFileType = self.__Token\r
3861\r
30fdf114 3862 if self.__GetAlignment():\r
e921f58d
YZ
3863 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3864 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
3865 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3866 FvImageSectionObj.Alignment = self.__Token\r
3867\r
3868 if self.__IsToken('|'):\r
3869 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3870 elif self.__GetNextToken():\r
3871 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3872 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3873 FvImageSectionObj.FvFileName = self.__Token\r
3874 else:\r
3875 self.__UndoToken()\r
3876 else:\r
3877 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3878\r
3879 Obj.SectionList.append(FvImageSectionObj)\r
3880 return True\r
3881\r
3882 EfiSectionObj = EfiSection.EfiSection()\r
3883 EfiSectionObj.SectionType = SectionName\r
3884\r
3885 if not self.__GetNextToken():\r
3886 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3887\r
3888 if self.__Token == "STRING":\r
3889 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3890 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3891\r
3892 if not self.__IsToken('='):\r
3893 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3894\r
3895 if not self.__GetNextToken():\r
3896 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3897\r
3898 if self.__GetStringData():\r
3899 EfiSectionObj.StringData = self.__Token\r
3900\r
3901 if self.__IsKeyword("BUILD_NUM"):\r
3902 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3903 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3904\r
3905 if not self.__IsToken("="):\r
3906 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3907 if not self.__GetNextToken():\r
3908 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3909 EfiSectionObj.BuildNum = self.__Token\r
3910\r
3911 else:\r
3912 EfiSectionObj.FileType = self.__Token\r
3913 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3914\r
3915 if self.__IsKeyword("Optional"):\r
3916 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3917 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3918 EfiSectionObj.Optional = True\r
3919\r
3920 if self.__IsKeyword("BUILD_NUM"):\r
3921 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3922 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3923\r
3924 if not self.__IsToken("="):\r
3925 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3926 if not self.__GetNextToken():\r
3927 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3928 EfiSectionObj.BuildNum = self.__Token\r
3929\r
3930 if self.__GetAlignment():\r
e921f58d
YZ
3931 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3932 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d
LG
3933 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3934 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3935 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3936 EfiSectionObj.Alignment = self.__Token\r
3937\r
3938 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3939 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3940 if self.__Token == 'RELOCS_STRIPPED':\r
3941 EfiSectionObj.KeepReloc = False\r
3942 else:\r
3943 EfiSectionObj.KeepReloc = True\r
4231a819 3944 if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
30fdf114
LG
3945 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3946 else:\r
3947 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3948\r
3949\r
3950 if self.__IsToken('|'):\r
3951 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3952 elif self.__GetNextToken():\r
3953 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3954 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3955 \r
3956 if self.__Token.startswith('PCD'):\r
3957 self.__UndoToken()\r
3958 self.__GetNextWord()\r
3959 \r
3960 if self.__Token == 'PCD':\r
3961 if not self.__IsToken( "("):\r
3962 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3963 PcdPair = self.__GetNextPcdName()\r
3964 if not self.__IsToken( ")"):\r
3965 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3966 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3967 \r
3968 EfiSectionObj.FileName = self.__Token \r
3969 \r
3970 else:\r
3971 self.__UndoToken()\r
3972 else:\r
3973 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
3974\r
3975 Obj.SectionList.append(EfiSectionObj)\r
3976 return True\r
3977\r
3978 ## __RuleSectionCouldBeOptional() method\r
3979 #\r
3980 # Get whether a section could be optional\r
3981 #\r
30fdf114
LG
3982 # @param SectionType The section type to check\r
3983 # @retval True section could be optional\r
3984 # @retval False section never optional\r
3985 #\r
5bcf1d56
CJ
3986 @staticmethod\r
3987 def __RuleSectionCouldBeOptional(SectionType):\r
30fdf114
LG
3988 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3989 return True\r
3990 else:\r
3991 return False\r
3992\r
3993 ## __RuleSectionCouldHaveBuildNum() method\r
3994 #\r
3995 # Get whether a section could have build number information\r
3996 #\r
30fdf114
LG
3997 # @param SectionType The section type to check\r
3998 # @retval True section could have build number information\r
3999 # @retval False section never have build number information\r
4000 #\r
5bcf1d56
CJ
4001 @staticmethod\r
4002 def __RuleSectionCouldHaveBuildNum(SectionType):\r
30fdf114
LG
4003 if SectionType in ("VERSION"):\r
4004 return True\r
4005 else:\r
4006 return False\r
4007\r
4008 ## __RuleSectionCouldHaveString() method\r
4009 #\r
4010 # Get whether a section could have string\r
4011 #\r
30fdf114
LG
4012 # @param SectionType The section type to check\r
4013 # @retval True section could have string\r
4014 # @retval False section never have string\r
4015 #\r
5bcf1d56
CJ
4016 @staticmethod\r
4017 def __RuleSectionCouldHaveString(SectionType):\r
30fdf114
LG
4018 if SectionType in ("UI", "VERSION"):\r
4019 return True\r
4020 else:\r
4021 return False\r
4022\r
4023 ## __CheckRuleSectionFileType() method\r
4024 #\r
4025 # Get whether a section matches a file type\r
4026 #\r
4027 # @param self The object pointer\r
4028 # @param SectionType The section type to check\r
4029 # @param FileType The file type to check\r
4030 #\r
4031 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
4032 if SectionType == "COMPAT16":\r
4033 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
4034 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4035 elif SectionType == "PE32":\r
4036 if FileType not in ("PE32", "SEC_PE32"):\r
4037 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4038 elif SectionType == "PIC":\r
4039 if FileType not in ("PIC", "PIC"):\r
4040 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4041 elif SectionType == "TE":\r
4042 if FileType not in ("TE", "SEC_TE"):\r
4043 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4044 elif SectionType == "RAW":\r
4045 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
4046 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
4047 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
4048 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
4049 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4050 elif SectionType == "UI":\r
4051 if FileType not in ("UI", "SEC_UI"):\r
4052 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4053 elif SectionType == "VERSION":\r
4054 if FileType not in ("VERSION", "SEC_VERSION"):\r
4055 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4056 elif SectionType == "PEI_DEPEX":\r
4057 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
4058 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4059 elif SectionType == "GUID":\r
4060 if FileType not in ("PE32", "SEC_GUID"):\r
4061 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4062\r
4063 ## __GetRuleEncapsulationSection() method\r
4064 #\r
4065 # Get encapsulation section for Rule\r
4066 #\r
4067 # @param self The object pointer\r
4068 # @param Rule for whom section is got\r
4069 # @retval True Successfully find section statement\r
4070 # @retval False Not able to find section statement\r
4071 #\r
4072 def __GetRuleEncapsulationSection(self, Rule):\r
4073\r
4074 if self.__IsKeyword( "COMPRESS"):\r
4075 Type = "PI_STD"\r
4076 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
4077 Type = self.__Token\r
4078\r
4079 if not self.__IsToken("{"):\r
4080 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
4081\r
4082 CompressSectionObj = CompressSection.CompressSection()\r
4083\r
4084 CompressSectionObj.CompType = Type\r
4085 # Recursive sections...\r
4086 while True:\r
4087 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
4088 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
4089 if not IsEncapsulate and not IsLeaf:\r
4090 break\r
4091\r
4092 if not self.__IsToken( "}"):\r
4093 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
4094 Rule.SectionList.append(CompressSectionObj)\r
4095\r
4096 return True\r
4097\r
4098 elif self.__IsKeyword( "GUIDED"):\r
4099 GuidValue = None\r
4100 if self.__GetNextGuid():\r
4101 GuidValue = self.__Token\r
4102\r
4103 if self.__IsKeyword( "$(NAMED_GUID)"):\r
4104 GuidValue = self.__Token\r
4105\r
4106 AttribDict = self.__GetGuidAttrib()\r
4107\r
4108 if not self.__IsToken("{"):\r
4109 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
4110 GuidSectionObj = GuidSection.GuidSection()\r
4111 GuidSectionObj.NameGuid = GuidValue\r
4112 GuidSectionObj.SectionType = "GUIDED"\r
4113 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
4114 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
25918452 4115 GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
30fdf114
LG
4116\r
4117 # Efi sections...\r
4118 while True:\r
4119 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
4120 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
4121 if not IsEncapsulate and not IsLeaf:\r
4122 break\r
4123\r
4124 if not self.__IsToken( "}"):\r
4125 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
4126 Rule.SectionList.append(GuidSectionObj)\r
4127\r
4128 return True\r
4129\r
4130 return False\r
4131\r
4132 ## __GetVtf() method\r
4133 #\r
4134 # Get VTF section contents and store its data into VTF list of self.Profile\r
4135 #\r
4136 # @param self The object pointer\r
4137 # @retval True Successfully find a VTF\r
4138 # @retval False Not able to find a VTF\r
4139 #\r
4140 def __GetVtf(self):\r
4141\r
4142 if not self.__GetNextToken():\r
4143 return False\r
4144\r
4145 S = self.__Token.upper()\r
4146 if S.startswith("[") and not S.startswith("[VTF."):\r
df81077f 4147 self.SectionParser(S)\r
30fdf114
LG
4148 self.__UndoToken()\r
4149 return False\r
4150\r
4151 self.__UndoToken()\r
4152 if not self.__IsToken("[VTF.", True):\r
4153 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
4154 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
4155 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
4156 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
4157\r
4158 if not self.__SkipToToken("."):\r
4159 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
4160\r
4161 Arch = self.__SkippedChars.rstrip(".").upper()\r
4afd3d04 4162 if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
4163 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
4164\r
4165 if not self.__GetNextWord():\r
4166 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
4167 Name = self.__Token.upper()\r
4168\r
4169 VtfObj = Vtf.Vtf()\r
4170 VtfObj.UiName = Name\r
4171 VtfObj.KeyArch = Arch\r
4172\r
4173 if self.__IsToken(","):\r
4174 if not self.__GetNextWord():\r
4175 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
4afd3d04 4176 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
4177 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4178 VtfObj.ArchList = self.__Token.upper()\r
4179\r
4180 if not self.__IsToken( "]"):\r
4181 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
4182\r
4183 if self.__IsKeyword("IA32_RST_BIN"):\r
4184 if not self.__IsToken("="):\r
4185 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4186\r
4187 if not self.__GetNextToken():\r
4188 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
4189\r
4190 VtfObj.ResetBin = self.__Token\r
6310ffd7 4191 if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
4192 #check for file path\r
4193 ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4194 if ErrorCode != 0:\r
4195 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4196\r
4197 while self.__GetComponentStatement(VtfObj):\r
4198 pass\r
4199\r
4200 self.Profile.VtfList.append(VtfObj)\r
4201 return True\r
4202\r
4203 ## __GetComponentStatement() method\r
4204 #\r
4205 # Get components in VTF\r
4206 #\r
4207 # @param self The object pointer\r
4208 # @param VtfObj for whom component is got\r
4209 # @retval True Successfully find a component\r
4210 # @retval False Not able to find a component\r
4211 #\r
4212 def __GetComponentStatement(self, VtfObj):\r
4213\r
4214 if not self.__IsKeyword("COMP_NAME"):\r
4215 return False\r
4216\r
4217 if not self.__IsToken("="):\r
4218 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4219\r
4220 if not self.__GetNextWord():\r
4221 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
4222\r
4223 CompStatementObj = ComponentStatement.ComponentStatement()\r
4224 CompStatementObj.CompName = self.__Token\r
4225\r
4226 if not self.__IsKeyword("COMP_LOC"):\r
4227 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
4228\r
4229 if not self.__IsToken("="):\r
4230 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4231\r
4232 CompStatementObj.CompLoc = ""\r
4233 if self.__GetNextWord():\r
4234 CompStatementObj.CompLoc = self.__Token\r
4235 if self.__IsToken('|'):\r
4236 if not self.__GetNextWord():\r
4237 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
4238\r
4239 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
4240 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4241\r
4242 CompStatementObj.FilePos = self.__Token\r
4243 else:\r
4244 self.CurrentLineNumber += 1\r
4245 self.CurrentOffsetWithinLine = 0\r
4246\r
4247 if not self.__IsKeyword("COMP_TYPE"):\r
4248 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
4249\r
4250 if not self.__IsToken("="):\r
4251 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4252\r
4253 if not self.__GetNextToken():\r
4254 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
4255 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
4256 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
cfbe3c35 4257 not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:\r
30fdf114
LG
4258 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4259 CompStatementObj.CompType = self.__Token\r
4260\r
4261 if not self.__IsKeyword("COMP_VER"):\r
4262 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
4263\r
4264 if not self.__IsToken("="):\r
4265 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4266\r
4267 if not self.__GetNextToken():\r
4268 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
4269\r
9fd2164e 4270 Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
4231a819 4271 if Pattern.match(self.__Token) is None:\r
30fdf114
LG
4272 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4273 CompStatementObj.CompVer = self.__Token\r
4274\r
4275 if not self.__IsKeyword("COMP_CS"):\r
4276 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
4277\r
4278 if not self.__IsToken("="):\r
4279 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4280\r
4281 if not self.__GetNextToken():\r
4282 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
4283 if self.__Token not in ("1", "0"):\r
4284 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4285 CompStatementObj.CompCs = self.__Token\r
4286\r
4287\r
4288 if not self.__IsKeyword("COMP_BIN"):\r
4289 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
4290\r
4291 if not self.__IsToken("="):\r
4292 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4293\r
4294 if not self.__GetNextToken():\r
4295 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
4296\r
4297 CompStatementObj.CompBin = self.__Token\r
6310ffd7 4298 if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
4299 #check for file path\r
4300 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4301 if ErrorCode != 0:\r
4302 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4303\r
4304 if not self.__IsKeyword("COMP_SYM"):\r
4305 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
4306\r
4307 if not self.__IsToken("="):\r
4308 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4309\r
4310 if not self.__GetNextToken():\r
4311 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
4312\r
4313 CompStatementObj.CompSym = self.__Token\r
6310ffd7 4314 if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1:\r
4315 #check for file path\r
4316 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4317 if ErrorCode != 0:\r
4318 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4319\r
4320 if not self.__IsKeyword("COMP_SIZE"):\r
4321 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
4322\r
4323 if not self.__IsToken("="):\r
4324 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4325\r
4326 if self.__IsToken("-"):\r
4327 CompStatementObj.CompSize = self.__Token\r
4328 elif self.__GetNextDecimalNumber():\r
4329 CompStatementObj.CompSize = self.__Token\r
4330 elif self.__GetNextHexNumber():\r
4331 CompStatementObj.CompSize = self.__Token\r
4332 else:\r
4333 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4334\r
4335 VtfObj.ComponentStatementList.append(CompStatementObj)\r
4336 return True\r
4337\r
4338 ## __GetOptionRom() method\r
4339 #\r
4340 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
4341 #\r
4342 # @param self The object pointer\r
4343 # @retval True Successfully find a OptionROM\r
4344 # @retval False Not able to find a OptionROM\r
4345 #\r
4346 def __GetOptionRom(self):\r
4347\r
4348 if not self.__GetNextToken():\r
4349 return False\r
4350\r
4351 S = self.__Token.upper()\r
4352 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
df81077f
YZ
4353 self.SectionParser(S)\r
4354 self.__UndoToken()\r
4355 return False\r
30fdf114
LG
4356 \r
4357 self.__UndoToken()\r
4358 if not self.__IsToken("[OptionRom.", True):\r
4359 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4360\r
4361 OptRomName = self.__GetUiName()\r
4362\r
4363 if not self.__IsToken( "]"):\r
4364 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
4365\r
4366 OptRomObj = OptionRom.OPTIONROM()\r
4367 OptRomObj.DriverName = OptRomName\r
4368 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
4369\r
4370 while True:\r
4371 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
4372 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
4373 if not isInf and not isFile:\r
4374 break\r
4375 \r
4376 return True\r
4377\r
4378 ## __GetOptRomInfStatement() method\r
4379 #\r
4380 # Get INF statements\r
4381 #\r
4382 # @param self The object pointer\r
4383 # @param Obj for whom inf statement is got\r
4384 # @retval True Successfully find inf statement\r
4385 # @retval False Not able to find inf statement\r
4386 #\r
4387 def __GetOptRomInfStatement(self, Obj):\r
4388\r
4389 if not self.__IsKeyword( "INF"):\r
4390 return False\r
4391\r
4392 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
4393 self.__GetInfOptions( ffsInf)\r
4394\r
4395 if not self.__GetNextToken():\r
4396 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
4397 ffsInf.InfFileName = self.__Token\r
6310ffd7 4398 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
4399 #check for file path\r
4400 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4401 if ErrorCode != 0:\r
4402 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4403\r
4404 if not ffsInf.InfFileName in self.Profile.InfList:\r
4405 self.Profile.InfList.append(ffsInf.InfFileName)\r
d0acc87a
LG
4406 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
4407 self.Profile.InfFileLineList.append(FileLineTuple)\r
2502b735
YZ
4408 if ffsInf.UseArch:\r
4409 if ffsInf.UseArch not in self.Profile.InfDict:\r
4410 self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
4411 else:\r
4412 self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
4413 else:\r
4414 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
30fdf114
LG
4415\r
4416 \r
4417 self.__GetOptRomOverrides (ffsInf)\r
4418 \r
4419 Obj.FfsList.append(ffsInf)\r
4420 return True\r
4421\r
4422 ## __GetOptRomOverrides() method\r
4423 #\r
4424 # Get overrides for OptROM INF & FILE\r
4425 #\r
4426 # @param self The object pointer\r
4427 # @param FfsInfObj for whom overrides is got\r
4428 #\r
4429 def __GetOptRomOverrides(self, Obj):\r
4430 if self.__IsToken('{'):\r
4431 Overrides = OptionRom.OverrideAttribs()\r
fd171542 4432 while True:\r
4433 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
4434 if not self.__IsToken( "="):\r
4435 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4436 if not self.__GetNextHexNumber():\r
4437 raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
4438 Overrides.PciVendorId = self.__Token\r
4439 continue\r
4440\r
4441 if self.__IsKeyword( "PCI_CLASS_CODE"):\r
4442 if not self.__IsToken( "="):\r
4443 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4444 if not self.__GetNextHexNumber():\r
4445 raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
4446 Overrides.PciClassCode = self.__Token\r
4447 continue\r
4448\r
4449 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
4450 if not self.__IsToken( "="):\r
4451 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4452 if not self.__GetNextHexNumber():\r
4453 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
4454\r
4455 Overrides.PciDeviceId = self.__Token\r
4456 continue\r
4457\r
4458 if self.__IsKeyword( "PCI_REVISION"):\r
4459 if not self.__IsToken( "="):\r
4460 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4461 if not self.__GetNextHexNumber():\r
4462 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
4463 Overrides.PciRevision = self.__Token\r
4464 continue\r
4465\r
79b74a03 4466 if self.__IsKeyword( "PCI_COMPRESS"):\r
fd171542 4467 if not self.__IsToken( "="):\r
4468 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4469 if not self.__GetNextToken():\r
4470 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
4471 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
4472 continue\r
4473\r
4474 if self.__IsToken( "}"):\r
4475 break\r
4476 else:\r
4477 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
4478\r
30fdf114
LG
4479 Obj.OverrideAttribs = Overrides\r
4480 \r
4481 ## __GetOptRomFileStatement() method\r
4482 #\r
4483 # Get FILE statements\r
4484 #\r
4485 # @param self The object pointer\r
4486 # @param Obj for whom FILE statement is got\r
4487 # @retval True Successfully find FILE statement\r
4488 # @retval False Not able to find FILE statement\r
4489 #\r
4490 def __GetOptRomFileStatement(self, Obj):\r
4491\r
4492 if not self.__IsKeyword( "FILE"):\r
4493 return False\r
4494\r
4495 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
4496\r
4497 if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
4498 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
4499 FfsFileObj.FileType = self.__Token\r
4500\r
4501 if not self.__GetNextToken():\r
4502 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
4503 FfsFileObj.FileName = self.__Token\r
6310ffd7 4504 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
4505 #check for file path\r
4506 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4507 if ErrorCode != 0:\r
4508 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4509\r
4510 if FfsFileObj.FileType == 'EFI':\r
4511 self.__GetOptRomOverrides(FfsFileObj)\r
4512 \r
4513 Obj.FfsList.append(FfsFileObj)\r
4514\r
4515 return True\r
fd171542 4516\r
4517 ## __GetCapInFd() method\r
4518 #\r
4519 # Get Cap list contained in FD\r
4520 #\r
4521 # @param self The object pointer\r
4522 # @param FdName FD name\r
4523 # @retval CapList List of Capsule in FD\r
4524 #\r
4525 def __GetCapInFd (self, FdName):\r
4526\r
4527 CapList = []\r
9eb87141 4528 if FdName.upper() in self.Profile.FdDict:\r
fd171542 4529 FdObj = self.Profile.FdDict[FdName.upper()]\r
4530 for elementRegion in FdObj.RegionList:\r
4531 if elementRegion.RegionType == 'CAPSULE':\r
4532 for elementRegionData in elementRegion.RegionDataList:\r
4533 if elementRegionData.endswith(".cap"):\r
4534 continue\r
4231a819 4535 if elementRegionData is not None and elementRegionData.upper() not in CapList:\r
fd171542 4536 CapList.append(elementRegionData.upper())\r
4537 return CapList\r
4538\r
4539 ## __GetReferencedFdCapTuple() method\r
4540 #\r
4541 # Get FV and FD list referenced by a capsule image\r
4542 #\r
4543 # @param self The object pointer\r
4544 # @param CapObj Capsule section to be searched\r
4545 # @param RefFdList referenced FD by section\r
4546 # @param RefFvList referenced FV by section\r
4547 #\r
4548 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
4549\r
4550 for CapsuleDataObj in CapObj.CapsuleDataList :\r
4231a819 4551 if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName is not None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
fd171542 4552 RefFvList.append (CapsuleDataObj.FvName.upper())\r
4231a819 4553 elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName is not None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
b36d134f 4554 RefFdList.append (CapsuleDataObj.FdName.upper()) \r
4231a819 4555 elif CapsuleDataObj.Ffs is not None:\r
b36d134f 4556 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
4231a819 4557 if CapsuleDataObj.Ffs.FvName is not None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
b36d134f 4558 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
4231a819 4559 elif CapsuleDataObj.Ffs.FdName is not None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
b36d134f
LG
4560 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
4561 else:\r
4562 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
fd171542 4563\r
30fdf114
LG
4564 ## __GetFvInFd() method\r
4565 #\r
4566 # Get FV list contained in FD\r
4567 #\r
4568 # @param self The object pointer\r
4569 # @param FdName FD name\r
4570 # @retval FvList list of FV in FD\r
4571 #\r
4572 def __GetFvInFd (self, FdName):\r
4573\r
4574 FvList = []\r
9eb87141 4575 if FdName.upper() in self.Profile.FdDict:\r
30fdf114
LG
4576 FdObj = self.Profile.FdDict[FdName.upper()]\r
4577 for elementRegion in FdObj.RegionList:\r
4578 if elementRegion.RegionType == 'FV':\r
4579 for elementRegionData in elementRegion.RegionDataList:\r
fd171542 4580 if elementRegionData.endswith(".fv"):\r
4581 continue\r
4231a819 4582 if elementRegionData is not None and elementRegionData.upper() not in FvList:\r
30fdf114
LG
4583 FvList.append(elementRegionData.upper())\r
4584 return FvList\r
4585\r
4586 ## __GetReferencedFdFvTuple() method\r
4587 #\r
4588 # Get FD and FV list referenced by a FFS file\r
4589 #\r
4590 # @param self The object pointer\r
4591 # @param FfsFile contains sections to be searched\r
4592 # @param RefFdList referenced FD by section\r
4593 # @param RefFvList referenced FV by section\r
4594 #\r
4595 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
4596\r
4597 for FfsObj in FvObj.FfsList:\r
4598 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
4231a819 4599 if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:\r
30fdf114 4600 RefFvList.append(FfsObj.FvName.upper())\r
4231a819 4601 elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:\r
30fdf114
LG
4602 RefFdList.append(FfsObj.FdName.upper())\r
4603 else:\r
4604 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
4605\r
4606 ## __GetReferencedFdFvTupleFromSection() method\r
4607 #\r
4608 # Get FD and FV list referenced by a FFS section\r
4609 #\r
4610 # @param self The object pointer\r
4611 # @param FfsFile contains sections to be searched\r
4612 # @param FdList referenced FD by section\r
4613 # @param FvList referenced FV by section\r
4614 #\r
4615 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
4616\r
4617 SectionStack = []\r
4618 SectionStack.extend(FfsFile.SectionList)\r
4619 while SectionStack != []:\r
4620 SectionObj = SectionStack.pop()\r
4621 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
4231a819 4622 if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:\r
30fdf114 4623 FvList.append(SectionObj.FvName.upper())\r
4231a819 4624 if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
30fdf114
LG
4625 FvList.append(SectionObj.Fv.UiFvName.upper())\r
4626 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
4627\r
4628 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
4629 SectionStack.extend(SectionObj.SectionList)\r
4630\r
4631 ## CycleReferenceCheck() method\r
4632 #\r
4633 # Check whether cycle reference exists in FDF\r
4634 #\r
4635 # @param self The object pointer\r
4636 # @retval True cycle reference exists\r
4637 # @retval False Not exists cycle reference\r
4638 #\r
4639 def CycleReferenceCheck(self):\r
fd171542 4640 #\r
4641 # Check the cycle between FV and FD image\r
4642 #\r
4643 MaxLength = len (self.Profile.FvDict)\r
9eb87141 4644 for FvName in self.Profile.FvDict:\r
fd171542 4645 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
4646 RefFvStack = []\r
4647 RefFvStack.append(FvName)\r
4648 FdAnalyzedList = []\r
4649 \r
4650 Index = 0\r
4651 while RefFvStack != [] and Index < MaxLength:\r
4652 Index = Index + 1\r
4653 FvNameFromStack = RefFvStack.pop()\r
9eb87141 4654 if FvNameFromStack.upper() in self.Profile.FvDict:\r
fd171542 4655 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
4656 else:\r
4657 continue\r
30fdf114 4658\r
fd171542 4659 RefFdList = []\r
4660 RefFvList = []\r
4661 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
30fdf114 4662\r
fd171542 4663 for RefFdName in RefFdList:\r
4664 if RefFdName in FdAnalyzedList:\r
30fdf114
LG
4665 continue\r
4666\r
fd171542 4667 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
4668 FvInFdList = self.__GetFvInFd(RefFdName)\r
4669 if FvInFdList != []:\r
4670 for FvNameInFd in FvInFdList:\r
4671 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4672 if FvNameInFd not in RefFvStack:\r
4673 RefFvStack.append(FvNameInFd)\r
4674\r
4675 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4676 EdkLogger.info(LogStr)\r
4677 return True\r
4678 FdAnalyzedList.append(RefFdName)\r
30fdf114 4679\r
fd171542 4680 for RefFvName in RefFvList:\r
4681 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
4682 if RefFvName not in RefFvStack:\r
4683 RefFvStack.append(RefFvName)\r
4684\r
4685 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4686 EdkLogger.info(LogStr)\r
4687 return True\r
4688\r
4689 #\r
4690 # Check the cycle between Capsule and FD image\r
4691 #\r
4692 MaxLength = len (self.Profile.CapsuleDict)\r
9eb87141 4693 for CapName in self.Profile.CapsuleDict:\r
fd171542 4694 #\r
4695 # Capsule image to be checked.\r
4696 #\r
4697 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
4698 RefCapStack = []\r
4699 RefCapStack.append(CapName)\r
4700 FdAnalyzedList = []\r
4701 FvAnalyzedList = []\r
4702 \r
4703 Index = 0\r
4704 while RefCapStack != [] and Index < MaxLength:\r
4705 Index = Index + 1\r
4706 CapNameFromStack = RefCapStack.pop()\r
9eb87141 4707 if CapNameFromStack.upper() in self.Profile.CapsuleDict:\r
fd171542 4708 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
4709 else:\r
4710 continue\r
4711\r
4712 RefFvList = []\r
4713 RefFdList = []\r
4714 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
4715\r
4716 FvListLength = 0\r
4717 FdListLength = 0\r
4718 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
30fdf114
LG
4719 for RefFdName in RefFdList:\r
4720 if RefFdName in FdAnalyzedList:\r
4721 continue\r
4722\r
fd171542 4723 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
4724 CapInFdList = self.__GetCapInFd(RefFdName)\r
4725 if CapInFdList != []:\r
4726 for CapNameInFd in CapInFdList:\r
4727 LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
4728 if CapNameInFd not in RefCapStack:\r
4729 RefCapStack.append(CapNameInFd)\r
4730\r
4731 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
4732 EdkLogger.info(LogStr)\r
4733 return True\r
4734\r
30fdf114
LG
4735 FvInFdList = self.__GetFvInFd(RefFdName)\r
4736 if FvInFdList != []:\r
fd171542 4737 for FvNameInFd in FvInFdList:\r
4738 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4739 if FvNameInFd not in RefFvList:\r
4740 RefFvList.append(FvNameInFd)\r
30fdf114 4741\r
fd171542 4742 FdAnalyzedList.append(RefFdName)\r
4743 #\r
4744 # the number of the parsed FV and FD image\r
4745 #\r
4746 FvListLength = len (RefFvList)\r
4747 FdListLength = len (RefFdList)\r
30fdf114 4748 for RefFvName in RefFvList:\r
fd171542 4749 if RefFvName in FvAnalyzedList:\r
4750 continue\r
4751 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
9eb87141 4752 if RefFvName.upper() in self.Profile.FvDict:\r
fd171542 4753 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4754 else:\r
4755 continue\r
4756 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4757 FvAnalyzedList.append(RefFvName)\r
30fdf114 4758\r
fd171542 4759 return False\r
30fdf114 4760\r
c17956e0
DL
4761 def GetAllIncludedFile (self):\r
4762 global AllIncludeFileList\r
4763 return AllIncludeFileList\r
4764\r
30fdf114 4765if __name__ == "__main__":\r
b36d134f
LG
4766 import sys\r
4767 try:\r
4768 test_file = sys.argv[1]\r
4769 except IndexError, v:\r
4770 print "Usage: %s filename" % sys.argv[0]\r
4771 sys.exit(1)\r
4772\r
4773 parser = FdfParser(test_file)\r
30fdf114
LG
4774 try:\r
4775 parser.ParseFile()\r
4776 parser.CycleReferenceCheck()\r
4777 except Warning, X:\r
b36d134f 4778 print str(X)\r
30fdf114
LG
4779 else:\r
4780 print "Success!"\r
4781\r