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