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