use sc::syscall;
use crate::platform::{Clone3Args, CloneArgs, PidT};
use crate::Result;
#[cfg(target_arch = "x86_64")]
pub unsafe fn fork() -> Result<PidT> {
let res = syscall!(FORK);
bail_on_below_zero!(res, "`FORK` syscall failed");
#[expect(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
Ok(res as PidT)
}
#[cfg(target_arch = "aarch64")]
pub unsafe fn fork() -> Result<PidT> {
let cflgs = crate::platform::SignalKind::SIGCHLD;
let res = syscall!(CLONE, cflgs.0 .0, 0, 0, 0, 0);
bail_on_below_zero!(res, "`CLONE` syscall failed");
#[expect(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
Ok(res as i32)
}
pub unsafe fn clone(args: &CloneArgs) -> Result<PidT> {
let flags = args.flags.bits() | args.exit_signal.0.into_u64();
#[cfg(target_arch = "x86_64")]
let res = unsafe {
syscall!(
CLONE,
flags,
args.stack,
args.parent_tid,
args.child_tid,
args.tls
)
};
#[cfg(any(target_arch = "aarch64", target_arch = "x86"))]
let res = {
syscall!(
CLONE,
flags,
args.stack,
args.parent_tid,
args.tls,
args.child_tid
)
};
bail_on_below_zero!(res, "`CLONE` syscall failed");
#[expect(clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
Ok(res as PidT)
}
pub unsafe fn clone3(clone_args: &mut Clone3Args) -> Result<u64> {
const SIZE: usize = core::mem::size_of::<Clone3Args>();
let res = syscall!(CLONE3, core::ptr::from_mut::<Clone3Args>(clone_args), SIZE);
bail_on_below_zero!(res, "`CLONE3` syscall failed");
Ok(res as u64)
}