1const SYSCALL_DUP: usize = 24;
2const SYSCALL_OPEN: usize = 56;
3const SYSCALL_CLOSE: usize = 57;
4const SYSCALL_PIPE: usize = 59;
5const SYSCALL_READ: usize = 63;
6const SYSCALL_WRITE: usize = 64;
7const SYSCALL_EXIT: usize = 93;
8const SYSCALL_YIELD: usize = 124;
9const SYSCALL_KILL: usize = 129;
10const SYSCALL_SIGACTION: usize = 134;
11const SYSCALL_SIGPROCMASK: usize = 135;
12const SYSCALL_SIGRETURN: usize = 139;
13const SYSCALL_GET_TIME: usize = 169;
14const SYSCALL_GETPID: usize = 172;
15const SYSCALL_FORK: usize = 220;
16const SYSCALL_EXEC: usize = 221;
17const SYSCALL_WAITPID: usize = 260;
18
19mod fs;
20mod process;
21
22use fs::*;
23use process::*;
24
25use crate::task::SignalAction;
26
27pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize {
28 match syscall_id {
29 SYSCALL_DUP => sys_dup(args[0]),
30 SYSCALL_OPEN => sys_open(args[0] as *const u8, args[1] as u32),
31 SYSCALL_CLOSE => sys_close(args[0]),
32 SYSCALL_PIPE => sys_pipe(args[0] as *mut usize),
33 SYSCALL_READ => sys_read(args[0], args[1] as *const u8, args[2]),
34 SYSCALL_WRITE => sys_write(args[0], args[1] as *const u8, args[2]),
35 SYSCALL_EXIT => sys_exit(args[0] as i32),
36 SYSCALL_YIELD => sys_yield(),
37 SYSCALL_KILL => sys_kill(args[0], args[1] as i32),
38 SYSCALL_SIGACTION => sys_sigaction(
39 args[0] as i32,
40 args[1] as *const SignalAction,
41 args[2] as *mut SignalAction,
42 ),
43 SYSCALL_SIGPROCMASK => sys_sigprocmask(args[0] as u32),
44 SYSCALL_SIGRETURN => sys_sigreturn(),
45 SYSCALL_GET_TIME => sys_get_time(),
46 SYSCALL_GETPID => sys_getpid(),
47 SYSCALL_FORK => sys_fork(),
48 SYSCALL_EXEC => sys_exec(args[0] as *const u8, args[1] as *const usize),
49 SYSCALL_WAITPID => sys_waitpid(args[0] as isize, args[1] as *mut i32),
50 _ => panic!("Unsupported syscall_id: {}", syscall_id),
51 }
52}