mirror of
https://github.com/LearningOS/rust-based-os-comp2022.git
synced 2026-05-10 07:41:44 +08:00
65 lines
2.6 KiB
Rust
65 lines
2.6 KiB
Rust
//! 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),
|
|
}
|
|
}
|