1. Update UpdateBuildVersion.py;

2. Generate correct HII data offset.
3. Fixed a bug for incorrect PCD value used in conditional statement.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Yingke Liu <yingke.d.liu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>


git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16784 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Yingke Liu 2015-02-06 03:40:27 +00:00 committed by yingke
parent ee2e676a44
commit 22a99b87c4
4 changed files with 140 additions and 59 deletions

View File

@ -6,7 +6,7 @@
# If SVN is available, the tool will obtain the current checked out version of # If SVN is available, the tool will obtain the current checked out version of
# the source tree for including the the --version commands. # the source tree for including the the --version commands.
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -32,8 +32,8 @@ from types import IntType, ListType
SYS_ENV_ERR = "ERROR : %s system environment variable must be set prior to running this tool.\n" SYS_ENV_ERR = "ERROR : %s system environment variable must be set prior to running this tool.\n"
__execname__ = "UpdateBuildVersions.py" __execname__ = "UpdateBuildVersions.py"
SVN_REVISION = "$Revision: 3 $" SVN_REVISION = "$LastChangedRevision: 3 $"
SVN_REVISION = SVN_REVISION.replace("$Revision:", "").replace("$", "").strip() SVN_REVISION = SVN_REVISION.replace("$LastChangedRevision:", "").replace("$", "").strip()
__copyright__ = "Copyright (c) 2014, Intel Corporation. All rights reserved." __copyright__ = "Copyright (c) 2014, Intel Corporation. All rights reserved."
VERSION_NUMBER = "0.7.0" VERSION_NUMBER = "0.7.0"
__version__ = "Version %s.%s" % (VERSION_NUMBER, SVN_REVISION) __version__ = "Version %s.%s" % (VERSION_NUMBER, SVN_REVISION)

View File

@ -1,7 +1,7 @@
## @file ## @file
# Common routines used by all tools # Common routines used by all tools
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
@ -44,6 +44,134 @@ gFileTimeStampCache = {} # {file path : file time stamp}
## Dictionary used to store dependencies of files ## Dictionary used to store dependencies of files
gDependencyDatabase = {} # arch : {file path : [dependent files list]} gDependencyDatabase = {} # arch : {file path : [dependent files list]}
def GetVariableOffset(mapfilepath, efifilepath, varnames):
""" Parse map file to get variable offset in current EFI file
@param mapfilepath Map file absolution path
@param efifilepath: EFI binary file full path
@param varnames iteratable container whose elements are variable names to be searched
@return List whos elements are tuple with variable name and raw offset
"""
lines = []
try:
f = open(mapfilepath, 'r')
lines = f.readlines()
f.close()
except:
return None
if len(lines) == 0: return None
firstline = lines[0].strip()
if (firstline.startswith("Archive member included ") and
firstline.endswith(" file (symbol)")):
return _parseForGCC(lines, efifilepath, varnames)
return _parseGeneral(lines, efifilepath, varnames)
def _parseForGCC(lines, efifilepath, varnames):
""" Parse map file generated by GCC linker """
status = 0
sections = []
varoffset = []
for line in lines:
line = line.strip()
# status machine transection
if status == 0 and line == "Memory Configuration":
status = 1
continue
elif status == 1 and line == 'Linker script and memory map':
status = 2
continue
elif status ==2 and line == 'START GROUP':
status = 3
continue
# status handler
if status == 2:
m = re.match('^([\w_\.]+) +([\da-fA-Fx]+) +([\da-fA-Fx]+)$', line)
if m != None:
sections.append(m.groups(0))
for varname in varnames:
m = re.match("^([\da-fA-Fx]+) +[_]*(%s)$" % varname, line)
if m != None:
varoffset.append((varname, int(m.groups(0)[0], 16) , int(sections[-1][1], 16), sections[-1][0]))
if not varoffset:
return []
# get section information from efi file
efisecs = PeImageClass(efifilepath).SectionHeaderList
if efisecs == None or len(efisecs) == 0:
return []
#redirection
redirection = 0
for efisec in efisecs:
for section in sections:
if section[0].strip() == efisec[0].strip() and section[0].strip() == '.text':
redirection = int(section[1], 16) - efisec[1]
ret = []
for var in varoffset:
for efisec in efisecs:
if var[1] >= efisec[1] and var[1] < efisec[1]+efisec[3]:
ret.append((var[0], hex(efisec[2] + var[1] - efisec[1] - redirection)))
return ret
def _parseGeneral(lines, efifilepath, varnames):
status = 0 #0 - beginning of file; 1 - PE section definition; 2 - symbol table
secs = [] # key = section name
varoffset = []
secRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\da-fA-F]+)[Hh]? +([.\w\$]+) +(\w+)', re.UNICODE)
symRe = re.compile('^([\da-fA-F]+):([\da-fA-F]+) +([\.:\\\\\w\?@\$]+) +([\da-fA-F]+)', re.UNICODE)
for line in lines:
line = line.strip()
if re.match("^Start[' ']+Length[' ']+Name[' ']+Class", line):
status = 1
continue
if re.match("^Address[' ']+Publics by Value[' ']+Rva\+Base", line):
status = 2
continue
if re.match("^entry point at", line):
status = 3
continue
if status == 1 and len(line) != 0:
m = secRe.match(line)
assert m != None, "Fail to parse the section in map file , line is %s" % line
sec_no, sec_start, sec_length, sec_name, sec_class = m.groups(0)
secs.append([int(sec_no, 16), int(sec_start, 16), int(sec_length, 16), sec_name, sec_class])
if status == 2 and len(line) != 0:
for varname in varnames:
m = symRe.match(line)
assert m != None, "Fail to parse the symbol in map file, line is %s" % line
sec_no, sym_offset, sym_name, vir_addr = m.groups(0)
sec_no = int(sec_no, 16)
sym_offset = int(sym_offset, 16)
vir_addr = int(vir_addr, 16)
m2 = re.match('^[_]*(%s)' % varname, sym_name)
if m2 != None:
# fond a binary pcd entry in map file
for sec in secs:
if sec[0] == sec_no and (sym_offset >= sec[1] and sym_offset < sec[1] + sec[2]):
varoffset.append([varname, sec[3], sym_offset, vir_addr, sec_no])
if not varoffset: return []
# get section information from efi file
efisecs = PeImageClass(efifilepath).SectionHeaderList
if efisecs == None or len(efisecs) == 0:
return []
ret = []
for var in varoffset:
index = 0
for efisec in efisecs:
index = index + 1
if var[1].strip() == efisec[0].strip():
ret.append((var[0], hex(efisec[2] + var[2])))
elif var[4] == index:
ret.append((var[0], hex(efisec[2] + var[2])))
return ret
## Routine to process duplicated INF ## Routine to process duplicated INF
# #
# This function is called by following two cases: # This function is called by following two cases:

View File

@ -1,7 +1,7 @@
## @file ## @file
# process FFS generation from INF statement # process FFS generation from INF statement
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2014 Hewlett-Packard Development Company, L.P.<BR> # Copyright (c) 2014 Hewlett-Packard Development Company, L.P.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
@ -32,6 +32,7 @@ from Common.String import *
from Common.Misc import PathClass from Common.Misc import PathClass
from Common.Misc import GuidStructureByteArrayToGuidString from Common.Misc import GuidStructureByteArrayToGuidString
from Common.Misc import ProcessDuplicatedInf from Common.Misc import ProcessDuplicatedInf
from Common.Misc import GetVariableOffset
from Common import EdkLogger from Common import EdkLogger
from Common.BuildToolError import * from Common.BuildToolError import *
from GuidSection import GuidSection from GuidSection import GuidSection
@ -988,47 +989,9 @@ class FfsInfStatement(FfsInfStatementClassObject):
# @retval RetValue A list contain offset of UNI/INF object. # @retval RetValue A list contain offset of UNI/INF object.
# #
def __GetBuildOutputMapFileVfrUniInfo(self, VfrUniBaseName): def __GetBuildOutputMapFileVfrUniInfo(self, VfrUniBaseName):
RetValue = []
MapFileName = os.path.join(self.EfiOutputPath, self.BaseName + ".map") MapFileName = os.path.join(self.EfiOutputPath, self.BaseName + ".map")
try: EfiFileName = os.path.join(self.EfiOutputPath, self.BaseName + ".efi")
fInputfile = open(MapFileName, "r", 0) return GetVariableOffset(MapFileName, EfiFileName, VfrUniBaseName.values())
try:
FileLinesList = fInputfile.readlines()
except:
EdkLogger.error("GenFds", FILE_READ_FAILURE, "File read failed for %s" %MapFileName,None)
finally:
fInputfile.close()
except:
EdkLogger.error("GenFds", FILE_OPEN_FAILURE, "File open failed for %s" %MapFileName,None)
IsHex = False
for eachLine in FileLinesList:
for eachName in VfrUniBaseName.values():
if eachLine.find(eachName) != -1:
eachLine = eachLine.strip()
Element = eachLine.split()
#
# MSFT/ICC/EBC map file
#
if (len(Element) == 4):
try:
int (Element[2], 16)
IsHex = True
except:
IsHex = False
if IsHex:
RetValue.append((eachName, Element[2]))
IsHex = False
#
# GCC map file
#
elif (len(Element) == 2) and Element[0].startswith("0x"):
RetValue.append((eachName, Element[0]))
return RetValue
## __GenUniVfrOffsetFile() method ## __GenUniVfrOffsetFile() method
# #

View File

@ -1,7 +1,7 @@
## @file ## @file
# This file is used to parse meta files # This file is used to parse meta files
# #
# Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
@ -1338,18 +1338,6 @@ class DscParser(MetaFileParser):
self._SubsectionType = MODEL_UNKNOWN self._SubsectionType = MODEL_UNKNOWN
def __RetrievePcdValue(self): def __RetrievePcdValue(self):
Records = self._RawTable.Query(MODEL_PCD_FEATURE_FLAG, BelongsToItem= -1.0)
for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records:
Name = TokenSpaceGuid + '.' + PcdName
ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FEATURE_FLAG)
self._Symbols[Name] = ValList[Index]
Records = self._RawTable.Query(MODEL_PCD_FIXED_AT_BUILD, BelongsToItem= -1.0)
for TokenSpaceGuid, PcdName, Value, Dummy2, Dummy3, ID, Line in Records:
Name = TokenSpaceGuid + '.' + PcdName
ValList, Valid, Index = AnalyzeDscPcd(Value, MODEL_PCD_FIXED_AT_BUILD)
self._Symbols[Name] = ValList[Index]
Content = open(str(self.MetaFile), 'r').readlines() Content = open(str(self.MetaFile), 'r').readlines()
GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile) GlobalData.gPlatformOtherPcds['DSCFILE'] = str(self.MetaFile)
for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII, for PcdType in (MODEL_PCD_PATCHABLE_IN_MODULE, MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_HII,
@ -1542,7 +1530,9 @@ class DscParser(MetaFileParser):
if ValList[Index] == 'False': if ValList[Index] == 'False':
ValList[Index] = '0' ValList[Index] = '0'
if (not self._DirectiveEvalStack) or (False not in self._DirectiveEvalStack):
GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue GlobalData.gPlatformPcds[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue
self._Symbols[TAB_SPLIT.join(self._ValueList[0:2])] = PcdValue
self._ValueList[2] = '|'.join(ValList) self._ValueList[2] = '|'.join(ValList)
def __ProcessComponent(self): def __ProcessComponent(self):