diff --git a/kernel/src/main.rs b/kernel/src/main.rs index e9709d8..79dfd01 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -63,7 +63,7 @@ fn run_test() -> ! { "getppid", "chdir", "open", - // "clone", + "clone", "mount", "exit", "sleep", diff --git a/kernel/src/syscall/mod.rs b/kernel/src/syscall/mod.rs index 0a190f0..d4729fe 100644 --- a/kernel/src/syscall/mod.rs +++ b/kernel/src/syscall/mod.rs @@ -14,7 +14,7 @@ const SYSCALL_GET_TIME: usize = 169; const SYSCALL_BRK: usize = 214; const SYSCALL_GETPID: usize = 172; const SYSCALL_GETPPID: usize = 173; -const SYSCALL_FORK: usize = 220; +const SYSCALL_CLONE: usize = 220; const SYSCALL_EXEC: usize = 221; const SYSCALL_WAITPID: usize = 260; const SYSCALL_GETCWD: usize = 17; @@ -40,7 +40,7 @@ pub fn syscall(id: usize, args: [usize; 6]) -> isize { SYSCALL_BRK => sys_brk(args[0] as i32), SYSCALL_GETPID => sys_getpid(), SYSCALL_GETPPID => sys_getppid(), - SYSCALL_FORK => sys_fork(), + SYSCALL_CLONE => sys_clone(args[0], args[1]), SYSCALL_EXEC => sys_exec(args[0] as *const u8, args[1] as *const u8), SYSCALL_WAITPID => sys_waitpid(args[0] as isize, args[1] as *mut i32, args[2]), SYSCALL_GETCWD => sys_getcwd(args[0] as *mut u8, args[1]), diff --git a/kernel/src/syscall/process.rs b/kernel/src/syscall/process.rs index 95a4e20..97e73ef 100644 --- a/kernel/src/syscall/process.rs +++ b/kernel/src/syscall/process.rs @@ -62,12 +62,16 @@ pub fn sys_getppid() -> isize { parent_pid as isize } -pub fn sys_fork() -> isize { +pub fn sys_clone(flags: usize, sp: usize) -> isize { + const SIGCHLD: usize = 17; + let current_task = task::get_processor().current(); let new_task = current_task.fork(); let new_pid = new_task.get_pid(); - let trap_cx = new_task.get_trap_cx_mut(); - trap_cx.set_a0(0); + if flags != SIGCHLD || sp != 0 { + new_task.get_trap_cx_mut().set_sp(sp as usize); + } + new_task.get_trap_cx_mut().set_a0(0); task::add_task(new_task); new_pid as isize