diff --git a/kernel/src/syscall.rs b/kernel/src/syscall.rs index e2fde20..7985b86 100644 --- a/kernel/src/syscall.rs +++ b/kernel/src/syscall.rs @@ -10,10 +10,15 @@ //! `sys_` then the name of the syscall. You can find functions like this in //! submodules, and you should also implement syscalls this way. +const SYSCALL_READ: usize = 63; const SYSCALL_WRITE: usize = 64; const SYSCALL_EXIT: usize = 93; const SYSCALL_YIELD: usize = 124; const SYSCALL_GET_TIME: usize = 169; +const SYSCALL_GETPID: usize = 172; +const SYSCALL_FORK: usize = 220; +const SYSCALL_EXEC: usize = 221; +const SYSCALL_WAITPID: usize = 260; mod fs; mod process; @@ -21,12 +26,19 @@ mod process; use fs::sys_write; use process::{sys_exit, sys_get_time, sys_yield}; +use crate::syscall::process::{sys_exec, sys_fork, sys_getpid, sys_read, sys_waitpid}; + pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize { match syscall_id { + SYSCALL_READ => sys_read(args[0], args[1] as *const u8, args[2]), SYSCALL_WRITE => sys_write(args[0], args[1] as *const u8, args[2]), SYSCALL_EXIT => sys_exit(args[0] as i32), SYSCALL_YIELD => sys_yield(), SYSCALL_GET_TIME => sys_get_time(), + SYSCALL_GETPID => sys_getpid(), + SYSCALL_FORK => sys_fork(), + SYSCALL_EXEC => sys_exec(args[0] as *const u8), + SYSCALL_WAITPID => sys_waitpid(args[0] as isize, args[1] as *mut i32), _ => panic!("Unsupported syscall_id: {}", syscall_id), } } diff --git a/kernel/src/syscall/process.rs b/kernel/src/syscall/process.rs index 464b98c..a7b01da 100644 --- a/kernel/src/syscall/process.rs +++ b/kernel/src/syscall/process.rs @@ -19,3 +19,23 @@ pub fn sys_yield() -> isize { pub fn sys_get_time() -> isize { get_time_ms() as isize } + +pub fn sys_fork() -> isize { + unimplemented!() +} + +pub fn sys_waitpid(pid: isize, exit_code_ptr: *mut i32) -> isize { + unimplemented!() +} + +pub fn sys_exec(path: *const u8) -> isize { + unimplemented!() +} + +pub fn sys_getpid() -> isize { + unimplemented!() +} + +pub fn sys_read(fd: usize, buf: *const u8, len: usize) -> isize { + unimplemented!() +} diff --git a/kernel/src/task/processor.rs b/kernel/src/task/processor.rs new file mode 100644 index 0000000..e69de29 diff --git a/user_lib/src/syscall.rs b/user_lib/src/syscall.rs index ef4b1a2..b88d924 100644 --- a/user_lib/src/syscall.rs +++ b/user_lib/src/syscall.rs @@ -1,9 +1,14 @@ use core::arch::asm; +const SYSCALL_READ: usize = 63; const SYSCALL_WRITE: usize = 64; const SYSCALL_EXIT: usize = 93; -const SYSCALL_GET_TIME: usize = 169; const SYSCALL_YIELD: usize = 124; +const SYSCALL_GET_TIME: usize = 169; +const SYSCALL_GETPID: usize = 172; +const SYSCALL_FORK: usize = 220; +const SYSCALL_EXEC: usize = 221; +const SYSCALL_WAITPID: usize = 260; fn syscall(id: usize, args: [usize; 3]) -> isize { let mut ret: isize; @@ -19,6 +24,13 @@ fn syscall(id: usize, args: [usize; 3]) -> isize { ret } +pub fn sys_read(fd: usize, buffer: &mut [u8]) -> isize { + syscall( + SYSCALL_READ, + [fd, buffer.as_mut_ptr() as usize, buffer.len()], + ) +} + pub fn sys_write(fd: usize, buffer: &[u8]) -> isize { syscall(SYSCALL_WRITE, [fd, buffer.as_ptr() as usize, buffer.len()]) } @@ -34,3 +46,19 @@ pub fn sys_get_time() -> isize { pub fn sys_yield() -> isize { syscall(SYSCALL_YIELD, [0, 0, 0]) } + +pub fn sys_getpid() -> isize { + syscall(SYSCALL_GETPID, [0, 0, 0]) +} + +pub fn sys_fork() -> isize { + syscall(SYSCALL_FORK, [0, 0, 0]) +} + +pub fn sys_exec(path: &str) -> isize { + syscall(SYSCALL_EXEC, [path.as_ptr() as usize, 0, 0]) +} + +pub fn sys_waitpid(pid: isize, exit_code: *mut i32) -> isize { + syscall(SYSCALL_WAITPID, [pid as usize, exit_code as usize, 0]) +}