]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FdfParser.py
Sync EDKII BaseTools to BaseTools project r2093.
[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
6780eef1 568 ## PreprocessConditionalStatement() method\r
30fdf114 569 #\r
6780eef1 570 # Preprocess conditional statement.\r
30fdf114
LG
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
6780eef1
LG
1267 # handle the SET statement\r
1268 if self.__Token == 'SET':\r
1269 self.__UndoToken()\r
1270 self.__GetSetStatement(None)\r
1271 continue\r
1272 \r
30fdf114
LG
1273 Macro = self.__Token\r
1274 \r
1275 if not self.__IsToken("="):\r
1276 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1277 if not self.__GetNextToken() or self.__Token.startswith('['):\r
1278 raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)\r
1279 Value = self.__Token\r
1280 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1281 MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])\r
1282 MacProfile.MacroName = Macro\r
1283 MacProfile.MacroValue = Value\r
1284 AllMacroList.append(MacProfile)\r
1285\r
1286 return False\r
1287\r
1288 ## __GetFd() method\r
1289 #\r
1290 # Get FD section contents and store its data into FD dictionary of self.Profile\r
1291 #\r
1292 # @param self The object pointer\r
1293 # @retval True Successfully find a FD\r
1294 # @retval False Not able to find a FD\r
1295 #\r
1296 def __GetFd(self):\r
1297\r
1298 if not self.__GetNextToken():\r
1299 return False\r
1300\r
1301 S = self.__Token.upper()\r
1302 if S.startswith("[") and not S.startswith("[FD."):\r
1303 if not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
1304 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1305 raise Warning("Unknown section", self.FileName, self.CurrentLineNumber)\r
1306 self.__UndoToken()\r
1307 return False\r
1308\r
1309 self.__UndoToken()\r
1310 if not self.__IsToken("[FD.", True):\r
1311 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1312 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1313 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1314 raise Warning("expected [FD.]", self.FileName, self.CurrentLineNumber)\r
1315\r
1316 FdName = self.__GetUiName()\r
52302d4d
LG
1317 if FdName == "":\r
1318 if len (self.Profile.FdDict) == 0:\r
1319 FdName = GenFdsGlobalVariable.PlatformName\r
1320 self.Profile.FdNameNotSet = True\r
1321 else:\r
1322 raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
30fdf114 1323 self.CurrentFdName = FdName.upper()\r
52302d4d
LG
1324 \r
1325 if self.CurrentFdName in self.Profile.FdDict:\r
1326 raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1327\r
1328 if not self.__IsToken( "]"):\r
1329 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1330\r
1331 FdObj = Fd.FD()\r
1332 FdObj.FdUiName = self.CurrentFdName\r
1333 self.Profile.FdDict[self.CurrentFdName] = FdObj\r
52302d4d
LG
1334\r
1335 if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet:\r
1336 raise Warning("expected all FDs have their name", self.FileName, self.CurrentLineNumber)\r
1337\r
30fdf114
LG
1338 Status = self.__GetCreateFile(FdObj)\r
1339 if not Status:\r
1340 raise Warning("FD name error", self.FileName, self.CurrentLineNumber)\r
1341\r
52302d4d 1342 self.__GetTokenStatements(FdObj)\r
30fdf114
LG
1343\r
1344 self.__GetDefineStatements(FdObj)\r
1345\r
1346 self.__GetSetStatements(FdObj)\r
1347\r
1348 if not self.__GetRegionLayout(FdObj):\r
1349 raise Warning("expected region layout", self.FileName, self.CurrentLineNumber)\r
1350\r
1351 while self.__GetRegionLayout(FdObj):\r
1352 pass\r
1353 return True\r
1354\r
1355 ## __GetUiName() method\r
1356 #\r
1357 # Return the UI name of a section\r
1358 #\r
1359 # @param self The object pointer\r
1360 # @retval FdName UI name\r
1361 #\r
1362 def __GetUiName(self):\r
1363 Name = ""\r
1364 if self.__GetNextWord():\r
1365 Name = self.__Token\r
1366\r
1367 return Name\r
1368\r
1369 ## __GetCreateFile() method\r
1370 #\r
1371 # Return the output file name of object\r
1372 #\r
1373 # @param self The object pointer\r
1374 # @param Obj object whose data will be stored in file\r
1375 # @retval FdName UI name\r
1376 #\r
1377 def __GetCreateFile(self, Obj):\r
1378\r
1379 if self.__IsKeyword( "CREATE_FILE"):\r
1380 if not self.__IsToken( "="):\r
1381 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1382\r
1383 if not self.__GetNextToken():\r
1384 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
1385\r
1386 FileName = self.__Token\r
1387 Obj.CreateFileName = FileName\r
1388\r
1389 return True\r
1390\r
1391 ## __GetTokenStatements() method\r
1392 #\r
1393 # Get token statements\r
1394 #\r
1395 # @param self The object pointer\r
1396 # @param Obj for whom token statement is got\r
30fdf114
LG
1397 #\r
1398 def __GetTokenStatements(self, Obj):\r
1399 if not self.__IsKeyword( "BaseAddress"):\r
1400 raise Warning("BaseAddress missing", self.FileName, self.CurrentLineNumber)\r
1401\r
1402 if not self.__IsToken( "="):\r
1403 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1404\r
1405 if not self.__GetNextHexNumber():\r
1406 raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
1407\r
1408 Obj.BaseAddress = self.__Token\r
1409\r
1410 if self.__IsToken( "|"):\r
1411 pcdPair = self.__GetNextPcdName()\r
1412 Obj.BaseAddressPcd = pcdPair\r
1413 self.Profile.PcdDict[pcdPair] = Obj.BaseAddress\r
1414\r
1415 if not self.__IsKeyword( "Size"):\r
1416 raise Warning("Size missing", self.FileName, self.CurrentLineNumber)\r
1417\r
1418 if not self.__IsToken( "="):\r
1419 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1420\r
1421 if not self.__GetNextHexNumber():\r
1422 raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
1423\r
1424\r
1425 Size = self.__Token\r
1426 if self.__IsToken( "|"):\r
1427 pcdPair = self.__GetNextPcdName()\r
1428 Obj.SizePcd = pcdPair\r
1429 self.Profile.PcdDict[pcdPair] = Size\r
1430 Obj.Size = long(Size, 0)\r
1431\r
1432 if not self.__IsKeyword( "ErasePolarity"):\r
1433 raise Warning("ErasePolarity missing", self.FileName, self.CurrentLineNumber)\r
1434\r
1435 if not self.__IsToken( "="):\r
1436 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1437\r
1438 if not self.__GetNextToken():\r
1439 raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\r
1440\r
1441 if self.__Token != "1" and self.__Token != "0":\r
1442 raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
1443\r
1444 Obj.ErasePolarity = self.__Token\r
1445\r
52302d4d 1446 self.__GetBlockStatements(Obj)\r
30fdf114
LG
1447\r
1448 ## __GetAddressStatements() method\r
1449 #\r
1450 # Get address statements\r
1451 #\r
1452 # @param self The object pointer\r
1453 # @param Obj for whom address statement is got\r
1454 # @retval True Successfully find\r
1455 # @retval False Not able to find\r
1456 #\r
1457 def __GetAddressStatements(self, Obj):\r
1458\r
1459 if self.__IsKeyword("BsBaseAddress"):\r
1460 if not self.__IsToken( "="):\r
1461 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1462\r
1463 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1464 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1465\r
1466 BsAddress = long(self.__Token, 0)\r
1467 Obj.BsBaseAddress = BsAddress\r
1468\r
1469 if self.__IsKeyword("RtBaseAddress"):\r
1470 if not self.__IsToken( "="):\r
1471 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1472\r
1473 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1474 raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
1475\r
1476 RtAddress = long(self.__Token, 0)\r
1477 Obj.RtBaseAddress = RtAddress\r
1478\r
1479 ## __GetBlockStatements() method\r
1480 #\r
1481 # Get block statements\r
1482 #\r
1483 # @param self The object pointer\r
1484 # @param Obj for whom block statement is got\r
30fdf114
LG
1485 #\r
1486 def __GetBlockStatements(self, Obj):\r
1487\r
1488 if not self.__GetBlockStatement(Obj):\r
52302d4d
LG
1489 #set default block size is 1\r
1490 Obj.BlockSizeList.append((1, Obj.Size, None))\r
1491 return\r
30fdf114
LG
1492\r
1493 while self.__GetBlockStatement(Obj):\r
1494 pass\r
52302d4d
LG
1495 \r
1496 for Item in Obj.BlockSizeList:\r
1497 if Item[0] == None or Item[1] == None:\r
6780eef1 1498 raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1499\r
1500 ## __GetBlockStatement() method\r
1501 #\r
1502 # Get block statement\r
1503 #\r
1504 # @param self The object pointer\r
1505 # @param Obj for whom block statement is got\r
1506 # @retval True Successfully find\r
1507 # @retval False Not able to find\r
1508 #\r
1509 def __GetBlockStatement(self, Obj):\r
1510 if not self.__IsKeyword( "BlockSize"):\r
1511 return False\r
1512\r
1513 if not self.__IsToken( "="):\r
1514 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1515\r
1516 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
6780eef1 1517 raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
1518\r
1519 BlockSize = self.__Token\r
1520 BlockSizePcd = None\r
1521 if self.__IsToken( "|"):\r
1522 PcdPair = self.__GetNextPcdName()\r
1523 BlockSizePcd = PcdPair\r
1524 self.Profile.PcdDict[PcdPair] = BlockSize\r
52302d4d 1525 BlockSize = long(BlockSize, 0)\r
30fdf114
LG
1526\r
1527 BlockNumber = None\r
1528 if self.__IsKeyword( "NumBlocks"):\r
1529 if not self.__IsToken( "="):\r
1530 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1531\r
1532 if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():\r
1533 raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber)\r
1534\r
1535 BlockNumber = long(self.__Token, 0)\r
1536\r
1537 Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
1538 return True\r
1539\r
1540 ## __GetDefineStatements() method\r
1541 #\r
1542 # Get define statements\r
1543 #\r
1544 # @param self The object pointer\r
1545 # @param Obj for whom define statement is got\r
1546 # @retval True Successfully find\r
1547 # @retval False Not able to find\r
1548 #\r
1549 def __GetDefineStatements(self, Obj):\r
1550 while self.__GetDefineStatement( Obj):\r
1551 pass\r
1552\r
1553 ## __GetDefineStatement() method\r
1554 #\r
1555 # Get define statement\r
1556 #\r
1557 # @param self The object pointer\r
1558 # @param Obj for whom define statement is got\r
1559 # @retval True Successfully find\r
1560 # @retval False Not able to find\r
1561 #\r
1562 def __GetDefineStatement(self, Obj):\r
1563 if self.__IsKeyword("DEFINE"):\r
1564 self.__GetNextToken()\r
1565 Macro = self.__Token\r
1566 if not self.__IsToken( "="):\r
1567 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1568\r
1569 if not self.__GetNextToken():\r
1570 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
1571\r
1572 Value = self.__Token\r
1573 Macro = '$(' + Macro + ')'\r
1574 Obj.DefineVarDict[Macro] = Value\r
1575 return True\r
1576\r
1577 return False\r
1578\r
1579 ## __GetSetStatements() method\r
1580 #\r
1581 # Get set statements\r
1582 #\r
1583 # @param self The object pointer\r
1584 # @param Obj for whom set statement is got\r
1585 # @retval True Successfully find\r
1586 # @retval False Not able to find\r
1587 #\r
1588 def __GetSetStatements(self, Obj):\r
1589 while self.__GetSetStatement(Obj):\r
1590 pass\r
1591\r
1592 ## __GetSetStatement() method\r
1593 #\r
1594 # Get set statement\r
1595 #\r
1596 # @param self The object pointer\r
1597 # @param Obj for whom set statement is got\r
1598 # @retval True Successfully find\r
1599 # @retval False Not able to find\r
1600 #\r
1601 def __GetSetStatement(self, Obj):\r
1602 if self.__IsKeyword("SET"):\r
1603 PcdPair = self.__GetNextPcdName()\r
1604\r
1605 if not self.__IsToken( "="):\r
1606 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1607\r
1608 if not self.__GetNextToken():\r
1609 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
1610\r
1611 Value = self.__Token\r
1612 if Value.startswith("{"):\r
1613 # deal with value with {}\r
1614 if not self.__SkipToToken( "}"):\r
1615 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
1616 Value += self.__SkippedChars\r
1617\r
6780eef1
LG
1618 if Obj:\r
1619 Obj.SetVarDict[PcdPair] = Value\r
30fdf114
LG
1620 self.Profile.PcdDict[PcdPair] = Value\r
1621 return True\r
1622\r
1623 return False\r
1624\r
1625 ## __GetRegionLayout() method\r
1626 #\r
1627 # Get region layout for FD\r
1628 #\r
1629 # @param self The object pointer\r
1630 # @param Fd for whom region is got\r
1631 # @retval True Successfully find\r
1632 # @retval False Not able to find\r
1633 #\r
1634 def __GetRegionLayout(self, Fd):\r
1635 if not self.__GetNextHexNumber():\r
1636 return False\r
1637\r
1638 RegionObj = Region.Region()\r
1639 RegionObj.Offset = long(self.__Token, 0)\r
1640 Fd.RegionList.append(RegionObj)\r
1641\r
1642 if not self.__IsToken( "|"):\r
1643 raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
1644\r
1645 if not self.__GetNextHexNumber():\r
1646 raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
1647 RegionObj.Size = long(self.__Token, 0)\r
1648\r
1649 if not self.__GetNextWord():\r
1650 return True\r
1651\r
fd171542 1652 if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):\r
30fdf114
LG
1653 self.__UndoToken()\r
1654 RegionObj.PcdOffset = self.__GetNextPcdName()\r
1655 self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0))\r
1656 if self.__IsToken( "|"):\r
1657 RegionObj.PcdSize = self.__GetNextPcdName()\r
1658 self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size\r
1659\r
1660 if not self.__GetNextWord():\r
1661 return True\r
1662\r
1663 if self.__Token == "SET":\r
1664 self.__UndoToken()\r
1665 self.__GetSetStatements( RegionObj)\r
1666 if not self.__GetNextWord():\r
1667 return True\r
1668\r
fd171542 1669 elif self.__Token == "FV":\r
30fdf114
LG
1670 self.__UndoToken()\r
1671 self.__GetRegionFvType( RegionObj)\r
1672\r
fd171542 1673 elif self.__Token == "CAPSULE":\r
1674 self.__UndoToken()\r
1675 self.__GetRegionCapType( RegionObj)\r
1676\r
30fdf114
LG
1677 elif self.__Token == "FILE":\r
1678 self.__UndoToken()\r
1679 self.__GetRegionFileType( RegionObj)\r
1680\r
1681 else:\r
1682 self.__UndoToken()\r
1683 self.__GetRegionDataType( RegionObj)\r
1684\r
1685 return True\r
1686\r
1687 ## __GetRegionFvType() method\r
1688 #\r
1689 # Get region fv data for region\r
1690 #\r
1691 # @param self The object pointer\r
1692 # @param RegionObj for whom region data is got\r
1693 #\r
1694 def __GetRegionFvType(self, RegionObj):\r
1695\r
1696 if not self.__IsKeyword( "FV"):\r
1697 raise Warning("expected Keyword 'FV'", self.FileName, self.CurrentLineNumber)\r
1698\r
1699 if not self.__IsToken( "="):\r
1700 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1701\r
1702 if not self.__GetNextToken():\r
1703 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1704\r
1705 RegionObj.RegionType = "FV"\r
1706 RegionObj.RegionDataList.append(self.__Token)\r
1707\r
1708 while self.__IsKeyword( "FV"):\r
1709\r
1710 if not self.__IsToken( "="):\r
1711 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1712\r
1713 if not self.__GetNextToken():\r
1714 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
1715\r
1716 RegionObj.RegionDataList.append(self.__Token)\r
1717\r
fd171542 1718 ## __GetRegionCapType() method\r
1719 #\r
1720 # Get region capsule data for region\r
1721 #\r
1722 # @param self The object pointer\r
1723 # @param RegionObj for whom region data is got\r
1724 #\r
1725 def __GetRegionCapType(self, RegionObj):\r
1726\r
1727 if not self.__IsKeyword("CAPSULE"):\r
1728 raise Warning("expected Keyword 'CAPSULE'", self.FileName, self.CurrentLineNumber)\r
1729\r
1730 if not self.__IsToken("="):\r
1731 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1732\r
1733 if not self.__GetNextToken():\r
1734 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
1735\r
1736 RegionObj.RegionType = "CAPSULE"\r
1737 RegionObj.RegionDataList.append(self.__Token)\r
1738\r
1739 while self.__IsKeyword("CAPSULE"):\r
1740\r
1741 if not self.__IsToken("="):\r
1742 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1743\r
1744 if not self.__GetNextToken():\r
1745 raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
1746\r
1747 RegionObj.RegionDataList.append(self.__Token)\r
1748\r
30fdf114
LG
1749 ## __GetRegionFileType() method\r
1750 #\r
1751 # Get region file data for region\r
1752 #\r
1753 # @param self The object pointer\r
1754 # @param RegionObj for whom region data is got\r
1755 #\r
1756 def __GetRegionFileType(self, RegionObj):\r
1757\r
1758 if not self.__IsKeyword( "FILE"):\r
1759 raise Warning("expected Keyword 'FILE'", self.FileName, self.CurrentLineNumber)\r
1760\r
1761 if not self.__IsToken( "="):\r
1762 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1763\r
1764 if not self.__GetNextToken():\r
1765 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
1766\r
1767 RegionObj.RegionType = "FILE"\r
1768 RegionObj.RegionDataList.append( self.__Token)\r
1769\r
1770 while self.__IsKeyword( "FILE"):\r
1771\r
1772 if not self.__IsToken( "="):\r
1773 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1774\r
1775 if not self.__GetNextToken():\r
1776 raise Warning("expected FILE name", self.FileName, self.CurrentLineNumber)\r
1777\r
1778 RegionObj.RegionDataList.append(self.__Token)\r
1779\r
1780 ## __GetRegionDataType() method\r
1781 #\r
1782 # Get region array data for region\r
1783 #\r
1784 # @param self The object pointer\r
1785 # @param RegionObj for whom region data is got\r
1786 #\r
1787 def __GetRegionDataType(self, RegionObj):\r
1788\r
1789 if not self.__IsKeyword( "DATA"):\r
1790 raise Warning("expected Region Data type", self.FileName, self.CurrentLineNumber)\r
1791\r
1792 if not self.__IsToken( "="):\r
1793 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1794\r
1795 if not self.__IsToken( "{"):\r
1796 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
1797\r
1798 if not self.__GetNextHexNumber():\r
1799 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
1800\r
636f2be6
LG
1801 if len(self.__Token) > 18:\r
1802 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
1803\r
1804 # convert hex string value to byte hex string array\r
1805 AllString = self.__Token\r
1806 AllStrLen = len (AllString)\r
1807 DataString = ""\r
1808 while AllStrLen > 4:\r
1809 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
1810 AllStrLen = AllStrLen - 2\r
1811 DataString = DataString + AllString[:AllStrLen] + ","\r
1812\r
1813 # byte value array\r
1814 if len (self.__Token) <= 4:\r
1815 while self.__IsToken(","):\r
1816 if not self.__GetNextHexNumber():\r
1817 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
1818 if len(self.__Token) > 4:\r
1819 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
1820 DataString += self.__Token\r
1821 DataString += ","\r
30fdf114
LG
1822\r
1823 if not self.__IsToken( "}"):\r
1824 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
1825\r
1826 DataString = DataString.rstrip(",")\r
1827 RegionObj.RegionType = "DATA"\r
1828 RegionObj.RegionDataList.append( DataString)\r
1829\r
1830 while self.__IsKeyword( "DATA"):\r
1831\r
1832 if not self.__IsToken( "="):\r
1833 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1834\r
1835 if not self.__IsToken( "{"):\r
1836 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
1837\r
1838 if not self.__GetNextHexNumber():\r
1839 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
1840\r
636f2be6
LG
1841 if len(self.__Token) > 18:\r
1842 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
1843\r
1844 # convert hex string value to byte hex string array\r
1845 AllString = self.__Token\r
1846 AllStrLen = len (AllString)\r
1847 DataString = ""\r
1848 while AllStrLen > 4:\r
1849 DataString = DataString + "0x" + AllString[AllStrLen - 2: AllStrLen] + ","\r
1850 AllStrLen = AllStrLen - 2\r
1851 DataString = DataString + AllString[:AllStrLen] + ","\r
1852\r
1853 # byte value array\r
1854 if len (self.__Token) <= 4:\r
1855 while self.__IsToken(","):\r
1856 if not self.__GetNextHexNumber():\r
1857 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
1858 if len(self.__Token) > 4:\r
1859 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
1860 DataString += self.__Token\r
1861 DataString += ","\r
30fdf114
LG
1862\r
1863 if not self.__IsToken( "}"):\r
1864 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
1865\r
1866 DataString = DataString.rstrip(",")\r
1867 RegionObj.RegionDataList.append( DataString)\r
1868\r
1869 ## __GetFv() method\r
1870 #\r
1871 # Get FV section contents and store its data into FV dictionary of self.Profile\r
1872 #\r
1873 # @param self The object pointer\r
1874 # @retval True Successfully find a FV\r
1875 # @retval False Not able to find a FV\r
1876 #\r
1877 def __GetFv(self):\r
1878 if not self.__GetNextToken():\r
1879 return False\r
1880\r
1881 S = self.__Token.upper()\r
1882 if S.startswith("[") and not S.startswith("[FV."):\r
1883 if not S.startswith("[CAPSULE.") \\r
1884 and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
1885 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
1886 self.__UndoToken()\r
1887 return False\r
1888\r
1889 self.__UndoToken()\r
1890 if not self.__IsToken("[FV.", True):\r
1891 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
1892 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
1893 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
1894 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1895\r
1896 FvName = self.__GetUiName()\r
1897 self.CurrentFvName = FvName.upper()\r
1898\r
1899 if not self.__IsToken( "]"):\r
1900 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
1901\r
1902 FvObj = Fv.FV()\r
1903 FvObj.UiFvName = self.CurrentFvName\r
1904 self.Profile.FvDict[self.CurrentFvName] = FvObj\r
1905\r
1906 Status = self.__GetCreateFile(FvObj)\r
1907 if not Status:\r
1908 raise Warning("FV name error", self.FileName, self.CurrentLineNumber)\r
1909\r
1910 self.__GetDefineStatements(FvObj)\r
1911\r
1912 self.__GetAddressStatements(FvObj)\r
1913\r
6780eef1
LG
1914 while self.__GetBlockStatement(FvObj):\r
1915 pass\r
30fdf114
LG
1916\r
1917 self.__GetSetStatements(FvObj)\r
1918\r
1919 self.__GetFvAlignment(FvObj)\r
1920\r
1921 self.__GetFvAttributes(FvObj)\r
1922 \r
1923 self.__GetFvNameGuid(FvObj)\r
1924\r
b303ea72
LG
1925 FvObj.FvExtEntryTypeValue = []\r
1926 FvObj.FvExtEntryType = []\r
1927 FvObj.FvExtEntryData = []\r
1928 while True:\r
1929 isFvExtEntry = self.__GetFvExtEntryStatement(FvObj)\r
1930 if not isFvExtEntry:\r
1931 break\r
1932\r
30fdf114
LG
1933 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1934 self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
1935\r
1936 while True:\r
1937 isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1938 isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
1939 if not isInf and not isFile:\r
1940 break\r
1941\r
1942 return True\r
1943\r
1944 ## __GetFvAlignment() method\r
1945 #\r
1946 # Get alignment for FV\r
1947 #\r
1948 # @param self The object pointer\r
1949 # @param Obj for whom alignment is got\r
1950 # @retval True Successfully find a alignment statement\r
1951 # @retval False Not able to find a alignment statement\r
1952 #\r
1953 def __GetFvAlignment(self, Obj):\r
1954\r
1955 if not self.__IsKeyword( "FvAlignment"):\r
1956 return False\r
1957\r
1958 if not self.__IsToken( "="):\r
1959 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1960\r
1961 if not self.__GetNextToken():\r
1962 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
1963\r
1964 if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
1965 "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
1966 "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \\r
1967 "1G", "2G"):\r
1968 raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
1969 Obj.FvAlignment = self.__Token\r
1970 return True\r
1971\r
1972 ## __GetFvAttributes() method\r
1973 #\r
1974 # Get attributes for FV\r
1975 #\r
1976 # @param self The object pointer\r
1977 # @param Obj for whom attribute is got\r
1978 # @retval None\r
1979 #\r
1980 def __GetFvAttributes(self, FvObj):\r
1981\r
1982 while self.__GetNextWord():\r
1983 name = self.__Token\r
1984 if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \\r
1985 "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \\r
1986 "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \\r
1987 "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \\r
1988 "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \\r
1989 "WRITE_POLICY_RELIABLE"):\r
1990 self.__UndoToken()\r
1991 return\r
1992\r
1993 if not self.__IsToken( "="):\r
1994 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
1995\r
1996 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
1997 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
1998\r
1999 FvObj.FvAttributeDict[name] = self.__Token\r
2000\r
2001 return\r
2002 \r
2003 ## __GetFvNameGuid() method\r
2004 #\r
2005 # Get FV GUID for FV\r
2006 #\r
2007 # @param self The object pointer\r
2008 # @param Obj for whom GUID is got\r
2009 # @retval None\r
2010 #\r
2011 def __GetFvNameGuid(self, FvObj):\r
2012\r
2013 if not self.__IsKeyword( "FvNameGuid"):\r
2014 return\r
2015\r
2016 if not self.__IsToken( "="):\r
2017 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2018\r
2019 if not self.__GetNextGuid():\r
2020 raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
2021\r
2022 FvObj.FvNameGuid = self.__Token\r
2023\r
2024 return\r
2025\r
b303ea72
LG
2026 def __GetFvExtEntryStatement(self, FvObj):\r
2027\r
2028 if not self.__IsKeyword( "FV_EXT_ENTRY"):\r
2029 return False\r
2030\r
2031 if not self.__IsKeyword ("TYPE"):\r
2032 raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
2033 \r
2034 if not self.__IsToken( "="):\r
2035 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2036\r
2037 if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
2038 raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
2039\r
2040 FvObj.FvExtEntryTypeValue += [self.__Token]\r
2041\r
2042 if not self.__IsToken( "{"):\r
2043 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2044\r
2045 if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
2046 raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
2047\r
2048 FvObj.FvExtEntryType += [self.__Token]\r
2049\r
2050 if self.__Token == 'DATA':\r
2051\r
2052 if not self.__IsToken( "="):\r
2053 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2054 \r
2055 if not self.__IsToken( "{"):\r
2056 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2057\r
2058 if not self.__GetNextHexNumber():\r
2059 raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
2060\r
2061 if len(self.__Token) > 4:\r
2062 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2063\r
2064 DataString = self.__Token\r
2065 DataString += ","\r
2066\r
2067 while self.__IsToken(","):\r
2068 if not self.__GetNextHexNumber():\r
2069 raise Warning("Invalid Hex number", self.FileName, self.CurrentLineNumber)\r
2070 if len(self.__Token) > 4:\r
2071 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
2072 DataString += self.__Token\r
2073 DataString += ","\r
2074\r
2075 if not self.__IsToken( "}"):\r
2076 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2077\r
2078 if not self.__IsToken( "}"):\r
2079 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2080\r
2081 DataString = DataString.rstrip(",")\r
2082 FvObj.FvExtEntryData += [DataString]\r
2083\r
2084 if self.__Token == 'FILE':\r
2085 \r
2086 if not self.__IsToken( "="):\r
2087 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2088 \r
2089 if not self.__GetNextToken():\r
2090 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
2091 \r
2092 FvObj.FvExtEntryData += [self.__Token]\r
2093\r
2094 if not self.__IsToken( "}"):\r
2095 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2096\r
2097 return True\r
2098\r
30fdf114
LG
2099 ## __GetAprioriSection() method\r
2100 #\r
2101 # Get token statements\r
2102 #\r
2103 # @param self The object pointer\r
2104 # @param FvObj for whom apriori is got\r
2105 # @param MacroDict dictionary used to replace macro\r
2106 # @retval True Successfully find apriori statement\r
2107 # @retval False Not able to find apriori statement\r
2108 #\r
2109 def __GetAprioriSection(self, FvObj, MacroDict = {}):\r
2110\r
2111 if not self.__IsKeyword( "APRIORI"):\r
2112 return False\r
2113\r
2114 if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):\r
2115 raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber)\r
2116 AprType = self.__Token\r
2117\r
2118 if not self.__IsToken( "{"):\r
2119 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2120\r
2121 AprSectionObj = AprioriSection.AprioriSection()\r
2122 AprSectionObj.AprioriType = AprType\r
2123\r
2124 self.__GetDefineStatements(AprSectionObj)\r
2125 MacroDict.update(AprSectionObj.DefineVarDict)\r
2126\r
2127 while True:\r
2128 IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)\r
2129 IsFile = self.__GetFileStatement( AprSectionObj)\r
2130 if not IsInf and not IsFile:\r
2131 break\r
2132\r
2133 if not self.__IsToken( "}"):\r
2134 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2135\r
2136 FvObj.AprioriSectionList.append(AprSectionObj)\r
2137 return True\r
2138\r
2139 ## __GetInfStatement() method\r
2140 #\r
2141 # Get INF statements\r
2142 #\r
2143 # @param self The object pointer\r
2144 # @param Obj for whom inf statement is got\r
2145 # @param MacroDict dictionary used to replace macro\r
2146 # @retval True Successfully find inf statement\r
2147 # @retval False Not able to find inf statement\r
2148 #\r
2149 def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2150\r
2151 if not self.__IsKeyword( "INF"):\r
2152 return False\r
2153\r
2154 ffsInf = FfsInfStatement.FfsInfStatement()\r
2155 self.__GetInfOptions( ffsInf)\r
2156\r
2157 if not self.__GetNextToken():\r
2158 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
2159 ffsInf.InfFileName = self.__Token\r
14c48571 2160 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2161 #do case sensitive check for file path\r
2162 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2163 if ErrorCode != 0:\r
2164 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114 2165\r
30fdf114
LG
2166 if not ffsInf.InfFileName in self.Profile.InfList:\r
2167 self.Profile.InfList.append(ffsInf.InfFileName)\r
2168\r
2169 if self.__IsToken('|'):\r
2170 if self.__IsKeyword('RELOCS_STRIPPED'):\r
2171 ffsInf.KeepReloc = False\r
2172 elif self.__IsKeyword('RELOCS_RETAINED'):\r
2173 ffsInf.KeepReloc = True\r
2174 else:\r
2175 raise Warning("Unknown reloc strip flag '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2176\r
2177 if ForCapsule:\r
2178 capsuleFfs = CapsuleData.CapsuleFfs()\r
2179 capsuleFfs.Ffs = ffsInf\r
2180 Obj.CapsuleDataList.append(capsuleFfs)\r
2181 else:\r
2182 Obj.FfsList.append(ffsInf)\r
2183 return True\r
2184\r
2185 ## __GetInfOptions() method\r
2186 #\r
2187 # Get options for INF\r
2188 #\r
2189 # @param self The object pointer\r
2190 # @param FfsInfObj for whom option is got\r
2191 #\r
2192 def __GetInfOptions(self, FfsInfObj):\r
2193\r
2194 if self.__IsKeyword( "RuleOverride"):\r
2195 if not self.__IsToken( "="):\r
2196 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2197 if not self.__GetNextToken():\r
2198 raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
2199 FfsInfObj.Rule = self.__Token\r
2200\r
2201 if self.__IsKeyword( "VERSION"):\r
2202 if not self.__IsToken( "="):\r
2203 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2204 if not self.__GetNextToken():\r
2205 raise Warning("expected Version", self.FileName, self.CurrentLineNumber)\r
2206\r
2207 if self.__GetStringData():\r
2208 FfsInfObj.Version = self.__Token\r
2209\r
2210 if self.__IsKeyword( "UI"):\r
2211 if not self.__IsToken( "="):\r
2212 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2213 if not self.__GetNextToken():\r
2214 raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
2215\r
2216 if self.__GetStringData():\r
2217 FfsInfObj.Ui = self.__Token\r
2218\r
2219 if self.__IsKeyword( "USE"):\r
2220 if not self.__IsToken( "="):\r
2221 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2222 if not self.__GetNextToken():\r
2223 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
2224 FfsInfObj.UseArch = self.__Token\r
2225\r
2226 \r
2227 if self.__GetNextToken():\r
2228 p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2229 if p.match(self.__Token):\r
2230 FfsInfObj.KeyStringList.append(self.__Token)\r
2231 if not self.__IsToken(","):\r
2232 return\r
2233 else:\r
2234 self.__UndoToken()\r
2235 return\r
2236\r
2237 while self.__GetNextToken():\r
2238 if not p.match(self.__Token):\r
2239 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2240 FfsInfObj.KeyStringList.append(self.__Token)\r
2241\r
2242 if not self.__IsToken(","):\r
2243 break\r
2244\r
2245 ## __GetFileStatement() method\r
2246 #\r
2247 # Get FILE statements\r
2248 #\r
2249 # @param self The object pointer\r
2250 # @param Obj for whom FILE statement is got\r
2251 # @param MacroDict dictionary used to replace macro\r
2252 # @retval True Successfully find FILE statement\r
2253 # @retval False Not able to find FILE statement\r
2254 #\r
2255 def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
2256\r
2257 if not self.__IsKeyword( "FILE"):\r
2258 return False\r
2259\r
2260 FfsFileObj = FfsFileStatement.FileStatement()\r
2261\r
2262 if not self.__GetNextWord():\r
2263 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
2264 FfsFileObj.FvFileType = self.__Token\r
2265\r
2266 if not self.__IsToken( "="):\r
2267 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2268\r
2269 if not self.__GetNextGuid():\r
2270 if not self.__GetNextWord():\r
2271 raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
2272 if self.__Token == 'PCD':\r
2273 if not self.__IsToken( "("):\r
2274 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
2275 PcdPair = self.__GetNextPcdName()\r
2276 if not self.__IsToken( ")"):\r
2277 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
2278 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
2279 \r
2280 FfsFileObj.NameGuid = self.__Token\r
2281\r
2282 self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
2283\r
2284 if ForCapsule:\r
2285 capsuleFfs = CapsuleData.CapsuleFfs()\r
2286 capsuleFfs.Ffs = FfsFileObj\r
2287 Obj.CapsuleDataList.append(capsuleFfs)\r
2288 else:\r
2289 Obj.FfsList.append(FfsFileObj)\r
2290\r
2291 return True\r
2292\r
2293 ## __FileCouldHaveRelocFlag() method\r
2294 #\r
2295 # Check whether reloc strip flag can be set for a file type.\r
2296 #\r
2297 # @param self The object pointer\r
2298 # @param FileType The file type to check with\r
2299 # @retval True This type could have relocation strip flag\r
2300 # @retval False No way to have it\r
2301 #\r
2302\r
2303 def __FileCouldHaveRelocFlag (self, FileType):\r
2304 if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
2305 return True\r
2306 else:\r
2307 return False\r
2308\r
2309 ## __SectionCouldHaveRelocFlag() method\r
2310 #\r
2311 # Check whether reloc strip flag can be set for a section type.\r
2312 #\r
2313 # @param self The object pointer\r
2314 # @param SectionType The section type to check with\r
2315 # @retval True This type could have relocation strip flag\r
2316 # @retval False No way to have it\r
2317 #\r
2318\r
2319 def __SectionCouldHaveRelocFlag (self, SectionType):\r
2320 if SectionType in ('TE', 'PE32'):\r
2321 return True\r
2322 else:\r
2323 return False\r
2324\r
2325 ## __GetFilePart() method\r
2326 #\r
2327 # Get components for FILE statement\r
2328 #\r
2329 # @param self The object pointer\r
2330 # @param FfsFileObj for whom component is got\r
2331 # @param MacroDict dictionary used to replace macro\r
2332 #\r
2333 def __GetFilePart(self, FfsFileObj, MacroDict = {}):\r
2334\r
2335 self.__GetFileOpts( FfsFileObj)\r
2336\r
2337 if not self.__IsToken("{"):\r
2338# if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2339# if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):\r
2340# if self.__Token == 'RELOCS_STRIPPED':\r
2341# FfsFileObj.KeepReloc = False\r
2342# else:\r
2343# FfsFileObj.KeepReloc = True\r
2344# else:\r
2345# raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
2346#\r
2347# if not self.__IsToken("{"):\r
2348 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2349\r
2350 if not self.__GetNextToken():\r
2351 raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
2352\r
2353 if self.__Token == "FV":\r
2354 if not self.__IsToken( "="):\r
2355 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2356 if not self.__GetNextToken():\r
2357 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2358 FfsFileObj.FvName = self.__Token\r
2359\r
2360 elif self.__Token == "FD":\r
2361 if not self.__IsToken( "="):\r
2362 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2363 if not self.__GetNextToken():\r
2364 raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
2365 FfsFileObj.FdName = self.__Token\r
2366\r
2367 elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):\r
2368 self.__UndoToken()\r
2369 self.__GetSectionData( FfsFileObj, MacroDict)\r
2370 else:\r
2371 FfsFileObj.FileName = self.__Token\r
14c48571 2372 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2373 #do case sensitive check for file path\r
2374 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2375 if ErrorCode != 0:\r
2376 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
2377\r
2378 if not self.__IsToken( "}"):\r
2379 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2380\r
2381 ## __GetFileOpts() method\r
2382 #\r
2383 # Get options for FILE statement\r
2384 #\r
2385 # @param self The object pointer\r
2386 # @param FfsFileObj for whom options is got\r
2387 #\r
2388 def __GetFileOpts(self, FfsFileObj):\r
2389\r
2390 if self.__GetNextToken():\r
2391 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
2392 if Pattern.match(self.__Token):\r
2393 FfsFileObj.KeyStringList.append(self.__Token)\r
2394 if self.__IsToken(","):\r
2395 while self.__GetNextToken():\r
2396 if not Pattern.match(self.__Token):\r
2397 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
2398 FfsFileObj.KeyStringList.append(self.__Token)\r
2399\r
2400 if not self.__IsToken(","):\r
2401 break\r
2402\r
2403 else:\r
2404 self.__UndoToken()\r
2405\r
2406 if self.__IsKeyword( "FIXED", True):\r
2407 FfsFileObj.Fixed = True\r
2408\r
2409 if self.__IsKeyword( "CHECKSUM", True):\r
2410 FfsFileObj.CheckSum = True\r
2411\r
2412 if self.__GetAlignment():\r
9053bc51 2413 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2414 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2415 #For FFS, Auto is default option same to ""\r
2416 if not self.__Token == "Auto":\r
2417 FfsFileObj.Alignment = self.__Token\r
30fdf114
LG
2418\r
2419 ## __GetAlignment() method\r
2420 #\r
2421 # Return the alignment value\r
2422 #\r
2423 # @param self The object pointer\r
2424 # @retval True Successfully find alignment\r
2425 # @retval False Not able to find alignment\r
2426 #\r
2427 def __GetAlignment(self):\r
2428 if self.__IsKeyword( "Align", True):\r
2429 if not self.__IsToken( "="):\r
2430 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2431\r
2432 if not self.__GetNextToken():\r
2433 raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
2434 return True\r
2435\r
2436 return False\r
2437\r
2438 ## __GetFilePart() method\r
2439 #\r
2440 # Get section data for FILE statement\r
2441 #\r
2442 # @param self The object pointer\r
2443 # @param FfsFileObj for whom section is got\r
2444 # @param MacroDict dictionary used to replace macro\r
2445 #\r
2446 def __GetSectionData(self, FfsFileObj, MacroDict = {}):\r
2447 Dict = {}\r
2448 Dict.update(MacroDict)\r
2449\r
2450 self.__GetDefineStatements(FfsFileObj)\r
2451\r
2452 Dict.update(FfsFileObj.DefineVarDict)\r
2453 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2454 self.__GetAprioriSection(FfsFileObj, Dict.copy())\r
2455\r
2456 while True:\r
2457 IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)\r
2458 IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)\r
2459 if not IsLeafSection and not IsEncapSection:\r
2460 break\r
2461\r
2462 ## __GetLeafSection() method\r
2463 #\r
2464 # Get leaf section for Obj\r
2465 #\r
2466 # @param self The object pointer\r
2467 # @param Obj for whom leaf section is got\r
2468 # @param MacroDict dictionary used to replace macro\r
2469 # @retval True Successfully find section statement\r
2470 # @retval False Not able to find section statement\r
2471 #\r
2472 def __GetLeafSection(self, Obj, MacroDict = {}):\r
2473\r
2474 OldPos = self.GetFileBufferPos()\r
2475\r
2476 if not self.__IsKeyword( "SECTION"):\r
2477 if len(Obj.SectionList) == 0:\r
2478 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2479 else:\r
2480 return False\r
2481\r
2482 AlignValue = None\r
2483 if self.__GetAlignment():\r
52302d4d
LG
2484 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2485 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2486 AlignValue = self.__Token\r
2487\r
2488 BuildNum = None\r
2489 if self.__IsKeyword( "BUILD_NUM"):\r
2490 if not self.__IsToken( "="):\r
2491 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2492\r
2493 if not self.__GetNextToken():\r
2494 raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
2495\r
2496 BuildNum = self.__Token\r
2497\r
2498 if self.__IsKeyword( "VERSION"):\r
52302d4d
LG
2499 if AlignValue == 'Auto':\r
2500 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2501 if not self.__IsToken( "="):\r
2502 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2503 if not self.__GetNextToken():\r
2504 raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
2505 VerSectionObj = VerSection.VerSection()\r
2506 VerSectionObj.Alignment = AlignValue\r
2507 VerSectionObj.BuildNum = BuildNum\r
2508 if self.__GetStringData():\r
2509 VerSectionObj.StringData = self.__Token\r
2510 else:\r
2511 VerSectionObj.FileName = self.__Token\r
2512 Obj.SectionList.append(VerSectionObj)\r
52302d4d 2513 \r
30fdf114 2514 elif self.__IsKeyword( "UI"):\r
52302d4d
LG
2515 if AlignValue == 'Auto':\r
2516 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2517 if not self.__IsToken( "="):\r
2518 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2519 if not self.__GetNextToken():\r
2520 raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
2521 UiSectionObj = UiSection.UiSection()\r
2522 UiSectionObj.Alignment = AlignValue\r
2523 if self.__GetStringData():\r
2524 UiSectionObj.StringData = self.__Token\r
2525 else:\r
2526 UiSectionObj.FileName = self.__Token\r
2527 Obj.SectionList.append(UiSectionObj)\r
2528\r
2529 elif self.__IsKeyword( "FV_IMAGE"):\r
52302d4d
LG
2530 if AlignValue == 'Auto':\r
2531 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2532 if not self.__IsToken( "="):\r
2533 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2534 if not self.__GetNextToken():\r
2535 raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
2536\r
2537 FvName = self.__Token\r
2538 FvObj = None\r
2539\r
2540 if self.__IsToken( "{"):\r
2541 FvObj = Fv.FV()\r
2542 FvObj.UiFvName = FvName.upper()\r
2543 self.__GetDefineStatements(FvObj)\r
2544 MacroDict.update(FvObj.DefineVarDict)\r
2545 self.__GetBlockStatement(FvObj)\r
2546 self.__GetSetStatements(FvObj)\r
2547 self.__GetFvAlignment(FvObj)\r
2548 self.__GetFvAttributes(FvObj)\r
2549 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2550 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
2551\r
2552 while True:\r
2553 IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
2554 IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
2555 if not IsInf and not IsFile:\r
2556 break\r
2557\r
2558 if not self.__IsToken( "}"):\r
2559 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2560\r
2561 FvImageSectionObj = FvImageSection.FvImageSection()\r
2562 FvImageSectionObj.Alignment = AlignValue\r
2563 if FvObj != None:\r
2564 FvImageSectionObj.Fv = FvObj\r
2565 FvImageSectionObj.FvName = None\r
2566 else:\r
2567 FvImageSectionObj.FvName = FvName.upper()\r
2568 FvImageSectionObj.FvFileName = FvName\r
2569\r
2570 Obj.SectionList.append(FvImageSectionObj)\r
2571\r
2572 elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):\r
52302d4d
LG
2573 if AlignValue == 'Auto':\r
2574 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2575 DepexSectionObj = DepexSection.DepexSection()\r
2576 DepexSectionObj.Alignment = AlignValue\r
2577 DepexSectionObj.DepexType = self.__Token\r
2578\r
2579 if not self.__IsToken( "="):\r
2580 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2581 if not self.__IsToken( "{"):\r
2582 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2583 if not self.__SkipToToken( "}"):\r
2584 raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
2585\r
2586 DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')\r
2587 Obj.SectionList.append(DepexSectionObj)\r
2588\r
2589 else:\r
30fdf114
LG
2590 if not self.__GetNextWord():\r
2591 raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
2592\r
2593 # Encapsulation section appear, UndoToken and return\r
2594 if self.__Token == "COMPRESS" or self.__Token == "GUIDED":\r
2595 self.SetFileBufferPos(OldPos)\r
2596 return False\r
2597\r
2598 if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
2599 "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
2600 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
2601 if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
2602 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
2603\r
30fdf114
LG
2604 # DataSection\r
2605 DataSectionObj = DataSection.DataSection()\r
2606 DataSectionObj.Alignment = AlignValue\r
2607 DataSectionObj.SecType = self.__Token\r
2608\r
2609 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
2610 if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):\r
2611 if self.__Token == 'RELOCS_STRIPPED':\r
2612 DataSectionObj.KeepReloc = False\r
2613 else:\r
2614 DataSectionObj.KeepReloc = True\r
2615 else:\r
2616 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
2617\r
2618 if self.__IsToken("="):\r
2619 if not self.__GetNextToken():\r
2620 raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
2621 DataSectionObj.SectFileName = self.__Token\r
14c48571 2622 if DataSectionObj.SectFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
2623 #do case sensitive check for file path\r
2624 ErrorCode, ErrorInfo = PathClass(NormPath(DataSectionObj.SectFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
2625 if ErrorCode != 0:\r
2626 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
2627 else:\r
2628 if not self.__GetCglSection(DataSectionObj):\r
2629 return False\r
2630\r
2631 Obj.SectionList.append(DataSectionObj)\r
2632\r
2633 return True\r
2634\r
2635 ## __GetCglSection() method\r
2636 #\r
2637 # Get compressed or GUIDed section for Obj\r
2638 #\r
2639 # @param self The object pointer\r
2640 # @param Obj for whom leaf section is got\r
2641 # @param AlignValue alignment value for complex section\r
2642 # @retval True Successfully find section statement\r
2643 # @retval False Not able to find section statement\r
2644 #\r
2645 def __GetCglSection(self, Obj, AlignValue = None):\r
2646\r
2647 if self.__IsKeyword( "COMPRESS"):\r
2648 type = "PI_STD"\r
2649 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
2650 type = self.__Token\r
2651\r
2652 if not self.__IsToken("{"):\r
2653 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2654\r
2655 CompressSectionObj = CompressSection.CompressSection()\r
2656 CompressSectionObj.Alignment = AlignValue\r
2657 CompressSectionObj.CompType = type\r
2658 # Recursive sections...\r
2659 while True:\r
2660 IsLeafSection = self.__GetLeafSection(CompressSectionObj)\r
2661 IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)\r
2662 if not IsLeafSection and not IsEncapSection:\r
2663 break\r
2664\r
2665\r
2666 if not self.__IsToken( "}"):\r
2667 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2668 Obj.SectionList.append(CompressSectionObj)\r
2669\r
2670# else:\r
2671# raise Warning("Compress type not known")\r
2672\r
2673 return True\r
2674\r
2675 elif self.__IsKeyword( "GUIDED"):\r
2676 GuidValue = None\r
2677 if self.__GetNextGuid():\r
2678 GuidValue = self.__Token\r
2679\r
2680 AttribDict = self.__GetGuidAttrib()\r
2681 if not self.__IsToken("{"):\r
2682 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
2683 GuidSectionObj = GuidSection.GuidSection()\r
2684 GuidSectionObj.Alignment = AlignValue\r
2685 GuidSectionObj.NameGuid = GuidValue\r
2686 GuidSectionObj.SectionType = "GUIDED"\r
2687 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
2688 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
2689 # Recursive sections...\r
2690 while True:\r
2691 IsLeafSection = self.__GetLeafSection(GuidSectionObj)\r
2692 IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)\r
2693 if not IsLeafSection and not IsEncapSection:\r
2694 break\r
2695\r
2696 if not self.__IsToken( "}"):\r
2697 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
2698 Obj.SectionList.append(GuidSectionObj)\r
2699\r
2700 return True\r
2701\r
2702 return False\r
2703\r
2704 ## __GetGuidAttri() method\r
2705 #\r
2706 # Get attributes for GUID section\r
2707 #\r
2708 # @param self The object pointer\r
2709 # @retval AttribDict Dictionary of key-value pair of section attributes\r
2710 #\r
2711 def __GetGuidAttrib(self):\r
2712\r
2713 AttribDict = {}\r
14c48571 2714 AttribDict["PROCESSING_REQUIRED"] = "NONE"\r
2715 AttribDict["AUTH_STATUS_VALID"] = "NONE"\r
30fdf114
LG
2716 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2717 AttribKey = self.__Token\r
2718\r
2719 if not self.__IsToken("="):\r
2720 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2721\r
2722 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2723 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2724 AttribDict[AttribKey] = self.__Token\r
2725\r
2726 if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):\r
2727 AttribKey = self.__Token\r
2728\r
2729 if not self.__IsToken("="):\r
2730 raise Warning("expected '='")\r
2731\r
2732 if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):\r
2733 raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
2734 AttribDict[AttribKey] = self.__Token\r
2735\r
2736 return AttribDict\r
2737\r
2738 ## __GetEncapsulationSec() method\r
2739 #\r
2740 # Get encapsulation section for FILE\r
2741 #\r
2742 # @param self The object pointer\r
2743 # @param FfsFile for whom section is got\r
2744 # @retval True Successfully find section statement\r
2745 # @retval False Not able to find section statement\r
2746 #\r
2747 def __GetEncapsulationSec(self, FfsFileObj):\r
2748\r
2749 OldPos = self.GetFileBufferPos()\r
2750 if not self.__IsKeyword( "SECTION"):\r
2751 if len(FfsFileObj.SectionList) == 0:\r
2752 raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
2753 else:\r
2754 return False\r
2755\r
2756 AlignValue = None\r
2757 if self.__GetAlignment():\r
52302d4d
LG
2758 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
2759 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
2760 AlignValue = self.__Token\r
2761\r
2762 if not self.__GetCglSection(FfsFileObj, AlignValue):\r
2763 self.SetFileBufferPos(OldPos)\r
2764 return False\r
2765 else:\r
2766 return True\r
2767\r
2768 ## __GetCapsule() method\r
2769 #\r
2770 # Get capsule section contents and store its data into capsule list of self.Profile\r
2771 #\r
2772 # @param self The object pointer\r
2773 # @retval True Successfully find a capsule\r
2774 # @retval False Not able to find a capsule\r
2775 #\r
2776 def __GetCapsule(self):\r
2777\r
2778 if not self.__GetNextToken():\r
2779 return False\r
2780\r
2781 S = self.__Token.upper()\r
2782 if S.startswith("[") and not S.startswith("[CAPSULE."):\r
2783 if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
2784 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
2785 self.__UndoToken()\r
2786 return False\r
2787\r
2788 self.__UndoToken()\r
2789 if not self.__IsToken("[CAPSULE.", True):\r
2790 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2791 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2792 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2793 raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
2794\r
2795 CapsuleObj = Capsule.Capsule()\r
2796\r
2797 CapsuleName = self.__GetUiName()\r
2798 if not CapsuleName:\r
2799 raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
2800\r
2801 CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
2802\r
2803 if not self.__IsToken( "]"):\r
2804 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2805\r
2806 if self.__IsKeyword("CREATE_FILE"):\r
2807 if not self.__IsToken( "="):\r
2808 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2809\r
2810 if not self.__GetNextToken():\r
2811 raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
2812\r
2813 CapsuleObj.CreateFile = self.__Token\r
2814\r
2815 self.__GetCapsuleStatements(CapsuleObj)\r
fd171542 2816 self.Profile.CapsuleDict[CapsuleObj.UiCapsuleName] = CapsuleObj\r
30fdf114
LG
2817 return True\r
2818\r
2819 ## __GetCapsuleStatements() method\r
2820 #\r
2821 # Get statements for capsule\r
2822 #\r
2823 # @param self The object pointer\r
2824 # @param Obj for whom statements are got\r
2825 #\r
2826 def __GetCapsuleStatements(self, Obj):\r
2827 self.__GetCapsuleTokens(Obj)\r
2828 self.__GetDefineStatements(Obj)\r
2829 self.__GetSetStatements(Obj)\r
30fdf114
LG
2830 self.__GetCapsuleData(Obj)\r
2831\r
fd171542 2832 ## __GetCapsuleTokens() method\r
30fdf114
LG
2833 #\r
2834 # Get token statements for capsule\r
2835 #\r
2836 # @param self The object pointer\r
2837 # @param Obj for whom token statements are got\r
2838 #\r
2839 def __GetCapsuleTokens(self, Obj):\r
b303ea72
LG
2840 if not self.__GetNextToken():\r
2841 return False\r
2842 while self.__Token in ("CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS"):\r
2843 Name = self.__Token.strip()\r
2844 if not self.__IsToken("="):\r
2845 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2846 if not self.__GetNextToken():\r
2847 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2848 if Name == 'CAPSULE_FLAGS':\r
2849 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2850 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2851 Value = self.__Token.strip()\r
2852 while self.__IsToken(","):\r
2853 Value += ','\r
2854 if not self.__GetNextToken():\r
2855 raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
2856 if not self.__Token in ("PersistAcrossReset", "PopulateSystemTable", "InitiateReset"):\r
2857 raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
2858 Value += self.__Token.strip()\r
2859 else:\r
2860 Value = self.__Token.strip()\r
2861 Obj.TokensDict[Name] = Value \r
2862 if not self.__GetNextToken():\r
2863 return False\r
2864 self.__UndoToken()\r
30fdf114
LG
2865\r
2866 ## __GetCapsuleData() method\r
2867 #\r
2868 # Get capsule data for capsule\r
2869 #\r
2870 # @param self The object pointer\r
2871 # @param Obj for whom capsule data are got\r
2872 #\r
2873 def __GetCapsuleData(self, Obj):\r
2874\r
2875 while True:\r
2876 IsInf = self.__GetInfStatement(Obj, True)\r
2877 IsFile = self.__GetFileStatement(Obj, True)\r
2878 IsFv = self.__GetFvStatement(Obj)\r
2879 if not IsInf and not IsFile and not IsFv:\r
2880 break\r
2881\r
2882 ## __GetFvStatement() method\r
2883 #\r
2884 # Get FV for capsule\r
2885 #\r
2886 # @param self The object pointer\r
2887 # @param CapsuleObj for whom FV is got\r
2888 # @retval True Successfully find a FV statement\r
2889 # @retval False Not able to find a FV statement\r
2890 #\r
2891 def __GetFvStatement(self, CapsuleObj):\r
2892\r
2893 if not self.__IsKeyword("FV"):\r
2894 return False\r
2895\r
2896 if not self.__IsToken("="):\r
2897 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
2898\r
2899 if not self.__GetNextToken():\r
2900 raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
2901\r
2902 CapsuleFv = CapsuleData.CapsuleFv()\r
2903 CapsuleFv.FvName = self.__Token\r
2904 CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
2905 return True\r
2906\r
2907 ## __GetRule() method\r
2908 #\r
2909 # Get Rule section contents and store its data into rule list of self.Profile\r
2910 #\r
2911 # @param self The object pointer\r
2912 # @retval True Successfully find a Rule\r
2913 # @retval False Not able to find a Rule\r
2914 #\r
2915 def __GetRule(self):\r
2916\r
2917 if not self.__GetNextToken():\r
2918 return False\r
2919\r
2920 S = self.__Token.upper()\r
2921 if S.startswith("[") and not S.startswith("[RULE."):\r
2922 if not S.startswith("[OPTIONROM."):\r
2923 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
2924 self.__UndoToken()\r
2925 return False\r
2926 self.__UndoToken()\r
2927 if not self.__IsToken("[Rule.", True):\r
2928 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
2929 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
2930 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
2931 raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
2932\r
2933 if not self.__SkipToToken("."):\r
2934 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
2935\r
2936 Arch = self.__SkippedChars.rstrip(".")\r
2937 if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "COMMON"):\r
2938 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
2939\r
2940 ModuleType = self.__GetModuleType()\r
2941\r
2942 TemplateName = ""\r
2943 if self.__IsToken("."):\r
2944 if not self.__GetNextWord():\r
2945 raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
2946 TemplateName = self.__Token\r
2947\r
2948 if not self.__IsToken( "]"):\r
2949 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
2950\r
2951 RuleObj = self.__GetRuleFileStatements()\r
2952 RuleObj.Arch = Arch.upper()\r
2953 RuleObj.ModuleType = ModuleType\r
2954 RuleObj.TemplateName = TemplateName\r
2955 if TemplateName == '' :\r
2956 self.Profile.RuleDict['RULE' + \\r
2957 '.' + \\r
2958 Arch.upper() + \\r
2959 '.' + \\r
2960 ModuleType.upper() ] = RuleObj\r
2961 else :\r
2962 self.Profile.RuleDict['RULE' + \\r
2963 '.' + \\r
2964 Arch.upper() + \\r
2965 '.' + \\r
2966 ModuleType.upper() + \\r
2967 '.' + \\r
2968 TemplateName.upper() ] = RuleObj\r
2969# self.Profile.RuleList.append(rule)\r
2970 return True\r
2971\r
2972 ## __GetModuleType() method\r
2973 #\r
2974 # Return the module type\r
2975 #\r
2976 # @param self The object pointer\r
2977 # @retval string module type\r
2978 #\r
2979 def __GetModuleType(self):\r
2980\r
2981 if not self.__GetNextWord():\r
2982 raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
2983 if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
2984 "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
2985 "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
2986 "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
2987 "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
b303ea72 2988 "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE"):\r
30fdf114
LG
2989 raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
2990 return self.__Token\r
2991\r
2992 ## __GetFileExtension() method\r
2993 #\r
2994 # Return the file extension\r
2995 #\r
2996 # @param self The object pointer\r
2997 # @retval string file name extension\r
2998 #\r
2999 def __GetFileExtension(self):\r
3000 if not self.__IsToken("."):\r
3001 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3002\r
3003 Ext = ""\r
3004 if self.__GetNextToken():\r
3005 Pattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
3006 if Pattern.match(self.__Token):\r
3007 Ext = self.__Token\r
3008 return '.' + Ext\r
3009 else:\r
3010 raise Warning("Unknown file extension '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3011\r
3012 else:\r
3013 raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
3014\r
3015 ## __GetRuleFileStatement() method\r
3016 #\r
3017 # Get rule contents\r
3018 #\r
3019 # @param self The object pointer\r
3020 # @retval Rule Rule object\r
3021 #\r
3022 def __GetRuleFileStatements(self):\r
3023\r
3024 if not self.__IsKeyword("FILE"):\r
3025 raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
3026\r
3027 if not self.__GetNextWord():\r
3028 raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
3029\r
3030 Type = self.__Token.strip().upper()\r
3031 if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
b303ea72 3032 "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE"):\r
30fdf114
LG
3033 raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3034\r
3035 if not self.__IsToken("="):\r
3036 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3037\r
3038 if not self.__IsKeyword("$(NAMED_GUID)"):\r
3039 if not self.__GetNextWord():\r
3040 raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
3041 if self.__Token == 'PCD':\r
3042 if not self.__IsToken( "("):\r
3043 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3044 PcdPair = self.__GetNextPcdName()\r
3045 if not self.__IsToken( ")"):\r
3046 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3047 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3048 \r
3049 NameGuid = self.__Token\r
3050\r
3051 KeepReloc = None\r
3052 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3053 if self.__FileCouldHaveRelocFlag(Type):\r
3054 if self.__Token == 'RELOCS_STRIPPED':\r
3055 KeepReloc = False\r
3056 else:\r
3057 KeepReloc = True\r
3058 else:\r
3059 raise Warning("File type %s could not have reloc strip flag%d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3060\r
3061 KeyStringList = []\r
3062 if self.__GetNextToken():\r
3063 Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
3064 if Pattern.match(self.__Token):\r
3065 KeyStringList.append(self.__Token)\r
3066 if self.__IsToken(","):\r
3067 while self.__GetNextToken():\r
3068 if not Pattern.match(self.__Token):\r
3069 raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
3070 KeyStringList.append(self.__Token)\r
3071\r
3072 if not self.__IsToken(","):\r
3073 break\r
3074\r
3075 else:\r
3076 self.__UndoToken()\r
3077\r
3078\r
3079 Fixed = False\r
3080 if self.__IsKeyword("Fixed", True):\r
3081 Fixed = True\r
3082\r
3083 CheckSum = False\r
3084 if self.__IsKeyword("CheckSum", True):\r
3085 CheckSum = True\r
3086\r
3087 AlignValue = ""\r
3088 if self.__GetAlignment():\r
52302d4d 3089 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
30fdf114 3090 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3091 #For FFS, Auto is default option same to ""\r
3092 if not self.__Token == "Auto":\r
3093 AlignValue = self.__Token\r
30fdf114
LG
3094\r
3095 if self.__IsToken("{"):\r
3096 # Complex file rule expected\r
3097 Rule = RuleComplexFile.RuleComplexFile()\r
3098 Rule.FvFileType = Type\r
3099 Rule.NameGuid = NameGuid\r
3100 Rule.Alignment = AlignValue\r
3101 Rule.CheckSum = CheckSum\r
3102 Rule.Fixed = Fixed\r
3103 Rule.KeyStringList = KeyStringList\r
3104 if KeepReloc != None:\r
3105 Rule.KeepReloc = KeepReloc\r
3106\r
3107 while True:\r
3108 IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)\r
3109 IsLeaf = self.__GetEfiSection(Rule)\r
3110 if not IsEncapsulate and not IsLeaf:\r
3111 break\r
3112\r
3113 if not self.__IsToken("}"):\r
3114 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3115\r
3116 return Rule\r
3117\r
30fdf114
LG
3118 else:\r
3119 # Simple file rule expected\r
3120 if not self.__GetNextWord():\r
3121 raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
3122\r
3123 SectionName = self.__Token\r
3124\r
3125 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3126 "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
3127 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
3128\r
3129\r
3130 if self.__IsKeyword("Fixed", True):\r
3131 Fixed = True\r
3132\r
3133 if self.__IsKeyword("CheckSum", True):\r
3134 CheckSum = True\r
3135\r
52302d4d 3136 SectAlignment = ""\r
30fdf114 3137 if self.__GetAlignment():\r
52302d4d 3138 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
30fdf114 3139 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
52302d4d
LG
3140 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3141 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
3142 SectAlignment = self.__Token\r
3143\r
3144 Ext = None\r
3145 if self.__IsToken('|'):\r
3146 Ext = self.__GetFileExtension()\r
3147 elif not self.__GetNextToken():\r
30fdf114
LG
3148 raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
3149\r
3150 Rule = RuleSimpleFile.RuleSimpleFile()\r
3151 Rule.SectionType = SectionName\r
3152 Rule.FvFileType = Type\r
3153 Rule.NameGuid = NameGuid\r
3154 Rule.Alignment = AlignValue\r
52302d4d 3155 Rule.SectAlignment = SectAlignment\r
30fdf114
LG
3156 Rule.CheckSum = CheckSum\r
3157 Rule.Fixed = Fixed\r
30fdf114
LG
3158 Rule.KeyStringList = KeyStringList\r
3159 if KeepReloc != None:\r
3160 Rule.KeepReloc = KeepReloc\r
52302d4d
LG
3161 Rule.FileExtension = Ext\r
3162 Rule.FileName = self.__Token\r
30fdf114
LG
3163 return Rule\r
3164\r
3165 ## __GetEfiSection() method\r
3166 #\r
3167 # Get section list for Rule\r
3168 #\r
3169 # @param self The object pointer\r
3170 # @param Obj for whom section is got\r
3171 # @retval True Successfully find section statement\r
3172 # @retval False Not able to find section statement\r
3173 #\r
3174 def __GetEfiSection(self, Obj):\r
3175\r
3176 OldPos = self.GetFileBufferPos()\r
3177 if not self.__GetNextWord():\r
3178 return False\r
3179 SectionName = self.__Token\r
3180\r
3181 if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3182 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3183 self.__UndoToken()\r
3184 return False\r
3185\r
3186 if SectionName == "FV_IMAGE":\r
3187 FvImageSectionObj = FvImageSection.FvImageSection()\r
3188 if self.__IsKeyword("FV_IMAGE"):\r
3189 pass\r
3190 if self.__IsToken( "{"):\r
3191 FvObj = Fv.FV()\r
3192 self.__GetDefineStatements(FvObj)\r
3193 self.__GetBlockStatement(FvObj)\r
3194 self.__GetSetStatements(FvObj)\r
3195 self.__GetFvAlignment(FvObj)\r
3196 self.__GetFvAttributes(FvObj)\r
3197 self.__GetAprioriSection(FvObj)\r
3198 self.__GetAprioriSection(FvObj)\r
3199\r
3200 while True:\r
3201 IsInf = self.__GetInfStatement(FvObj)\r
3202 IsFile = self.__GetFileStatement(FvObj)\r
3203 if not IsInf and not IsFile:\r
3204 break\r
3205\r
3206 if not self.__IsToken( "}"):\r
3207 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3208 FvImageSectionObj.Fv = FvObj\r
3209 FvImageSectionObj.FvName = None\r
3210\r
3211 else:\r
3212 if not self.__IsKeyword("FV"):\r
3213 raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
3214 FvImageSectionObj.FvFileType = self.__Token\r
3215\r
30fdf114
LG
3216 if self.__GetAlignment():\r
3217 if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3218 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3219 FvImageSectionObj.Alignment = self.__Token\r
3220\r
3221 if self.__IsToken('|'):\r
3222 FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
3223 elif self.__GetNextToken():\r
3224 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3225 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3226 FvImageSectionObj.FvFileName = self.__Token\r
3227 else:\r
3228 self.__UndoToken()\r
3229 else:\r
3230 raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
3231\r
3232 Obj.SectionList.append(FvImageSectionObj)\r
3233 return True\r
3234\r
3235 EfiSectionObj = EfiSection.EfiSection()\r
3236 EfiSectionObj.SectionType = SectionName\r
3237\r
3238 if not self.__GetNextToken():\r
3239 raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
3240\r
3241 if self.__Token == "STRING":\r
3242 if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
3243 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3244\r
3245 if not self.__IsToken('='):\r
3246 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3247\r
3248 if not self.__GetNextToken():\r
3249 raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
3250\r
3251 if self.__GetStringData():\r
3252 EfiSectionObj.StringData = self.__Token\r
3253\r
3254 if self.__IsKeyword("BUILD_NUM"):\r
3255 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3256 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3257\r
3258 if not self.__IsToken("="):\r
3259 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3260 if not self.__GetNextToken():\r
3261 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3262 EfiSectionObj.BuildNum = self.__Token\r
3263\r
3264 else:\r
3265 EfiSectionObj.FileType = self.__Token\r
3266 self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)\r
3267\r
3268 if self.__IsKeyword("Optional"):\r
3269 if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):\r
3270 raise Warning("%s section could NOT be optional%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3271 EfiSectionObj.Optional = True\r
3272\r
3273 if self.__IsKeyword("BUILD_NUM"):\r
3274 if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):\r
3275 raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
3276\r
3277 if not self.__IsToken("="):\r
3278 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3279 if not self.__GetNextToken():\r
3280 raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
3281 EfiSectionObj.BuildNum = self.__Token\r
3282\r
3283 if self.__GetAlignment():\r
52302d4d
LG
3284 if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"):\r
3285 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3286 if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
3287 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
30fdf114
LG
3288 EfiSectionObj.Alignment = self.__Token\r
3289\r
3290 if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):\r
3291 if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):\r
3292 if self.__Token == 'RELOCS_STRIPPED':\r
3293 EfiSectionObj.KeepReloc = False\r
3294 else:\r
3295 EfiSectionObj.KeepReloc = True\r
3296 if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
3297 raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3298 else:\r
3299 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
3300\r
3301\r
3302 if self.__IsToken('|'):\r
3303 EfiSectionObj.FileExtension = self.__GetFileExtension()\r
3304 elif self.__GetNextToken():\r
3305 if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
3306 "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
3307 \r
3308 if self.__Token.startswith('PCD'):\r
3309 self.__UndoToken()\r
3310 self.__GetNextWord()\r
3311 \r
3312 if self.__Token == 'PCD':\r
3313 if not self.__IsToken( "("):\r
3314 raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
3315 PcdPair = self.__GetNextPcdName()\r
3316 if not self.__IsToken( ")"):\r
3317 raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
3318 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
3319 \r
3320 EfiSectionObj.FileName = self.__Token \r
3321 \r
3322 else:\r
3323 self.__UndoToken()\r
3324 else:\r
3325 raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
3326\r
3327 Obj.SectionList.append(EfiSectionObj)\r
3328 return True\r
3329\r
3330 ## __RuleSectionCouldBeOptional() method\r
3331 #\r
3332 # Get whether a section could be optional\r
3333 #\r
3334 # @param self The object pointer\r
3335 # @param SectionType The section type to check\r
3336 # @retval True section could be optional\r
3337 # @retval False section never optional\r
3338 #\r
3339 def __RuleSectionCouldBeOptional(self, SectionType):\r
3340 if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
3341 return True\r
3342 else:\r
3343 return False\r
3344\r
3345 ## __RuleSectionCouldHaveBuildNum() method\r
3346 #\r
3347 # Get whether a section could have build number information\r
3348 #\r
3349 # @param self The object pointer\r
3350 # @param SectionType The section type to check\r
3351 # @retval True section could have build number information\r
3352 # @retval False section never have build number information\r
3353 #\r
3354 def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
3355 if SectionType in ("VERSION"):\r
3356 return True\r
3357 else:\r
3358 return False\r
3359\r
3360 ## __RuleSectionCouldHaveString() method\r
3361 #\r
3362 # Get whether a section could have string\r
3363 #\r
3364 # @param self The object pointer\r
3365 # @param SectionType The section type to check\r
3366 # @retval True section could have string\r
3367 # @retval False section never have string\r
3368 #\r
3369 def __RuleSectionCouldHaveString(self, SectionType):\r
3370 if SectionType in ("UI", "VERSION"):\r
3371 return True\r
3372 else:\r
3373 return False\r
3374\r
3375 ## __CheckRuleSectionFileType() method\r
3376 #\r
3377 # Get whether a section matches a file type\r
3378 #\r
3379 # @param self The object pointer\r
3380 # @param SectionType The section type to check\r
3381 # @param FileType The file type to check\r
3382 #\r
3383 def __CheckRuleSectionFileType(self, SectionType, FileType):\r
3384 if SectionType == "COMPAT16":\r
3385 if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
3386 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3387 elif SectionType == "PE32":\r
3388 if FileType not in ("PE32", "SEC_PE32"):\r
3389 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3390 elif SectionType == "PIC":\r
3391 if FileType not in ("PIC", "PIC"):\r
3392 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3393 elif SectionType == "TE":\r
3394 if FileType not in ("TE", "SEC_TE"):\r
3395 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3396 elif SectionType == "RAW":\r
3397 if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
3398 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
b303ea72
LG
3399 elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
3400 if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
30fdf114
LG
3401 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3402 elif SectionType == "UI":\r
3403 if FileType not in ("UI", "SEC_UI"):\r
3404 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3405 elif SectionType == "VERSION":\r
3406 if FileType not in ("VERSION", "SEC_VERSION"):\r
3407 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3408 elif SectionType == "PEI_DEPEX":\r
3409 if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
3410 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3411 elif SectionType == "GUID":\r
3412 if FileType not in ("PE32", "SEC_GUID"):\r
3413 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
3414\r
3415 ## __GetRuleEncapsulationSection() method\r
3416 #\r
3417 # Get encapsulation section for Rule\r
3418 #\r
3419 # @param self The object pointer\r
3420 # @param Rule for whom section is got\r
3421 # @retval True Successfully find section statement\r
3422 # @retval False Not able to find section statement\r
3423 #\r
3424 def __GetRuleEncapsulationSection(self, Rule):\r
3425\r
3426 if self.__IsKeyword( "COMPRESS"):\r
3427 Type = "PI_STD"\r
3428 if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):\r
3429 Type = self.__Token\r
3430\r
3431 if not self.__IsToken("{"):\r
3432 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3433\r
3434 CompressSectionObj = CompressSection.CompressSection()\r
3435\r
3436 CompressSectionObj.CompType = Type\r
3437 # Recursive sections...\r
3438 while True:\r
3439 IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)\r
3440 IsLeaf = self.__GetEfiSection(CompressSectionObj)\r
3441 if not IsEncapsulate and not IsLeaf:\r
3442 break\r
3443\r
3444 if not self.__IsToken( "}"):\r
3445 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3446 Rule.SectionList.append(CompressSectionObj)\r
3447\r
3448 return True\r
3449\r
3450 elif self.__IsKeyword( "GUIDED"):\r
3451 GuidValue = None\r
3452 if self.__GetNextGuid():\r
3453 GuidValue = self.__Token\r
3454\r
3455 if self.__IsKeyword( "$(NAMED_GUID)"):\r
3456 GuidValue = self.__Token\r
3457\r
3458 AttribDict = self.__GetGuidAttrib()\r
3459\r
3460 if not self.__IsToken("{"):\r
3461 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
3462 GuidSectionObj = GuidSection.GuidSection()\r
3463 GuidSectionObj.NameGuid = GuidValue\r
3464 GuidSectionObj.SectionType = "GUIDED"\r
3465 GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]\r
3466 GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]\r
3467\r
3468 # Efi sections...\r
3469 while True:\r
3470 IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)\r
3471 IsLeaf = self.__GetEfiSection(GuidSectionObj)\r
3472 if not IsEncapsulate and not IsLeaf:\r
3473 break\r
3474\r
3475 if not self.__IsToken( "}"):\r
3476 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
3477 Rule.SectionList.append(GuidSectionObj)\r
3478\r
3479 return True\r
3480\r
3481 return False\r
3482\r
3483 ## __GetVtf() method\r
3484 #\r
3485 # Get VTF section contents and store its data into VTF list of self.Profile\r
3486 #\r
3487 # @param self The object pointer\r
3488 # @retval True Successfully find a VTF\r
3489 # @retval False Not able to find a VTF\r
3490 #\r
3491 def __GetVtf(self):\r
3492\r
3493 if not self.__GetNextToken():\r
3494 return False\r
3495\r
3496 S = self.__Token.upper()\r
3497 if S.startswith("[") and not S.startswith("[VTF."):\r
3498 if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
3499 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
3500 self.__UndoToken()\r
3501 return False\r
3502\r
3503 self.__UndoToken()\r
3504 if not self.__IsToken("[VTF.", True):\r
3505 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
3506 #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
3507 # % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
3508 raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
3509\r
3510 if not self.__SkipToToken("."):\r
3511 raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
3512\r
3513 Arch = self.__SkippedChars.rstrip(".").upper()\r
3514 if Arch not in ("IA32", "X64", "IPF", "ARM"):\r
3515 raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
3516\r
3517 if not self.__GetNextWord():\r
3518 raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
3519 Name = self.__Token.upper()\r
3520\r
3521 VtfObj = Vtf.Vtf()\r
3522 VtfObj.UiName = Name\r
3523 VtfObj.KeyArch = Arch\r
3524\r
3525 if self.__IsToken(","):\r
3526 if not self.__GetNextWord():\r
3527 raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
3528 if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM"):\r
3529 raise Warning("Unknown Arch '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3530 VtfObj.ArchList = self.__Token.upper()\r
3531\r
3532 if not self.__IsToken( "]"):\r
3533 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3534\r
3535 if self.__IsKeyword("IA32_RST_BIN"):\r
3536 if not self.__IsToken("="):\r
3537 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3538\r
3539 if not self.__GetNextToken():\r
3540 raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
3541\r
3542 VtfObj.ResetBin = self.__Token\r
6310ffd7 3543 if VtfObj.ResetBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
3544 #check for file path\r
3545 ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3546 if ErrorCode != 0:\r
3547 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
3548\r
3549 while self.__GetComponentStatement(VtfObj):\r
3550 pass\r
3551\r
3552 self.Profile.VtfList.append(VtfObj)\r
3553 return True\r
3554\r
3555 ## __GetComponentStatement() method\r
3556 #\r
3557 # Get components in VTF\r
3558 #\r
3559 # @param self The object pointer\r
3560 # @param VtfObj for whom component is got\r
3561 # @retval True Successfully find a component\r
3562 # @retval False Not able to find a component\r
3563 #\r
3564 def __GetComponentStatement(self, VtfObj):\r
3565\r
3566 if not self.__IsKeyword("COMP_NAME"):\r
3567 return False\r
3568\r
3569 if not self.__IsToken("="):\r
3570 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3571\r
3572 if not self.__GetNextWord():\r
3573 raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
3574\r
3575 CompStatementObj = ComponentStatement.ComponentStatement()\r
3576 CompStatementObj.CompName = self.__Token\r
3577\r
3578 if not self.__IsKeyword("COMP_LOC"):\r
3579 raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
3580\r
3581 if not self.__IsToken("="):\r
3582 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3583\r
3584 CompStatementObj.CompLoc = ""\r
3585 if self.__GetNextWord():\r
3586 CompStatementObj.CompLoc = self.__Token\r
3587 if self.__IsToken('|'):\r
3588 if not self.__GetNextWord():\r
3589 raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
3590\r
3591 if self.__Token not in ("F", "N", "S"): #, "H", "L", "PH", "PL"): not support\r
3592 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3593\r
3594 CompStatementObj.FilePos = self.__Token\r
3595 else:\r
3596 self.CurrentLineNumber += 1\r
3597 self.CurrentOffsetWithinLine = 0\r
3598\r
3599 if not self.__IsKeyword("COMP_TYPE"):\r
3600 raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
3601\r
3602 if not self.__IsToken("="):\r
3603 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3604\r
3605 if not self.__GetNextToken():\r
3606 raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
3607 if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
3608 if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
3609 not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
3610 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3611 CompStatementObj.CompType = self.__Token\r
3612\r
3613 if not self.__IsKeyword("COMP_VER"):\r
3614 raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
3615\r
3616 if not self.__IsToken("="):\r
3617 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3618\r
3619 if not self.__GetNextToken():\r
3620 raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
3621\r
3622 Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')\r
3623 if Pattern.match(self.__Token) == None:\r
3624 raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3625 CompStatementObj.CompVer = self.__Token\r
3626\r
3627 if not self.__IsKeyword("COMP_CS"):\r
3628 raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
3629\r
3630 if not self.__IsToken("="):\r
3631 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3632\r
3633 if not self.__GetNextToken():\r
3634 raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
3635 if self.__Token not in ("1", "0"):\r
3636 raise Warning("Unknown Component CS '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3637 CompStatementObj.CompCs = self.__Token\r
3638\r
3639\r
3640 if not self.__IsKeyword("COMP_BIN"):\r
3641 raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
3642\r
3643 if not self.__IsToken("="):\r
3644 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3645\r
3646 if not self.__GetNextToken():\r
3647 raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
3648\r
3649 CompStatementObj.CompBin = self.__Token\r
6310ffd7 3650 if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace('$(WORKSPACE)', '').find('$') == -1:\r
3651 #check for file path\r
3652 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3653 if ErrorCode != 0:\r
3654 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
3655\r
3656 if not self.__IsKeyword("COMP_SYM"):\r
3657 raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
3658\r
3659 if not self.__IsToken("="):\r
3660 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3661\r
3662 if not self.__GetNextToken():\r
3663 raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
3664\r
3665 CompStatementObj.CompSym = self.__Token\r
6310ffd7 3666 if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace('$(WORKSPACE)', '').find('$') == -1:\r
3667 #check for file path\r
3668 ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3669 if ErrorCode != 0:\r
3670 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
3671\r
3672 if not self.__IsKeyword("COMP_SIZE"):\r
3673 raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
3674\r
3675 if not self.__IsToken("="):\r
3676 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3677\r
3678 if self.__IsToken("-"):\r
3679 CompStatementObj.CompSize = self.__Token\r
3680 elif self.__GetNextDecimalNumber():\r
3681 CompStatementObj.CompSize = self.__Token\r
3682 elif self.__GetNextHexNumber():\r
3683 CompStatementObj.CompSize = self.__Token\r
3684 else:\r
3685 raise Warning("Unknown size '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3686\r
3687 VtfObj.ComponentStatementList.append(CompStatementObj)\r
3688 return True\r
3689\r
3690 ## __GetOptionRom() method\r
3691 #\r
3692 # Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
3693 #\r
3694 # @param self The object pointer\r
3695 # @retval True Successfully find a OptionROM\r
3696 # @retval False Not able to find a OptionROM\r
3697 #\r
3698 def __GetOptionRom(self):\r
3699\r
3700 if not self.__GetNextToken():\r
3701 return False\r
3702\r
3703 S = self.__Token.upper()\r
3704 if S.startswith("[") and not S.startswith("[OPTIONROM."):\r
3705 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
3706 \r
3707 self.__UndoToken()\r
3708 if not self.__IsToken("[OptionRom.", True):\r
3709 raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
3710\r
3711 OptRomName = self.__GetUiName()\r
3712\r
3713 if not self.__IsToken( "]"):\r
3714 raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
3715\r
3716 OptRomObj = OptionRom.OPTIONROM()\r
3717 OptRomObj.DriverName = OptRomName\r
3718 self.Profile.OptRomDict[OptRomName] = OptRomObj\r
3719\r
3720 while True:\r
3721 isInf = self.__GetOptRomInfStatement(OptRomObj)\r
3722 isFile = self.__GetOptRomFileStatement(OptRomObj)\r
3723 if not isInf and not isFile:\r
3724 break\r
3725 \r
3726 return True\r
3727\r
3728 ## __GetOptRomInfStatement() method\r
3729 #\r
3730 # Get INF statements\r
3731 #\r
3732 # @param self The object pointer\r
3733 # @param Obj for whom inf statement is got\r
3734 # @retval True Successfully find inf statement\r
3735 # @retval False Not able to find inf statement\r
3736 #\r
3737 def __GetOptRomInfStatement(self, Obj):\r
3738\r
3739 if not self.__IsKeyword( "INF"):\r
3740 return False\r
3741\r
3742 ffsInf = OptRomInfStatement.OptRomInfStatement()\r
3743 self.__GetInfOptions( ffsInf)\r
3744\r
3745 if not self.__GetNextToken():\r
3746 raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
3747 ffsInf.InfFileName = self.__Token\r
6310ffd7 3748 if ffsInf.InfFileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
3749 #check for file path\r
3750 ErrorCode, ErrorInfo = PathClass(NormPath(ffsInf.InfFileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3751 if ErrorCode != 0:\r
3752 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
3753\r
3754 if not ffsInf.InfFileName in self.Profile.InfList:\r
3755 self.Profile.InfList.append(ffsInf.InfFileName)\r
3756\r
3757 \r
3758 self.__GetOptRomOverrides (ffsInf)\r
3759 \r
3760 Obj.FfsList.append(ffsInf)\r
3761 return True\r
3762\r
3763 ## __GetOptRomOverrides() method\r
3764 #\r
3765 # Get overrides for OptROM INF & FILE\r
3766 #\r
3767 # @param self The object pointer\r
3768 # @param FfsInfObj for whom overrides is got\r
3769 #\r
3770 def __GetOptRomOverrides(self, Obj):\r
3771 if self.__IsToken('{'):\r
3772 Overrides = OptionRom.OverrideAttribs()\r
fd171542 3773 while True:\r
3774 if self.__IsKeyword( "PCI_VENDOR_ID"):\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 vendor id", self.FileName, self.CurrentLineNumber)\r
3779 Overrides.PciVendorId = self.__Token\r
3780 continue\r
3781\r
3782 if self.__IsKeyword( "PCI_CLASS_CODE"):\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 class code", self.FileName, self.CurrentLineNumber)\r
3787 Overrides.PciClassCode = self.__Token\r
3788 continue\r
3789\r
3790 if self.__IsKeyword( "PCI_DEVICE_ID"):\r
3791 if not self.__IsToken( "="):\r
3792 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3793 if not self.__GetNextHexNumber():\r
3794 raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
3795\r
3796 Overrides.PciDeviceId = self.__Token\r
3797 continue\r
3798\r
3799 if self.__IsKeyword( "PCI_REVISION"):\r
3800 if not self.__IsToken( "="):\r
3801 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3802 if not self.__GetNextHexNumber():\r
3803 raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
3804 Overrides.PciRevision = self.__Token\r
3805 continue\r
3806\r
3807 if self.__IsKeyword( "COMPRESS"):\r
3808 if not self.__IsToken( "="):\r
3809 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
3810 if not self.__GetNextToken():\r
3811 raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
3812 Overrides.NeedCompress = self.__Token.upper() == 'TRUE'\r
3813 continue\r
3814\r
3815 if self.__IsToken( "}"):\r
3816 break\r
3817 else:\r
3818 EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
3819\r
30fdf114
LG
3820 Obj.OverrideAttribs = Overrides\r
3821 \r
3822 ## __GetOptRomFileStatement() method\r
3823 #\r
3824 # Get FILE statements\r
3825 #\r
3826 # @param self The object pointer\r
3827 # @param Obj for whom FILE statement is got\r
3828 # @retval True Successfully find FILE statement\r
3829 # @retval False Not able to find FILE statement\r
3830 #\r
3831 def __GetOptRomFileStatement(self, Obj):\r
3832\r
3833 if not self.__IsKeyword( "FILE"):\r
3834 return False\r
3835\r
3836 FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
3837\r
3838 if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
3839 raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
3840 FfsFileObj.FileType = self.__Token\r
3841\r
3842 if not self.__GetNextToken():\r
3843 raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
3844 FfsFileObj.FileName = self.__Token\r
6310ffd7 3845 if FfsFileObj.FileName.replace('$(WORKSPACE)', '').find('$') == -1:\r
3846 #check for file path\r
3847 ErrorCode, ErrorInfo = PathClass(NormPath(FfsFileObj.FileName), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
3848 if ErrorCode != 0:\r
3849 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
30fdf114
LG
3850\r
3851 if FfsFileObj.FileType == 'EFI':\r
3852 self.__GetOptRomOverrides(FfsFileObj)\r
3853 \r
3854 Obj.FfsList.append(FfsFileObj)\r
3855\r
3856 return True\r
fd171542 3857\r
3858 ## __GetCapInFd() method\r
3859 #\r
3860 # Get Cap list contained in FD\r
3861 #\r
3862 # @param self The object pointer\r
3863 # @param FdName FD name\r
3864 # @retval CapList List of Capsule in FD\r
3865 #\r
3866 def __GetCapInFd (self, FdName):\r
3867\r
3868 CapList = []\r
3869 if FdName.upper() in self.Profile.FdDict.keys():\r
3870 FdObj = self.Profile.FdDict[FdName.upper()]\r
3871 for elementRegion in FdObj.RegionList:\r
3872 if elementRegion.RegionType == 'CAPSULE':\r
3873 for elementRegionData in elementRegion.RegionDataList:\r
3874 if elementRegionData.endswith(".cap"):\r
3875 continue\r
3876 if elementRegionData != None and elementRegionData.upper() not in CapList:\r
3877 CapList.append(elementRegionData.upper())\r
3878 return CapList\r
3879\r
3880 ## __GetReferencedFdCapTuple() method\r
3881 #\r
3882 # Get FV and FD list referenced by a capsule image\r
3883 #\r
3884 # @param self The object pointer\r
3885 # @param CapObj Capsule section to be searched\r
3886 # @param RefFdList referenced FD by section\r
3887 # @param RefFvList referenced FV by section\r
3888 #\r
3889 def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
3890\r
3891 for CapsuleDataObj in CapObj.CapsuleDataList :\r
3892 if CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
3893 RefFvList.append (CapsuleDataObj.FvName.upper())\r
3894 elif CapsuleDataObj.Ffs != None:\r
3895 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
3896 if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
3897 RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
3898 elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
3899 RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
3900 else:\r
3901 self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
3902\r
30fdf114
LG
3903 ## __GetFvInFd() method\r
3904 #\r
3905 # Get FV list contained in FD\r
3906 #\r
3907 # @param self The object pointer\r
3908 # @param FdName FD name\r
3909 # @retval FvList list of FV in FD\r
3910 #\r
3911 def __GetFvInFd (self, FdName):\r
3912\r
3913 FvList = []\r
3914 if FdName.upper() in self.Profile.FdDict.keys():\r
3915 FdObj = self.Profile.FdDict[FdName.upper()]\r
3916 for elementRegion in FdObj.RegionList:\r
3917 if elementRegion.RegionType == 'FV':\r
3918 for elementRegionData in elementRegion.RegionDataList:\r
fd171542 3919 if elementRegionData.endswith(".fv"):\r
3920 continue\r
30fdf114
LG
3921 if elementRegionData != None and elementRegionData.upper() not in FvList:\r
3922 FvList.append(elementRegionData.upper())\r
3923 return FvList\r
3924\r
3925 ## __GetReferencedFdFvTuple() method\r
3926 #\r
3927 # Get FD and FV list referenced by a FFS file\r
3928 #\r
3929 # @param self The object pointer\r
3930 # @param FfsFile contains sections to be searched\r
3931 # @param RefFdList referenced FD by section\r
3932 # @param RefFvList referenced FV by section\r
3933 #\r
3934 def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):\r
3935\r
3936 for FfsObj in FvObj.FfsList:\r
3937 if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
3938 if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList:\r
3939 RefFvList.append(FfsObj.FvName.upper())\r
3940 elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList:\r
3941 RefFdList.append(FfsObj.FdName.upper())\r
3942 else:\r
3943 self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
3944\r
3945 ## __GetReferencedFdFvTupleFromSection() method\r
3946 #\r
3947 # Get FD and FV list referenced by a FFS section\r
3948 #\r
3949 # @param self The object pointer\r
3950 # @param FfsFile contains sections to be searched\r
3951 # @param FdList referenced FD by section\r
3952 # @param FvList referenced FV by section\r
3953 #\r
3954 def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):\r
3955\r
3956 SectionStack = []\r
3957 SectionStack.extend(FfsFile.SectionList)\r
3958 while SectionStack != []:\r
3959 SectionObj = SectionStack.pop()\r
3960 if isinstance(SectionObj, FvImageSection.FvImageSection):\r
3961 if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList:\r
3962 FvList.append(SectionObj.FvName.upper())\r
3963 if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
3964 FvList.append(SectionObj.Fv.UiFvName.upper())\r
3965 self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
3966\r
3967 if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):\r
3968 SectionStack.extend(SectionObj.SectionList)\r
3969\r
3970 ## CycleReferenceCheck() method\r
3971 #\r
3972 # Check whether cycle reference exists in FDF\r
3973 #\r
3974 # @param self The object pointer\r
3975 # @retval True cycle reference exists\r
3976 # @retval False Not exists cycle reference\r
3977 #\r
3978 def CycleReferenceCheck(self):\r
fd171542 3979 #\r
3980 # Check the cycle between FV and FD image\r
3981 #\r
3982 MaxLength = len (self.Profile.FvDict)\r
3983 for FvName in self.Profile.FvDict.keys():\r
3984 LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
3985 RefFvStack = []\r
3986 RefFvStack.append(FvName)\r
3987 FdAnalyzedList = []\r
3988 \r
3989 Index = 0\r
3990 while RefFvStack != [] and Index < MaxLength:\r
3991 Index = Index + 1\r
3992 FvNameFromStack = RefFvStack.pop()\r
3993 if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
3994 FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
3995 else:\r
3996 continue\r
30fdf114 3997\r
fd171542 3998 RefFdList = []\r
3999 RefFvList = []\r
4000 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
30fdf114 4001\r
fd171542 4002 for RefFdName in RefFdList:\r
4003 if RefFdName in FdAnalyzedList:\r
30fdf114
LG
4004 continue\r
4005\r
fd171542 4006 LogStr += "FV %s contains FD %s\n" % (FvNameFromStack, RefFdName)\r
4007 FvInFdList = self.__GetFvInFd(RefFdName)\r
4008 if FvInFdList != []:\r
4009 for FvNameInFd in FvInFdList:\r
4010 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4011 if FvNameInFd not in RefFvStack:\r
4012 RefFvStack.append(FvNameInFd)\r
4013\r
4014 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4015 EdkLogger.info(LogStr)\r
4016 return True\r
4017 FdAnalyzedList.append(RefFdName)\r
30fdf114 4018\r
fd171542 4019 for RefFvName in RefFvList:\r
4020 LogStr += "FV %s contains FV %s\n" % (FvNameFromStack, RefFvName)\r
4021 if RefFvName not in RefFvStack:\r
4022 RefFvStack.append(RefFvName)\r
4023\r
4024 if FvName in RefFvStack or FvNameFromStack in RefFvStack:\r
4025 EdkLogger.info(LogStr)\r
4026 return True\r
4027\r
4028 #\r
4029 # Check the cycle between Capsule and FD image\r
4030 #\r
4031 MaxLength = len (self.Profile.CapsuleDict)\r
4032 for CapName in self.Profile.CapsuleDict.keys():\r
4033 #\r
4034 # Capsule image to be checked.\r
4035 #\r
4036 LogStr = "\n\n\nCycle Reference Checking for Capsule: %s\n" % CapName\r
4037 RefCapStack = []\r
4038 RefCapStack.append(CapName)\r
4039 FdAnalyzedList = []\r
4040 FvAnalyzedList = []\r
4041 \r
4042 Index = 0\r
4043 while RefCapStack != [] and Index < MaxLength:\r
4044 Index = Index + 1\r
4045 CapNameFromStack = RefCapStack.pop()\r
4046 if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
4047 CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
4048 else:\r
4049 continue\r
4050\r
4051 RefFvList = []\r
4052 RefFdList = []\r
4053 self.__GetReferencedFdCapTuple(CapObj, RefFdList, RefFvList)\r
4054\r
4055 FvListLength = 0\r
4056 FdListLength = 0\r
4057 while FvListLength < len (RefFvList) or FdListLength < len (RefFdList):\r
30fdf114
LG
4058 for RefFdName in RefFdList:\r
4059 if RefFdName in FdAnalyzedList:\r
4060 continue\r
4061\r
fd171542 4062 LogStr += "Capsule %s contains FD %s\n" % (CapNameFromStack, RefFdName)\r
4063 CapInFdList = self.__GetCapInFd(RefFdName)\r
4064 if CapInFdList != []:\r
4065 for CapNameInFd in CapInFdList:\r
4066 LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
4067 if CapNameInFd not in RefCapStack:\r
4068 RefCapStack.append(CapNameInFd)\r
4069\r
4070 if CapName in RefCapStack or CapNameFromStack in RefCapStack:\r
4071 EdkLogger.info(LogStr)\r
4072 return True\r
4073\r
30fdf114
LG
4074 FvInFdList = self.__GetFvInFd(RefFdName)\r
4075 if FvInFdList != []:\r
fd171542 4076 for FvNameInFd in FvInFdList:\r
4077 LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
4078 if FvNameInFd not in RefFvList:\r
4079 RefFvList.append(FvNameInFd)\r
30fdf114 4080\r
fd171542 4081 FdAnalyzedList.append(RefFdName)\r
4082 #\r
4083 # the number of the parsed FV and FD image\r
4084 #\r
4085 FvListLength = len (RefFvList)\r
4086 FdListLength = len (RefFdList)\r
30fdf114 4087 for RefFvName in RefFvList:\r
fd171542 4088 if RefFvName in FvAnalyzedList:\r
4089 continue\r
4090 LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
4091 if RefFvName.upper() in self.Profile.FvDict.keys():\r
4092 FvObj = self.Profile.FvDict[RefFvName.upper()]\r
4093 else:\r
4094 continue\r
4095 self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)\r
4096 FvAnalyzedList.append(RefFvName)\r
30fdf114 4097\r
fd171542 4098 return False\r
30fdf114
LG
4099\r
4100if __name__ == "__main__":\r
4101 parser = FdfParser("..\LakeportX64Pkg.fdf")\r
4102 try:\r
4103 parser.ParseFile()\r
4104 parser.CycleReferenceCheck()\r
4105 except Warning, X:\r
4106 print str(X)\r
4107 else:\r
4108 print "Success!"\r
4109\r