import struct\r
import argparse\r
from ctypes import *\r
+from functools import reduce\r
\r
"""\r
This utility supports some operations for Intel FSP 1.x/2.x image.\r
def Val2Bytes (value, blen):\r
return [(value>>(i*8) & 0xff) for i in range(blen)]\r
\r
+def IsIntegerType (val):\r
+ if sys.version_info[0] < 3:\r
+ if type(val) in (int, long):\r
+ return True\r
+ else:\r
+ if type(val) is int:\r
+ return True\r
+ return False\r
+\r
+def IsStrType (val):\r
+ if sys.version_info[0] < 3:\r
+ if type(val) is str:\r
+ return True\r
+ else:\r
+ if type(val) is bytes:\r
+ return True\r
+ return False\r
+\r
+def HandleNameStr (val):\r
+ if sys.version_info[0] < 3:\r
+ rep = "0x%X ('%s')" % (Bytes2Val (bytearray (val)), val)\r
+ else:\r
+ rep = "0x%X ('%s')" % (Bytes2Val (bytearray (val)), str (val, 'utf-8'))\r
+ return rep\r
+\r
def OutputStruct (obj, indent = 0, plen = 0):\r
if indent:\r
body = ''\r
body += OutputStruct (val, indent + 1)\r
plen -= sizeof(val)\r
else:\r
- if type(val) is str:\r
- rep = "0x%X ('%s')" % (Bytes2Val(bytearray(val)), val)\r
- elif type(val) in (int, long):\r
+ if IsStrType (val):\r
+ rep = HandleNameStr (val)\r
+ elif IsIntegerType (val):\r
rep = '0x%X' % val\r
elif isinstance(val, c_uint24):\r
rep = '0x%X' % val.get_value()\r
elif 'c_ubyte_Array' in str(type(val)):\r
if sizeof(val) == 16:\r
- rep = str(uuid.UUID(bytes = str(bytearray(val)))).upper()\r
+ if sys.version_info[0] < 3:\r
+ rep = str(bytearray(val))\r
+ else:\r
+ rep = bytes(val)\r
+ rep = str(uuid.UUID(bytes_le = rep)).upper()\r
else:\r
res = ['0x%02X'%i for i in bytearray(val)]\r
rep = '[%s]' % (','.join(res))\r
self.FvList = []\r
while offset < fdsize:\r
fvh = EFI_FIRMWARE_VOLUME_HEADER.from_buffer (self.FdData, offset)\r
- if '_FVH' != fvh.Signature:\r
+ if b'_FVH' != fvh.Signature:\r
raise Exception("ERROR: Invalid FV header !")\r
fv = FirmwareVolume (offset, self.FdData[offset:offset + fvh.FvLength])\r
fv.ParseFv ()\r
fspoffset = fv.Offset\r
offset = fspoffset + fihoffset\r
fih = FSP_INFORMATION_HEADER.from_buffer (self.FdData, offset)\r
- if 'FSPH' != fih.Signature:\r
+ if b'FSPH' != fih.Signature:\r
continue\r
\r
offset += fih.HeaderLength\r
plist = []\r
while True:\r
fch = FSP_COMMON_HEADER.from_buffer (self.FdData, offset)\r
- if 'FSPP' != fch.Signature:\r
+ if b'FSPP' != fch.Signature:\r
offset += fch.HeaderLength\r
offset = AlignPtr(offset, 4)\r
else:\r
def __init__(self, offset, data):\r
self.Offset = offset\r
tehdr = EFI_TE_IMAGE_HEADER.from_buffer (data, 0)\r
- if tehdr.Signature == 'VZ': # TE image\r
+ if tehdr.Signature == b'VZ': # TE image\r
self.TeHdr = tehdr\r
- elif tehdr.Signature == 'MZ': # PE image\r
+ elif tehdr.Signature == b'MZ': # PE image\r
self.TeHdr = None\r
self.DosHdr = EFI_IMAGE_DOS_HEADER.from_buffer (data, 0)\r
self.PeHdr = EFI_IMAGE_NT_HEADERS32.from_buffer (data, self.DosHdr.e_lfanew)\r
offset += sizeof(blkhdr)\r
# Read relocation type,offset pairs\r
rlen = blkhdr.BlockSize - sizeof(PE_RELOC_BLOCK_HEADER)\r
- rnum = rlen/sizeof(c_uint16)\r
+ rnum = int (rlen/sizeof(c_uint16))\r
rdata = (c_uint16 * rnum).from_buffer(self.Data, offset)\r
for each in rdata:\r
roff = each & 0xfff\r
if not name:\r
name = '\xff' * 16\r
else:\r
- name = str(bytearray(name))\r
- guid = uuid.UUID(bytes = name)\r
+ if sys.version_info[0] < 3:\r
+ name = str(bytearray(name))\r
+ else:\r
+ name = bytes(name)\r
+ guid = uuid.UUID(bytes_le = name)\r
print ("FV%d:" % idx)\r
print (" GUID : %s" % str(guid).upper())\r
print (" Offset : 0x%08X" % fv.Offset)\r
for fsp in fd.FspList:\r
fih = fsp.Fih\r
if firstfv:\r
- hfsp.write("#define FSP_IMAGE_ID 0x%016X /* '%s' */\n" % (Bytes2Val(bytearray(fih.ImageId)), fih.ImageId))\r
+ if sys.version_info[0] < 3:\r
+ hfsp.write("#define FSP_IMAGE_ID 0x%016X /* '%s' */\n" % (Bytes2Val(bytearray(fih.ImageId)), fih.ImageId))\r
+ else:\r
+ hfsp.write("#define FSP_IMAGE_ID 0x%016X /* '%s' */\n" % (Bytes2Val(bytearray(fih.ImageId)), str (fih.ImageId, 'utf-8')))\r
hfsp.write("#define FSP_IMAGE_REV 0x%08X \n\n" % fih.ImageRevision)\r
firstfv = False\r
fv = fd.FvList[fsp.FvIdxList[0]]\r
numcomp = len(FspComponent)\r
baselist = FspBase\r
if numcomp != len(baselist):\r
- print "ERROR: Required number of base does not match number of FSP component !"\r
+ print ("ERROR: Required number of base does not match number of FSP component !")\r
return\r
\r
newfspbin = fd.FdData[:]\r
break\r
\r
if not found:\r
- print "ERROR: Could not find FSP_%c component to rebase !" % fspcomp.upper()\r
+ print ("ERROR: Could not find FSP_%c component to rebase !" % fspcomp.upper())\r
return\r
\r
fspbase = baselist[idx]\r
newbase = int(fspbase)\r
oldbase = fsp.Fih.ImageBase\r
delta = newbase - oldbase\r
- print "Rebase FSP-%c from 0x%08X to 0x%08X:" % (ftype.upper(),oldbase,newbase)\r
+ print ("Rebase FSP-%c from 0x%08X to 0x%08X:" % (ftype.upper(),oldbase,newbase))\r
\r
imglist = []\r
for fvidx in fsp.FvIdxList:\r
pcount += img.Rebase(delta, newfspbin)\r
fcount += 1\r
\r
- print " Patched %d entries in %d TE/PE32 images." % (pcount, fcount)\r
+ print (" Patched %d entries in %d TE/PE32 images." % (pcount, fcount))\r
\r
(count, applied) = fsp.Patch(delta, newfspbin)\r
- print " Patched %d entries using FSP patch table." % applied\r
+ print (" Patched %d entries using FSP patch table." % applied)\r
if count != applied:\r
- print " %d invalid entries are ignored !" % (count - applied)\r
+ print (" %d invalid entries are ignored !" % (count - applied))\r
\r
if OutputFile == '':\r
filename = os.path.basename(FspBinary)\r