From 42c24dd75520218fffe424a9f8196f3c43599297 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Sun, 23 Jun 2024 10:42:52 +0200 Subject: [PATCH] Successfully run more userspace. --- redox-rt/src/arch/x86_64.rs | 8 +++++--- redox-rt/src/signal.rs | 5 +++-- redox-rt/src/sync.rs | 6 +++++- src/ld_so/tcb.rs | 9 ++++++++- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/redox-rt/src/arch/x86_64.rs b/redox-rt/src/arch/x86_64.rs index cade85a1..6c12a964 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 e45cfa4c..03da284d 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 71307784..172bd37b 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 ae1b9eaf..a7c0457b 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) } -- GitLab