Files
chipsec-chipsec/source/tool/chipsec/utilcmd/decode_cmd.py
T
CHIPSEC ac2ca7264f 1. We have support for uefi variables on Windows and Linux but not
UEFI shell.
2.       Decompression of images in SPI flash parsing is only supported in
Windows.
3.	UEFI - Support for IA32 and i586 (Quark)
4.	Added capability to use modules from an arbitrary path with the -I
/ --import command line option
5.	Module functionality encapsulated in class inheriting BaseModule
6.	Fixed  loading platform specific configuration
7.	Fixed issue with modules which run on multiple logical CPUs
hanging on Bay Trail (Windows/Linux). The issue still exist when running
from UEFI shell
8.	Added template for a module - module_template.py
9.	Added options to flush log files
10.	Added ability to define custom platforms
Driver changes:
1.	Windows - Added IOCTL_ALLOC_PHYSMEM to allocate physical memory
buffer
2.	Linux - Fix wrpci defect
2014-05-29 21:57:40 +01:00

135 lines
4.1 KiB
Python

#!/usr/local/bin/python
#CHIPSEC: Platform Security Assessment Framework
#Copyright (c) 2010-2014, Intel Corporation
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; Version 2.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
#Contact information:
#chipsec@intel.com
#
#
# usage as a standalone utility:
#
# chipsec_util decode spi.bin
#
## \addtogroup standalone
#chipsec_util decode
#--------
#~~~
#chipsec_util decode <rom> [fw_type]
#''
# Examples:
#''
# chipsec_util decode spi.bin vss
#~~~
__version__ = '1.0'
import os
import sys
import time
import chipsec_util
#from chipsec_util import global_usage, chipsec_util_commands, _cs
from chipsec_util import chipsec_util_commands, _cs
from chipsec.logger import *
import chipsec.file
import chipsec.hal.spi as spi
import chipsec.hal.spi_descriptor as spi_descriptor
import chipsec.hal.spi_uefi as spi_uefi
import chipsec.hal.uefi as uefi
#_cs = cs()
_uefi = uefi.UEFI( _cs.helper )
usage = "chipsec_util decode <rom> [fw_type]\n" + \
" <fw_type> should be in [ %s ]\n" % (" | ".join( ["%s" % t for t in uefi.fw_types])) + \
"Examples:\n" + \
" chipsec_util decode spi.bin vss\n\n"
chipsec_util.global_usage += usage
def decode(argv):
if 3 > len(argv):
print usage
return
rom_file = argv[2]
fwtype = ''
if 4 == len(argv):
fwtype = argv[3]
logger().log( "[CHIPSEC] Decoding SPI ROM image from a file '%s'" % rom_file )
t = time.time()
f = chipsec.file.read_file( rom_file )
(fd_off, fd) = spi_descriptor.get_spi_flash_descriptor( f )
if (-1 == fd_off) or (fd is None):
logger().error( "Could not find SPI Flash descriptor in the binary '%s'" % rom_file )
return False
logger().log( "[CHIPSEC] Found SPI Flash descriptor at offset 0x%x in the binary '%s'" % (fd_off, rom_file) )
rom = f[fd_off:]
# Decoding Flash Descriptor
#logger().LOG_COMPLETE_FILE_NAME = os.path.join( pth, 'flash_descriptor.log' )
#parse_spi_flash_descriptor( fd )
# Decoding SPI Flash Regions
# flregs[r] = (r,SPI_REGION_NAMES[r],flreg,base,limit,notused)
flregs = spi_descriptor.get_spi_regions( fd )
if flregs is None:
logger().error( "SPI Flash descriptor region is not valid" )
return False
_orig_logname = logger().LOG_FILE_NAME
pth = os.path.join( _cs.helper.getcwd(), rom_file + ".dir" )
if not os.path.exists( pth ):
os.makedirs( pth )
for r in flregs:
idx = r[0]
name = r[1]
base = r[3]
limit = r[4]
notused = r[5]
if not notused:
region_data = rom[base:limit+1]
fname = os.path.join( pth, '%d_%04X-%04X_%s.bin' % (idx, base, limit, name) )
chipsec.file.write_file( fname, region_data )
if spi.FLASH_DESCRIPTOR == idx:
# Decoding Flash Descriptor
logger().set_log_file( os.path.join( pth, fname + '.log' ) )
spi_descriptor.parse_spi_flash_descriptor( region_data )
elif spi.BIOS == idx:
# Decoding EFI Firmware Volumes
logger().set_log_file( os.path.join( pth, fname + '.log' ) )
spi_uefi.decode_uefi_region(_uefi, pth, fname, fwtype)
logger().set_log_file( _orig_logname )
logger().log( "[CHIPSEC] (decode) time elapsed %.3f" % (time.time()-t) )
chipsec_util_commands['decode'] = {'func' : decode, 'start_driver' : False }