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()