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