diff --git a/redox-rt/src/arch/x86_64.rs b/redox-rt/src/arch/x86_64.rs index cade85a186f1ca0ae78ccd08e1ce0a59779a1afa..6c12a9642f69535c27fb35878b05670782a2b538 100644 --- a/redox-rt/src/arch/x86_64.rs +++ b/redox-rt/src/arch/x86_64.rs @@ -78,7 +78,11 @@ asmfunction!(__relibc_internal_fork_wrapper -> usize: [" mov rdi, rsp call __relibc_internal_fork_impl - jmp 2f + + add rsp, 80 + + pop rbp + ret "] <= []); asmfunction!(__relibc_internal_fork_ret: [" @@ -91,8 +95,6 @@ asmfunction!(__relibc_internal_fork_ret: [" xor rax, rax - .p2align 4 -2: add rsp, 32 pop r15 pop r14 diff --git a/redox-rt/src/signal.rs b/redox-rt/src/signal.rs index e45cfa4c4c84c30699de8ad7eeacfae5f348663c..03da284d261ab277e644e47e9240b8d032e451ef 100644 --- a/redox-rt/src/signal.rs +++ b/redox-rt/src/signal.rs @@ -129,16 +129,17 @@ pub fn sigaction(signal: u8, new: Option<&Sigaction>, old: Option<&mut Sigaction let _sigguard = tmp_disable_signals(); let ctl = current_sigctl(); - let guard = SIGACTIONS.lock(); + let mut guard = SIGACTIONS.lock(); let old_ignmask = IGNMASK.load(Ordering::Relaxed); if let Some(old) = old { - // TODO + *old = guard[usize::from(signal)]; } let Some(new) = new else { return Ok(()); }; + guard[usize::from(signal)] = *new; let sig_group = usize::from(signal) / 32; let sig_bit32 = 1 << ((signal - 1) % 32); diff --git a/redox-rt/src/sync.rs b/redox-rt/src/sync.rs index 713077842987f9925d39d0f94d2c5aee6373c65f..172bd37b1f1c0d49af5e8b653387ce32f6b879ac 100644 --- a/redox-rt/src/sync.rs +++ b/redox-rt/src/sync.rs @@ -2,7 +2,7 @@ use core::cell::UnsafeCell; use core::ops::{Deref, DerefMut}; -use core::sync::atomic::AtomicU32; +use core::sync::atomic::{AtomicU32, Ordering}; pub struct Mutex<T> { pub lockword: AtomicU32, @@ -24,6 +24,9 @@ impl<T> Mutex<T> { } } pub fn lock(&self) -> MutexGuard<'_, T> { + while self.lockword.compare_exchange(UNLOCKED, LOCKED, Ordering::Acquire, Ordering::Relaxed).is_err() { + core::hint::spin_loop(); + } MutexGuard { lock: self } } } @@ -44,5 +47,6 @@ impl<T> DerefMut for MutexGuard<'_, T> { } impl<T> Drop for MutexGuard<'_, T> { fn drop(&mut self) { + self.lock.lockword.store(UNLOCKED, Ordering::Release); } } diff --git a/src/ld_so/tcb.rs b/src/ld_so/tcb.rs index ae1b9eaf4c025ed2484c6cbe0a064cc95f866521..a7c0457b25b5d0cd2bcca0b032b7311f19b166f2 100644 --- a/src/ld_so/tcb.rs +++ b/src/ld_so/tcb.rs @@ -56,6 +56,13 @@ pub struct Tcb { pub pthread: Pthread, } +#[cfg(target_os = "redox")] +const _: () = { + if mem::size_of::<Tcb>() > syscall::PAGE_SIZE { + panic!("too large TCB!"); + } +}; + impl Tcb { /// Create a new TCB pub unsafe fn new(size: usize) -> Result<&'static mut Self> { @@ -223,7 +230,7 @@ impl Tcb { syscall!(ARCH_PRCTL, ARCH_SET_FS, tls_end); } - #[cfg(all(target_os = "redox"))] + #[cfg(target_os = "redox")] unsafe fn os_arch_activate(tls_end: usize, tls_len: usize) { redox_rt::tcb_activate(tls_end, tls_len) }