diff --git a/chipsec/cfg/sfdp.xml b/chipsec/cfg/sfdp.xml
index 995c74d9..35c4395f 100644
--- a/chipsec/cfg/sfdp.xml
+++ b/chipsec/cfg/sfdp.xml
@@ -1,5 +1,7 @@
-
-
+
+
+
+
@@ -14,10 +16,10 @@
-
+
-
+
@@ -27,7 +29,7 @@ output" />
-
+
@@ -37,14 +39,14 @@ output" />
-
+
-
+
@@ -52,7 +54,7 @@ output" />
-
+
@@ -60,21 +62,21 @@ output" />
-
+
-
+
-
+
@@ -82,7 +84,7 @@ output" />
-
+
@@ -92,7 +94,7 @@ output" />
-
+
@@ -103,14 +105,14 @@ output" />
-
+
-
+
@@ -119,7 +121,7 @@ output" />
-
+
@@ -130,14 +132,14 @@ output" />
-
+
-
+
@@ -145,7 +147,7 @@ output" />
-
+
@@ -157,7 +159,7 @@ output" />
-
+
@@ -167,7 +169,7 @@ output" />
-
+
@@ -178,5 +180,7 @@ output" />
-
+
+
+
diff --git a/chipsec/chipset.py b/chipsec/chipset.py
index bc2ee8cb..d0139f74 100644
--- a/chipsec/chipset.py
+++ b/chipsec/chipset.py
@@ -1,6 +1,6 @@
#!/usr/bin/python
#CHIPSEC: Platform Security Assessment Framework
-#Copyright (c) 2010-2019, Intel Corporation
+#Copyright (c) 2010-2020, Intel Corporation
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
@@ -1095,7 +1095,9 @@ class Chipset:
elif RegisterType.IOBAR == rtype:
reg_str = "[*] {} = {} << {} (I/O {} + 0x{:X})".format(reg_name, reg_val_str, reg['desc'], reg['bar'], int(reg['offset'],16))
elif RegisterType.MSGBUS == rtype or RegisterType.MM_MSGBUS == rtype:
- reg_str = "[*] {} = {} << {} (msgbus port 0x{:X}, off 0x{:X})".format(reg_name, reg_val_str, reg['desc'], int(reg['port'],16), int(reg['offset'],16))
+ reg_str = "[*] %s = %s << %s (msgbus port 0x%X, off 0x%X)" % (reg_name, reg_val_str, reg['desc'], int(reg['port'],16), int(reg['offset'],16))
+ else:
+ reg_str = "[*] {} = {} << {}".format(reg_name, reg_val_str, reg['desc'])
reg_str += self._register_fields_str(reg, reg_val)
logger().log( reg_str )
diff --git a/chipsec/hal/spi.py b/chipsec/hal/spi.py
index 52f6043b..3aefdd10 100644
--- a/chipsec/hal/spi.py
+++ b/chipsec/hal/spi.py
@@ -1,6 +1,6 @@
#!/usr/bin/python
#CHIPSEC: Platform Security Assessment Framework
-#Copyright (c) 2010-2019, Intel Corporation
+#Copyright (c) 2010-2020, Intel Corporation
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
@@ -55,7 +55,6 @@ usage:
import struct
import sys
import time
-import xml.etree.ElementTree as ET
import chipsec.defines
from chipsec.file import *
@@ -176,10 +175,6 @@ class SpiAccessError (RuntimeError):
class SPI(hal_base.HALBase):
- # XML device definition files stuff
- XML_ROOT_NAME = "SFDP"
- XML_COMMAND_NODE_TAG = "register"
- XML_FIELD_NODE_TAG = "field"
def __init__(self, cs):
super(SPI, self).__init__(cs)
@@ -699,94 +694,39 @@ class SPI(hal_base.HALBase):
#
# SPI SFDP operations
#
- def parse_dev_file(self, file_path):
- return ET.parse(file_path)
-
- def check_def_file(self, filename):
- base_name = os.path.basename(filename)
- full_path = os.path.join( chipsec.file.get_main_dir(), 'chipsec/cfg', base_name )
-
- if not os.path.exists(full_path):
- self.logger.error("The file %s does not exist!" % base_name)
- return False
- else:
- if logger().VERBOSE: self.logger.log("checking file {0} ...".format(base_name))
- try:
- tree = self.parse_dev_file(full_path)
- except:
- logger().log( "Failed parsing the sfdp.xml file provided")
- return False
- if tree.getroot().tag == self.XML_ROOT_NAME :
- if logger().VERBOSE: self.logger.log("file {0} looks OK ...".format(base_name))
- return full_path
- else:
- self.logger.error("The file {0} has an inappropriate structure!".format(base_name))
- return False
-
- def get_formated_list_str(self, _list):
- return "[ " + ", ".join("0x{0:02x}".format(int(i)) for i in _list) + " ]"
-
- def show_command_result(self, command, result):
- self.logger.log(" name: {0:<20} reg_value: {1} : {2:s}".format(
- command.attrib["name"],
- self.get_formated_list_str(result),
- command.attrib["desc"]))
-
- # look if command in XML dev file has some childs
- for child in command:
- if child.tag and child.tag == self.XML_FIELD_NODE_TAG:
- # mask all found bit fields...
- byte = int(result[0])
- bitno = int(child.attrib["bit"])
- length = int(child.attrib["size"])
- mask = (2 ** length) - 1
- bitval = (byte & (mask << bitno)) >> bitno
-
- # ...and self.logger.log them
- self.logger.log("\tfield: {0:<25} value: {1:<12s} \t: {2:s}".format(
- child.attrib["name"],
- "0x{0:02x}".format(bitval),
- #"0b{0:0{width}b}".format(bitval, width=length),
- child.attrib["desc"]))
+ def ptmesg(self, offset):
+ self.spi_reg_write(self.bios_ptinx, offset)
+ self.spi_reg_read(self.bios_ptinx)
+ return self.spi_reg_read(self.bios_ptdata)
def get_SPI_SFDP(self):
ret = False
for component in range(0,2):
- logger().log( "Scanning for Flash device %d" % (component+1))
- offset = 0x0000
- offset = offset | (component << 14)
- self.spi_reg_write(self.bios_ptinx, offset)
- self.spi_reg_read(self.bios_ptinx)
- sfdp_signature = self.spi_reg_read(self.bios_ptdata)
+ logger().log( "Scanning for Flash device {:d}".format(component+1))
+ offset = 0x0000 | (component << 14)
+ sfdp_signature = self.ptmesg(offset)
if sfdp_signature == SFDP_HEADER:
- logger().log( " * Found valid SFDP header for Flash device %d" % (component+1))
+ logger().log( " * Found valid SFDP header for Flash device {:d}".format(component+1))
ret = True
else:
- logger().log ( " * Didn't find a valid SFDP header for Flash device %d" % (component+1))
+ logger().log ( " * Didn't find a valid SFDP header for Flash device {:d}".format(component+1))
continue
# Increment offset to read second dword of SFDP header structure
- offset += 0x4
- self.spi_reg_write(self.bios_ptinx, offset)
- self.spi_reg_read(self.bios_ptinx)
- sfdp_data = self.spi_reg_read(self.bios_ptdata)
+ sfdp_data = self.ptmesg(offset+0x4)
sfdp_minor_version = sfdp_data & 0xFF
sfdp_major_version = ( sfdp_data >> 8) & 0xFF
- logger().log( " SFDP version number: %s.%s" % (sfdp_major_version, sfdp_minor_version))
+ logger().log( " SFDP version number: {}.{}".format(sfdp_major_version, sfdp_minor_version))
num_of_param_headers = ((sfdp_data >> 16) & 0xFF) +1
- logger().log( " Number of parameter headers: %d" % num_of_param_headers)
- offset = 0x0000
- offset = offset | (component << 14)
+ logger().log( " Number of parameter headers: {:d}".format(num_of_param_headers))
# Set offset to read 1st Parameter Table in the SFDP header structure
offset = offset | 0x1000
- self.spi_reg_write(self.bios_ptinx, offset)
- self.spi_reg_read(self.bios_ptinx)
- parameter_1 = self.spi_reg_read(self.bios_ptdata)
+ parameter_1 = self.ptmesg(offset)
param1_minor_version = (parameter_1 >> 8) & 0xFF
param1_major_version = (parameter_1 >> 16) & 0xFF
param1_length = (parameter_1 >> 24) & 0xFF
logger().log( " * Parameter Header 1 (JEDEC)" )
- logger().log( " ** Parameter version number: %s.%s" % (param1_major_version, param1_minor_version))
- logger().log( " ** Parameter length in double words: %s" % hex(param1_length))
+ logger().log( " ** Parameter version number: {}.{}".format(param1_major_version, param1_minor_version))
+ logger().log( " ** Parameter length in double words: {}".format(hex(param1_length)))
if (num_of_param_headers > 1) and self.cs.register_has_field( 'HSFS', 'FCYCLE' ):
self.check_hardware_sequencing()
self.spi_reg_write( self.fdata12_off, 0x00000000 )
@@ -800,7 +740,7 @@ class SPI(hal_base.HALBase):
pTable_length = []
# Calculate which fdata_offset registers to read, based on number of parameter headers present
for i in range(1,num_of_param_headers):
- logger().log( " * Parameter Header:%d" % (i+1) )
+ logger().log( " * Parameter Header:{:d}".format(i+1) )
data_reg_1 = "self.fdata" + str(2+(2*i)) + "_off"
data_reg_2 = "self.fdata" + str(2+(2*i)+1) + "_off"
data_dword_1 = self.spi_reg_read( eval(data_reg_1))
@@ -810,33 +750,22 @@ class SPI(hal_base.HALBase):
param_major_version = (data_dword_1 >> 16) & 0xFF
param_length = (data_dword_1 >> 24) & 0xFF
param_table_pointer = (data_dword_2 & 0x00FFFFFF)
- logger().log( " ** Parameter version number: %s.%s" % (param_major_version, param_minor_version))
- logger().log( " ** Pramaeter length in double words: %s" % hex(param_length))
- logger().log( " ** Parameter ID: %s" % hex(id_manuf))
- logger().log( " ** Parameter Table Pointer(byte address): %s " % hex(param_table_pointer))
+ logger().log( " ** Parameter version number:{}.{}".format(param_major_version, param_minor_version))
+ logger().log( " ** Pramaeter length in double words: {}".format(hex(param_length)))
+ logger().log( " ** Parameter ID: {}".format(hex(id_manuf)))
+ logger().log( " ** Parameter Table Pointer(byte address): {} ".format(hex(param_table_pointer)))
pTable_offset_list.append(param_table_pointer)
pTable_length.append(param_length)
- offset = 0
- offset = offset | (component << 14)
+ offset = 0x0000 | (component << 14)
# Set offset to read 1st Parameter table ( JEDEC Basic Flash Parameter Table) content and Parse it
offset = offset | 0x2000
logger().log( " ")
logger().log( " * 1'st Parameter Table Content ")
- self.dev_file = self.check_def_file("sfdp.xml")
- if self.dev_file is False:
- continue
- tree = self.parse_dev_file(self.dev_file)
- root = tree.getroot()
- count = 0
- for child in root:
- if ( count >= param1_length):
- break
- self.spi_reg_write(self.bios_ptinx, offset)
- self.spi_reg_read(self.bios_ptinx)
- sfdp_data = self.spi_reg_read(self.bios_ptdata)
- count +=1
+ for count in range(1,param1_length+1):
+ sfdp_data = self.ptmesg(offset)
offset +=4
- self.show_command_result(child, [sfdp_data])
+ self.cs.print_register("DWORD{}".format(count), sfdp_data)
+ return ret
#
# SPI JEDEC ID operations
diff --git a/chipsec/utilcmd/spi_cmd.py b/chipsec/utilcmd/spi_cmd.py
index 69968ec3..9738ea06 100644
--- a/chipsec/utilcmd/spi_cmd.py
+++ b/chipsec/utilcmd/spi_cmd.py
@@ -1,6 +1,6 @@
#!/usr/bin/python
#CHIPSEC: Platform Security Assessment Framework
-#Copyright (c) 2010-2018, Intel Corporation
+#Copyright (c) 2010-2020, Intel Corporation
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
@@ -75,7 +75,7 @@ class SPICommand(BaseCommand):
spi_op = self.argv[2]
if spi_op in ['read', 'write','erase'] and len(self.argv) < 4:
- print SPICommand.__doc__
+ print (SPICommand.__doc__)
return
t = time.time()
@@ -92,12 +92,12 @@ class SPICommand(BaseCommand):
if 5 == len(self.argv):
filename = self.argv[4]
if not os.path.exists(filename):
- self.logger.error( "File %s doesn't exist" % filename)
+ self.logger.error( "File {} doesn't exist".format(filename))
return
else:
- print SPICommand.__doc__
+ print (SPICommand.__doc__)
return
- self.logger.log( "[CHIPSEC] writing to SPI flash memory at FLA = 0x{:X} from '{:64}'".format(spi_fla, filename) )
+ self.logger.log( "[CHIPSEC] writing to SPI flash memory at FLA = 0x{:X} from '{:64s}'".format(spi_fla, filename) )
ok = _spi.write_spi_from_file( spi_fla, filename )
if ok: self.logger.log( "[CHIPSEC] completed SPI flash memory write" )
@@ -108,14 +108,14 @@ class SPICommand(BaseCommand):
length = int(self.argv[4],16)
else:
length = 0x4
- self.logger.log( "[CHIPSEC] reading 0x{:X} bytes from SPI Flash starting at FLA = 0x{:X}".format(length, spi_fla) )
+ self.logger.log( "[CHIPSEC] reading 0x{:x} bytes from SPI Flash starting at FLA = 0x{:X}".format(length, spi_fla) )
self.logger.log( "[CHIPSEC] {}".format(_msg) )
out_file = None
if 6 == len(self.argv):
if os.path.exists(self.argv[5]):
out_file = self.argv[5]
else:
- self.logger.error( "File %s doesn't exist" % self.argv[5])
+ self.logger.error( "File {} doesn't exist".format(self.argv[5]))
return
buf = _spi.read_spi_to_file( spi_fla, length, out_file )
if (buf is None): self.logger.error( "SPI flash read didn't return any data (turn on VERBOSE)" )
@@ -165,7 +165,7 @@ class SPICommand(BaseCommand):
else:
self.logger.log( ' JEDEC ID command is not supported ')
else:
- print SPICommand.__doc__
+ print (SPICommand.__doc__)
return
elif ( 'sfdp' == spi_op):
_spi.get_SPI_SFDP()