]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools: FdfParser refactor to remove a dictionary
[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
cdc9b0c2 2161 isInf = self.__GetInfStatement(FvObj)\r
30fdf114
LG
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
cdc9b0c2 2426 IsInf = self.__GetInfStatement(AprSectionObj)\r
30fdf114
LG
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
b21a13fb
YZ
2489 # @retval True Successfully find inf statement\r
2490 # @retval False Not able to find inf statement\r
2491 #\r
cdc9b0c2 2492 def __GetInfStatement(self, Obj, ForCapsule=False):\r
b21a13fb
YZ
2493 ffsInf = self.__ParseInfStatement()\r
2494 if not ffsInf:\r
2495 return False\r
2496\r
30fdf114
LG
2497 if ForCapsule:\r
2498 capsuleFfs = CapsuleData.CapsuleFfs()\r
2499 capsuleFfs.Ffs = ffsInf\r
2500 Obj.CapsuleDataList.append(capsuleFfs)\r
2501 else:\r
2502 Obj.FfsList.append(ffsInf)\r
2503 return True\r
2504\r
2505 ## __GetInfOptions() method\r
2506 #\r
2507 # Get options for INF\r
2508 #\r
2509 # @param self The object pointer\r
2510 # @param FfsInfObj for whom option is got\r
2511 #\r
2512 def __GetInfOptions(self, FfsInfObj):\r
97fa0ee9
YL
2513 if self.__IsKeyword("FILE_GUID"):\r
2514 if not self.__IsToken("="):\r
2515 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2516 if not self.__GetNextGuid():\r
2517 raise Warning("expected GUID value", self.FileName, self.CurrentLineNumber)\r
2518 FfsInfObj.OverrideGuid = self.__Token\r
30fdf114
LG
2519\r
2520 if self.__IsKeyword( "RuleOverride"):\r
2521 if not self.__IsToken( "="):\r
2522 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2523 if not self.__GetNextToken():\r
2524 raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
2525 FfsInfObj.Rule = self.__Token\r
2526\r
2527 if self.__IsKeyword( "VERSION"):\r
2528 if not self.__IsToken( "="):\r
2529 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2530 if not self.__GetNextToken():\r
2531 raise Warning("expected Version", self.FileName, self.CurrentLineNumber)\r
2532\r
2533 if self.__GetStringData():\r
2534 FfsInfObj.Version = self.__Token\r
2535\r
2536 if self.__IsKeyword( "UI"):\r
2537 if not self.__IsToken( "="):\r
2538 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2539 if not self.__GetNextToken():\r
2540 raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
2541\r
2542 if self.__GetStringData():\r
2543 FfsInfObj.Ui = self.__Token\r
2544\r
2545 if self.__IsKeyword( "USE"):\r
2546 if not self.__IsToken( "="):\r
2547 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2548 if not self.__GetNextToken():\r
2549 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2550 FfsInfObj.UseArch = self.__Token\r
2551\r
2552 \r
2553 if self.__GetNextToken():\r
97fa0ee9
YL
2554 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')\r
2555 if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token):\r
30fdf114
LG
2556 FfsInfObj.KeyStringList.append(self.__Token)\r
2557 if not self.__IsToken(","):\r
2558 return\r
2559 else:\r
2560 self.__UndoToken()\r
2561 return\r
2562\r
2563 while self.__GetNextToken():\r
2564 if not p.match(self.__Token):\r
2565 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2566 FfsInfObj.KeyStringList.append(self.__Token)\r
2567\r
2568 if not self.__IsToken(","):\r
2569 break\r
2570\r
2571 ## __GetFileStatement() method\r
2572 #\r
2573 # Get FILE statements\r
2574 #\r
2575 # @param self The object pointer\r
2576 # @param Obj for whom FILE statement is got\r
2577 # @param MacroDict dictionary used to replace macro\r
2578 # @retval True Successfully find FILE statement\r
2579 # @retval False Not able to find FILE statement\r
2580 #\r
2581 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2582\r
2583 if not self.__IsKeyword( "FILE"):\r
2584 return False\r
2585\r
30fdf114
LG
2586 if not self.__GetNextWord():\r
2587 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
b36d134f
LG
2588\r
2589 if ForCapsule and self.__Token == 'DATA':\r
2590 self.__UndoToken()\r
2591 self.__UndoToken()\r
2592 return False\r
2593 \r
2594 FfsFileObj = FfsFileStatement.FileStatement()\r
30fdf114
LG
2595 FfsFileObj.FvFileType = self.__Token\r
2596\r
2597 if not self.__IsToken( "="):\r
2598 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2599\r
2600 if not self.__GetNextGuid():\r
2601 if not self.__GetNextWord():\r
2602 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2603 if self.__Token == 'PCD':\r
2604 if not self.__IsToken( "("):\r
2605 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2606 PcdPair = self.__GetNextPcdName()\r
2607 if not self.__IsToken( ")"):\r
2608 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2609 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2610 \r
2611 FfsFileObj.NameGuid = self.__Token\r
79b74a03 2612 \r
30fdf114
LG
2613 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2614\r
2615 if ForCapsule:\r
2616 capsuleFfs = CapsuleData.CapsuleFfs()\r
2617 capsuleFfs.Ffs = FfsFileObj\r
2618 Obj.CapsuleDataList.append(capsuleFfs)\r
2619 else:\r
2620 Obj.FfsList.append(FfsFileObj)\r
2621\r
2622 return True\r
2623\r
2624 ## __FileCouldHaveRelocFlag() method\r
2625 #\r
2626 # Check whether reloc strip flag can be set for a file type.\r
2627 #\r
30fdf114
LG
2628 # @param FileType The file type to check with\r
2629 # @retval True This type could have relocation strip flag\r
2630 # @retval False No way to have it\r
2631 #\r
5bcf1d56
CJ
2632 @staticmethod\r
2633 def __FileCouldHaveRelocFlag (FileType):\r
30fdf114
LG
2634 if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
2635 return True\r
2636 else:\r
2637 return False\r
2638\r
2639 ## __SectionCouldHaveRelocFlag() method\r
2640 #\r
2641 # Check whether reloc strip flag can be set for a section type.\r
2642 #\r
30fdf114
LG
2643 # @param SectionType The section type to check with\r
2644 # @retval True This type could have relocation strip flag\r
2645 # @retval False No way to have it\r
2646 #\r
5bcf1d56
CJ
2647 @staticmethod\r
2648 def __SectionCouldHaveRelocFlag (SectionType):\r
30fdf114
LG
2649 if SectionType in ('TE', 'PE32'):\r
2650 return True\r
2651 else:\r
2652 return False\r
2653\r
2654 ## __GetFilePart() method\r
2655 #\r
2656 # Get components for FILE statement\r
2657 #\r
2658 # @param self The object pointer\r
2659 # @param FfsFileObj for whom component is got\r
2660 # @param MacroDict dictionary used to replace macro\r
2661 #\r
2662 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2663\r
2664 self.__GetFileOpts( FfsFileObj)\r
2665\r
2666 if not self.__IsToken("{"):\r
4afd3d04
LG
2667 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2668 if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2669 if self.__Token == 'RELOCS_STRIPPED':\r
2670 FfsFileObj.KeepReloc = False\r
2671 else:\r
2672 FfsFileObj.KeepReloc = True\r
2673 else:\r
2674 raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2675\r
2676 if not self.__IsToken("{"):\r
30fdf114
LG
2677 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2678\r
2679 if not self.__GetNextToken():\r
2680 raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
2681\r
2682 if self.__Token == "FV":\r
2683 if not self.__IsToken( "="):\r
2684 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2685 if not self.__GetNextToken():\r
2686 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2687 FfsFileObj.FvName = self.__Token\r
2688\r
2689 elif self.__Token == "FD":\r
2690 if not self.__IsToken( "="):\r
2691 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2692 if not self.__GetNextToken():\r
2693 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
2694 FfsFileObj.FdName = self.__Token\r
2695\r
2696 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2697 self.__UndoToken()\r
2698 self.__GetSectionData( FfsFileObj, MacroDict)\r
860992ed
YZ
2699\r
2700 elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':\r
2701 self.__UndoToken()\r
2702 self.__GetRAWData(FfsFileObj, MacroDict)\r
2703\r
30fdf114 2704 else:\r
64b2609f
LG
2705 FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
2706 FfsFileObj.CurrentLineContent = self.__CurrentLine()\r
97fa0ee9 2707 FfsFileObj.FileName = self.__Token.replace('$(SPACE)', ' ')\r
2bc3256c 2708 self.__VerifyFile(FfsFileObj.FileName)\r
0d2711a6 2709\r
30fdf114
LG
2710 if not self.__IsToken( "}"):\r
2711 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2712\r
860992ed
YZ
2713 ## __GetRAWData() method\r
2714 #\r
2715 # Get RAW data for FILE statement\r
2716 #\r
2717 # @param self The object pointer\r
2718 # @param FfsFileObj for whom section is got\r
2719 # @param MacroDict dictionary used to replace macro\r
2720 #\r
2721 def __GetRAWData(self, FfsFileObj, MacroDict = {}):\r
2722 FfsFileObj.FileName = []\r
cfaaf99b 2723 FfsFileObj.SubAlignment = []\r
860992ed
YZ
2724 while True:\r
2725 AlignValue = None\r
2726 if self.__GetAlignment():\r
e921f58d
YZ
2727 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2728 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
860992ed 2729 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
f475f1e2
YZ
2730 #For FFS, Auto is default option same to ""\r
2731 if not self.__Token == "Auto":\r
2732 AlignValue = self.__Token\r
860992ed
YZ
2733 if not self.__GetNextToken():\r
2734 raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
2735\r
2736 FileName = self.__Token.replace('$(SPACE)', ' ')\r
2737 if FileName == '}':\r
2738 self.__UndoToken()\r
2739 raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
860992ed
YZ
2740\r
2741 self.__VerifyFile(FileName)\r
2742 File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)\r
2743 FfsFileObj.FileName.append(File.Path)\r
cfaaf99b 2744 FfsFileObj.SubAlignment.append(AlignValue)\r
860992ed
YZ
2745\r
2746 if self.__IsToken( "}"):\r
2747 self.__UndoToken()\r
2748 break\r
2749\r
cfaaf99b
YZ
2750 if len(FfsFileObj.SubAlignment) == 1:\r
2751 FfsFileObj.SubAlignment = FfsFileObj.SubAlignment[0]\r
860992ed
YZ
2752 if len(FfsFileObj.FileName) == 1:\r
2753 FfsFileObj.FileName = FfsFileObj.FileName[0]\r
2754\r
30fdf114
LG
2755 ## __GetFileOpts() method\r
2756 #\r
2757 # Get options for FILE statement\r
2758 #\r
2759 # @param self The object pointer\r
2760 # @param FfsFileObj for whom options is got\r
2761 #\r
2762 def __GetFileOpts(self, FfsFileObj):\r
2763\r
2764 if self.__GetNextToken():\r
147a656b 2765 if TokenFindPattern.match(self.__Token):\r
30fdf114
LG
2766 FfsFileObj.KeyStringList.append(self.__Token)\r
2767 if self.__IsToken(","):\r
2768 while self.__GetNextToken():\r
147a656b 2769 if not TokenFindPattern.match(self.__Token):\r
30fdf114
LG
2770 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2771 FfsFileObj.KeyStringList.append(self.__Token)\r
2772\r
2773 if not self.__IsToken(","):\r
2774 break\r
2775\r
2776 else:\r
2777 self.__UndoToken()\r
2778\r
2779 if self.__IsKeyword( "FIXED", True):\r
2780 FfsFileObj.Fixed = True\r
2781\r
2782 if self.__IsKeyword( "CHECKSUM", True):\r
2783 FfsFileObj.CheckSum = True\r
2784\r
2785 if self.__GetAlignment():\r
e921f58d
YZ
2786 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2787 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
9053bc51 2788 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2789 #For FFS, Auto is default option same to ""\r
2790 if not self.__Token == "Auto":\r
2791 FfsFileObj.Alignment = self.__Token\r
30fdf114
LG
2792\r
2793 ## __GetAlignment() method\r
2794 #\r
2795 # Return the alignment value\r
2796 #\r
2797 # @param self The object pointer\r
2798 # @retval True Successfully find alignment\r
2799 # @retval False Not able to find alignment\r
2800 #\r
2801 def __GetAlignment(self):\r
2802 if self.__IsKeyword( "Align", True):\r
2803 if not self.__IsToken( "="):\r
2804 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2805\r
2806 if not self.__GetNextToken():\r
2807 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2808 return True\r
2809\r
2810 return False\r
2811\r
2812 ## __GetFilePart() method\r
2813 #\r
2814 # Get section data for FILE statement\r
2815 #\r
2816 # @param self The object pointer\r
2817 # @param FfsFileObj for whom section is got\r
2818 # @param MacroDict dictionary used to replace macro\r
2819 #\r
2820 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2821 Dict = {}\r
2822 Dict.update(MacroDict)\r
2823\r
2824 self.__GetDefineStatements(FfsFileObj)\r
2825\r
2826 Dict.update(FfsFileObj.DefineVarDict)\r
2827 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2828 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2829\r
2830 while True:\r
2831 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2832 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2833 if not IsLeafSection and not IsEncapSection:\r
2834 break\r
2835\r
2836 ## __GetLeafSection() method\r
2837 #\r
2838 # Get leaf section for Obj\r
2839 #\r
2840 # @param self The object pointer\r
2841 # @param Obj for whom leaf section is got\r
2842 # @param MacroDict dictionary used to replace macro\r
2843 # @retval True Successfully find section statement\r
2844 # @retval False Not able to find section statement\r
2845 #\r
2846 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2847\r
2848 OldPos = self.GetFileBufferPos()\r
2849\r
2850 if not self.__IsKeyword( "SECTION"):\r
2851 if len(Obj.SectionList) == 0:\r
2852 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2853 else:\r
2854 return False\r
2855\r
2856 AlignValue = None\r
2857 if self.__GetAlignment():\r
e921f58d
YZ
2858 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
2859 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 2860 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2861 AlignValue = self.__Token\r
2862\r
2863 BuildNum = None\r
2864 if self.__IsKeyword( "BUILD_NUM"):\r
2865 if not self.__IsToken( "="):\r
2866 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2867\r
2868 if not self.__GetNextToken():\r
2869 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2870\r
2871 BuildNum = self.__Token\r
2872\r
2873 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2874 if AlignValue == 'Auto':\r
2875 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2876 if not self.__IsToken( "="):\r
2877 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2878 if not self.__GetNextToken():\r
2879 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2880 VerSectionObj = VerSection.VerSection()\r
2881 VerSectionObj.Alignment = AlignValue\r
2882 VerSectionObj.BuildNum = BuildNum\r
2883 if self.__GetStringData():\r
2884 VerSectionObj.StringData = self.__Token\r
2885 else:\r
2886 VerSectionObj.FileName = self.__Token\r
2887 Obj.SectionList.append(VerSectionObj)\r
52302d4d 2888 \r
30fdf114 2889 elif self.__IsKeyword( "UI"):\r
52302d4d
LG
2890 if AlignValue == 'Auto':\r
2891 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2892 if not self.__IsToken( "="):\r
2893 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2894 if not self.__GetNextToken():\r
2895 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2896 UiSectionObj = UiSection.UiSection()\r
2897 UiSectionObj.Alignment = AlignValue\r
2898 if self.__GetStringData():\r
2899 UiSectionObj.StringData = self.__Token\r
2900 else:\r
2901 UiSectionObj.FileName = self.__Token\r
2902 Obj.SectionList.append(UiSectionObj)\r
2903\r
2904 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2905 if AlignValue == 'Auto':\r
2906 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2907 if not self.__IsToken( "="):\r
2908 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2909 if not self.__GetNextToken():\r
2910 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2911\r
2912 FvName = self.__Token\r
2913 FvObj = None\r
2914\r
2915 if self.__IsToken( "{"):\r
2916 FvObj = Fv.FV()\r
2917 FvObj.UiFvName = FvName.upper()\r
2918 self.__GetDefineStatements(FvObj)\r
2919 MacroDict.update(FvObj.DefineVarDict)\r
2920 self.__GetBlockStatement(FvObj)\r
2921 self.__GetSetStatements(FvObj)\r
2922 self.__GetFvAlignment(FvObj)\r
2923 self.__GetFvAttributes(FvObj)\r
2924 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2925 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2926\r
2927 while True:\r
cdc9b0c2 2928 IsInf = self.__GetInfStatement(FvObj)\r
30fdf114
LG
2929 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2930 if not IsInf and not IsFile:\r
2931 break\r
2932\r
2933 if not self.__IsToken( "}"):\r
2934 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2935\r
2936 FvImageSectionObj = FvImageSection.FvImageSection()\r
2937 FvImageSectionObj.Alignment = AlignValue\r
4231a819 2938 if FvObj is not None:\r
30fdf114
LG
2939 FvImageSectionObj.Fv = FvObj\r
2940 FvImageSectionObj.FvName = None\r
2941 else:\r
2942 FvImageSectionObj.FvName = FvName.upper()\r
2943 FvImageSectionObj.FvFileName = FvName\r
2944\r
2945 Obj.SectionList.append(FvImageSectionObj)\r
2946\r
2947 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
2948 if AlignValue == 'Auto':\r
2949 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2950 DepexSectionObj = DepexSection.DepexSection()\r
2951 DepexSectionObj.Alignment = AlignValue\r
2952 DepexSectionObj.DepexType = self.__Token\r
2953\r
2954 if not self.__IsToken( "="):\r
2955 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2956 if not self.__IsToken( "{"):\r
2957 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2958 if not self.__SkipToToken( "}"):\r
2959 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
2960\r
2961 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2962 Obj.SectionList.append(DepexSectionObj)\r
2963\r
2964 else:\r
30fdf114
LG
2965 if not self.__GetNextWord():\r
2966 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
2967\r
2968 # Encapsulation section appear, UndoToken and return\r
2969 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2970 self.SetFileBufferPos(OldPos)\r
2971 return False\r
2972\r
2973 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2974 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2975 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2976 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2977 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2978\r
30fdf114
LG
2979 # DataSection\r
2980 DataSectionObj = DataSection.DataSection()\r
2981 DataSectionObj.Alignment = AlignValue\r
2982 DataSectionObj.SecType = self.__Token\r
2983\r
2984 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2985 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2986 if self.__Token == 'RELOCS_STRIPPED':\r
2987 DataSectionObj.KeepReloc = False\r
2988 else:\r
2989 DataSectionObj.KeepReloc = True\r
2990 else:\r
2991 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
2992\r
2993 if self.__IsToken("="):\r
2994 if not self.__GetNextToken():\r
2995 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
2996 DataSectionObj.SectFileName = self.__Token\r
2bc3256c 2997 self.__VerifyFile(DataSectionObj.SectFileName)\r
30fdf114
LG
2998 else:\r
2999 if not self.__GetCglSection(DataSectionObj):\r
3000 return False\r
3001\r
3002 Obj.SectionList.append(DataSectionObj)\r
3003\r
3004 return True\r
3005\r
2bc3256c
LG
3006 ## __VerifyFile\r
3007 #\r
3008 # Check if file exists or not:\r
3009 # If current phase if GenFds, the file must exist;\r
3010 # If current phase is AutoGen and the file is not in $(OUTPUT_DIRECTORY), the file must exist\r
3011 # @param FileName: File path to be verified.\r
3012 #\r
3013 def __VerifyFile(self, FileName):\r
3014 if FileName.replace('$(WORKSPACE)', '').find('$') != -1:\r
3015 return\r
3016 if not GlobalData.gAutoGenPhase or not self.__GetMacroValue("OUTPUT_DIRECTORY") in FileName:\r
3017 ErrorCode, ErrorInfo = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3018 if ErrorCode != 0:\r
3019 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
3020\r
30fdf114
LG
3021 ## __GetCglSection() method\r
3022 #\r
3023 # Get compressed or GUIDed section for Obj\r
3024 #\r
3025 # @param self The object pointer\r
3026 # @param Obj for whom leaf section is got\r
3027 # @param AlignValue alignment value for complex section\r
3028 # @retval True Successfully find section statement\r
3029 # @retval False Not able to find section statement\r
3030 #\r
3031 def __GetCglSection(self, Obj, AlignValue = None):\r
3032\r
3033 if self.__IsKeyword( "COMPRESS"):\r
3034 type = "PI_STD"\r
3035 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3036 type = self.__Token\r
3037\r
3038 if not self.__IsToken("{"):\r
3039 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3040\r
3041 CompressSectionObj = CompressSection.CompressSection()\r
3042 CompressSectionObj.Alignment = AlignValue\r
3043 CompressSectionObj.CompType = type\r
3044 # Recursive sections...\r
3045 while True:\r
3046 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
3047 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
3048 if not IsLeafSection and not IsEncapSection:\r
3049 break\r
3050\r
3051\r
3052 if not self.__IsToken( "}"):\r
3053 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3054 Obj.SectionList.append(CompressSectionObj)\r
3055\r
3056# else:\r
3057# raise Warning("Compress type not known")\r
3058\r
3059 return True\r
3060\r
3061 elif self.__IsKeyword( "GUIDED"):\r
3062 GuidValue = None\r
3063 if self.__GetNextGuid():\r
3064 GuidValue = self.__Token\r
3065\r
3066 AttribDict = self.__GetGuidAttrib()\r
3067 if not self.__IsToken("{"):\r
3068 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3069 GuidSectionObj = GuidSection.GuidSection()\r
3070 GuidSectionObj.Alignment = AlignValue\r
3071 GuidSectionObj.NameGuid = GuidValue\r
3072 GuidSectionObj.SectionType = "GUIDED"\r
3073 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3074 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
25918452 3075 GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
30fdf114
LG
3076 # Recursive sections...\r
3077 while True:\r
3078 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
3079 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
3080 if not IsLeafSection and not IsEncapSection:\r
3081 break\r
3082\r
3083 if not self.__IsToken( "}"):\r
3084 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3085 Obj.SectionList.append(GuidSectionObj)\r
3086\r
3087 return True\r
3088\r
3089 return False\r
3090\r
3091 ## __GetGuidAttri() method\r
3092 #\r
3093 # Get attributes for GUID section\r
3094 #\r
3095 # @param self The object pointer\r
3096 # @retval AttribDict Dictionary of key-value pair of section attributes\r
3097 #\r
3098 def __GetGuidAttrib(self):\r
3099\r
3100 AttribDict = {}\r
14c48571 3101 AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
3102 AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
25918452
LG
3103 AttribDict["EXTRA_HEADER_SIZE"] = -1\r
3104 while self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID") \\r
3105 or self.__IsKeyword("EXTRA_HEADER_SIZE"):\r
30fdf114
LG
3106 AttribKey = self.__Token\r
3107\r
3108 if not self.__IsToken("="):\r
3109 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3110\r
25918452
LG
3111 if not self.__GetNextToken():\r
3112 raise Warning("expected TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber)\r
3113 elif AttribKey == "EXTRA_HEADER_SIZE":\r
3114 Base = 10\r
3115 if self.__Token[0:2].upper() == "0X":\r
3116 Base = 16\r
3117 try:\r
3118 AttribDict[AttribKey] = int(self.__Token, Base)\r
3119 continue\r
3120 except ValueError:\r
3121 raise Warning("expected Number", self.FileName, self.CurrentLineNumber)\r
3122 elif self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
30fdf114
LG
3123 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
3124 AttribDict[AttribKey] = self.__Token\r
3125\r
3126 return AttribDict\r
3127\r
3128 ## __GetEncapsulationSec() method\r
3129 #\r
3130 # Get encapsulation section for FILE\r
3131 #\r
3132 # @param self The object pointer\r
3133 # @param FfsFile for whom section is got\r
3134 # @retval True Successfully find section statement\r
3135 # @retval False Not able to find section statement\r
3136 #\r
3137 def __GetEncapsulationSec(self, FfsFileObj):\r
3138\r
3139 OldPos = self.GetFileBufferPos()\r
3140 if not self.__IsKeyword( "SECTION"):\r
3141 if len(FfsFileObj.SectionList) == 0:\r
3142 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
3143 else:\r
3144 return False\r
3145\r
3146 AlignValue = None\r
3147 if self.__GetAlignment():\r
e921f58d
YZ
3148 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3149 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d 3150 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3151 AlignValue = self.__Token\r
3152\r
3153 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
3154 self.SetFileBufferPos(OldPos)\r
3155 return False\r
3156 else:\r
3157 return True\r
3158\r
a3251d84
YL
3159 def __GetFmp(self):\r
3160 if not self.__GetNextToken():\r
3161 return False\r
3162 S = self.__Token.upper()\r
df81077f
YZ
3163 if S.startswith("[") and not S.startswith("[FMPPAYLOAD."):\r
3164 self.SectionParser(S)\r
a3251d84
YL
3165 self.__UndoToken()\r
3166 return False\r
3167\r
3168 self.__UndoToken()\r
3169 self.__SkipToToken("[FMPPAYLOAD.", True)\r
3170 FmpUiName = self.__GetUiName().upper()\r
3171 if FmpUiName in self.Profile.FmpPayloadDict:\r
3172 raise Warning("Duplicated FMP UI name found: %s" % FmpUiName, self.FileName, self.CurrentLineNumber)\r
3173\r
3174 FmpData = CapsuleData.CapsulePayload()\r
3175 FmpData.UiName = FmpUiName\r
3176\r
3177 if not self.__IsToken( "]"):\r
3178 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3179\r
3180 if not self.__GetNextToken():\r
3181 raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber)\r
91ae2988 3182 FmpKeyList = ['IMAGE_HEADER_INIT_VERSION', 'IMAGE_TYPE_ID', 'IMAGE_INDEX', 'HARDWARE_INSTANCE', 'CERTIFICATE_GUID', 'MONOTONIC_COUNT']\r
a3251d84
YL
3183 while self.__Token in FmpKeyList:\r
3184 Name = self.__Token\r
3185 FmpKeyList.remove(Name)\r
3186 if not self.__IsToken("="):\r
3187 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3188 if Name == 'IMAGE_TYPE_ID':\r
3189 if not self.__GetNextGuid():\r
91ae2988 3190 raise Warning("expected GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber)\r
a3251d84 3191 FmpData.ImageTypeId = self.__Token\r
91ae2988
YZ
3192 elif Name == 'CERTIFICATE_GUID':\r
3193 if not self.__GetNextGuid():\r
3194 raise Warning("expected GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
3195 FmpData.Certificate_Guid = self.__Token\r
3196 if uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and uuid.UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID:\r
3197 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
3198 else:\r
3199 if not self.__GetNextToken():\r
3200 raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
3201 Value = self.__Token\r
3202 if Name == 'IMAGE_HEADER_INIT_VERSION':\r
91ae2988
YZ
3203 if self.__Verify(Name, Value, 'UINT8'):\r
3204 FmpData.Version = Value\r
a3251d84 3205 elif Name == 'IMAGE_INDEX':\r
91ae2988
YZ
3206 if self.__Verify(Name, Value, 'UINT8'):\r
3207 FmpData.ImageIndex = Value\r
a3251d84 3208 elif Name == 'HARDWARE_INSTANCE':\r
91ae2988
YZ
3209 if self.__Verify(Name, Value, 'UINT8'):\r
3210 FmpData.HardwareInstance = Value\r
3211 elif Name == 'MONOTONIC_COUNT':\r
3212 if self.__Verify(Name, Value, 'UINT64'):\r
3213 FmpData.MonotonicCount = Value\r
3214 if FmpData.MonotonicCount.upper().startswith('0X'):\r
3215 FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
3216 else:\r
3217 FmpData.MonotonicCount = (long)(FmpData.MonotonicCount)\r
a3251d84
YL
3218 if not self.__GetNextToken():\r
3219 break\r
3220 else:\r
3221 self.__UndoToken()\r
3222\r
91ae2988
YZ
3223 if (FmpData.MonotonicCount and not FmpData.Certificate_Guid) or (not FmpData.MonotonicCount and FmpData.Certificate_Guid):\r
3224 EdkLogger.error("FdfParser", FORMAT_INVALID, "CERTIFICATE_GUID and MONOTONIC_COUNT must be work as a pair.")\r
9ce9bf53
YZ
3225\r
3226 # Only the IMAGE_TYPE_ID is required item\r
3227 if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList:\r
3228 raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
19e3aa7a
YZ
3229 # get the Image file and Vendor code file\r
3230 self.__GetFMPCapsuleData(FmpData)\r
3231 if not FmpData.ImageFile:\r
91ae2988 3232 raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
19e3aa7a
YZ
3233 # check whether more than one Vendor code file\r
3234 if len(FmpData.VendorCodeFile) > 1:\r
91ae2988 3235 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
3236 self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
3237 return True\r
3238\r
30fdf114
LG
3239 ## __GetCapsule() method\r
3240 #\r
3241 # Get capsule section contents and store its data into capsule list of self.Profile\r
3242 #\r
3243 # @param self The object pointer\r
3244 # @retval True Successfully find a capsule\r
3245 # @retval False Not able to find a capsule\r
3246 #\r
3247 def __GetCapsule(self):\r
3248\r
3249 if not self.__GetNextToken():\r
3250 return False\r
3251\r
3252 S = self.__Token.upper()\r
3253 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
df81077f 3254 self.SectionParser(S)\r
30fdf114
LG
3255 self.__UndoToken()\r
3256 return False\r
3257\r
3258 self.__UndoToken()\r
3259 if not self.__IsToken("[CAPSULE.", True):\r
3260 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3261 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3262 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3263 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
3264\r
3265 CapsuleObj = Capsule.Capsule()\r
3266\r
3267 CapsuleName = self.__GetUiName()\r
3268 if not CapsuleName:\r
3269 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
3270\r
3271 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
3272\r
3273 if not self.__IsToken( "]"):\r
3274 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3275\r
3276 if self.__IsKeyword("CREATE_FILE"):\r
3277 if not self.__IsToken( "="):\r
3278 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3279\r
3280 if not self.__GetNextToken():\r
3281 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
3282\r
3283 CapsuleObj.CreateFile = self.__Token\r
3284\r
3285 self.__GetCapsuleStatements(CapsuleObj)\r
fd171542 3286 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
30fdf114
LG
3287 return True\r
3288\r
3289 ## __GetCapsuleStatements() method\r
3290 #\r
3291 # Get statements for capsule\r
3292 #\r
3293 # @param self The object pointer\r
3294 # @param Obj for whom statements are got\r
3295 #\r
3296 def __GetCapsuleStatements(self, Obj):\r
3297 self.__GetCapsuleTokens(Obj)\r
3298 self.__GetDefineStatements(Obj)\r
3299 self.__GetSetStatements(Obj)\r
30fdf114
LG
3300 self.__GetCapsuleData(Obj)\r
3301\r
fd171542 3302 ## __GetCapsuleTokens() method\r
30fdf114
LG
3303 #\r
3304 # Get token statements for capsule\r
3305 #\r
3306 # @param self The object pointer\r
3307 # @param Obj for whom token statements are got\r
3308 #\r
3309 def __GetCapsuleTokens(self, Obj):\r
b303ea72
LG
3310 if not self.__GetNextToken():\r
3311 return False\r
a3251d84 3312 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"):\r
b303ea72
LG
3313 Name = self.__Token.strip()\r
3314 if not self.__IsToken("="):\r
3315 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3316 if not self.__GetNextToken():\r
3317 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
3318 if Name == 'CAPSULE_FLAGS':\r
3319 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
3320 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
3321 Value = self.__Token.strip()\r
3322 while self.__IsToken(","):\r
3323 Value += ','\r
3324 if not self.__GetNextToken():\r
3325 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
3326 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
3327 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
3328 Value += self.__Token.strip()\r
e8a47801
LG
3329 elif Name == 'OEM_CAPSULE_FLAGS':\r
3330 Value = self.__Token.strip()\r
2bc3256c
LG
3331 if not Value.upper().startswith('0X'):\r
3332 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801
LG
3333 try:\r
3334 Value = int(Value, 0)\r
3335 except ValueError:\r
2bc3256c 3336 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801 3337 if not 0x0000 <= Value <= 0xFFFF:\r
2bc3256c 3338 raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
e8a47801 3339 Value = self.__Token.strip()\r
b303ea72
LG
3340 else:\r
3341 Value = self.__Token.strip()\r
3342 Obj.TokensDict[Name] = Value \r
3343 if not self.__GetNextToken():\r
3344 return False\r
3345 self.__UndoToken()\r
30fdf114
LG
3346\r
3347 ## __GetCapsuleData() method\r
3348 #\r
3349 # Get capsule data for capsule\r
3350 #\r
3351 # @param self The object pointer\r
3352 # @param Obj for whom capsule data are got\r
3353 #\r
3354 def __GetCapsuleData(self, Obj):\r
3355\r
3356 while True:\r
3357 IsInf = self.__GetInfStatement(Obj, True)\r
3358 IsFile = self.__GetFileStatement(Obj, True)\r
3359 IsFv = self.__GetFvStatement(Obj)\r
b36d134f
LG
3360 IsFd = self.__GetFdStatement(Obj)\r
3361 IsAnyFile = self.__GetAnyFileStatement(Obj)\r
2bc3256c 3362 IsAfile = self.__GetAfileStatement(Obj)\r
a3251d84
YL
3363 IsFmp = self.__GetFmpStatement(Obj)\r
3364 if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile or IsAfile or IsFmp):\r
30fdf114
LG
3365 break\r
3366\r
19e3aa7a
YZ
3367 ## __GetFMPCapsuleData() method\r
3368 #\r
3369 # Get capsule data for FMP capsule\r
3370 #\r
3371 # @param self The object pointer\r
3372 # @param Obj for whom capsule data are got\r
3373 #\r
3374 def __GetFMPCapsuleData(self, Obj):\r
3375\r
3376 while True:\r
3377 IsFv = self.__GetFvStatement(Obj, True)\r
3378 IsFd = self.__GetFdStatement(Obj, True)\r
3379 IsAnyFile = self.__GetAnyFileStatement(Obj, True)\r
3380 if not (IsFv or IsFd or IsAnyFile):\r
3381 break\r
3382\r
30fdf114
LG
3383 ## __GetFvStatement() method\r
3384 #\r
3385 # Get FV for capsule\r
3386 #\r
3387 # @param self The object pointer\r
3388 # @param CapsuleObj for whom FV is got\r
3389 # @retval True Successfully find a FV statement\r
3390 # @retval False Not able to find a FV statement\r
3391 #\r
19e3aa7a 3392 def __GetFvStatement(self, CapsuleObj, FMPCapsule = False):\r
30fdf114
LG
3393\r
3394 if not self.__IsKeyword("FV"):\r
3395 return False\r
3396\r
3397 if not self.__IsToken("="):\r
3398 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3399\r
3400 if not self.__GetNextToken():\r
3401 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
3402\r
2bcc713e
LG
3403 if self.__Token.upper() not in self.Profile.FvDict.keys():\r
3404 raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
3405\r
30fdf114
LG
3406 CapsuleFv = CapsuleData.CapsuleFv()\r
3407 CapsuleFv.FvName = self.__Token\r
19e3aa7a
YZ
3408 if FMPCapsule:\r
3409 if not CapsuleObj.ImageFile:\r
3410 CapsuleObj.ImageFile.append(CapsuleFv)\r
3411 else:\r
3412 CapsuleObj.VendorCodeFile.append(CapsuleFv)\r
3413 else:\r
3414 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
30fdf114
LG
3415 return True\r
3416\r
b36d134f
LG
3417 ## __GetFdStatement() method\r
3418 #\r
3419 # Get FD for capsule\r
3420 #\r
3421 # @param self The object pointer\r
3422 # @param CapsuleObj for whom FD is got\r
3423 # @retval True Successfully find a FD statement\r
3424 # @retval False Not able to find a FD statement\r
3425 #\r
19e3aa7a 3426 def __GetFdStatement(self, CapsuleObj, FMPCapsule = False):\r
b36d134f
LG
3427\r
3428 if not self.__IsKeyword("FD"):\r
3429 return False\r
3430\r
3431 if not self.__IsToken("="):\r
3432 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3433\r
3434 if not self.__GetNextToken():\r
3435 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
3436\r
2bcc713e
LG
3437 if self.__Token.upper() not in self.Profile.FdDict.keys():\r
3438 raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
3439\r
b36d134f
LG
3440 CapsuleFd = CapsuleData.CapsuleFd()\r
3441 CapsuleFd.FdName = self.__Token\r
19e3aa7a
YZ
3442 if FMPCapsule:\r
3443 if not CapsuleObj.ImageFile:\r
3444 CapsuleObj.ImageFile.append(CapsuleFd)\r
3445 else:\r
3446 CapsuleObj.VendorCodeFile.append(CapsuleFd)\r
3447 else:\r
3448 CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
b36d134f
LG
3449 return True\r
3450\r
a3251d84 3451 def __GetFmpStatement(self, CapsuleObj):\r
df81077f
YZ
3452 if not self.__IsKeyword("FMP_PAYLOAD"):\r
3453 if not self.__IsKeyword("FMP"):\r
3454 return False\r
b36d134f 3455\r
df81077f
YZ
3456 if not self.__IsKeyword("PAYLOAD"):\r
3457 self.__UndoToken()\r
3458 return False\r
b36d134f 3459\r
a3251d84
YL
3460 if not self.__IsToken("="):\r
3461 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3462\r
3463 if not self.__GetNextToken():\r
df81077f 3464 raise Warning("expected payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
a3251d84
YL
3465 Payload = self.__Token.upper()\r
3466 if Payload not in self.Profile.FmpPayloadDict:\r
3467 raise Warning("This FMP Payload does not exist: %s" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3468 CapsuleObj.FmpPayloadList.append(self.Profile.FmpPayloadDict[Payload])\r
3469 return True\r
3470\r
3471 def __ParseRawFileStatement(self):\r
3472 if not self.__IsKeyword("FILE"):\r
3473 return None\r
3474\r
b36d134f
LG
3475 if not self.__IsKeyword("DATA"):\r
3476 self.__UndoToken()\r
a3251d84 3477 return None\r
b36d134f
LG
3478\r
3479 if not self.__IsToken("="):\r
3480 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3481\r
3482 if not self.__GetNextToken():\r
3483 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3484 \r
3485 AnyFileName = self.__Token\r
35217a33
YZ
3486 self.__VerifyFile(AnyFileName)\r
3487\r
94e4bcbb
YZ
3488 if not os.path.isabs(AnyFileName):\r
3489 AnyFileName = mws.join(GenFdsGlobalVariable.WorkSpaceDir, AnyFileName)\r
3490\r
a3251d84
YL
3491 return AnyFileName\r
3492\r
3493 ## __GetAnyFileStatement() method\r
3494 #\r
3495 # Get AnyFile for capsule\r
3496 #\r
3497 # @param self The object pointer\r
3498 # @param CapsuleObj for whom AnyFile is got\r
3499 # @retval True Successfully find a Anyfile statement\r
3500 # @retval False Not able to find a AnyFile statement\r
3501 #\r
19e3aa7a 3502 def __GetAnyFileStatement(self, CapsuleObj, FMPCapsule = False):\r
a3251d84
YL
3503 AnyFileName = self.__ParseRawFileStatement()\r
3504 if not AnyFileName:\r
3505 return False\r
b36d134f
LG
3506\r
3507 CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
3508 CapsuleAnyFile.FileName = AnyFileName\r
19e3aa7a
YZ
3509 if FMPCapsule:\r
3510 if not CapsuleObj.ImageFile:\r
3511 CapsuleObj.ImageFile.append(CapsuleAnyFile)\r
3512 else:\r
3513 CapsuleObj.VendorCodeFile.append(CapsuleAnyFile)\r
3514 else:\r
3515 CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
b36d134f 3516 return True\r
2bc3256c
LG
3517 \r
3518 ## __GetAfileStatement() method\r
3519 #\r
3520 # Get Afile for capsule\r
3521 #\r
3522 # @param self The object pointer\r
3523 # @param CapsuleObj for whom Afile is got\r
3524 # @retval True Successfully find a Afile statement\r
3525 # @retval False Not able to find a Afile statement\r
3526 #\r
3527 def __GetAfileStatement(self, CapsuleObj):\r
3528\r
3529 if not self.__IsKeyword("APPEND"):\r
3530 return False\r
3531\r
3532 if not self.__IsToken("="):\r
3533 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3534\r
3535 if not self.__GetNextToken():\r
3536 raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber)\r
3537 \r
3538 AfileName = self.__Token\r
3539 AfileBaseName = os.path.basename(AfileName)\r
3540 \r
3541 if os.path.splitext(AfileBaseName)[1] not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:\r
3542 raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \\r
3543 self.FileName, self.CurrentLineNumber)\r
3544 \r
3545 if not os.path.isabs(AfileName):\r
3546 AfileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AfileName)\r
3547 self.__VerifyFile(AfileName)\r
3548 else:\r
3549 if not os.path.exists(AfileName):\r
3550 raise Warning('%s does not exist' % AfileName, self.FileName, self.CurrentLineNumber)\r
3551 else:\r
3552 pass\r
3553\r
3554 CapsuleAfile = CapsuleData.CapsuleAfile()\r
3555 CapsuleAfile.FileName = AfileName\r
3556 CapsuleObj.CapsuleDataList.append(CapsuleAfile)\r
3557 return True\r
b36d134f 3558\r
30fdf114
LG
3559 ## __GetRule() method\r
3560 #\r
3561 # Get Rule section contents and store its data into rule list of self.Profile\r
3562 #\r
3563 # @param self The object pointer\r
3564 # @retval True Successfully find a Rule\r
3565 # @retval False Not able to find a Rule\r
3566 #\r
3567 def __GetRule(self):\r
3568\r
3569 if not self.__GetNextToken():\r
3570 return False\r
3571\r
3572 S = self.__Token.upper()\r
3573 if S.startswith("[") and not S.startswith("[RULE."):\r
df81077f 3574 self.SectionParser(S)\r
30fdf114
LG
3575 self.__UndoToken()\r
3576 return False\r
3577 self.__UndoToken()\r
3578 if not self.__IsToken("[Rule.", True):\r
3579 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3580 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3581 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3582 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
3583\r
3584 if not self.__SkipToToken("."):\r
3585 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3586\r
3587 Arch = self.__SkippedChars.rstrip(".")\r
4afd3d04 3588 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):\r
30fdf114
LG
3589 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3590\r
3591 ModuleType = self.__GetModuleType()\r
3592\r
3593 TemplateName = ""\r
3594 if self.__IsToken("."):\r
3595 if not self.__GetNextWord():\r
3596 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
3597 TemplateName = self.__Token\r
3598\r
3599 if not self.__IsToken( "]"):\r
3600 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3601\r
3602 RuleObj = self.__GetRuleFileStatements()\r
3603 RuleObj.Arch = Arch.upper()\r
3604 RuleObj.ModuleType = ModuleType\r
3605 RuleObj.TemplateName = TemplateName\r
3606 if TemplateName == '' :\r
3607 self.Profile.RuleDict['RULE' + \\r
3608 '.' + \\r
3609 Arch.upper() + \\r
3610 '.' + \\r
3611 ModuleType.upper() ] = RuleObj\r
3612 else :\r
3613 self.Profile.RuleDict['RULE' + \\r
3614 '.' + \\r
3615 Arch.upper() + \\r
3616 '.' + \\r
3617 ModuleType.upper() + \\r
3618 '.' + \\r
3619 TemplateName.upper() ] = RuleObj\r
3620# self.Profile.RuleList.append(rule)\r
3621 return True\r
3622\r
3623 ## __GetModuleType() method\r
3624 #\r
3625 # Return the module type\r
3626 #\r
3627 # @param self The object pointer\r
3628 # @retval string module type\r
3629 #\r
3630 def __GetModuleType(self):\r
3631\r
3632 if not self.__GetNextWord():\r
3633 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
3634 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
3635 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
3636 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
3637 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
3638 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
b19df640 3639 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
30fdf114
LG
3640 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3641 return self.__Token\r
3642\r
3643 ## __GetFileExtension() method\r
3644 #\r
3645 # Return the file extension\r
3646 #\r
3647 # @param self The object pointer\r
3648 # @retval string file name extension\r
3649 #\r
3650 def __GetFileExtension(self):\r
3651 if not self.__IsToken("."):\r
df81077f 3652 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3653\r
3654 Ext = ""\r
3655 if self.__GetNextToken():\r
4d603daa 3656 if FileExtensionPattern.match(self.__Token):\r
30fdf114
LG
3657 Ext = self.__Token\r
3658 return '.' + Ext\r
3659 else:\r
3660 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3661\r
3662 else:\r
3663 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
3664\r
3665 ## __GetRuleFileStatement() method\r
3666 #\r
3667 # Get rule contents\r
3668 #\r
3669 # @param self The object pointer\r
3670 # @retval Rule Rule object\r
3671 #\r
3672 def __GetRuleFileStatements(self):\r
3673\r
3674 if not self.__IsKeyword("FILE"):\r
3675 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
3676\r
3677 if not self.__GetNextWord():\r
3678 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
3679\r
3680 Type = self.__Token.strip().upper()\r
3681 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
b19df640 3682 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
30fdf114
LG
3683 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3684\r
3685 if not self.__IsToken("="):\r
3686 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3687\r
3688 if not self.__IsKeyword("$(NAMED_GUID)"):\r
3689 if not self.__GetNextWord():\r
3690 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
3691 if self.__Token == 'PCD':\r
3692 if not self.__IsToken( "("):\r
3693 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3694 PcdPair = self.__GetNextPcdName()\r
3695 if not self.__IsToken( ")"):\r
3696 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3697 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3698 \r
3699 NameGuid = self.__Token\r
3700\r
3701 KeepReloc = None\r
3702 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3703 if self.__FileCouldHaveRelocFlag(Type):\r
3704 if self.__Token == 'RELOCS_STRIPPED':\r
3705 KeepReloc = False\r
3706 else:\r
3707 KeepReloc = True\r
3708 else:\r
3709 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3710\r
3711 KeyStringList = []\r
3712 if self.__GetNextToken():\r
147a656b 3713 if TokenFindPattern.match(self.__Token):\r
30fdf114
LG
3714 KeyStringList.append(self.__Token)\r
3715 if self.__IsToken(","):\r
3716 while self.__GetNextToken():\r
147a656b 3717 if not TokenFindPattern.match(self.__Token):\r
30fdf114
LG
3718 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
3719 KeyStringList.append(self.__Token)\r
3720\r
3721 if not self.__IsToken(","):\r
3722 break\r
3723\r
3724 else:\r
3725 self.__UndoToken()\r
3726\r
3727\r
3728 Fixed = False\r
3729 if self.__IsKeyword("Fixed", True):\r
3730 Fixed = True\r
3731\r
3732 CheckSum = False\r
3733 if self.__IsKeyword("CheckSum", True):\r
3734 CheckSum = True\r
3735\r
3736 AlignValue = ""\r
3737 if self.__GetAlignment():\r
e921f58d
YZ
3738 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3739 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 3740 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3741 #For FFS, Auto is default option same to ""\r
3742 if not self.__Token == "Auto":\r
3743 AlignValue = self.__Token\r
30fdf114
LG
3744\r
3745 if self.__IsToken("{"):\r
3746 # Complex file rule expected\r
3747 Rule = RuleComplexFile.RuleComplexFile()\r
3748 Rule.FvFileType = Type\r
3749 Rule.NameGuid = NameGuid\r
3750 Rule.Alignment = AlignValue\r
3751 Rule.CheckSum = CheckSum\r
3752 Rule.Fixed = Fixed\r
3753 Rule.KeyStringList = KeyStringList\r
4231a819 3754 if KeepReloc is not None:\r
30fdf114
LG
3755 Rule.KeepReloc = KeepReloc\r
3756\r
3757 while True:\r
3758 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3759 IsLeaf = self.__GetEfiSection(Rule)\r
3760 if not IsEncapsulate and not IsLeaf:\r
3761 break\r
3762\r
3763 if not self.__IsToken("}"):\r
3764 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3765\r
3766 return Rule\r
3767\r
30fdf114
LG
3768 else:\r
3769 # Simple file rule expected\r
3770 if not self.__GetNextWord():\r
3771 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3772\r
3773 SectionName = self.__Token\r
3774\r
3775 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3776 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
3777 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3778\r
3779\r
3780 if self.__IsKeyword("Fixed", True):\r
3781 Fixed = True\r
3782\r
3783 if self.__IsKeyword("CheckSum", True):\r
3784 CheckSum = True\r
3785\r
52302d4d 3786 SectAlignment = ""\r
30fdf114 3787 if self.__GetAlignment():\r
e921f58d
YZ
3788 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3789 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114 3790 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3791 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3792 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3793 SectAlignment = self.__Token\r
3794\r
3795 Ext = None\r
3796 if self.__IsToken('|'):\r
3797 Ext = self.__GetFileExtension()\r
3798 elif not self.__GetNextToken():\r
30fdf114
LG
3799 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3800\r
3801 Rule = RuleSimpleFile.RuleSimpleFile()\r
3802 Rule.SectionType = SectionName\r
3803 Rule.FvFileType = Type\r
3804 Rule.NameGuid = NameGuid\r
3805 Rule.Alignment = AlignValue\r
52302d4d 3806 Rule.SectAlignment = SectAlignment\r
30fdf114
LG
3807 Rule.CheckSum = CheckSum\r
3808 Rule.Fixed = Fixed\r
30fdf114 3809 Rule.KeyStringList = KeyStringList\r
4231a819 3810 if KeepReloc is not None:\r
30fdf114 3811 Rule.KeepReloc = KeepReloc\r
52302d4d
LG
3812 Rule.FileExtension = Ext\r
3813 Rule.FileName = self.__Token\r
30fdf114
LG
3814 return Rule\r
3815\r
3816 ## __GetEfiSection() method\r
3817 #\r
3818 # Get section list for Rule\r
3819 #\r
3820 # @param self The object pointer\r
3821 # @param Obj for whom section is got\r
3822 # @retval True Successfully find section statement\r
3823 # @retval False Not able to find section statement\r
3824 #\r
3825 def __GetEfiSection(self, Obj):\r
3826\r
3827 OldPos = self.GetFileBufferPos()\r
3828 if not self.__GetNextWord():\r
3829 return False\r
3830 SectionName = self.__Token\r
3831\r
3832 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3833 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3834 self.__UndoToken()\r
3835 return False\r
3836\r
3837 if SectionName == "FV_IMAGE":\r
3838 FvImageSectionObj = FvImageSection.FvImageSection()\r
3839 if self.__IsKeyword("FV_IMAGE"):\r
3840 pass\r
3841 if self.__IsToken( "{"):\r
3842 FvObj = Fv.FV()\r
3843 self.__GetDefineStatements(FvObj)\r
3844 self.__GetBlockStatement(FvObj)\r
3845 self.__GetSetStatements(FvObj)\r
3846 self.__GetFvAlignment(FvObj)\r
3847 self.__GetFvAttributes(FvObj)\r
3848 self.__GetAprioriSection(FvObj)\r
3849 self.__GetAprioriSection(FvObj)\r
3850\r
3851 while True:\r
3852 IsInf = self.__GetInfStatement(FvObj)\r
3853 IsFile = self.__GetFileStatement(FvObj)\r
3854 if not IsInf and not IsFile:\r
3855 break\r
3856\r
3857 if not self.__IsToken( "}"):\r
3858 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3859 FvImageSectionObj.Fv = FvObj\r
3860 FvImageSectionObj.FvName = None\r
3861\r
3862 else:\r
3863 if not self.__IsKeyword("FV"):\r
3864 raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
3865 FvImageSectionObj.FvFileType = self.__Token\r
3866\r
30fdf114 3867 if self.__GetAlignment():\r
e921f58d
YZ
3868 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3869 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
30fdf114
LG
3870 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3871 FvImageSectionObj.Alignment = self.__Token\r
3872\r
3873 if self.__IsToken('|'):\r
3874 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3875 elif self.__GetNextToken():\r
3876 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3877 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3878 FvImageSectionObj.FvFileName = self.__Token\r
3879 else:\r
3880 self.__UndoToken()\r
3881 else:\r
3882 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3883\r
3884 Obj.SectionList.append(FvImageSectionObj)\r
3885 return True\r
3886\r
3887 EfiSectionObj = EfiSection.EfiSection()\r
3888 EfiSectionObj.SectionType = SectionName\r
3889\r
3890 if not self.__GetNextToken():\r
3891 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3892\r
3893 if self.__Token == "STRING":\r
3894 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3895 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3896\r
3897 if not self.__IsToken('='):\r
3898 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3899\r
3900 if not self.__GetNextToken():\r
3901 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3902\r
3903 if self.__GetStringData():\r
3904 EfiSectionObj.StringData = self.__Token\r
3905\r
3906 if self.__IsKeyword("BUILD_NUM"):\r
3907 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3908 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3909\r
3910 if not self.__IsToken("="):\r
3911 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3912 if not self.__GetNextToken():\r
3913 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3914 EfiSectionObj.BuildNum = self.__Token\r
3915\r
3916 else:\r
3917 EfiSectionObj.FileType = self.__Token\r
3918 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3919\r
3920 if self.__IsKeyword("Optional"):\r
3921 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3922 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3923 EfiSectionObj.Optional = True\r
3924\r
3925 if self.__IsKeyword("BUILD_NUM"):\r
3926 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3927 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3928\r
3929 if not self.__IsToken("="):\r
3930 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3931 if not self.__GetNextToken():\r
3932 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3933 EfiSectionObj.BuildNum = self.__Token\r
3934\r
3935 if self.__GetAlignment():\r
e921f58d
YZ
3936 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
3937 "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
52302d4d
LG
3938 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3939 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3940 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3941 EfiSectionObj.Alignment = self.__Token\r
3942\r
3943 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3944 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3945 if self.__Token == 'RELOCS_STRIPPED':\r
3946 EfiSectionObj.KeepReloc = False\r
3947 else:\r
3948 EfiSectionObj.KeepReloc = True\r
4231a819 3949 if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
30fdf114
LG
3950 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3951 else:\r
3952 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3953\r
3954\r
3955 if self.__IsToken('|'):\r
3956 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3957 elif self.__GetNextToken():\r
3958 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3959 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3960 \r
3961 if self.__Token.startswith('PCD'):\r
3962 self.__UndoToken()\r
3963 self.__GetNextWord()\r
3964 \r
3965 if self.__Token == 'PCD':\r
3966 if not self.__IsToken( "("):\r
3967 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3968 PcdPair = self.__GetNextPcdName()\r
3969 if not self.__IsToken( ")"):\r
3970 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3971 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3972 \r
3973 EfiSectionObj.FileName = self.__Token \r
3974 \r
3975 else:\r
3976 self.__UndoToken()\r
3977 else:\r
3978 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
3979\r
3980 Obj.SectionList.append(EfiSectionObj)\r
3981 return True\r
3982\r
3983 ## __RuleSectionCouldBeOptional() method\r
3984 #\r
3985 # Get whether a section could be optional\r
3986 #\r
30fdf114
LG
3987 # @param SectionType The section type to check\r
3988 # @retval True section could be optional\r
3989 # @retval False section never optional\r
3990 #\r
5bcf1d56
CJ
3991 @staticmethod\r
3992 def __RuleSectionCouldBeOptional(SectionType):\r
30fdf114
LG
3993 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3994 return True\r
3995 else:\r
3996 return False\r
3997\r
3998 ## __RuleSectionCouldHaveBuildNum() method\r
3999 #\r
4000 # Get whether a section could have build number information\r
4001 #\r
30fdf114
LG
4002 # @param SectionType The section type to check\r
4003 # @retval True section could have build number information\r
4004 # @retval False section never have build number information\r
4005 #\r
5bcf1d56
CJ
4006 @staticmethod\r
4007 def __RuleSectionCouldHaveBuildNum(SectionType):\r
30fdf114
LG
4008 if SectionType in ("VERSION"):\r
4009 return True\r
4010 else:\r
4011 return False\r
4012\r
4013 ## __RuleSectionCouldHaveString() method\r
4014 #\r
4015 # Get whether a section could have string\r
4016 #\r
30fdf114
LG
4017 # @param SectionType The section type to check\r
4018 # @retval True section could have string\r
4019 # @retval False section never have string\r
4020 #\r
5bcf1d56
CJ
4021 @staticmethod\r
4022 def __RuleSectionCouldHaveString(SectionType):\r
30fdf114
LG
4023 if SectionType in ("UI", "VERSION"):\r
4024 return True\r
4025 else:\r
4026 return False\r
4027\r
4028 ## __CheckRuleSectionFileType() method\r
4029 #\r
4030 # Get whether a section matches a file type\r
4031 #\r
4032 # @param self The object pointer\r
4033 # @param SectionType The section type to check\r
4034 # @param FileType The file type to check\r
4035 #\r
4036 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
4037 if SectionType == "COMPAT16":\r
4038 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
4039 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4040 elif SectionType == "PE32":\r
4041 if FileType not in ("PE32", "SEC_PE32"):\r
4042 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4043 elif SectionType == "PIC":\r
4044 if FileType not in ("PIC", "PIC"):\r
4045 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4046 elif SectionType == "TE":\r
4047 if FileType not in ("TE", "SEC_TE"):\r
4048 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4049 elif SectionType == "RAW":\r
4050 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
4051 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
4052 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
4053 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
4054 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4055 elif SectionType == "UI":\r
4056 if FileType not in ("UI", "SEC_UI"):\r
4057 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4058 elif SectionType == "VERSION":\r
4059 if FileType not in ("VERSION", "SEC_VERSION"):\r
4060 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4061 elif SectionType == "PEI_DEPEX":\r
4062 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
4063 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4064 elif SectionType == "GUID":\r
4065 if FileType not in ("PE32", "SEC_GUID"):\r
4066 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
4067\r
4068 ## __GetRuleEncapsulationSection() method\r
4069 #\r
4070 # Get encapsulation section for Rule\r
4071 #\r
4072 # @param self The object pointer\r
4073 # @param Rule for whom section is got\r
4074 # @retval True Successfully find section statement\r
4075 # @retval False Not able to find section statement\r
4076 #\r
4077 def __GetRuleEncapsulationSection(self, Rule):\r
4078\r
4079 if self.__IsKeyword( "COMPRESS"):\r
4080 Type = "PI_STD"\r
4081 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
4082 Type = self.__Token\r
4083\r
4084 if not self.__IsToken("{"):\r
4085 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
4086\r
4087 CompressSectionObj = CompressSection.CompressSection()\r
4088\r
4089 CompressSectionObj.CompType = Type\r
4090 # Recursive sections...\r
4091 while True:\r
4092 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
4093 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
4094 if not IsEncapsulate and not IsLeaf:\r
4095 break\r
4096\r
4097 if not self.__IsToken( "}"):\r
4098 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
4099 Rule.SectionList.append(CompressSectionObj)\r
4100\r
4101 return True\r
4102\r
4103 elif self.__IsKeyword( "GUIDED"):\r
4104 GuidValue = None\r
4105 if self.__GetNextGuid():\r
4106 GuidValue = self.__Token\r
4107\r
4108 if self.__IsKeyword( "$(NAMED_GUID)"):\r
4109 GuidValue = self.__Token\r
4110\r
4111 AttribDict = self.__GetGuidAttrib()\r
4112\r
4113 if not self.__IsToken("{"):\r
4114 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
4115 GuidSectionObj = GuidSection.GuidSection()\r
4116 GuidSectionObj.NameGuid = GuidValue\r
4117 GuidSectionObj.SectionType = "GUIDED"\r
4118 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
4119 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
25918452 4120 GuidSectionObj.ExtraHeaderSize = AttribDict["EXTRA_HEADER_SIZE"]\r
30fdf114
LG
4121\r
4122 # Efi sections...\r
4123 while True:\r
4124 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
4125 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
4126 if not IsEncapsulate and not IsLeaf:\r
4127 break\r
4128\r
4129 if not self.__IsToken( "}"):\r
4130 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
4131 Rule.SectionList.append(GuidSectionObj)\r
4132\r
4133 return True\r
4134\r
4135 return False\r
4136\r
4137 ## __GetVtf() method\r
4138 #\r
4139 # Get VTF section contents and store its data into VTF list of self.Profile\r
4140 #\r
4141 # @param self The object pointer\r
4142 # @retval True Successfully find a VTF\r
4143 # @retval False Not able to find a VTF\r
4144 #\r
4145 def __GetVtf(self):\r
4146\r
4147 if not self.__GetNextToken():\r
4148 return False\r
4149\r
4150 S = self.__Token.upper()\r
4151 if S.startswith("[") and not S.startswith("[VTF."):\r
df81077f 4152 self.SectionParser(S)\r
30fdf114
LG
4153 self.__UndoToken()\r
4154 return False\r
4155\r
4156 self.__UndoToken()\r
4157 if not self.__IsToken("[VTF.", True):\r
4158 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
4159 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
4160 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
4161 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
4162\r
4163 if not self.__SkipToToken("."):\r
4164 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
4165\r
4166 Arch = self.__SkippedChars.rstrip(".").upper()\r
4afd3d04 4167 if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
4168 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
4169\r
4170 if not self.__GetNextWord():\r
4171 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
4172 Name = self.__Token.upper()\r
4173\r
4174 VtfObj = Vtf.Vtf()\r
4175 VtfObj.UiName = Name\r
4176 VtfObj.KeyArch = Arch\r
4177\r
4178 if self.__IsToken(","):\r
4179 if not self.__GetNextWord():\r
4180 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
4afd3d04 4181 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):\r
30fdf114
LG
4182 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4183 VtfObj.ArchList = self.__Token.upper()\r
4184\r
4185 if not self.__IsToken( "]"):\r
4186 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
4187\r
4188 if self.__IsKeyword("IA32_RST_BIN"):\r
4189 if not self.__IsToken("="):\r
4190 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4191\r
4192 if not self.__GetNextToken():\r
4193 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
4194\r
4195 VtfObj.ResetBin = self.__Token\r
6310ffd7 4196 if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
4197 #check for file path\r
4198 ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4199 if ErrorCode != 0:\r
4200 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4201\r
4202 while self.__GetComponentStatement(VtfObj):\r
4203 pass\r
4204\r
4205 self.Profile.VtfList.append(VtfObj)\r
4206 return True\r
4207\r
4208 ## __GetComponentStatement() method\r
4209 #\r
4210 # Get components in VTF\r
4211 #\r
4212 # @param self The object pointer\r
4213 # @param VtfObj for whom component is got\r
4214 # @retval True Successfully find a component\r
4215 # @retval False Not able to find a component\r
4216 #\r
4217 def __GetComponentStatement(self, VtfObj):\r
4218\r
4219 if not self.__IsKeyword("COMP_NAME"):\r
4220 return False\r
4221\r
4222 if not self.__IsToken("="):\r
4223 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4224\r
4225 if not self.__GetNextWord():\r
4226 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
4227\r
4228 CompStatementObj = ComponentStatement.ComponentStatement()\r
4229 CompStatementObj.CompName = self.__Token\r
4230\r
4231 if not self.__IsKeyword("COMP_LOC"):\r
4232 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
4233\r
4234 if not self.__IsToken("="):\r
4235 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4236\r
4237 CompStatementObj.CompLoc = ""\r
4238 if self.__GetNextWord():\r
4239 CompStatementObj.CompLoc = self.__Token\r
4240 if self.__IsToken('|'):\r
4241 if not self.__GetNextWord():\r
4242 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
4243\r
4244 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
4245 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4246\r
4247 CompStatementObj.FilePos = self.__Token\r
4248 else:\r
4249 self.CurrentLineNumber += 1\r
4250 self.CurrentOffsetWithinLine = 0\r
4251\r
4252 if not self.__IsKeyword("COMP_TYPE"):\r
4253 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
4254\r
4255 if not self.__IsToken("="):\r
4256 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4257\r
4258 if not self.__GetNextToken():\r
4259 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
4260 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
4261 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
cfbe3c35 4262 not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:\r
30fdf114
LG
4263 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4264 CompStatementObj.CompType = self.__Token\r
4265\r
4266 if not self.__IsKeyword("COMP_VER"):\r
4267 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
4268\r
4269 if not self.__IsToken("="):\r
4270 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4271\r
4272 if not self.__GetNextToken():\r
4273 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
4274\r
9fd2164e 4275 Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
4231a819 4276 if Pattern.match(self.__Token) is None:\r
30fdf114
LG
4277 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4278 CompStatementObj.CompVer = self.__Token\r
4279\r
4280 if not self.__IsKeyword("COMP_CS"):\r
4281 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
4282\r
4283 if not self.__IsToken("="):\r
4284 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4285\r
4286 if not self.__GetNextToken():\r
4287 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
4288 if self.__Token not in ("1", "0"):\r
4289 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4290 CompStatementObj.CompCs = self.__Token\r
4291\r
4292\r
4293 if not self.__IsKeyword("COMP_BIN"):\r
4294 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
4295\r
4296 if not self.__IsToken("="):\r
4297 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4298\r
4299 if not self.__GetNextToken():\r
4300 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
4301\r
4302 CompStatementObj.CompBin = self.__Token\r
6310ffd7 4303 if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
4304 #check for file path\r
4305 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4306 if ErrorCode != 0:\r
4307 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4308\r
4309 if not self.__IsKeyword("COMP_SYM"):\r
4310 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
4311\r
4312 if not self.__IsToken("="):\r
4313 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4314\r
4315 if not self.__GetNextToken():\r
4316 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
4317\r
4318 CompStatementObj.CompSym = self.__Token\r
6310ffd7 4319 if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1:\r
4320 #check for file path\r
4321 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4322 if ErrorCode != 0:\r
4323 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4324\r
4325 if not self.__IsKeyword("COMP_SIZE"):\r
4326 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
4327\r
4328 if not self.__IsToken("="):\r
4329 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4330\r
4331 if self.__IsToken("-"):\r
4332 CompStatementObj.CompSize = self.__Token\r
4333 elif self.__GetNextDecimalNumber():\r
4334 CompStatementObj.CompSize = self.__Token\r
4335 elif self.__GetNextHexNumber():\r
4336 CompStatementObj.CompSize = self.__Token\r
4337 else:\r
4338 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4339\r
4340 VtfObj.ComponentStatementList.append(CompStatementObj)\r
4341 return True\r
4342\r
4343 ## __GetOptionRom() method\r
4344 #\r
4345 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
4346 #\r
4347 # @param self The object pointer\r
4348 # @retval True Successfully find a OptionROM\r
4349 # @retval False Not able to find a OptionROM\r
4350 #\r
4351 def __GetOptionRom(self):\r
4352\r
4353 if not self.__GetNextToken():\r
4354 return False\r
4355\r
4356 S = self.__Token.upper()\r
4357 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
df81077f
YZ
4358 self.SectionParser(S)\r
4359 self.__UndoToken()\r
4360 return False\r
30fdf114
LG
4361 \r
4362 self.__UndoToken()\r
4363 if not self.__IsToken("[OptionRom.", True):\r
4364 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
4365\r
4366 OptRomName = self.__GetUiName()\r
4367\r
4368 if not self.__IsToken( "]"):\r
4369 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
4370\r
4371 OptRomObj = OptionRom.OPTIONROM()\r
4372 OptRomObj.DriverName = OptRomName\r
4373 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
4374\r
4375 while True:\r
4376 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
4377 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
4378 if not isInf and not isFile:\r
4379 break\r
4380 \r
4381 return True\r
4382\r
4383 ## __GetOptRomInfStatement() method\r
4384 #\r
4385 # Get INF statements\r
4386 #\r
4387 # @param self The object pointer\r
4388 # @param Obj for whom inf statement is got\r
4389 # @retval True Successfully find inf statement\r
4390 # @retval False Not able to find inf statement\r
4391 #\r
4392 def __GetOptRomInfStatement(self, Obj):\r
4393\r
4394 if not self.__IsKeyword( "INF"):\r
4395 return False\r
4396\r
4397 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
4398 self.__GetInfOptions( ffsInf)\r
4399\r
4400 if not self.__GetNextToken():\r
4401 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
4402 ffsInf.InfFileName = self.__Token\r
6310ffd7 4403 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
4404 #check for file path\r
4405 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4406 if ErrorCode != 0:\r
4407 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4408\r
4409 if not ffsInf.InfFileName in self.Profile.InfList:\r
4410 self.Profile.InfList.append(ffsInf.InfFileName)\r
d0acc87a
LG
4411 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
4412 self.Profile.InfFileLineList.append(FileLineTuple)\r
2502b735
YZ
4413 if ffsInf.UseArch:\r
4414 if ffsInf.UseArch not in self.Profile.InfDict:\r
4415 self.Profile.InfDict[ffsInf.UseArch] = [ffsInf.InfFileName]\r
4416 else:\r
4417 self.Profile.InfDict[ffsInf.UseArch].append(ffsInf.InfFileName)\r
4418 else:\r
4419 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
30fdf114
LG
4420\r
4421 \r
4422 self.__GetOptRomOverrides (ffsInf)\r
4423 \r
4424 Obj.FfsList.append(ffsInf)\r
4425 return True\r
4426\r
4427 ## __GetOptRomOverrides() method\r
4428 #\r
4429 # Get overrides for OptROM INF & FILE\r
4430 #\r
4431 # @param self The object pointer\r
4432 # @param FfsInfObj for whom overrides is got\r
4433 #\r
4434 def __GetOptRomOverrides(self, Obj):\r
4435 if self.__IsToken('{'):\r
4436 Overrides = OptionRom.OverrideAttribs()\r
fd171542 4437 while True:\r
4438 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
4439 if not self.__IsToken( "="):\r
4440 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4441 if not self.__GetNextHexNumber():\r
4442 raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
4443 Overrides.PciVendorId = self.__Token\r
4444 continue\r
4445\r
4446 if self.__IsKeyword( "PCI_CLASS_CODE"):\r
4447 if not self.__IsToken( "="):\r
4448 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4449 if not self.__GetNextHexNumber():\r
4450 raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
4451 Overrides.PciClassCode = self.__Token\r
4452 continue\r
4453\r
4454 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
4455 if not self.__IsToken( "="):\r
4456 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4457 if not self.__GetNextHexNumber():\r
4458 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
4459\r
4460 Overrides.PciDeviceId = self.__Token\r
4461 continue\r
4462\r
4463 if self.__IsKeyword( "PCI_REVISION"):\r
4464 if not self.__IsToken( "="):\r
4465 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4466 if not self.__GetNextHexNumber():\r
4467 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
4468 Overrides.PciRevision = self.__Token\r
4469 continue\r
4470\r
79b74a03 4471 if self.__IsKeyword( "PCI_COMPRESS"):\r
fd171542 4472 if not self.__IsToken( "="):\r
4473 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
4474 if not self.__GetNextToken():\r
4475 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
4476 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
4477 continue\r
4478\r
4479 if self.__IsToken( "}"):\r
4480 break\r
4481 else:\r
4482 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
4483\r
30fdf114
LG
4484 Obj.OverrideAttribs = Overrides\r
4485 \r
4486 ## __GetOptRomFileStatement() method\r
4487 #\r
4488 # Get FILE statements\r
4489 #\r
4490 # @param self The object pointer\r
4491 # @param Obj for whom FILE statement is got\r
4492 # @retval True Successfully find FILE statement\r
4493 # @retval False Not able to find FILE statement\r
4494 #\r
4495 def __GetOptRomFileStatement(self, Obj):\r
4496\r
4497 if not self.__IsKeyword( "FILE"):\r
4498 return False\r
4499\r
4500 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
4501\r
4502 if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
4503 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
4504 FfsFileObj.FileType = self.__Token\r
4505\r
4506 if not self.__GetNextToken():\r
4507 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
4508 FfsFileObj.FileName = self.__Token\r
6310ffd7 4509 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
4510 #check for file path\r
4511 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
4512 if ErrorCode != 0:\r
4513 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
4514\r
4515 if FfsFileObj.FileType == 'EFI':\r
4516 self.__GetOptRomOverrides(FfsFileObj)\r
4517 \r
4518 Obj.FfsList.append(FfsFileObj)\r
4519\r
4520 return True\r
fd171542 4521\r
4522 ## __GetCapInFd() method\r
4523 #\r
4524 # Get Cap list contained in FD\r
4525 #\r
4526 # @param self The object pointer\r
4527 # @param FdName FD name\r
4528 # @retval CapList List of Capsule in FD\r
4529 #\r
4530 def __GetCapInFd (self, FdName):\r
4531\r
4532 CapList = []\r
4533 if FdName.upper() in self.Profile.FdDict.keys():\r
4534 FdObj = self.Profile.FdDict[FdName.upper()]\r
4535 for elementRegion in FdObj.RegionList:\r
4536 if elementRegion.RegionType == 'CAPSULE':\r
4537 for elementRegionData in elementRegion.RegionDataList:\r
4538 if elementRegionData.endswith(".cap"):\r
4539 continue\r
4231a819 4540 if elementRegionData is not None and elementRegionData.upper() not in CapList:\r
fd171542 4541 CapList.append(elementRegionData.upper())\r
4542 return CapList\r
4543\r
4544 ## __GetReferencedFdCapTuple() method\r
4545 #\r
4546 # Get FV and FD list referenced by a capsule image\r
4547 #\r
4548 # @param self The object pointer\r
4549 # @param CapObj Capsule section to be searched\r
4550 # @param RefFdList referenced FD by section\r
4551 # @param RefFvList referenced FV by section\r
4552 #\r
4553 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
4554\r
4555 for CapsuleDataObj in CapObj.CapsuleDataList :\r
4231a819 4556 if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName is not None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
fd171542 4557 RefFvList.append (CapsuleDataObj.FvName.upper())\r
4231a819 4558 elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName is not None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
b36d134f 4559 RefFdList.append (CapsuleDataObj.FdName.upper()) \r
4231a819 4560 elif CapsuleDataObj.Ffs is not None:\r
b36d134f 4561 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
4231a819 4562 if CapsuleDataObj.Ffs.FvName is not None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
b36d134f 4563 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
4231a819 4564 elif CapsuleDataObj.Ffs.FdName is not None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
b36d134f
LG
4565 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
4566 else:\r
4567 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
fd171542 4568\r
30fdf114
LG
4569 ## __GetFvInFd() method\r
4570 #\r
4571 # Get FV list contained in FD\r
4572 #\r
4573 # @param self The object pointer\r
4574 # @param FdName FD name\r
4575 # @retval FvList list of FV in FD\r
4576 #\r
4577 def __GetFvInFd (self, FdName):\r
4578\r
4579 FvList = []\r
4580 if FdName.upper() in self.Profile.FdDict.keys():\r
4581 FdObj = self.Profile.FdDict[FdName.upper()]\r
4582 for elementRegion in FdObj.RegionList:\r
4583 if elementRegion.RegionType == 'FV':\r
4584 for elementRegionData in elementRegion.RegionDataList:\r
fd171542 4585 if elementRegionData.endswith(".fv"):\r
4586 continue\r
4231a819 4587 if elementRegionData is not None and elementRegionData.upper() not in FvList:\r
30fdf114
LG
4588 FvList.append(elementRegionData.upper())\r
4589 return FvList\r
4590\r
4591 ## __GetReferencedFdFvTuple() method\r
4592 #\r
4593 # Get FD and FV list referenced by a FFS file\r
4594 #\r
4595 # @param self The object pointer\r
4596 # @param FfsFile contains sections to be searched\r
4597 # @param RefFdList referenced FD by section\r
4598 # @param RefFvList referenced FV by section\r
4599 #\r
4600 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
4601\r
4602 for FfsObj in FvObj.FfsList:\r
4603 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
4231a819 4604 if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:\r
30fdf114 4605 RefFvList.append(FfsObj.FvName.upper())\r
4231a819 4606 elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:\r
30fdf114
LG
4607 RefFdList.append(FfsObj.FdName.upper())\r
4608 else:\r
4609 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
4610\r
4611 ## __GetReferencedFdFvTupleFromSection() method\r
4612 #\r
4613 # Get FD and FV list referenced by a FFS section\r
4614 #\r
4615 # @param self The object pointer\r
4616 # @param FfsFile contains sections to be searched\r
4617 # @param FdList referenced FD by section\r
4618 # @param FvList referenced FV by section\r
4619 #\r
4620 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
4621\r
4622 SectionStack = []\r
4623 SectionStack.extend(FfsFile.SectionList)\r
4624 while SectionStack != []:\r
4625 SectionObj = SectionStack.pop()\r
4626 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
4231a819 4627 if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:\r
30fdf114 4628 FvList.append(SectionObj.FvName.upper())\r
4231a819 4629 if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
30fdf114
LG
4630 FvList.append(SectionObj.Fv.UiFvName.upper())\r
4631 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
4632\r
4633 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
4634 SectionStack.extend(SectionObj.SectionList)\r
4635\r
4636 ## CycleReferenceCheck() method\r
4637 #\r
4638 # Check whether cycle reference exists in FDF\r
4639 #\r
4640 # @param self The object pointer\r
4641 # @retval True cycle reference exists\r
4642 # @retval False Not exists cycle reference\r
4643 #\r
4644 def CycleReferenceCheck(self):\r
fd171542 4645 #\r
4646 # Check the cycle between FV and FD image\r
4647 #\r
4648 MaxLength = len (self.Profile.FvDict)\r
4649 for FvName in self.Profile.FvDict.keys():\r
4650 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
4651 RefFvStack = []\r
4652 RefFvStack.append(FvName)\r
4653 FdAnalyzedList = []\r
4654 \r
4655 Index = 0\r
4656 while RefFvStack != [] and Index < MaxLength:\r
4657 Index = Index + 1\r
4658 FvNameFromStack = RefFvStack.pop()\r
4659 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
4660 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
4661 else:\r
4662 continue\r
30fdf114 4663\r
fd171542 4664 RefFdList = []\r
4665 RefFvList = []\r
4666 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
30fdf114 4667\r
fd171542 4668 for RefFdName in RefFdList:\r
4669 if RefFdName in FdAnalyzedList:\r
30fdf114
LG
4670 continue\r
4671\r
fd171542 4672 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
4673 FvInFdList = self.__GetFvInFd(RefFdName)\r
4674 if FvInFdList != []:\r
4675 for FvNameInFd in FvInFdList:\r
4676 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4677 if FvNameInFd not in RefFvStack:\r
4678 RefFvStack.append(FvNameInFd)\r
4679\r
4680 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4681 EdkLogger.info(LogStr)\r
4682 return True\r
4683 FdAnalyzedList.append(RefFdName)\r
30fdf114 4684\r
fd171542 4685 for RefFvName in RefFvList:\r
4686 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
4687 if RefFvName not in RefFvStack:\r
4688 RefFvStack.append(RefFvName)\r
4689\r
4690 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4691 EdkLogger.info(LogStr)\r
4692 return True\r
4693\r
4694 #\r
4695 # Check the cycle between Capsule and FD image\r
4696 #\r
4697 MaxLength = len (self.Profile.CapsuleDict)\r
4698 for CapName in self.Profile.CapsuleDict.keys():\r
4699 #\r
4700 # Capsule image to be checked.\r
4701 #\r
4702 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
4703 RefCapStack = []\r
4704 RefCapStack.append(CapName)\r
4705 FdAnalyzedList = []\r
4706 FvAnalyzedList = []\r
4707 \r
4708 Index = 0\r
4709 while RefCapStack != [] and Index < MaxLength:\r
4710 Index = Index + 1\r
4711 CapNameFromStack = RefCapStack.pop()\r
4712 if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
4713 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
4714 else:\r
4715 continue\r
4716\r
4717 RefFvList = []\r
4718 RefFdList = []\r
4719 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
4720\r
4721 FvListLength = 0\r
4722 FdListLength = 0\r
4723 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
30fdf114
LG
4724 for RefFdName in RefFdList:\r
4725 if RefFdName in FdAnalyzedList:\r
4726 continue\r
4727\r
fd171542 4728 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
4729 CapInFdList = self.__GetCapInFd(RefFdName)\r
4730 if CapInFdList != []:\r
4731 for CapNameInFd in CapInFdList:\r
4732 LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
4733 if CapNameInFd not in RefCapStack:\r
4734 RefCapStack.append(CapNameInFd)\r
4735\r
4736 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
4737 EdkLogger.info(LogStr)\r
4738 return True\r
4739\r
30fdf114
LG
4740 FvInFdList = self.__GetFvInFd(RefFdName)\r
4741 if FvInFdList != []:\r
fd171542 4742 for FvNameInFd in FvInFdList:\r
4743 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4744 if FvNameInFd not in RefFvList:\r
4745 RefFvList.append(FvNameInFd)\r
30fdf114 4746\r
fd171542 4747 FdAnalyzedList.append(RefFdName)\r
4748 #\r
4749 # the number of the parsed FV and FD image\r
4750 #\r
4751 FvListLength = len (RefFvList)\r
4752 FdListLength = len (RefFdList)\r
30fdf114 4753 for RefFvName in RefFvList:\r
fd171542 4754 if RefFvName in FvAnalyzedList:\r
4755 continue\r
4756 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
4757 if RefFvName.upper() in self.Profile.FvDict.keys():\r
4758 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4759 else:\r
4760 continue\r
4761 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4762 FvAnalyzedList.append(RefFvName)\r
30fdf114 4763\r
fd171542 4764 return False\r
30fdf114 4765\r
c17956e0
DL
4766 def GetAllIncludedFile (self):\r
4767 global AllIncludeFileList\r
4768 return AllIncludeFileList\r
4769\r
30fdf114 4770if __name__ == "__main__":\r
b36d134f
LG
4771 import sys\r
4772 try:\r
4773 test_file = sys.argv[1]\r
4774 except IndexError, v:\r
4775 print "Usage: %s filename" % sys.argv[0]\r
4776 sys.exit(1)\r
4777\r
4778 parser = FdfParser(test_file)\r
30fdf114
LG
4779 try:\r
4780 parser.ParseFile()\r
4781 parser.CycleReferenceCheck()\r
4782 except Warning, X:\r
b36d134f 4783 print str(X)\r
30fdf114
LG
4784 else:\r
4785 print "Success!"\r
4786\r