xref: /DragonOS/kernel/src/syscall/mod.rs (revision 11f78b73e7b18ef04e05e63612f8027eda0740e7)
1 use core::{
2     ffi::{c_char, c_int, c_void, CStr},
3     sync::atomic::{AtomicBool, Ordering},
4 };
5 
6 use crate::{
7     arch::syscall::{
8         SYS_ACCESS, SYS_CHMOD, SYS_CLOCK_GETTIME, SYS_FACCESSAT, SYS_FACCESSAT2, SYS_FCHMOD,
9         SYS_FCHMODAT, SYS_LSTAT, SYS_OPENAT, SYS_PRLIMIT64, SYS_READV, SYS_SYSINFO, SYS_UMASK,
10         SYS_UNLINK,
11     },
12     libs::{futex::constant::FutexFlag, rand::GRandFlags},
13     process::{
14         fork::KernelCloneArgs,
15         resource::{RLimit64, RUsage},
16     },
17 };
18 
19 use num_traits::{FromPrimitive, ToPrimitive};
20 
21 use crate::{
22     arch::{cpu::cpu_reset, interrupt::TrapFrame, MMArch},
23     driver::base::{block::SeekFrom, device::DeviceNumber},
24     filesystem::vfs::{
25         fcntl::FcntlCommand,
26         file::FileMode,
27         syscall::{ModeType, PosixKstat, SEEK_CUR, SEEK_END, SEEK_MAX, SEEK_SET},
28         MAX_PATHLEN,
29     },
30     include::bindings::bindings::{PAGE_2M_SIZE, PAGE_4K_SIZE},
31     kinfo,
32     libs::align::page_align_up,
33     mm::{verify_area, MemoryManagementArch, VirtAddr},
34     net::syscall::SockAddr,
35     process::{fork::CloneFlags, Pid},
36     time::{
37         syscall::{PosixTimeZone, PosixTimeval},
38         TimeSpec,
39     },
40 };
41 
42 use self::{
43     misc::SysInfo,
44     user_access::{UserBufferReader, UserBufferWriter},
45 };
46 
47 pub mod misc;
48 pub mod user_access;
49 
50 #[repr(i32)]
51 #[derive(Debug, FromPrimitive, ToPrimitive, PartialEq, Eq, Clone)]
52 #[allow(dead_code, non_camel_case_types)]
53 pub enum SystemError {
54     /// 操作不被允许 Operation not permitted.
55     EPERM = 1,
56     /// 没有指定的文件或目录 No such file or directory.
57     ENOENT = 2,
58     /// 没有这样的进程 No such process.
59     ESRCH = 3,
60     /// 被中断的函数 Interrupted function.
61     EINTR = 4,
62     /// I/O错误 I/O error.
63     EIO = 5,
64     /// 没有这样的设备或地址 No such device or address.
65     ENXIO = 6,
66     /// 参数列表过长,或者在输出buffer中缺少空间 或者参数比系统内建的最大值要大 Argument list too long.
67     E2BIG = 7,
68     /// 可执行文件格式错误 Executable file format error
69     ENOEXEC = 8,
70     /// 错误的文件描述符 Bad file descriptor.
71     EBADF = 9,
72     /// 没有子进程 No child processes.
73     ECHILD = 10,
74     /// 资源不可用,请重试。 Resource unavailable, try again.(may be the same value as [EWOULDBLOCK])
75     ///
76     /// 操作将被禁止 Operation would block.(may be the same value as [EAGAIN]).
77     EAGAIN_OR_EWOULDBLOCK = 11,
78     /// 没有足够的空间 Not enough space.
79     ENOMEM = 12,
80     /// 访问被拒绝 Permission denied
81     EACCES = 13,
82     /// 错误的地址 Bad address
83     EFAULT = 14,
84     /// 需要块设备 Block device required
85     ENOTBLK = 15,
86     /// 设备或资源忙 Device or resource busy.
87     EBUSY = 16,
88     /// 文件已存在 File exists.
89     EEXIST = 17,
90     /// 跨设备连接 Cross-device link.
91     EXDEV = 18,
92     /// 没有指定的设备 No such device.
93     ENODEV = 19,
94     /// 不是目录 Not a directory.
95     ENOTDIR = 20,
96     /// 是一个目录 Is a directory
97     EISDIR = 21,
98     /// 不可用的参数 Invalid argument.
99     EINVAL = 22,
100     /// 系统中打开的文件过多 Too many files open in system.
101     ENFILE = 23,
102     /// 文件描述符的值过大 File descriptor value too large.
103     EMFILE = 24,
104     /// 不正确的I/O控制操作 Inappropriate I/O control operation.
105     ENOTTY = 25,
106     /// 文本文件忙 Text file busy.
107     ETXTBSY = 26,
108     /// 文件太大 File too large.
109     EFBIG = 27,
110     /// 设备上没有空间 No space left on device.
111     ENOSPC = 28,
112     /// 错误的寻道.当前文件是pipe,不允许seek请求  Invalid seek.
113     ESPIPE = 29,
114     /// 只读的文件系统 Read-only file system.
115     EROFS = 30,
116     /// 链接数过多 Too many links.
117     EMLINK = 31,
118     /// 断开的管道 Broken pipe.
119     EPIPE = 32,
120     /// 数学参数超出作用域 Mathematics argument out of domain of function.
121     EDOM = 33,
122     /// 结果过大 Result too large.
123     ERANGE = 34,
124     /// 资源死锁将要发生 Resource deadlock would occur.
125     EDEADLK = 35,
126     /// 文件名过长 Filename too long.
127     ENAMETOOLONG = 36,
128     /// 没有可用的锁 No locks available.
129     ENOLCK = 37,
130     /// 功能不支持 Function not supported.
131     ENOSYS = 38,
132     /// 目录非空 Directory not empty.
133     ENOTEMPTY = 39,
134     /// 符号链接级别过多 Too many levels of symbolic links.
135     ELOOP = 40,
136     /// 没有期待类型的消息 No message of the desired type.
137     ENOMSG = 41,
138     /// 标志符被移除 Identifier removed.
139     EIDRM = 42,
140     /// 通道号超出范围 Channel number out of range
141     ECHRNG = 43,
142     /// 二级不同步 Level 2 not synchronized
143     EL2NSYNC = 44,
144     /// 三级暂停 Level 3 halted
145     EL3HLT = 45,
146     /// 三级重置 Level 3 reset
147     EL3RST = 46,
148     /// 链接号超出范围 Link number out of range
149     ELNRNG = 47,
150     /// 未连接协议驱动程序 Protocol driver not attached
151     EUNATCH = 48,
152     /// 没有可用的CSI结构 No CSI structure available
153     ENOCSI = 49,
154     /// 二级暂停 Level 2 halted
155     EL2HLT = 50,
156     /// 无效交换 Invalid exchange
157     EBADE = 51,
158     /// 无效的请求描述符 Invalid request descriptor
159     EBADR = 52,
160     /// 交换满 Exchange full
161     EXFULL = 53,
162     /// 无阳极 No anode
163     ENOANO = 54,
164     /// 请求码无效 Invalid request code
165     EBADRQC = 55,
166     /// 无效插槽 Invalid slot
167     EBADSLT = 56,
168     /// 资源死锁 Resource deadlock would occur
169     EDEADLOCK = 57,
170     /// 错误的字体文件格式 Bad font file format
171     EBFONT = 58,
172     /// 不是STREAM Not a STREAM
173     ENOSTR = 59,
174     /// 队列头没有可读取的消息 No message is available on the STREAM head read queue.
175     ENODATA = 60,
176     /// 流式ioctl()超时 Stream ioctl() timeout
177     ETIME = 61,
178     /// 没有STREAM资源  No STREAM resources.
179     ENOSR = 62,
180     /// 机器不在网络上 Machine is not on the network
181     ENONET = 63,
182     /// 未安装软件包 Package not installed
183     ENOPKG = 64,
184     /// 远程对象 Object is remote
185     EREMOTE = 65,
186     /// 保留 Reserved.
187     ENOLINK = 66,
188     /// 外设错误 Advertise error.
189     EADV = 67,
190     /// 安装错误 Srmount error
191     ESRMNT = 68,
192     /// 发送时发生通信错误 Communication error on send
193     ECOMM = 69,
194     /// 协议错误 Protocol error.
195     EPROTO = 70,
196     /// 保留使用 Reserved.
197     EMULTIHOP = 71,
198     /// RFS特定错误 RFS specific error
199     EDOTDOT = 72,
200     /// 错误的消息 Bad message.
201     EBADMSG = 73,
202     /// 数值过大,产生溢出 Value too large to be stored in data type.
203     EOVERFLOW = 74,
204     /// 名称在网络上不是唯一的 Name not unique on network
205     ENOTUNIQ = 75,
206     /// 处于不良状态的文件描述符 File descriptor in bad state
207     EBADFD = 76,
208     /// 远程地址已更改 Remote address changed
209     EREMCHG = 77,
210     /// 无法访问所需的共享库 Can not access a needed shared library
211     ELIBACC = 78,
212     /// 访问损坏的共享库 Accessing a corrupted shared library
213     ELIBBAD = 79,
214     /// a. out中的.lib部分已损坏 .lib section in a.out corrupted
215     ELIBSCN = 80,
216     /// 尝试链接太多共享库 Attempting to link in too many shared libraries
217     ELIBMAX = 81,
218     /// 无法直接执行共享库 Cannot exec a shared library directly
219     ELIBEXEC = 82,
220     /// 不合法的字符序列 Illegal byte sequence.
221     EILSEQ = 83,
222     /// 中断的系统调用应该重新启动 Interrupted system call should be restarted
223     ERESTART = 84,
224     /// 流管道错误 Streams pipe error
225     ESTRPIPE = 85,
226     /// 用户太多 Too many users
227     EUSERS = 86,
228     /// 不是一个套接字 Not a socket.
229     ENOTSOCK = 87,
230     /// 需要目标地址 Destination address required.
231     EDESTADDRREQ = 88,
232     /// 消息过大 Message too large.
233     EMSGSIZE = 89,
234     /// 对于套接字而言,错误的协议 Protocol wrong type for socket.
235     EPROTOTYPE = 90,
236     /// 协议不可用 Protocol not available.
237     ENOPROTOOPT = 91,
238     /// 协议不被支持 Protocol not supported.
239     EPROTONOSUPPORT = 92,
240     /// 不支持套接字类型 Socket type not supported
241     ESOCKTNOSUPPORT = 93,
242     /// 套接字不支持该操作 Operation not supported on socket (may be the same value as [ENOTSUP]).
243     ///
244     /// 不被支持 Not supported (may be the same value as [EOPNOTSUPP]).
245     EOPNOTSUPP_OR_ENOTSUP = 94,
246     /// 不支持协议系列 Protocol family not supported
247     EPFNOSUPPORT = 95,
248     /// 地址family不支持 Address family not supported.
249     EAFNOSUPPORT = 96,
250     /// 地址正在被使用 Address in use.
251     EADDRINUSE = 97,
252     /// 地址不可用 Address  not available.
253     EADDRNOTAVAIL = 98,
254     /// 网络已关闭 Network is down.
255     ENETDOWN = 99,
256     /// 网络不可达 Network unreachable.
257     ENETUNREACH = 100,
258     /// 网络连接已断开 Connection aborted by network.
259     ENETRESET = 101,
260     /// 连接已断开 Connection aborted.
261     ECONNABORTED = 102,
262     /// 连接被重置 Connection reset.
263     ECONNRESET = 103,
264     /// 缓冲区空间不足 No buffer space available.
265     ENOBUFS = 104,
266     /// 套接字已连接 Socket is connected.
267     EISCONN = 105,
268     /// 套接字未连接 The socket is not connected.
269     ENOTCONN = 106,
270     /// 传输端点关闭后无法发送 Cannot send after transport endpoint shutdown
271     ESHUTDOWN = 107,
272     /// 引用太多:无法拼接 Too many references: cannot splice
273     ETOOMANYREFS = 108,
274     /// 连接超时 Connection timed out.
275     ETIMEDOUT = 109,
276     /// 连接被拒绝 Connection refused.
277     ECONNREFUSED = 110,
278     /// 主机已关闭 Host is down
279     EHOSTDOWN = 111,
280     /// 主机不可达 Host is unreachable.
281     EHOSTUNREACH = 112,
282     /// 连接已经在处理 Connection already in progress.
283     EALREADY = 113,
284     /// 操作正在处理 Operation in progress.
285     EINPROGRESS = 114,
286     /// 保留 Reserved.
287     ESTALE = 115,
288     /// 结构需要清理 Structure needs cleaning
289     EUCLEAN = 116,
290     /// 不是XENIX命名类型文件 Not a XENIX named type file
291     ENOTNAM = 117,
292     /// 没有可用的XENIX信号量 No XENIX semaphores available
293     ENAVAIL = 118,
294     /// 是命名类型文件 Is a named type file
295     EISNAM = 119,
296     /// 远程I/O错误 Remote I/O error
297     EREMOTEIO = 120,
298     /// 保留使用 Reserved
299     EDQUOT = 121,
300     /// 没有找到媒介 No medium found
301     ENOMEDIUM = 122,
302     /// 介质类型错误 Wrong medium type
303     EMEDIUMTYPE = 123,
304     /// 操作被取消 Operation canceled.
305     ECANCELED = 124,
306     /// 所需的密钥不可用 Required key not available
307     ENOKEY = 125,
308     /// 密钥已过期 Key has expired
309     EKEYEXPIRED = 126,
310     /// 密钥已被撤销 Key has been revoked
311     EKEYREVOKED = 127,
312     /// 密钥被服务拒绝 Key has been revoked
313     EKEYREJECTED = 128,
314     /// 之前的拥有者挂了 Previous owner died.
315     EOWNERDEAD = 129,
316     /// 状态不可恢复 State not recoverable.
317     ENOTRECOVERABLE = 130,
318     // VMX on 虚拟化开启指令出错
319     EVMXONFailed = 131,
320     // VMX off 虚拟化关闭指令出错
321     EVMXOFFFailed = 132,
322     // VMX VMWRITE 写入虚拟化VMCS内存出错
323     EVMWRITEFailed = 133,
324     EVMREADFailed = 134,
325     EVMPRTLDFailed = 135,
326     EVMLAUNCHFailed = 136,
327     KVM_HVA_ERR_BAD = 137,
328 
329     // === 以下错误码不应该被用户态程序使用 ===
330     ERESTARTSYS = 512,
331 }
332 
333 impl SystemError {
334     /// @brief 把posix错误码转换为系统错误枚举类型。
335     pub fn from_posix_errno(errno: i32) -> Option<SystemError> {
336         // posix 错误码是小于0的
337         if errno >= 0 {
338             return None;
339         }
340         return <Self as FromPrimitive>::from_i32(-errno);
341     }
342 
343     /// @brief 把系统错误枚举类型转换为负数posix错误码。
344     pub fn to_posix_errno(&self) -> i32 {
345         return -<Self as ToPrimitive>::to_i32(self).unwrap();
346     }
347 }
348 
349 // 定义系统调用号
350 pub const SYS_READ: usize = 0;
351 pub const SYS_WRITE: usize = 1;
352 pub const SYS_OPEN: usize = 2;
353 pub const SYS_CLOSE: usize = 3;
354 pub const SYS_STAT: usize = 4;
355 pub const SYS_FSTAT: usize = 5;
356 
357 pub const SYS_POLL: usize = 7;
358 pub const SYS_LSEEK: usize = 8;
359 pub const SYS_MMAP: usize = 9;
360 pub const SYS_MPROTECT: usize = 10;
361 
362 pub const SYS_MUNMAP: usize = 11;
363 pub const SYS_BRK: usize = 12;
364 pub const SYS_SIGACTION: usize = 13;
365 pub const SYS_RT_SIGPROCMASK: usize = 14;
366 pub const SYS_RT_SIGRETURN: usize = 15;
367 
368 pub const SYS_IOCTL: usize = 16;
369 
370 pub const SYS_WRITEV: usize = 20;
371 pub const SYS_PIPE: usize = 22;
372 
373 pub const SYS_MADVISE: usize = 28;
374 
375 pub const SYS_DUP: usize = 32;
376 pub const SYS_DUP2: usize = 33;
377 
378 pub const SYS_NANOSLEEP: usize = 35;
379 
380 pub const SYS_GETPID: usize = 39;
381 
382 pub const SYS_SOCKET: usize = 41;
383 pub const SYS_CONNECT: usize = 42;
384 pub const SYS_ACCEPT: usize = 43;
385 pub const SYS_SENDTO: usize = 44;
386 pub const SYS_RECVFROM: usize = 45;
387 
388 pub const SYS_RECVMSG: usize = 47;
389 pub const SYS_SHUTDOWN: usize = 48;
390 pub const SYS_BIND: usize = 49;
391 pub const SYS_LISTEN: usize = 50;
392 pub const SYS_GETSOCKNAME: usize = 51;
393 pub const SYS_GETPEERNAME: usize = 52;
394 pub const SYS_SOCKET_PAIR: usize = 53;
395 pub const SYS_SETSOCKOPT: usize = 54;
396 pub const SYS_GETSOCKOPT: usize = 55;
397 
398 pub const SYS_CLONE: usize = 56;
399 pub const SYS_FORK: usize = 57;
400 pub const SYS_VFORK: usize = 58;
401 pub const SYS_EXECVE: usize = 59;
402 pub const SYS_EXIT: usize = 60;
403 pub const SYS_WAIT4: usize = 61;
404 pub const SYS_KILL: usize = 62;
405 
406 pub const SYS_FCNTL: usize = 72;
407 
408 pub const SYS_FTRUNCATE: usize = 77;
409 pub const SYS_GET_DENTS: usize = 78;
410 
411 pub const SYS_GETCWD: usize = 79;
412 
413 pub const SYS_CHDIR: usize = 80;
414 
415 pub const SYS_MKDIR: usize = 83;
416 
417 pub const SYS_READLINK: usize = 89;
418 
419 pub const SYS_GETTIMEOFDAY: usize = 96;
420 pub const SYS_GETRUSAGE: usize = 98;
421 
422 pub const SYS_GETUID: usize = 102;
423 pub const SYS_SYSLOG: usize = 103;
424 pub const SYS_GETGID: usize = 104;
425 pub const SYS_SETUID: usize = 105;
426 
427 pub const SYS_SETGID: usize = 106;
428 pub const SYS_GETEUID: usize = 107;
429 pub const SYS_GETEGID: usize = 108;
430 
431 pub const SYS_GETPPID: usize = 110;
432 pub const SYS_GETPGID: usize = 121;
433 
434 pub const SYS_SIGALTSTACK: usize = 131;
435 pub const SYS_MKNOD: usize = 133;
436 
437 pub const SYS_ARCH_PRCTL: usize = 158;
438 
439 pub const SYS_REBOOT: usize = 169;
440 
441 pub const SYS_GETTID: usize = 186;
442 
443 #[allow(dead_code)]
444 pub const SYS_TKILL: usize = 200;
445 
446 #[allow(dead_code)]
447 pub const SYS_FUTEX: usize = 202;
448 
449 pub const SYS_GET_DENTS_64: usize = 217;
450 #[allow(dead_code)]
451 pub const SYS_SET_TID_ADDR: usize = 218;
452 
453 pub const SYS_EXIT_GROUP: usize = 231;
454 
455 pub const SYS_UNLINK_AT: usize = 263;
456 
457 pub const SYS_READLINK_AT: usize = 267;
458 
459 pub const SYS_ACCEPT4: usize = 288;
460 
461 pub const SYS_PIPE2: usize = 293;
462 
463 #[allow(dead_code)]
464 pub const SYS_GET_RANDOM: usize = 318;
465 
466 // 与linux不一致的调用,在linux基础上累加
467 pub const SYS_PUT_STRING: usize = 100000;
468 pub const SYS_SBRK: usize = 100001;
469 /// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!! 删的时候记得改C版本的libc
470 pub const SYS_CLOCK: usize = 100002;
471 pub const SYS_SCHED: usize = 100003;
472 
473 #[derive(Debug)]
474 pub struct Syscall;
475 
476 extern "C" {
477     fn do_put_string(s: *const u8, front_color: u32, back_color: u32) -> usize;
478 }
479 
480 #[no_mangle]
481 pub extern "C" fn syscall_init() -> i32 {
482     kinfo!("Initializing syscall...");
483     Syscall::init().expect("syscall init failed");
484     kinfo!("Syscall init successfully!");
485     return 0;
486 }
487 
488 impl Syscall {
489     /// 初始化系统调用
490     pub fn init() -> Result<(), SystemError> {
491         static INIT_FLAG: AtomicBool = AtomicBool::new(false);
492         let prev = INIT_FLAG.swap(true, Ordering::SeqCst);
493         if prev {
494             panic!("Cannot initialize syscall more than once!");
495         }
496         return crate::arch::syscall::arch_syscall_init();
497     }
498     /// @brief 系统调用分发器,用于分发系统调用。
499     ///
500     /// 这个函数内,需要根据系统调用号,调用对应的系统调用处理函数。
501     /// 并且,对于用户态传入的指针参数,需要在本函数内进行越界检查,防止访问到内核空间。
502     pub fn handle(
503         syscall_num: usize,
504         args: &[usize],
505         frame: &mut TrapFrame,
506     ) -> Result<usize, SystemError> {
507         let r = match syscall_num {
508             SYS_PUT_STRING => {
509                 Self::put_string(args[0] as *const u8, args[1] as u32, args[2] as u32)
510             }
511             SYS_OPEN => {
512                 let path: &CStr = unsafe { CStr::from_ptr(args[0] as *const c_char) };
513                 let path: Result<&str, core::str::Utf8Error> = path.to_str();
514                 let res = if path.is_err() {
515                     Err(SystemError::EINVAL)
516                 } else {
517                     let path: &str = path.unwrap();
518 
519                     let flags = args[1];
520                     let mode = args[2];
521 
522                     let open_flags: FileMode = FileMode::from_bits_truncate(flags as u32);
523                     let mode = ModeType::from_bits(mode as u32).ok_or(SystemError::EINVAL)?;
524                     Self::open(path, open_flags, mode, true)
525                 };
526                 res
527             }
528 
529             SYS_OPENAT => {
530                 let dirfd = args[0] as i32;
531                 let path: &CStr = unsafe { CStr::from_ptr(args[1] as *const c_char) };
532                 let flags = args[2];
533                 let mode = args[3];
534 
535                 let path: Result<&str, core::str::Utf8Error> = path.to_str();
536                 let res = if path.is_err() {
537                     Err(SystemError::EINVAL)
538                 } else {
539                     let path: &str = path.unwrap();
540 
541                     let open_flags: FileMode =
542                         FileMode::from_bits(flags as u32).ok_or(SystemError::EINVAL)?;
543                     let mode = ModeType::from_bits(mode as u32).ok_or(SystemError::EINVAL)?;
544                     Self::openat(dirfd, path, open_flags, mode, true)
545                 };
546                 res
547             }
548             SYS_CLOSE => {
549                 let fd = args[0];
550 
551                 let res = Self::close(fd);
552 
553                 res
554             }
555             SYS_READ => {
556                 let fd = args[0] as i32;
557                 let buf_vaddr = args[1];
558                 let len = args[2];
559                 let from_user = frame.from_user();
560                 let mut user_buffer_writer =
561                     UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
562 
563                 let user_buf = user_buffer_writer.buffer(0)?;
564                 let res = Self::read(fd, user_buf);
565                 res
566             }
567             SYS_WRITE => {
568                 let fd = args[0] as i32;
569                 let buf_vaddr = args[1];
570                 let len = args[2];
571                 let from_user = frame.from_user();
572                 let user_buffer_reader =
573                     UserBufferReader::new(buf_vaddr as *const u8, len, from_user)?;
574 
575                 let user_buf = user_buffer_reader.read_from_user(0)?;
576                 let res = Self::write(fd, user_buf);
577                 res
578             }
579 
580             SYS_LSEEK => {
581                 let fd = args[0] as i32;
582                 let offset = args[1] as i64;
583                 let whence = args[2] as u32;
584 
585                 let w = match whence {
586                     SEEK_SET => Ok(SeekFrom::SeekSet(offset)),
587                     SEEK_CUR => Ok(SeekFrom::SeekCurrent(offset)),
588                     SEEK_END => Ok(SeekFrom::SeekEnd(offset)),
589                     SEEK_MAX => Ok(SeekFrom::SeekEnd(0)),
590                     _ => Err(SystemError::EINVAL),
591                 }?;
592 
593                 Self::lseek(fd, w)
594             }
595             SYS_IOCTL => {
596                 let fd = args[0];
597                 let cmd = args[1];
598                 let data = args[2];
599                 Self::ioctl(fd, cmd as u32, data)
600             }
601 
602             SYS_FORK => Self::fork(frame),
603             SYS_VFORK => Self::vfork(frame),
604 
605             SYS_BRK => {
606                 let new_brk = VirtAddr::new(args[0]);
607                 Self::brk(new_brk).map(|vaddr| vaddr.data())
608             }
609 
610             SYS_SBRK => {
611                 let increment = args[0] as isize;
612                 Self::sbrk(increment).map(|vaddr: VirtAddr| vaddr.data())
613             }
614 
615             SYS_REBOOT => Self::reboot(),
616 
617             SYS_CHDIR => {
618                 // Closure for checking arguments
619                 let chdir_check = |arg0: usize| {
620                     if arg0 == 0 {
621                         return Err(SystemError::EFAULT);
622                     }
623                     let path_ptr = arg0 as *const c_char;
624                     let virt_addr = VirtAddr::new(path_ptr as usize);
625                     // 权限校验
626                     if path_ptr.is_null()
627                         || (frame.from_user()
628                             && verify_area(virt_addr, PAGE_2M_SIZE as usize).is_err())
629                     {
630                         return Err(SystemError::EINVAL);
631                     }
632                     let dest_path: &CStr = unsafe { CStr::from_ptr(path_ptr) };
633                     let dest_path: &str = dest_path.to_str().map_err(|_| SystemError::EINVAL)?;
634                     if dest_path.len() == 0 {
635                         return Err(SystemError::EINVAL);
636                     } else if dest_path.len() > MAX_PATHLEN as usize {
637                         return Err(SystemError::ENAMETOOLONG);
638                     }
639 
640                     return Ok(dest_path);
641                 };
642 
643                 let r = chdir_check(args[0])?;
644                 Self::chdir(r)
645             }
646 
647             SYS_GET_DENTS | SYS_GET_DENTS_64 => {
648                 let fd = args[0] as i32;
649 
650                 let buf_vaddr = args[1];
651                 let len = args[2];
652                 let virt_addr: VirtAddr = VirtAddr::new(buf_vaddr);
653                 // 判断缓冲区是否来自用户态,进行权限校验
654                 let res = if frame.from_user() && verify_area(virt_addr, len as usize).is_err() {
655                     // 来自用户态,而buffer在内核态,这样的操作不被允许
656                     Err(SystemError::EPERM)
657                 } else if buf_vaddr == 0 {
658                     Err(SystemError::EFAULT)
659                 } else {
660                     let buf: &mut [u8] = unsafe {
661                         core::slice::from_raw_parts_mut::<'static, u8>(buf_vaddr as *mut u8, len)
662                     };
663                     Self::getdents(fd, buf)
664                 };
665 
666                 res
667             }
668 
669             SYS_EXECVE => {
670                 let path_ptr = args[0];
671                 let argv_ptr = args[1];
672                 let env_ptr = args[2];
673                 let virt_path_ptr = VirtAddr::new(path_ptr);
674                 let virt_argv_ptr = VirtAddr::new(argv_ptr);
675                 let virt_env_ptr = VirtAddr::new(env_ptr);
676                 // 权限校验
677                 if frame.from_user()
678                     && (verify_area(virt_path_ptr, MAX_PATHLEN as usize).is_err()
679                         || verify_area(virt_argv_ptr, PAGE_4K_SIZE as usize).is_err())
680                     || verify_area(virt_env_ptr, PAGE_4K_SIZE as usize).is_err()
681                 {
682                     Err(SystemError::EFAULT)
683                 } else {
684                     Self::execve(
685                         path_ptr as *const u8,
686                         argv_ptr as *const *const u8,
687                         env_ptr as *const *const u8,
688                         frame,
689                     )
690                     .map(|_| 0)
691                 }
692             }
693             SYS_WAIT4 => {
694                 let pid = args[0] as i32;
695                 let wstatus = args[1] as *mut i32;
696                 let options = args[2] as c_int;
697                 let rusage = args[3] as *mut c_void;
698                 // 权限校验
699                 // todo: 引入rusage之后,更正以下权限校验代码中,rusage的大小
700                 Self::wait4(pid.into(), wstatus, options, rusage)
701             }
702 
703             SYS_EXIT => {
704                 let exit_code = args[0];
705                 Self::exit(exit_code)
706             }
707             SYS_MKDIR => {
708                 let path_ptr = args[0] as *const c_char;
709                 let mode = args[1];
710                 let virt_path_ptr = VirtAddr::new(path_ptr as usize);
711                 let security_check = || {
712                     if path_ptr.is_null()
713                         || (frame.from_user()
714                             && verify_area(virt_path_ptr, PAGE_2M_SIZE as usize).is_err())
715                     {
716                         return Err(SystemError::EINVAL);
717                     }
718                     let path: &CStr = unsafe { CStr::from_ptr(path_ptr) };
719                     let path: &str = path.to_str().map_err(|_| SystemError::EINVAL)?.trim();
720 
721                     if path == "" {
722                         return Err(SystemError::EINVAL);
723                     }
724                     return Ok(path);
725                 };
726 
727                 let path = security_check();
728                 if path.is_err() {
729                     Err(path.unwrap_err())
730                 } else {
731                     Self::mkdir(path.unwrap(), mode)
732                 }
733             }
734 
735             SYS_NANOSLEEP => {
736                 let req = args[0] as *const TimeSpec;
737                 let rem = args[1] as *mut TimeSpec;
738                 let virt_req = VirtAddr::new(req as usize);
739                 let virt_rem = VirtAddr::new(rem as usize);
740                 if frame.from_user()
741                     && (verify_area(virt_req, core::mem::size_of::<TimeSpec>() as usize).is_err()
742                         || verify_area(virt_rem, core::mem::size_of::<TimeSpec>() as usize)
743                             .is_err())
744                 {
745                     Err(SystemError::EFAULT)
746                 } else {
747                     Self::nanosleep(req, rem)
748                 }
749             }
750 
751             SYS_CLOCK => Self::clock(),
752             SYS_PIPE => {
753                 let pipefd: *mut i32 = args[0] as *mut c_int;
754                 if pipefd.is_null() {
755                     Err(SystemError::EFAULT)
756                 } else {
757                     Self::pipe2(pipefd, FileMode::empty())
758                 }
759             }
760             SYS_PIPE2 => {
761                 let pipefd: *mut i32 = args[0] as *mut c_int;
762                 let arg1 = args[1];
763                 if pipefd.is_null() {
764                     Err(SystemError::EFAULT)
765                 } else {
766                     let flags = FileMode::from_bits_truncate(arg1 as u32);
767                     Self::pipe2(pipefd, flags)
768                 }
769             }
770 
771             SYS_UNLINK_AT => {
772                 let dirfd = args[0] as i32;
773                 let pathname = args[1] as *const c_char;
774                 let flags = args[2] as u32;
775                 let virt_pathname = VirtAddr::new(pathname as usize);
776                 if frame.from_user() && verify_area(virt_pathname, PAGE_4K_SIZE as usize).is_err() {
777                     Err(SystemError::EFAULT)
778                 } else if pathname.is_null() {
779                     Err(SystemError::EFAULT)
780                 } else {
781                     let get_path = || {
782                         let pathname: &CStr = unsafe { CStr::from_ptr(pathname) };
783 
784                         let pathname: &str = pathname.to_str().map_err(|_| SystemError::EINVAL)?;
785                         if pathname.len() >= MAX_PATHLEN {
786                             return Err(SystemError::ENAMETOOLONG);
787                         }
788                         return Ok(pathname.trim());
789                     };
790                     let pathname = get_path();
791                     if pathname.is_err() {
792                         Err(pathname.unwrap_err())
793                     } else {
794                         // kdebug!("sys unlinkat: dirfd: {}, pathname: {}", dirfd, pathname.as_ref().unwrap());
795                         Self::unlinkat(dirfd, pathname.unwrap(), flags)
796                     }
797                 }
798             }
799 
800             SYS_UNLINK => {
801                 let pathname = args[0] as *const u8;
802                 Self::unlink(pathname)
803             }
804             SYS_KILL => {
805                 let pid = Pid::new(args[0]);
806                 let sig = args[1] as c_int;
807                 // kdebug!("KILL SYSCALL RECEIVED");
808                 Self::kill(pid, sig)
809             }
810 
811             SYS_SIGACTION => {
812                 let sig = args[0] as c_int;
813                 let act = args[1];
814                 let old_act = args[2];
815                 Self::sigaction(sig, act, old_act, frame.from_user())
816             }
817 
818             SYS_RT_SIGRETURN => {
819                 // 由于目前signal机制的实现,与x86_64强关联,因此暂时在arch/x86_64/syscall.rs中调用
820                 // todo: 未来需要将signal机制与平台解耦
821                 todo!()
822             }
823 
824             SYS_GETPID => Self::getpid().map(|pid| pid.into()),
825 
826             SYS_SCHED => Self::sched(frame.from_user()),
827             SYS_DUP => {
828                 let oldfd: i32 = args[0] as c_int;
829                 Self::dup(oldfd)
830             }
831             SYS_DUP2 => {
832                 let oldfd: i32 = args[0] as c_int;
833                 let newfd: i32 = args[1] as c_int;
834                 Self::dup2(oldfd, newfd)
835             }
836 
837             SYS_SOCKET => Self::socket(args[0], args[1], args[2]),
838             SYS_SETSOCKOPT => {
839                 let optval = args[3] as *const u8;
840                 let optlen = args[4] as usize;
841                 let virt_optval = VirtAddr::new(optval as usize);
842                 // 验证optval的地址是否合法
843                 if verify_area(virt_optval, optlen as usize).is_err() {
844                     // 地址空间超出了用户空间的范围,不合法
845                     Err(SystemError::EFAULT)
846                 } else {
847                     let data: &[u8] = unsafe { core::slice::from_raw_parts(optval, optlen) };
848                     Self::setsockopt(args[0], args[1], args[2], data)
849                 }
850             }
851             SYS_GETSOCKOPT => {
852                 let optval = args[3] as *mut u8;
853                 let optlen = args[4] as *mut usize;
854                 let virt_optval = VirtAddr::new(optval as usize);
855                 let virt_optlen = VirtAddr::new(optlen as usize);
856                 let security_check = || {
857                     // 验证optval的地址是否合法
858                     if verify_area(virt_optval, PAGE_4K_SIZE as usize).is_err() {
859                         // 地址空间超出了用户空间的范围,不合法
860                         return Err(SystemError::EFAULT);
861                     }
862 
863                     // 验证optlen的地址是否合法
864                     if verify_area(virt_optlen, core::mem::size_of::<u32>() as usize).is_err() {
865                         // 地址空间超出了用户空间的范围,不合法
866                         return Err(SystemError::EFAULT);
867                     }
868                     return Ok(());
869                 };
870                 let r = security_check();
871                 if r.is_err() {
872                     Err(r.unwrap_err())
873                 } else {
874                     Self::getsockopt(args[0], args[1], args[2], optval, optlen as *mut u32)
875                 }
876             }
877 
878             SYS_CONNECT => {
879                 let addr = args[1] as *const SockAddr;
880                 let addrlen = args[2] as usize;
881                 let virt_addr = VirtAddr::new(addr as usize);
882                 // 验证addr的地址是否合法
883                 if verify_area(virt_addr, addrlen as usize).is_err() {
884                     // 地址空间超出了用户空间的范围,不合法
885                     Err(SystemError::EFAULT)
886                 } else {
887                     Self::connect(args[0], addr, addrlen)
888                 }
889             }
890             SYS_BIND => {
891                 let addr = args[1] as *const SockAddr;
892                 let addrlen = args[2] as usize;
893                 let virt_addr = VirtAddr::new(addr as usize);
894                 // 验证addr的地址是否合法
895                 if verify_area(virt_addr, addrlen as usize).is_err() {
896                     // 地址空间超出了用户空间的范围,不合法
897                     Err(SystemError::EFAULT)
898                 } else {
899                     Self::bind(args[0], addr, addrlen)
900                 }
901             }
902 
903             SYS_SENDTO => {
904                 let buf = args[1] as *const u8;
905                 let len = args[2] as usize;
906                 let flags = args[3] as u32;
907                 let addr = args[4] as *const SockAddr;
908                 let addrlen = args[5] as usize;
909                 let virt_buf = VirtAddr::new(buf as usize);
910                 let virt_addr = VirtAddr::new(addr as usize);
911                 // 验证buf的地址是否合法
912                 if verify_area(virt_buf, len as usize).is_err() {
913                     // 地址空间超出了用户空间的范围,不合法
914                     Err(SystemError::EFAULT)
915                 } else if verify_area(virt_addr, addrlen as usize).is_err() {
916                     // 地址空间超出了用户空间的范围,不合法
917                     Err(SystemError::EFAULT)
918                 } else {
919                     let data: &[u8] = unsafe { core::slice::from_raw_parts(buf, len) };
920                     Self::sendto(args[0], data, flags, addr, addrlen)
921                 }
922             }
923 
924             SYS_RECVFROM => {
925                 let buf = args[1] as *mut u8;
926                 let len = args[2] as usize;
927                 let flags = args[3] as u32;
928                 let addr = args[4] as *mut SockAddr;
929                 let addrlen = args[5] as *mut usize;
930                 let virt_buf = VirtAddr::new(buf as usize);
931                 let virt_addrlen = VirtAddr::new(addrlen as usize);
932                 let virt_addr = VirtAddr::new(addr as usize);
933                 let security_check = || {
934                     // 验证buf的地址是否合法
935                     if verify_area(virt_buf, len as usize).is_err() {
936                         // 地址空间超出了用户空间的范围,不合法
937                         return Err(SystemError::EFAULT);
938                     }
939 
940                     // 验证addrlen的地址是否合法
941                     if verify_area(virt_addrlen, core::mem::size_of::<u32>() as usize).is_err() {
942                         // 地址空间超出了用户空间的范围,不合法
943                         return Err(SystemError::EFAULT);
944                     }
945 
946                     if verify_area(virt_addr, core::mem::size_of::<SockAddr>() as usize).is_err() {
947                         // 地址空间超出了用户空间的范围,不合法
948                         return Err(SystemError::EFAULT);
949                     }
950                     return Ok(());
951                 };
952                 let r = security_check();
953                 if r.is_err() {
954                     Err(r.unwrap_err())
955                 } else {
956                     let buf = unsafe { core::slice::from_raw_parts_mut(buf, len) };
957                     Self::recvfrom(args[0], buf, flags, addr, addrlen as *mut u32)
958                 }
959             }
960 
961             SYS_RECVMSG => {
962                 let msg = args[1] as *mut crate::net::syscall::MsgHdr;
963                 let flags = args[2] as u32;
964                 match UserBufferWriter::new(
965                     msg,
966                     core::mem::size_of::<crate::net::syscall::MsgHdr>(),
967                     true,
968                 ) {
969                     Err(e) => Err(e),
970                     Ok(mut user_buffer_writer) => {
971                         match user_buffer_writer.buffer::<crate::net::syscall::MsgHdr>(0) {
972                             Err(e) => Err(e),
973                             Ok(buffer) => {
974                                 let msg = &mut buffer[0];
975                                 Self::recvmsg(args[0], msg, flags)
976                             }
977                         }
978                     }
979                 }
980             }
981 
982             SYS_LISTEN => Self::listen(args[0], args[1]),
983             SYS_SHUTDOWN => Self::shutdown(args[0], args[1]),
984             SYS_ACCEPT => Self::accept(args[0], args[1] as *mut SockAddr, args[2] as *mut u32),
985             SYS_ACCEPT4 => Self::accept4(
986                 args[0],
987                 args[1] as *mut SockAddr,
988                 args[2] as *mut u32,
989                 args[3] as u32,
990             ),
991             SYS_GETSOCKNAME => {
992                 Self::getsockname(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
993             }
994             SYS_GETPEERNAME => {
995                 Self::getpeername(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
996             }
997             SYS_GETTIMEOFDAY => {
998                 let timeval = args[0] as *mut PosixTimeval;
999                 let timezone_ptr = args[1] as *mut PosixTimeZone;
1000                 Self::gettimeofday(timeval, timezone_ptr)
1001             }
1002             SYS_MMAP => {
1003                 let len = page_align_up(args[1]);
1004                 let virt_addr = VirtAddr::new(args[0] as usize);
1005                 if verify_area(virt_addr, len as usize).is_err() {
1006                     Err(SystemError::EFAULT)
1007                 } else {
1008                     Self::mmap(
1009                         VirtAddr::new(args[0]),
1010                         len,
1011                         args[2],
1012                         args[3],
1013                         args[4] as i32,
1014                         args[5],
1015                     )
1016                 }
1017             }
1018             SYS_MUNMAP => {
1019                 let addr = args[0];
1020                 let len = page_align_up(args[1]);
1021                 if addr & (MMArch::PAGE_SIZE - 1) != 0 {
1022                     // The addr argument is not a multiple of the page size
1023                     Err(SystemError::EINVAL)
1024                 } else {
1025                     Self::munmap(VirtAddr::new(addr), len)
1026                 }
1027             }
1028             SYS_MPROTECT => {
1029                 let addr = args[0];
1030                 let len = page_align_up(args[1]);
1031                 if addr & (MMArch::PAGE_SIZE - 1) != 0 {
1032                     // The addr argument is not a multiple of the page size
1033                     Err(SystemError::EINVAL)
1034                 } else {
1035                     Self::mprotect(VirtAddr::new(addr), len, args[2])
1036                 }
1037             }
1038 
1039             SYS_GETCWD => {
1040                 let buf = args[0] as *mut u8;
1041                 let size = args[1] as usize;
1042                 let security_check = || {
1043                     verify_area(VirtAddr::new(buf as usize), size)?;
1044                     return Ok(());
1045                 };
1046                 let r = security_check();
1047                 if r.is_err() {
1048                     Err(r.unwrap_err())
1049                 } else {
1050                     let buf = unsafe { core::slice::from_raw_parts_mut(buf, size) };
1051                     Self::getcwd(buf).map(|ptr| ptr.data())
1052                 }
1053             }
1054 
1055             SYS_GETPGID => Self::getpgid(Pid::new(args[0])).map(|pid| pid.into()),
1056 
1057             SYS_GETPPID => Self::getppid().map(|pid| pid.into()),
1058             SYS_FSTAT => {
1059                 let fd = args[0] as i32;
1060                 let kstat = args[1] as *mut PosixKstat;
1061                 let vaddr = VirtAddr::new(kstat as usize);
1062                 // FIXME 由于c中的verify_area与rust中的verify_area重名,所以在引入时加了前缀区分
1063                 // TODO 应该将用了c版本的verify_area都改为rust的verify_area
1064                 match verify_area(vaddr, core::mem::size_of::<PosixKstat>()) {
1065                     Ok(_) => Self::fstat(fd, kstat),
1066                     Err(e) => Err(e),
1067                 }
1068             }
1069 
1070             SYS_FCNTL => {
1071                 let fd = args[0] as i32;
1072                 let cmd: Option<FcntlCommand> =
1073                     <FcntlCommand as FromPrimitive>::from_u32(args[1] as u32);
1074                 let arg = args[2] as i32;
1075                 let res = if let Some(cmd) = cmd {
1076                     Self::fcntl(fd, cmd, arg)
1077                 } else {
1078                     Err(SystemError::EINVAL)
1079                 };
1080 
1081                 // kdebug!("FCNTL: fd: {}, cmd: {:?}, arg: {}, res: {:?}", fd, cmd, arg, res);
1082                 res
1083             }
1084 
1085             SYS_FTRUNCATE => {
1086                 let fd = args[0] as i32;
1087                 let len = args[1] as usize;
1088                 let res = Self::ftruncate(fd, len);
1089                 // kdebug!("FTRUNCATE: fd: {}, len: {}, res: {:?}", fd, len, res);
1090                 res
1091             }
1092 
1093             SYS_MKNOD => {
1094                 let path = args[0];
1095                 let flags = args[1];
1096                 let dev_t = args[2];
1097                 let flags: ModeType = ModeType::from_bits_truncate(flags as u32);
1098                 Self::mknod(path as *const i8, flags, DeviceNumber::from(dev_t))
1099             }
1100 
1101             SYS_CLONE => {
1102                 let parent_tid = VirtAddr::new(args[2]);
1103                 let child_tid = VirtAddr::new(args[3]);
1104 
1105                 // 地址校验
1106                 verify_area(parent_tid, core::mem::size_of::<i32>())?;
1107                 verify_area(child_tid, core::mem::size_of::<i32>())?;
1108 
1109                 let mut clone_args = KernelCloneArgs::new();
1110                 clone_args.flags = CloneFlags::from_bits_truncate(args[0] as u64);
1111                 clone_args.stack = args[1];
1112                 clone_args.parent_tid = parent_tid;
1113                 clone_args.child_tid = child_tid;
1114                 clone_args.tls = args[4];
1115                 Self::clone(frame, clone_args)
1116             }
1117 
1118             SYS_FUTEX => {
1119                 let uaddr = VirtAddr::new(args[0]);
1120                 let operation = FutexFlag::from_bits(args[1] as u32).ok_or(SystemError::ENOSYS)?;
1121                 let val = args[2] as u32;
1122                 let utime = args[3];
1123                 let uaddr2 = VirtAddr::new(args[4]);
1124                 let val3 = args[5] as u32;
1125 
1126                 verify_area(uaddr, core::mem::size_of::<u32>())?;
1127                 verify_area(uaddr2, core::mem::size_of::<u32>())?;
1128 
1129                 let mut timespec = None;
1130                 if utime != 0 && operation.contains(FutexFlag::FLAGS_HAS_TIMEOUT) {
1131                     let reader = UserBufferReader::new(
1132                         utime as *const TimeSpec,
1133                         core::mem::size_of::<TimeSpec>(),
1134                         true,
1135                     )?;
1136 
1137                     timespec = Some(reader.read_one_from_user::<TimeSpec>(0)?.clone());
1138                 }
1139 
1140                 Self::do_futex(uaddr, operation, val, timespec, uaddr2, utime as u32, val3)
1141             }
1142 
1143             SYS_READV => Self::readv(args[0] as i32, args[1], args[2]),
1144             SYS_WRITEV => Self::writev(args[0] as i32, args[1], args[2]),
1145 
1146             SYS_ARCH_PRCTL => Self::arch_prctl(args[0], args[1]),
1147 
1148             SYS_SET_TID_ADDR => Self::set_tid_address(args[0]),
1149 
1150             SYS_STAT | SYS_LSTAT => {
1151                 let path: &CStr = unsafe { CStr::from_ptr(args[0] as *const c_char) };
1152                 let path: Result<&str, core::str::Utf8Error> = path.to_str();
1153                 let res = if path.is_err() {
1154                     Err(SystemError::EINVAL)
1155                 } else {
1156                     let path: &str = path.unwrap();
1157                     let kstat = args[1] as *mut PosixKstat;
1158                     let vaddr = VirtAddr::new(kstat as usize);
1159                     match verify_area(vaddr, core::mem::size_of::<PosixKstat>()) {
1160                         Ok(_) => {
1161                             if syscall_num == SYS_STAT {
1162                                 Self::stat(path, kstat)
1163                             } else {
1164                                 Self::lstat(path, kstat)
1165                             }
1166                         }
1167                         Err(e) => Err(e),
1168                     }
1169                 };
1170 
1171                 res
1172             }
1173 
1174             // 目前为了适配musl-libc,以下系统调用先这样写着
1175             SYS_GET_RANDOM => {
1176                 let flags = GRandFlags::from_bits(args[2] as u8).ok_or(SystemError::EINVAL)?;
1177                 Self::get_random(args[0] as *mut u8, args[1], flags)
1178             }
1179 
1180             SYS_SOCKET_PAIR => {
1181                 unimplemented!()
1182             }
1183 
1184             SYS_POLL => {
1185                 kwarn!("SYS_POLL has not yet been implemented");
1186                 Ok(0)
1187             }
1188 
1189             SYS_RT_SIGPROCMASK => {
1190                 kwarn!("SYS_RT_SIGPROCMASK has not yet been implemented");
1191                 Ok(0)
1192             }
1193 
1194             SYS_TKILL => {
1195                 kwarn!("SYS_TKILL has not yet been implemented");
1196                 Ok(0)
1197             }
1198 
1199             SYS_SIGALTSTACK => {
1200                 kwarn!("SYS_SIGALTSTACK has not yet been implemented");
1201                 Ok(0)
1202             }
1203 
1204             SYS_EXIT_GROUP => {
1205                 kwarn!("SYS_EXIT_GROUP has not yet been implemented");
1206                 Ok(0)
1207             }
1208 
1209             SYS_MADVISE => {
1210                 kwarn!("SYS_MADVISE has not yet been implemented");
1211                 Ok(0)
1212             }
1213             SYS_GETTID => Self::gettid().map(|tid| tid.into()),
1214             SYS_GETUID => Self::getuid().map(|uid| uid.into()),
1215             SYS_SYSLOG => {
1216                 kwarn!("SYS_SYSLOG has not yet been implemented");
1217                 Ok(0)
1218             }
1219             SYS_GETGID => Self::getgid().map(|gid| gid.into()),
1220             SYS_SETUID => {
1221                 kwarn!("SYS_SETUID has not yet been implemented");
1222                 Ok(0)
1223             }
1224             SYS_SETGID => {
1225                 kwarn!("SYS_SETGID has not yet been implemented");
1226                 Ok(0)
1227             }
1228             SYS_GETEUID => Self::geteuid().map(|euid| euid.into()),
1229             SYS_GETEGID => Self::getegid().map(|egid| egid.into()),
1230             SYS_GETRUSAGE => {
1231                 let who = args[0] as c_int;
1232                 let rusage = args[1] as *mut RUsage;
1233                 Self::get_rusage(who, rusage)
1234             }
1235 
1236             SYS_READLINK => {
1237                 let path = args[0] as *const u8;
1238                 let buf = args[1] as *mut u8;
1239                 let bufsiz = args[2] as usize;
1240                 Self::readlink(path, buf, bufsiz)
1241             }
1242 
1243             SYS_READLINK_AT => {
1244                 let dirfd = args[0] as i32;
1245                 let pathname = args[1] as *const u8;
1246                 let buf = args[2] as *mut u8;
1247                 let bufsiz = args[3] as usize;
1248                 Self::readlink_at(dirfd, pathname, buf, bufsiz)
1249             }
1250 
1251             SYS_PRLIMIT64 => {
1252                 let pid = args[0];
1253                 let pid = Pid::new(pid);
1254                 let resource = args[1];
1255                 let new_limit = args[2] as *const RLimit64;
1256                 let old_limit = args[3] as *mut RLimit64;
1257 
1258                 Self::prlimit64(pid, resource, new_limit, old_limit)
1259             }
1260 
1261             SYS_ACCESS => {
1262                 let pathname = args[0] as *const u8;
1263                 let mode = args[1] as u32;
1264                 Self::access(pathname, mode)
1265             }
1266 
1267             SYS_FACCESSAT => {
1268                 let dirfd = args[0] as i32;
1269                 let pathname = args[1] as *const u8;
1270                 let mode = args[2] as u32;
1271                 Self::faccessat2(dirfd, pathname, mode, 0)
1272             }
1273 
1274             SYS_FACCESSAT2 => {
1275                 let dirfd = args[0] as i32;
1276                 let pathname = args[1] as *const u8;
1277                 let mode = args[2] as u32;
1278                 let flags = args[3] as u32;
1279                 Self::faccessat2(dirfd, pathname, mode, flags)
1280             }
1281 
1282             SYS_CLOCK_GETTIME => {
1283                 let clockid = args[0] as i32;
1284                 let timespec = args[1] as *mut TimeSpec;
1285                 Self::clock_gettime(clockid, timespec)
1286             }
1287 
1288             SYS_SYSINFO => {
1289                 let info = args[0] as *mut SysInfo;
1290                 Self::sysinfo(info)
1291             }
1292 
1293             SYS_UMASK => {
1294                 let mask = args[0] as u32;
1295                 Self::umask(mask)
1296             }
1297 
1298             SYS_CHMOD => {
1299                 let pathname = args[0] as *const u8;
1300                 let mode = args[1] as u32;
1301                 Self::chmod(pathname, mode)
1302             }
1303             SYS_FCHMOD => {
1304                 let fd = args[0] as i32;
1305                 let mode = args[1] as u32;
1306                 Self::fchmod(fd, mode)
1307             }
1308             SYS_FCHMODAT => {
1309                 let dirfd = args[0] as i32;
1310                 let pathname = args[1] as *const u8;
1311                 let mode = args[2] as u32;
1312                 Self::fchmodat(dirfd, pathname, mode)
1313             }
1314 
1315             _ => panic!("Unsupported syscall ID: {}", syscall_num),
1316         };
1317         return r;
1318     }
1319 
1320     pub fn put_string(
1321         s: *const u8,
1322         front_color: u32,
1323         back_color: u32,
1324     ) -> Result<usize, SystemError> {
1325         return Ok(unsafe { do_put_string(s, front_color, back_color) });
1326     }
1327 
1328     pub fn reboot() -> Result<usize, SystemError> {
1329         cpu_reset();
1330     }
1331 }
1332