os/arch/riscv/syscall/
mod.rs

1//! RISC-V 架构的系统调用分发模块
2use crate::kernel::syscall::*;
3use crate::{earlyprintln, pr_err};
4
5mod syscall_number;
6
7/// 分发系统调用
8/// 按照系统调用号顺序排列,参考 syscall_number.rs 中的分类
9pub 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        // 文件系统/目录操作 (Filesystem/Directory Operations)
22        syscall_number::SYS_GETCWD => sys_getcwd(frame),
23
24        // Epoll & Duplication
25        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        // 文件/目录创建与链接 (File/Directory Creation and Linking)
31        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        // 挂载/文件系统信息 (Mount/Filesystem Info)
37        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        // 文件大小/权限/所有权 (File Size/Permissions/Ownership)
42        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        // 文件描述符操作 (File Descriptor Operations)
48        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        // I/O 操作 (Input/Output Operations)
55        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        // 文件元数据与同步 (File Metadata and Synchronization)
68        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        // 定时器 (Timers)
76        syscall_number::SYS_UTIMENSAT => sys_utimensat(frame),
77
78        // 进程与控制 (Process and Control)
79        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        // 同步/休眠
84        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        // POSIX 定时器 (POSIX Timers)
92        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        // 信号 (Signals)
98        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        // 进程属性 (Process Attributes)
110        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        // 系统信息 (System Information)
121        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        // 网络 (Networking/Sockets)
137        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        // 进程创建/执行 (Process Creation/Execution)
150        syscall_number::SYS_CLONE => sys_clone(frame),
151        syscall_number::SYS_EXECVE => sys_execve(frame),
152
153        // 网络/I/O (续)
154        syscall_number::SYS_ACCEPT4 => sys_accept4(frame),
155
156        // 进程与控制 (续)
157        syscall_number::SYS_WAIT4 => sys_wait4(frame),
158        syscall_number::SYS_PRLIMIT64 => sys_prlimit(frame),
159
160        // 内存管理 (Memory Management)
161        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        // 文件系统同步 (续)
167        syscall_number::SYS_SYNCFS => sys_syncfs(frame),
168
169        // 调度 (续)
170        syscall_number::SYS_RENAMEAT2 => sys_renameat2(frame),
171
172        // 随机数与内存文件
173        syscall_number::SYS_GETRANDOM => sys_getrandom(frame),
174
175        // 获取网络接口地址列表 (非标准系统调用)
176        syscall_number::SYS_GETIFADDRS => sys_getifaddrs(frame),
177
178        // 扩展系统调用 (Extended/Legacy)
179        // (send/recv 等已经通过更通用的接口实现,不需要单独分发)
180
181        // 系统信息 (补充)
182        syscall_number::SYS_SYSINFO => sys_sysinfo(frame),
183
184        // POSIX 定时器 (补充)
185        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            // 未知的系统调用
191            frame.x10_a0 = (-2isize) as usize; // -ENOSYS
192            earlyprintln!("Unknown syscall: {}", frame.x17_a7);
193        }
194    }
195    crate::pr_debug!("syscall exit, return: {}", frame.x10_a0 as isize);
196}
197
198/// 宏:实现系统调用函数的自动包装器
199///
200/// 该宏会生成一个名为 `sys_name` 的函数,该函数签名固定为 `(frame: &mut TrapFrame)`
201/// 1. 从TrapFrame中提取参数
202/// 2. 调用对应的系统调用处理函数
203/// 3. 将返回值写回TrapFrame
204#[cfg(target_arch = "riscv64")]
205#[macro_export]
206macro_rules! impl_syscall {
207    // noreturn, 6 args
208    ($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    // noreturn, 0..5 args (expanded)
222    ($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    // returning, 6 args
275    ($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    // returning, 0..5 args (expanded)
290    ($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}