Skip to content

Commit c184de2

Browse files
committed
Add SMI enumeration mode to the smm_ptr module
Signed-off-by: Carles Pey <[email protected]>
1 parent 5558244 commit c184de2

File tree

6 files changed

+319
-23
lines changed

6 files changed

+319
-23
lines changed

chipsec/hal/interrupts.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,18 @@ def send_SW_SMI(self, thread_id: int, SMI_code_port_value: int, SMI_data_port_va
6262
logger().log_hal(f" RDI = 0x{_rdi:016X}")
6363
return self.cs.helper.send_sw_smi(thread_id, SMI_code_data, _rax, _rbx, _rcx, _rdx, _rsi, _rdi)
6464

65+
def send_SW_SMI_timed(self, thread_id: int, SMI_code_port_value: int, SMI_data_port_value: int, _rax: int, _rbx: int, _rcx: int, _rdx: int, _rsi: int, _rdi: int) -> Optional[Tuple[int, int, int, int, int, int, int]]:
66+
SMI_code_data = (SMI_data_port_value << 8 | SMI_code_port_value)
67+
logger().log_hal(
68+
f"[intr] Sending SW SMI: code port 0x{SMI_APMC_PORT:02X} <- 0x{SMI_code_port_value:02X}, data port 0x{SMI_APMC_PORT + 1:02X} <- 0x{SMI_data_port_value:02X} (0x{SMI_code_data:04X})")
69+
logger().log_hal(f" RAX = 0x{_rax:016X} (AX will be overridden with values of SW SMI ports B2/B3)")
70+
logger().log_hal(f" RBX = 0x{_rbx:016X}")
71+
logger().log_hal(f" RCX = 0x{_rcx:016X}")
72+
logger().log_hal(f" RDX = 0x{_rdx:016X} (DX will be overridden with 0x00B2)")
73+
logger().log_hal(f" RSI = 0x{_rsi:016X}")
74+
logger().log_hal(f" RDI = 0x{_rdi:016X}")
75+
return self.cs.helper.send_sw_smi_timed(thread_id, SMI_code_data, _rax, _rbx, _rcx, _rdx, _rsi, _rdi)
76+
6577
def send_SMI_APMC(self, SMI_code_port_value: int, SMI_data_port_value: int) -> None:
6678
logger().log_hal(f"[intr] sending SMI via APMC ports: code 0xB2 <- 0x{SMI_code_port_value:02X}, data 0xB3 <- 0x{SMI_data_port_value:02X}")
6779
self.cs.io.write_port_byte(SMI_DATA_PORT, SMI_data_port_value)

chipsec/helper/linux/linuxhelper.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
IOCTL_VA2PA = 0x14
7373
IOCTL_MSGBUS_SEND_MESSAGE = 0x15
7474
IOCTL_FREE_PHYSMEM = 0x16
75+
IOCTL_SWSMI_TIMED = 0x17
7576

7677
_tools = {}
7778

@@ -618,6 +619,13 @@ def send_sw_smi(self, cpu_thread_id: int, SMI_code_data: int, _rax: int, _rbx: i
618619
ret = struct.unpack(f'7{self._pack}', out_buf)
619620
return ret
620621

622+
def send_sw_smi_timed(self, cpu_thread_id: int, SMI_code_data: int, _rax: int, _rbx: int, _rcx: int, _rdx: int, _rsi: int, _rdi: int) -> Optional[Tuple[int, int, int, int, int, int, int]]:
623+
self.set_affinity(cpu_thread_id)
624+
in_buf = struct.pack(f'8{self._pack}', SMI_code_data, _rax, _rbx, _rcx, _rdx, _rsi, _rdi, 0)
625+
out_buf = self.ioctl(IOCTL_SWSMI_TIMED, in_buf)
626+
ret = struct.unpack(f'8{self._pack}', out_buf)
627+
return ret
628+
621629
#
622630
# File system
623631
#

0 commit comments

Comments
 (0)