diff --git a/redox-rt/src/arch/x86_64.rs b/redox-rt/src/arch/x86_64.rs index 86a9892568..fa2f9e372a 100644 --- a/redox-rt/src/arch/x86_64.rs +++ b/redox-rt/src/arch/x86_64.rs @@ -12,10 +12,7 @@ use syscall::{ use crate::{ proc::{fork_inner, FdGuard, ForkArgs}, - signal::{ - get_sigaltstack, inner_c, PosixStackt, RtSigarea, SigStack, - PROC_CONTROL_STRUCT, - }, + signal::{get_sigaltstack, inner_c, PosixStackt, RtSigarea, SigStack, PROC_CONTROL_STRUCT}, Tcb, }; diff --git a/redox-rt/src/signal.rs b/redox-rt/src/signal.rs index c7ac63dccd..da332ef753 100644 --- a/redox-rt/src/signal.rs +++ b/redox-rt/src/signal.rs @@ -6,7 +6,9 @@ use syscall::{ SIGCHLD, SIGKILL, SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU, SIGURG, SIGWINCH, }; -use crate::{arch::*, proc::FdGuard, protocol::{ProcCall, ThreadCall}, sync::Mutex, sys::{proc_call, thread_call}, RtTcb, Tcb}; +use crate::{ + arch::*, proc::FdGuard, protocol::ThreadCall, sync::Mutex, sys::thread_call, RtTcb, Tcb, +}; #[cfg(target_arch = "x86_64")] static CPUID_EAX1_ECX: core::sync::atomic::AtomicU32 = core::sync::atomic::AtomicU32::new(0); @@ -576,13 +578,11 @@ pub fn setup_sighandler(tcb: &RtTcb) { syscall::dup(**tcb.thread_fd(), b"sighandler").expect("failed to open sighandler fd"), ); let _ = syscall::write(*fd, &data).expect("failed to write to sighandler fd"); - thread_call(&mut [], CallFlags::empty(), &[ - ThreadCall::SyncSigTctl as usize, - ]); - // TODO: Only run for first thread - proc_call(&mut [], CallFlags::empty(), &[ - ProcCall::SyncSigPctl as usize, - ]); + thread_call( + &mut [], + CallFlags::empty(), + &[ThreadCall::SyncSigTctl as usize], + ); // TODO: Inherited set of ignored signals set_sigmask(Some(0), None); diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index 5d9bb146eb..85d37932cd 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -10,7 +10,11 @@ use syscall::{ }; use crate::{ - arch::manually_enter_trampoline, proc::FdGuard, protocol::{ProcCall, ProcKillTarget, WaitFlags}, signal::tmp_disable_signals, DynamicProcInfo, RtTcb, Tcb, DYNAMIC_PROC_INFO + arch::manually_enter_trampoline, + proc::FdGuard, + protocol::{ProcCall, ProcKillTarget, WaitFlags}, + signal::tmp_disable_signals, + DynamicProcInfo, RtTcb, Tcb, DYNAMIC_PROC_INFO, }; #[inline] @@ -112,7 +116,12 @@ pub unsafe fn sys_futex_wake(addr: *mut u32, num: u32) -> Result { ) .map(|awoken| awoken as u32) } -pub fn sys_call(fd: usize, payload: &mut [u8], flags: CallFlags, metadata: &[usize]) -> Result { +pub fn sys_call( + fd: usize, + payload: &mut [u8], + flags: CallFlags, + metadata: &[usize], +) -> Result { unsafe { syscall::syscall5( syscall::SYS_CALL, diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 016f4eec36..55139c1972 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -335,6 +335,13 @@ pub unsafe fn init(auxvs: Box<[[usize; 2]]>) { }; redox_rt::initialize(FdGuard::new(proc_fd)); + // TODO: Is it safe to assume setup_sighandler has been called at this point? + redox_rt::sys::proc_call( + &mut [], + syscall::CallFlags::empty(), + &[redox_rt::protocol::ProcCall::SyncSigPctl as usize], + ); + if let (Some(cwd_ptr), Some(cwd_len)) = ( get_auxv(&auxvs, AT_REDOX_INITIAL_CWD_PTR), get_auxv(&auxvs, AT_REDOX_INITIAL_CWD_LEN),