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