1use crate::kernel::syscall::*;
3use crate::{earlyprintln, pr_err};
4
5mod syscall_number;
6
7pub fn dispatch_syscall(frame: &mut super::trap::TrapFrame) {
10 crate::pr_debug!(
11 "syscall: {} args: [{:#x}, {:#x}, {:#x}, {:#x}, {:#x}, {:#x}]",
12 frame.x17_a7,
13 frame.x10_a0,
14 frame.x11_a1,
15 frame.x12_a2,
16 frame.x13_a3,
17 frame.x14_a4,
18 frame.x15_a5
19 );
20 match frame.x17_a7 {
21 syscall_number::SYS_GETCWD => sys_getcwd(frame),
23
24 syscall_number::SYS_DUP => sys_dup(frame),
26 syscall_number::SYS_DUP3 => sys_dup3(frame),
27 syscall_number::SYS_FCNTL => sys_fcntl(frame),
28 syscall_number::SYS_IOCTL => sys_ioctl(frame),
29
30 syscall_number::SYS_MKNODAT => sys_mknodat(frame),
32 syscall_number::SYS_MKDIRAT => sys_mkdirat(frame),
33 syscall_number::SYS_UNLINKAT => sys_unlinkat(frame),
34 syscall_number::SYS_SYMLINKAT => sys_symlinkat(frame),
35
36 syscall_number::SYS_MOUNT => sys_mount(frame),
38 syscall_number::SYS_UMOUNT2 => sys_umount2(frame),
39 syscall_number::SYS_STATFS => sys_statfs(frame),
40
41 syscall_number::SYS_FACCESSAT => sys_faccessat(frame),
43 syscall_number::SYS_CHDIR => sys_chdir(frame),
44 syscall_number::SYS_FCHMODAT => sys_fchmodat(frame),
45 syscall_number::SYS_FCHOWNAT => sys_fchownat(frame),
46
47 syscall_number::SYS_OPENAT => sys_openat(frame),
49 syscall_number::SYS_CLOSE => sys_close(frame),
50 syscall_number::SYS_PIPE2 => sys_pipe2(frame),
51 syscall_number::SYS_GETDENTS64 => sys_getdents64(frame),
52 syscall_number::SYS_LSEEK => sys_lseek(frame),
53
54 syscall_number::SYS_READ => sys_read(frame),
56 syscall_number::SYS_WRITE => sys_write(frame),
57 syscall_number::SYS_READV => sys_readv(frame),
58 syscall_number::SYS_WRITEV => sys_writev(frame),
59 syscall_number::SYS_PREAD64 => sys_pread64(frame),
60 syscall_number::SYS_PWRITE64 => sys_pwrite64(frame),
61 syscall_number::SYS_PREADV => sys_preadv(frame),
62 syscall_number::SYS_PWRITEV => sys_pwritev(frame),
63 syscall_number::SYS_SENDFILE => sys_sendfile(frame),
64 syscall_number::SYS_PSELECT6 => sys_pselect6(frame),
65 syscall_number::SYS_PPOLL => sys_ppoll(frame),
66
67 syscall_number::SYS_READLINKAT => sys_readlinkat(frame),
69 syscall_number::SYS_FSTATAT => sys_newfstatat(frame),
70 syscall_number::SYS_FSTAT => sys_fstat(frame),
71 syscall_number::SYS_SYNC => sys_sync(frame),
72 syscall_number::SYS_FSYNC => sys_fsync(frame),
73 syscall_number::SYS_FDATASYNC => sys_fdatasync(frame),
74
75 syscall_number::SYS_UTIMENSAT => sys_utimensat(frame),
77
78 syscall_number::SYS_EXIT => sys_exit(frame),
80 syscall_number::SYS_EXIT_GROUP => sys_exit_group(frame),
81 syscall_number::SYS_SET_TID_ADDRESS => sys_set_tid_address(frame),
82
83 syscall_number::SYS_FUTEX => sys_futex(frame),
85 syscall_number::SYS_SET_ROBUST_LIST => sys_set_robust_list(frame),
86 syscall_number::SYS_GET_ROBUST_LIST => sys_get_robust_list(frame),
87 syscall_number::SYS_NANOSLEEP => sys_nanosleep(frame),
88 syscall_number::SYS_GETITIMER => sys_getitimmer(frame),
89 syscall_number::SYS_SETITIMER => sys_setitimmer(frame),
90
91 syscall_number::SYS_CLOCK_SETTIME => sys_clock_settime(frame),
93 syscall_number::SYS_CLOCK_GETTIME => sys_clock_gettime(frame),
94 syscall_number::SYS_CLOCK_GETRES => sys_clock_getres(frame),
95 syscall_number::SYS_SYSLOG => sys_syslog(frame),
96
97 syscall_number::SYS_KILL => sys_kill(frame),
99 syscall_number::SYS_TKILL => sys_tkill(frame),
100 syscall_number::SYS_TGKILL => sys_tgkill(frame),
101 syscall_number::SYS_SIGALTSTACK => sys_sigaltstack(frame),
102 syscall_number::SYS_RT_SIGSUSPEND => sys_rt_sigsuspend(frame),
103 syscall_number::SYS_RT_SIGACTION => sys_rt_sigaction(frame),
104 syscall_number::SYS_RT_SIGPROCMASK => sys_rt_sigprocmask(frame),
105 syscall_number::SYS_RT_SIGPENDING => sys_rt_sigpending(frame),
106 syscall_number::SYS_RT_SIGTIMEDWAIT => sys_rt_sigtimedwait(frame),
107 syscall_number::SYS_RT_SIGRETURN => sys_rt_sigreturn(frame),
108
109 syscall_number::SYS_REBOOT => sys_reboot(frame),
111 syscall_number::SYS_SETGID => sys_setgid(frame),
112 syscall_number::SYS_SETUID => sys_setuid(frame),
113 syscall_number::SYS_SETRESUID => sys_setresuid(frame),
114 syscall_number::SYS_GETRESUID => sys_getresuid(frame),
115 syscall_number::SYS_SETRESGID => sys_setresgid(frame),
116 syscall_number::SYS_GETRESGID => sys_getresgid(frame),
117 syscall_number::SYS_SETPGID => sys_setpgid(frame),
118 syscall_number::SYS_SETSID => sys_setsid(frame),
119
120 syscall_number::SYS_UNAME => sys_uname(frame),
122 syscall_number::SYS_SETHOSTNAME => sys_sethostname(frame),
123 syscall_number::SYS_GETRLIMIT => sys_getrlimit(frame),
124 syscall_number::SYS_SETRLIMIT => sys_setrlimit(frame),
125 syscall_number::SYS_UMASK => sys_umask(frame),
126 syscall_number::SYS_GETPID => sys_getpid(frame),
127 syscall_number::SYS_GETPPID => sys_getppid(frame),
128 syscall_number::SYS_GETPGID => sys_getpgid(frame),
129 syscall_number::SYS_GETUID => sys_getuid(frame),
130 syscall_number::SYS_GETEUID => sys_geteuid(frame),
131 syscall_number::SYS_GETGID => sys_getgid(frame),
132 syscall_number::SYS_GETEGID => sys_getegid(frame),
133 syscall_number::SYS_GETTID => sys_gettid(frame),
134 syscall_number::SYS_SYSINFO => sys_sysinfo(frame),
135
136 syscall_number::SYS_SOCKET => sys_socket(frame),
138 syscall_number::SYS_BIND => sys_bind(frame),
139 syscall_number::SYS_LISTEN => sys_listen(frame),
140 syscall_number::SYS_ACCEPT => sys_accept(frame),
141 syscall_number::SYS_CONNECT => sys_connect(frame),
142 syscall_number::SYS_GETSOCKNAME => sys_getsockname(frame),
143 syscall_number::SYS_GETPEERNAME => sys_getpeername(frame),
144 syscall_number::SYS_SENDTO => sys_sendto(frame),
145 syscall_number::SYS_RECVFROM => sys_recvfrom(frame),
146 syscall_number::SYS_SETSOCKOPT => sys_setsockopt(frame),
147 syscall_number::SYS_GETSOCKOPT => sys_getsockopt(frame),
148
149 syscall_number::SYS_CLONE => sys_clone(frame),
151 syscall_number::SYS_EXECVE => sys_execve(frame),
152
153 syscall_number::SYS_ACCEPT4 => sys_accept4(frame),
155
156 syscall_number::SYS_WAIT4 => sys_wait4(frame),
158 syscall_number::SYS_PRLIMIT64 => sys_prlimit(frame),
159
160 syscall_number::SYS_BRK => sys_brk(frame),
162 syscall_number::SYS_MUNMAP => sys_munmap(frame),
163 syscall_number::SYS_MMAP => sys_mmap(frame),
164 syscall_number::SYS_MPROTECT => sys_mprotect(frame),
165
166 syscall_number::SYS_SYNCFS => sys_syncfs(frame),
168
169 syscall_number::SYS_RENAMEAT2 => sys_renameat2(frame),
171
172 syscall_number::SYS_GETRANDOM => sys_getrandom(frame),
174
175 syscall_number::SYS_GETIFADDRS => sys_getifaddrs(frame),
177
178 syscall_number::SYS_SYSINFO => sys_sysinfo(frame),
183
184 syscall_number::SYS_CLOCK_GETTIME => sys_clock_gettime(frame),
186 syscall_number::SYS_CLOCK_SETTIME => sys_clock_settime(frame),
187 syscall_number::SYS_CLOCK_GETRES => sys_clock_getres(frame),
188
189 _ => {
190 frame.x10_a0 = (-2isize) as usize; earlyprintln!("Unknown syscall: {}", frame.x17_a7);
193 }
194 }
195 crate::pr_debug!("syscall exit, return: {}", frame.x10_a0 as isize);
196}
197
198#[cfg(target_arch = "riscv64")]
205#[macro_export]
206macro_rules! impl_syscall {
207 ($sys_name:ident, $kernel:path, noreturn, ($t0:ty, $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty)) => {
209 #[allow(non_snake_case)]
210 pub fn $sys_name(frame: &mut $crate::trap::TrapFrame) -> ! {
211 let a0 = frame.x10_a0 as $t0;
212 let a1 = frame.x11_a1 as $t1;
213 let a2 = frame.x12_a2 as $t2;
214 let a3 = frame.x13_a3 as $t3;
215 let a4 = frame.x14_a4 as $t4;
216 let a5 = frame.x15_a5 as $t5;
217 $kernel(a0, a1, a2, a3, a4, a5)
218 }
219 };
220
221 ($sys_name:ident, $kernel:path, noreturn, ()) => {
223 #[allow(non_snake_case)]
224 pub fn $sys_name(_frame: &mut $crate::arch::trap::TrapFrame) -> ! {
225 $kernel()
226 }
227 };
228 ($sys_name:ident, $kernel:path, noreturn, ($t0:ty)) => {
229 #[allow(non_snake_case)]
230 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) -> ! {
231 let a0 = frame.x10_a0 as $t0;
232 $kernel(a0)
233 }
234 };
235 ($sys_name:ident, $kernel:path, noreturn, ($t0:ty, $t1:ty)) => {
236 #[allow(non_snake_case)]
237 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) -> ! {
238 let a0 = frame.x10_a0 as $t0;
239 let a1 = frame.x11_a1 as $t1;
240 $kernel(a0, a1)
241 }
242 };
243 ($sys_name:ident, $kernel:path, noreturn, ($t0:ty, $t1:ty, $t2:ty)) => {
244 #[allow(non_snake_case)]
245 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) -> ! {
246 let a0 = frame.x10_a0 as $t0;
247 let a1 = frame.x11_a1 as $t1;
248 let a2 = frame.x12_a2 as $t2;
249 $kernel(a0, a1, a2)
250 }
251 };
252 ($sys_name:ident, $kernel:path, noreturn, ($t0:ty, $t1:ty, $t2:ty, $t3:ty)) => {
253 #[allow(non_snake_case)]
254 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) -> ! {
255 let a0 = frame.x10_a0 as $t0;
256 let a1 = frame.x11_a1 as $t1;
257 let a2 = frame.x12_a2 as $t2;
258 let a3 = frame.x13_a3 as $t3;
259 $kernel(a0, a1, a2, a3)
260 }
261 };
262 ($sys_name:ident, $kernel:path, noreturn, ($t0:ty, $t1:ty, $t2:ty, $t3:ty, $t4:ty)) => {
263 #[allow(non_snake_case)]
264 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) -> ! {
265 let a0 = frame.x10_a0 as $t0;
266 let a1 = frame.x11_a1 as $t1;
267 let a2 = frame.x12_a2 as $t2;
268 let a3 = frame.x13_a3 as $t3;
269 let a4 = frame.x14_a4 as $t4;
270 $kernel(a0, a1, a2, a3, a4)
271 }
272 };
273
274 ($sys_name:ident, $kernel:path, ($t0:ty, $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty)) => {
276 #[allow(non_snake_case)]
277 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
278 let a0 = frame.x10_a0 as $t0;
279 let a1 = frame.x11_a1 as $t1;
280 let a2 = frame.x12_a2 as $t2;
281 let a3 = frame.x13_a3 as $t3;
282 let a4 = frame.x14_a4 as $t4;
283 let a5 = frame.x15_a5 as $t5;
284 let ret = $kernel(a0, a1, a2, a3, a4, a5);
285 frame.x10_a0 = ret as isize as usize;
286 }
287 };
288
289 ($sys_name:ident, $kernel:path, ()) => {
291 #[allow(non_snake_case)]
292 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
293 let ret = $kernel();
294 frame.x10_a0 = ret as isize as usize;
295 }
296 };
297 ($sys_name:ident, $kernel:path, ($t0:ty)) => {
298 #[allow(non_snake_case)]
299 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
300 let a0 = frame.x10_a0 as $t0;
301 let ret = $kernel(a0);
302 frame.x10_a0 = ret as isize as usize;
303 }
304 };
305 ($sys_name:ident, $kernel:path, ($t0:ty, $t1:ty)) => {
306 #[allow(non_snake_case)]
307 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
308 let a0 = frame.x10_a0 as $t0;
309 let a1 = frame.x11_a1 as $t1;
310 let ret = $kernel(a0, a1);
311 frame.x10_a0 = ret as isize as usize;
312 }
313 };
314 ($sys_name:ident, $kernel:path, ($t0:ty, $t1:ty, $t2:ty)) => {
315 #[allow(non_snake_case)]
316 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
317 let a0 = frame.x10_a0 as $t0;
318 let a1 = frame.x11_a1 as $t1;
319 let a2 = frame.x12_a2 as $t2;
320 let ret = $kernel(a0, a1, a2);
321 frame.x10_a0 = ret as isize as usize;
322 }
323 };
324 ($sys_name:ident, $kernel:path, ($t0:ty, $t1:ty, $t2:ty, $t3:ty)) => {
325 #[allow(non_snake_case)]
326 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
327 let a0 = frame.x10_a0 as $t0;
328 let a1 = frame.x11_a1 as $t1;
329 let a2 = frame.x12_a2 as $t2;
330 let a3 = frame.x13_a3 as $t3;
331 let ret = $kernel(a0, a1, a2, a3);
332 frame.x10_a0 = ret as isize as usize;
333 }
334 };
335 ($sys_name:ident, $kernel:path, ($t0:ty, $t1:ty, $t2:ty, $t3:ty, $t4:ty)) => {
336 #[allow(non_snake_case)]
337 pub fn $sys_name(frame: &mut $crate::arch::trap::TrapFrame) {
338 let a0 = frame.x10_a0 as $t0;
339 let a1 = frame.x11_a1 as $t1;
340 let a2 = frame.x12_a2 as $t2;
341 let a3 = frame.x13_a3 as $t3;
342 let a4 = frame.x14_a4 as $t4;
343 let ret = $kernel(a0, a1, a2, a3, a4);
344 frame.x10_a0 = ret as isize as usize;
345 }
346 };
347}