From 13ba013413b66a5fcce2a65b0d023e226c1f2068 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 13 Apr 2025 18:31:12 +0200 Subject: [PATCH] Handle interrupts in icicle --- src/backends/icicle-emulator/icicle-bridge/src/icicle.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/backends/icicle-emulator/icicle-bridge/src/icicle.rs b/src/backends/icicle-emulator/icicle-bridge/src/icicle.rs index fc91c93b..d9b07b9f 100644 --- a/src/backends/icicle-emulator/icicle-bridge/src/icicle.rs +++ b/src/backends/icicle-emulator/icicle-bridge/src/icicle.rs @@ -328,11 +328,12 @@ impl IcicleEmulator { fn handle_exception(&mut self, code: ExceptionCode, value: u64) -> bool { let continue_execution = match code { - ExceptionCode::Syscall => self.handle_syscall(), + ExceptionCode::Syscall => self.handle_syscall(value), ExceptionCode::ReadPerm => self.handle_violation(value, FOREIGN_READ, false), ExceptionCode::WritePerm => self.handle_violation(value, FOREIGN_WRITE, false), ExceptionCode::ReadUnmapped => self.handle_violation(value, FOREIGN_READ, true), ExceptionCode::WriteUnmapped => self.handle_violation(value, FOREIGN_WRITE, true), + ExceptionCode::SoftwareBreakpoint => self.handle_interrupt(3), ExceptionCode::InvalidInstruction => self.handle_interrupt(6), ExceptionCode::DivisionException => self.handle_interrupt(0), _ => false, @@ -356,7 +357,11 @@ impl IcicleEmulator { return continue_execution; } - fn handle_syscall(&mut self) -> bool { + fn handle_syscall(&mut self, value: u64) -> bool { + if value != 0 { + return self.handle_interrupt(value as i32); + } + for (_key, func) in self.syscall_hooks.get_hooks() { func(); }