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