From cc487139460ed8d176d2909d3330cbdff1196ec6 Mon Sep 17 00:00:00 2001 From: Sangho Lee Date: Wed, 5 Aug 2026 22:35:57 +0000 Subject: [PATCH] Fix forced signal delivery --- litebox_shim_linux/src/syscalls/signal/mod.rs | 5 +++- litebox_shim_linux/src/syscalls/tests.rs | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/litebox_shim_linux/src/syscalls/signal/mod.rs b/litebox_shim_linux/src/syscalls/signal/mod.rs index b793a35fd..3cc033bb0 100644 --- a/litebox_shim_linux/src/syscalls/signal/mod.rs +++ b/litebox_shim_linux/src/syscalls/signal/mod.rs @@ -707,7 +707,10 @@ impl Task { } fn force_signal_with_info(&self, signal: Signal, force_exit: bool, siginfo: Siginfo) { - assert!(matches!(signal, Signal::SIGKILL | Signal::SIGSEGV)); + assert!(matches!( + signal, + Signal::SIGKILL | Signal::SIGSEGV | Signal::SIGFPE | Signal::SIGTRAP | Signal::SIGILL + )); self.signals .pending diff --git a/litebox_shim_linux/src/syscalls/tests.rs b/litebox_shim_linux/src/syscalls/tests.rs index 3f77c3334..c7ac1fdf9 100644 --- a/litebox_shim_linux/src/syscalls/tests.rs +++ b/litebox_shim_linux/src/syscalls/tests.rs @@ -7,6 +7,11 @@ use zerocopy::FromBytes as _; use crate::UserPtrMut; +#[cfg(target_arch = "x86_64")] +use litebox::shim::{Exception, ExceptionInfo}; +#[cfg(target_arch = "x86_64")] +use litebox_common_linux::signal::Signal; + extern crate std; const TEST_TAR_FILE: &[u8] = include_bytes!("../../../litebox/src/fs/test.tar"); @@ -78,6 +83,26 @@ pub(crate) fn init_platform( task } +#[cfg(target_arch = "x86_64")] +#[test] +fn exceptions_queue_their_corresponding_signals() { + let task = init_platform(None); + + for (exception, signal) in [ + (Exception::DIVIDE_ERROR, Signal::SIGFPE), + (Exception::BREAKPOINT, Signal::SIGTRAP), + (Exception::INVALID_OPCODE, Signal::SIGILL), + ] { + task.handle_exception_request(&ExceptionInfo { + exception, + error_code: 0, + cr2: 0, + kernel_mode: false, + }); + assert!(task.pending_signal_set().contains(signal)); + } +} + #[test] fn test_fcntl() { let task = init_platform(None);