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