From 885f88b7779cf96131fca9bc360e457c3cdee5ad Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Thu, 27 Jul 2023 16:44:26 +0200 Subject: [PATCH] Fix futex for non-AtomicU64-capable targets. --- src/syscall/futex.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/syscall/futex.rs b/src/syscall/futex.rs index 5051817ce2..596aa6f616 100644 --- a/src/syscall/futex.rs +++ b/src/syscall/futex.rs @@ -5,7 +5,8 @@ use alloc::collections::VecDeque; use alloc::sync::Arc; use rmm::Arch; -use core::sync::atomic::{AtomicU32, AtomicU64, Ordering}; +use syscall::EOPNOTSUPP; +use core::sync::atomic::{AtomicU32, Ordering}; use spin::RwLock; use crate::context::{self, memory::AddrSpace, Context}; @@ -84,14 +85,23 @@ pub fn futex(addr: usize, op: usize, val: usize, val2: usize, addr2: usize) -> R u64::from(val as u32), ) } else { - // op == FUTEX_WAIT64 - if addr % 8 != 0 { - return Err(Error::new(EINVAL)); + #[cfg(target_has_atomic = "64")] + { + use core::sync::atomic::AtomicU64; + + // op == FUTEX_WAIT64 + if addr % 8 != 0 { + return Err(Error::new(EINVAL)); + } + ( + u64::from(unsafe { (*(addr as *const AtomicU64)).load(Ordering::SeqCst) }), + val as u64, + ) + } + #[cfg(not(target_has_atomic = "64"))] + { + return Err(Error::new(EOPNOTSUPP)); } - ( - u64::from(unsafe { (*(addr as *const AtomicU64)).load(Ordering::SeqCst) }), - val as u64, - ) }; if fetched != expected { return Err(Error::new(EAGAIN));