//! Implementation of syscalls //! //! The single entry point to all system calls, [`syscall()`], is called //! whenever userspace wishes to perform a system call using the `ecall` //! instruction. In this case, the processor raises an 'Environment call from //! U-mode' exception, which is handled as one of the cases in //! [`crate::trap::trap_handler`]. //! //! For clarity, each single syscall is implemented as its own function, named //! `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_UNLINKAT: usize = 35; const SYSCALL_LINKAT: usize = 37; const SYSCALL_OPEN: usize = 56; const SYSCALL_CLOSE: usize = 57; const SYSCALL_READ: usize = 63; const SYSCALL_WRITE: usize = 64; const SYSCALL_FSTAT: usize = 80; 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; const SYSCALL_SPAWN: usize = 400; const SYSCALL_MUNMAP: usize = 215; const SYSCALL_MMAP: usize = 222; const SYSCALL_SET_PRIORITY: usize = 140; const SYSCALL_TASK_INFO: usize = 410; mod fs; pub mod process; use fs::*; use process::*; use crate::fs::Stat; /// handle syscall exception with `syscall_id` and other arguments pub fn syscall(syscall_id: usize, args: [usize; 4]) -> isize { match syscall_id { SYSCALL_LINKAT => sys_linkat(args[1] as *const u8, args[3] as *const u8), SYSCALL_UNLINKAT => sys_unlinkat(args[1] as *const u8), SYSCALL_OPEN => sys_open(args[1] as *const u8, args[2] as u32), SYSCALL_CLOSE => sys_close(args[0]), 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_FSTAT => sys_fstat(args[0], args[1] as *mut Stat), SYSCALL_EXIT => sys_exit(args[0] as i32), SYSCALL_YIELD => sys_yield(), 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), SYSCALL_GET_TIME => sys_get_time(args[0] as *mut TimeVal, args[1]), SYSCALL_MMAP => sys_mmap(args[0], args[1], args[2]), SYSCALL_MUNMAP => sys_munmap(args[0], args[1]), SYSCALL_SET_PRIORITY => sys_set_priority(args[0] as isize), SYSCALL_TASK_INFO => sys_task_info(args[0] as *mut TaskInfo), SYSCALL_SPAWN => sys_spawn(args[0] as *const u8), _ => panic!("Unsupported syscall_id: {}", syscall_id), } }