diff --git a/kernel/src/process/clone.rs b/kernel/src/process/clone.rs index 189d3549..e3c13163 100644 --- a/kernel/src/process/clone.rs +++ b/kernel/src/process/clone.rs @@ -137,6 +137,14 @@ impl CloneArgs { ..Default::default() } } + + pub fn for_vfork() -> Self { + Self { + flags: CloneFlags::CLONE_VFORK | CloneFlags::CLONE_VM, + exit_signal: Some(SIGCHLD), + ..Default::default() + } + } } impl From for CloneFlags { @@ -158,7 +166,8 @@ impl CloneFlags { | CloneFlags::CLONE_SETTLS | CloneFlags::CLONE_PARENT_SETTID | CloneFlags::CLONE_CHILD_SETTID - | CloneFlags::CLONE_CHILD_CLEARTID; + | CloneFlags::CLONE_CHILD_CLEARTID + | CloneFlags::CLONE_VFORK; let unsupported_flags = *self - supported_flags; if !unsupported_flags.is_empty() { warn!("contains unsupported clone flags: {:?}", unsupported_flags); diff --git a/kernel/src/syscall/arch/x86.rs b/kernel/src/syscall/arch/x86.rs index d14d2445..d763ba73 100644 --- a/kernel/src/syscall/arch/x86.rs +++ b/kernel/src/syscall/arch/x86.rs @@ -26,7 +26,7 @@ use crate::syscall::{ fallocate::sys_fallocate, fcntl::sys_fcntl, flock::sys_flock, - fork::sys_fork, + fork::{sys_fork, sys_vfork}, fsync::{sys_fdatasync, sys_fsync}, futex::sys_futex, get_priority::sys_get_priority, @@ -205,6 +205,7 @@ impl_syscall_nums_and_dispatch_fn! { SYS_GETSOCKOPT = 55 => sys_getsockopt(args[..5]); SYS_CLONE = 56 => sys_clone(args[..5], &user_ctx); SYS_FORK = 57 => sys_fork(args[..0], &user_ctx); + SYS_VFORK = 58 => sys_vfork(args[..0], &user_ctx); SYS_EXECVE = 59 => sys_execve(args[..3], &mut user_ctx); SYS_EXIT = 60 => sys_exit(args[..1]); SYS_WAIT4 = 61 => sys_wait4(args[..4]); diff --git a/kernel/src/syscall/fork.rs b/kernel/src/syscall/fork.rs index 65b0cb8a..7878d43b 100644 --- a/kernel/src/syscall/fork.rs +++ b/kernel/src/syscall/fork.rs @@ -13,3 +13,9 @@ pub fn sys_fork(ctx: &Context, parent_context: &UserContext) -> Result Result { + let clone_args = CloneArgs::for_vfork(); + let child_pid = clone_child(ctx, parent_context, clone_args).unwrap(); + Ok(SyscallReturn::Return(child_pid as _)) +}