mirror of
https://github.com/chipsec/chipsec
synced 2026-06-08 13:31:00 +00:00
Update SDFP commit
Moved sfdp to common configuration updated spi hal to use register functions opposed to xml parsing Signed-off-by: BrentHoltsclaw <brent.holtsclaw@intel.com>
This commit is contained in:
+26
-22
@@ -1,5 +1,7 @@
|
||||
<SFDP>
|
||||
<register name="DWORD1" offset="0x00" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 1st DWORD " >
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<registers>
|
||||
<register name="DWORD1" offset="0x00" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 1st DWORD " >
|
||||
<field name="BLK_ERASE_SUPPORT" bit="0" size="2" desc="Block Sector Erase Sizes" />
|
||||
<field name="WR_GRANULTY" bit="2" size="1" desc="Write Granularity" />
|
||||
<field name="BLK_PRT_VOL_STATUS" bit="3" size="1" desc="Write Enable Instruction Required for Writing to Volatile Status Register" />
|
||||
@@ -14,10 +16,10 @@
|
||||
<field name="FASTREAD_114_SUPPORT" bit="22" size="1" desc="Supports ( 1-4-4) fast read" />
|
||||
<field name="UNUSED" bit="23" size="9" desc="Unused" />
|
||||
</register>
|
||||
<register name="DWORD2" offset="0x04" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 2nd DWORD " >
|
||||
<register name="DWORD2" offset="0x04" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 2nd DWORD " >
|
||||
<field name="FLASH_MEM_DENSITY" bit="0" size="32" desc="Flash Memory Density" />
|
||||
</register>
|
||||
<register name="DWORD3" offset="0x08" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 3rd DWORD " >
|
||||
<register name="DWORD3" offset="0x08" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 3rd DWORD " >
|
||||
<field name="144_FR_NUM_WAIT_STATES" bit="0" size="5" desc="(1-4-4) fast read number of wait states (dummy clocks) needed before valid
|
||||
output" />
|
||||
<field name="144_FR_QUAD_NUM_MODE_CLKS" bit="5" size="3" desc="Quad Input Address Quad Output (1-4-4) Fast Read Number of Mode Bits" />
|
||||
@@ -27,7 +29,7 @@ output" />
|
||||
<field name="114_FR_INST" bit="24" size="8" desc="(1-1-4) fast read Opcode" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD4" offset="0xC" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 4th DWORD " >
|
||||
<register name="DWORD4" offset="0xC" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 4th DWORD " >
|
||||
<field name="112_FR_NUM_WAIT_STATES" bit="0" size="5" desc="(1-1-2) fast read Number of Wait states (dummy clocks) needed before valid
|
||||
output" />
|
||||
<field name="112_FR_NUM_MODE_CLKS" bit="5" size="3" desc="(1-1-2) fast read Number of Mode Bits" />
|
||||
@@ -37,14 +39,14 @@ output" />
|
||||
<field name="122_FR_INST" bit="24" size="8" desc="(1-2-2) fast read Opcode" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD5" offset="0x10" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 5th DWORD " >
|
||||
<register name="DWORD5" offset="0x10" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 5th DWORD " >
|
||||
<field name="222_FR_SUPPORT" bit="0" size="1" desc="Supports (2-2-2) fast read" />
|
||||
<field name="Reserved" bit="1" size="3" desc="Reserved" />
|
||||
<field name="444_FR_SUPPORT" bit="4" size="1" desc="Supports ( 4-4-4) fast read" />
|
||||
<field name="RESERVED" bit="5" size="27" desc="Reserved" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD6" offset="0x14" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 6th DWORD " >
|
||||
<register name="DWORD6" offset="0x14" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 6th DWORD " >
|
||||
<field name="RESERVED" bit="0" size="16" desc="Reserved" />
|
||||
<field name="222_FR_NUM_WAIT_STATES" bit="16" size="5" desc="(2-2-2) fast read Number of Wait states (dummy clocks) needed before valid
|
||||
output" />
|
||||
@@ -52,7 +54,7 @@ output" />
|
||||
<field name="222_FR_INST" bit="24" size="8" desc="(2-2-2) fast read Opcode" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD7" offset="0x18" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 7th DWORD " >
|
||||
<register name="DWORD7" offset="0x18" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 7th DWORD " >
|
||||
<field name="RESERVED" bit="0" size="16" desc="Reserved" />
|
||||
<field name="444_FR_NUM_WAIT_STATES" bit="16" size="5" desc="(4-4-4) fast read number of wait states (dummy clocks) needed before valid
|
||||
output" />
|
||||
@@ -60,21 +62,21 @@ output" />
|
||||
<field name="444_FR_INST" bit="24" size="8" desc="(4-4-4) fast read Opcode" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD8" offset="0x1C" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 8th DWORD " >
|
||||
<register name="DWORD8" offset="0x1C" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 8th DWORD " >
|
||||
<field name="ERASE_TYPE1_SIZE" bit="0" size="8" desc="Sector Type 1 size" />
|
||||
<field name="ERASE_TYPE1_INST" bit="8" size="8" desc="Sector Type 1 Opcode" />
|
||||
<field name="ERASE_TYPE2_SIZE" bit="16" size="8" desc="Sector Type 2 size" />
|
||||
<field name="ERASE_TYPE1_INST" bit="24" size="8" desc="Sector Type 2 Opcode" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD9" offset="0x20" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 9th DWORD " >
|
||||
<register name="DWORD9" offset="0x20" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 9th DWORD " >
|
||||
<field name="ERASE_TYPE3_SIZE" bit="0" size="8" desc="Sector Type 3 size" />
|
||||
<field name="ERASE_TYPE3_OPCODE" bit="8" size="8" desc="Sector Type 3 Opcode" />
|
||||
<field name="ERASE_TYPE4_SIZE" bit="16" size="8" desc="Sector Type 4 size" />
|
||||
<field name="ERASE_TYPE4_OPCODE" bit="24" size="8" desc="Sector Type 4 Opcode" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD10" offset="0x24" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 10th DWORD " >
|
||||
<register name="DWORD10" offset="0x24" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 10th DWORD " >
|
||||
<field name="MULTIPLIER" bit="0" size="4" desc="Multiplier from typical erase time to maximum erase time" />
|
||||
<field name="ERASE_TYPE1_TIME" bit="4" size="7" desc="Erase Type 1 Erase, Typical time" />
|
||||
<field name="ERASE_TYPE2_TIME" bit="11" size="7" desc="Erase Type 2 Erase, Typical time" />
|
||||
@@ -82,7 +84,7 @@ output" />
|
||||
<field name="ERASE_TYPE4_TIME" bit="25" size="7" desc="Erase Type 4 Erase, Typical time" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD11" offset="0x28" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 11th DWORD " >
|
||||
<register name="DWORD11" offset="0x28" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 11th DWORD " >
|
||||
<field name="MULTIPLIER" bit="0" size="4" desc="Multiplier from typical to maximum erase time for page or Byte program" />
|
||||
<field name="PAGE_SIZE" bit="4" size="4" desc="Page Size" />
|
||||
<field name="PAGE_PRG_TYPICAL_TIME" bit="8" size="6" desc="Page Program Typical time" />
|
||||
@@ -92,7 +94,7 @@ output" />
|
||||
<field name="Reserved" bit="31" size="1" desc="Reserved" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD12" offset="0x2C" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 12th DWORD " >
|
||||
<register name="DWORD12" offset="0x2C" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 12th DWORD " >
|
||||
<field name="PO_PRG_SUSPEND" bit="0" size="4" desc="Prohibited Operations During Program Suspend" />
|
||||
<field name="PO_ERASE_SUSPEND" bit="4" size="4" desc="Prohibited Operations During Erase Suspend" />
|
||||
<field name="Reserved" bit="8" size="1" desc="Reserved" />
|
||||
@@ -103,14 +105,14 @@ output" />
|
||||
<field name="SUSPEND_RESUME_SUPPORT" bit="31" size="1" desc="Suspend/Resume Supported" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD13" offset="0x30" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 13th DWORD " >
|
||||
<register name="DWORD13" offset="0x30" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 13th DWORD " >
|
||||
<field name="PRG_RESUME_INST" bit="0" size="8" desc="Program Resume Instruction" />
|
||||
<field name="PRG_SUSP_INST" bit="8" size="8" desc="Program Suspend Instruction" />
|
||||
<field name="RESUME_INST" bit="16" size="8" desc="Resume Instruction" />
|
||||
<field name="SUSP_INST" bit="24" size="8" desc="Suspend Instruction" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD14" offset="0x34" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 14th DWORD " >
|
||||
<register name="DWORD14" offset="0x34" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 14th DWORD " >
|
||||
<field name="RESERVED" bit="0" size="2" desc="Reserved" />
|
||||
<field name="STS_POLLING_BUSY" bit="2" size="6" desc="Status Register Polling Device Busy" />
|
||||
<field name="EXIT_DPWDOWN_DELAY" bit="8" size="7" desc="Exit Deep Powerdown to next operation delay" />
|
||||
@@ -119,7 +121,7 @@ output" />
|
||||
<field name="DPWDOWN_SUPPORT" bit="31" size="1" desc="Deep Powerdown Supported" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD15" offset="0x38" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 15th DWORD " >
|
||||
<register name="DWORD15" offset="0x38" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 15th DWORD " >
|
||||
<field name="444_DISABLE_SEQ" bit="0" size="4" desc="4-4-4 mode disable sequences" />
|
||||
<field name="444_ENABLE_SEQ" bit="4" size="5" desc="4-4-4 mode enable sequences" />
|
||||
<field name="044_MODE_SUPPORTED" bit="9" size="1" desc="0-4-4 mode supported" />
|
||||
@@ -130,14 +132,14 @@ output" />
|
||||
<field name="RESERVED" bit="24" size="8" desc="Reserved" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD16" offset="0x3C" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 16th DWORD " >
|
||||
<register name="DWORD16" offset="0x3C" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 16th DWORD " >
|
||||
<field name="VLT_WRENABLE_INST" bit="0" size="7" desc="Volatile or Non-Volatile Register and Write Enable Instruction for Status Register 1" />
|
||||
<field name="RESERVED" bit="7" size="1" desc="Reserved" />
|
||||
<field name="SRESET_RESC_SUPPORT" bit="8" size="6" desc="Soft Reset and Rescue Sequence Support" />
|
||||
<field name="EXIT_4BYTE_ADDR" bit="14" size="10" desc="Exit 4 Byte Addressing" />
|
||||
<field name="ENTER_4BYTE_ADDR" bit="24" size="8" desc="Enter 4 Byte Addressing" />
|
||||
</register>
|
||||
<register name="DWORD17" offset="0x40" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 17th DWORD " >
|
||||
<register name="DWORD17" offset="0x40" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 17th DWORD " >
|
||||
<field name="188_FR_NUM_WAIT_STATES" bit="0" size="5" desc="(1-8-8) Fast Read Number of Wait states (dummy clocks) needed before valid output" />
|
||||
<field name="188_FR_NUM_MOD_CLKS" bit="5" size="3" desc="(1-8-8) Fast Read Number of Mode Clocks" />
|
||||
<field name="188_FR_INST" bit="8" size="8" desc="(1-8-8) Fast Read Instruction" />
|
||||
@@ -145,7 +147,7 @@ output" />
|
||||
<field name="118_FR_NUM_MOD_CLKS" bit="21" size="3" desc="(1-1-8) Fast Read Number of Mode Clocks" />
|
||||
<field name="118_FR_INST" bit="24" size="8" desc="(1-8-8) Fast Read Instruction" />
|
||||
</register>
|
||||
<register name="DWORD18" offset="0x44" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 18th DWORD " >
|
||||
<register name="DWORD18" offset="0x44" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 18th DWORD " >
|
||||
<field name="Reserved" bit="0" size="18" desc="Reserved" />
|
||||
<field name="VAR_OUT_DRV_STRENGTH" bit="18" size="5" desc="Variable Output Driver Strength" />
|
||||
<field name="JEDEC_SPI_RESET" bit="23" size="1" desc="JEDEC SPI Protocol Reset (In-Band Reset)" />
|
||||
@@ -157,7 +159,7 @@ output" />
|
||||
<field name="8D8D8D_BYTE_ORDER_MODE" bit="31" size="1" desc="Octal DTR (8D-8D-8D) Command and Command Extension" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD19" offset="0x48" access="R Byte" desc="JEDEC Basic Flash Parameter Table: 19th DWORD " >
|
||||
<register name="DWORD19" offset="0x48" type="R Byte" desc="JEDEC Basic Flash Parameter Table: 19th DWORD " >
|
||||
<field name="8S8S8S_DISABLE_SEQ" bit="0" size="4" desc="8S-8S-8S mode disable sequences" />
|
||||
<field name="8S8S8S_ENABLE_SEQ" bit="4" size="5" desc="8S-8S-8S mode enable sequences" />
|
||||
<field name="088_MODE_SUPPORTED" bit="9" size="1" desc="0-8-8 mode supported" />
|
||||
@@ -167,7 +169,7 @@ output" />
|
||||
<field name="RESERVED" bit="23" size="9" desc="Reserved" />
|
||||
</register>
|
||||
|
||||
<register name="DWORD20" offset="0x4C" access="R Byte" desc=" " >
|
||||
<register name="DWORD20" offset="0x4C" type="R Byte" desc=" " >
|
||||
<field name="MAX4SMODE_SPEED_WITHOUT_STRB" bit="0" size="4" desc="Maximum operation speed of device in 4S-4S-4S mode when not utilizing Data Strobe" />
|
||||
<field name="MAX4SMODE_SPEED_WITH_STRB" bit="4" size="4" desc="Maximum operation speed of device in 4S-4S-4S mode when utilizing Data Strobe" />
|
||||
<field name="MAX4S4D4DMODE_SPEED_WITHOUT_STRB" bit="8" size="4" desc="Maximum operation speed of device in 4S-4D-4D mode when not utilizing Data Strobe" />
|
||||
@@ -178,5 +180,7 @@ output" />
|
||||
<field name="MAX8DMODE_SPEED_WITH_STRB" bit="28" size="4" desc="Maximum operation speed of device in 8D-8D-8D mode when utilizing Data Strobe" />
|
||||
</register>
|
||||
|
||||
</SFDP>
|
||||
</registers>
|
||||
|
||||
</configuration>
|
||||
|
||||
|
||||
+4
-2
@@ -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 )
|
||||
|
||||
+26
-97
@@ -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 <field> 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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user