mod.rs 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011
  1. use core::{
  2. ffi::{c_char, c_int, c_void, CStr},
  3. sync::atomic::{AtomicBool, Ordering},
  4. };
  5. use num_traits::{FromPrimitive, ToPrimitive};
  6. use crate::{
  7. arch::{cpu::cpu_reset, MMArch},
  8. filesystem::vfs::{
  9. fcntl::FcntlCommand,
  10. file::FileMode,
  11. syscall::{PosixKstat, SEEK_CUR, SEEK_END, SEEK_MAX, SEEK_SET},
  12. MAX_PATHLEN,
  13. },
  14. include::bindings::bindings::{pid_t, PAGE_2M_SIZE, PAGE_4K_SIZE},
  15. io::SeekFrom,
  16. kinfo,
  17. libs::align::page_align_up,
  18. mm::{verify_area, MemoryManagementArch, VirtAddr},
  19. net::syscall::SockAddr,
  20. time::{
  21. syscall::{PosixTimeZone, PosixTimeval},
  22. TimeSpec,
  23. },
  24. };
  25. pub mod user_access;
  26. #[repr(i32)]
  27. #[derive(Debug, FromPrimitive, ToPrimitive, PartialEq, Eq, Clone)]
  28. #[allow(dead_code, non_camel_case_types)]
  29. pub enum SystemError {
  30. EPERM = 1,
  31. /// 没有指定的文件或目录 No such file or directory.
  32. ENOENT = 2,
  33. /// 没有这样的进程 No such process.
  34. ESRCH = 3,
  35. /// 被中断的函数 Interrupted function.
  36. EINTR = 4,
  37. /// I/O错误 I/O error.
  38. EIO = 5,
  39. /// 没有这样的设备或地址 No such device or address.
  40. ENXIO = 6,
  41. /// 参数列表过长,或者在输出buffer中缺少空间 或者参数比系统内建的最大值要大 Argument list too long.
  42. E2BIG = 7,
  43. /// 可执行文件格式错误 Executable file format error
  44. ENOEXEC = 8,
  45. /// 错误的文件描述符 Bad file descriptor.
  46. EBADF = 9,
  47. /// 没有子进程 No child processes.
  48. ECHILD = 10,
  49. /// 资源不可用,请重试。 Resource unavailable, try again.(may be the same value as [EWOULDBLOCK])
  50. ///
  51. /// 操作将被禁止 Operation would block.(may be the same value as [EAGAIN]).
  52. EAGAIN_OR_EWOULDBLOCK = 11,
  53. /// 没有足够的空间 Not enough space.
  54. ENOMEM = 12,
  55. /// 访问被拒绝 Permission denied
  56. EACCES = 13,
  57. /// 错误的地址 Bad address
  58. EFAULT = 14,
  59. /// 需要块设备 Block device required
  60. ENOTBLK = 15,
  61. /// 设备或资源忙 Device or resource busy.
  62. EBUSY = 16,
  63. /// 文件已存在 File exists.
  64. EEXIST = 17,
  65. /// 跨设备连接 Cross-device link.
  66. EXDEV = 18,
  67. /// 没有指定的设备 No such device.
  68. ENODEV = 19,
  69. /// 不是目录 Not a directory.
  70. ENOTDIR = 20,
  71. /// 是一个目录 Is a directory
  72. EISDIR = 21,
  73. /// 不可用的参数 Invalid argument.
  74. EINVAL = 22,
  75. /// 系统中打开的文件过多 Too many files open in system.
  76. ENFILE = 23,
  77. /// 文件描述符的值过大 File descriptor value too large.
  78. EMFILE = 24,
  79. /// 不正确的I/O控制操作 Inappropriate I/O control operation.
  80. ENOTTY = 25,
  81. /// 文本文件忙 Text file busy.
  82. ETXTBSY = 26,
  83. /// 文件太大 File too large.
  84. EFBIG = 27,
  85. /// 设备上没有空间 No space left on device.
  86. ENOSPC = 28,
  87. /// 错误的寻道.当前文件是pipe,不允许seek请求 Invalid seek.
  88. ESPIPE = 29,
  89. /// 只读的文件系统 Read-only file system.
  90. EROFS = 30,
  91. /// 链接数过多 Too many links.
  92. EMLINK = 31,
  93. /// 断开的管道 Broken pipe.
  94. EPIPE = 32,
  95. /// 数学参数超出作用域 Mathematics argument out of domain of function.
  96. EDOM = 33,
  97. /// 结果过大 Result too large.
  98. ERANGE = 34,
  99. /// 资源死锁将要发生 Resource deadlock would occur.
  100. EDEADLK = 35,
  101. /// 文件名过长 Filename too long.
  102. ENAMETOOLONG = 36,
  103. /// 没有可用的锁 No locks available.
  104. ENOLCK = 37,
  105. /// 功能不支持 Function not supported.
  106. ENOSYS = 38,
  107. /// 目录非空 Directory not empty.
  108. ENOTEMPTY = 39,
  109. /// 符号链接级别过多 Too many levels of symbolic links.
  110. ELOOP = 40,
  111. /// 没有期待类型的消息 No message of the desired type.
  112. ENOMSG = 41,
  113. /// 标志符被移除 Identifier removed.
  114. EIDRM = 42,
  115. /// 通道号超出范围 Channel number out of range
  116. ECHRNG = 43,
  117. /// 二级不同步 Level 2 not synchronized
  118. EL2NSYNC = 44,
  119. /// 三级暂停 Level 3 halted
  120. EL3HLT = 45,
  121. /// 三级重置 Level 3 reset
  122. EL3RST = 46,
  123. /// 链接号超出范围 Link number out of range
  124. ELNRNG = 47,
  125. /// 未连接协议驱动程序 Protocol driver not attached
  126. EUNATCH = 48,
  127. /// 没有可用的CSI结构 No CSI structure available
  128. ENOCSI = 49,
  129. /// 二级暂停 Level 2 halted
  130. EL2HLT = 50,
  131. /// 无效交换 Invalid exchange
  132. EBADE = 51,
  133. /// 无效的请求描述符 Invalid request descriptor
  134. EBADR = 52,
  135. /// 交换满 Exchange full
  136. EXFULL = 53,
  137. /// 无阳极 No anode
  138. ENOANO = 54,
  139. /// 请求码无效 Invalid request code
  140. EBADRQC = 55,
  141. /// 无效插槽 Invalid slot
  142. EBADSLT = 56,
  143. /// 资源死锁 Resource deadlock would occur
  144. EDEADLOCK = 57,
  145. /// 错误的字体文件格式 Bad font file format
  146. EBFONT = 58,
  147. /// 不是STREAM Not a STREAM
  148. ENOSTR = 59,
  149. /// 队列头没有可读取的消息 No message is available on the STREAM head read queue.
  150. ENODATA = 60,
  151. /// 流式ioctl()超时 Stream ioctl() timeout
  152. ETIME = 61,
  153. /// 没有STREAM资源 No STREAM resources.
  154. ENOSR = 62,
  155. /// 机器不在网络上 Machine is not on the network
  156. ENONET = 63,
  157. /// 未安装软件包 Package not installed
  158. ENOPKG = 64,
  159. /// 远程对象 Object is remote
  160. EREMOTE = 65,
  161. /// 保留 Reserved.
  162. ENOLINK = 66,
  163. /// 外设错误 Advertise error.
  164. EADV = 67,
  165. /// 安装错误 Srmount error
  166. ESRMNT = 68,
  167. /// 发送时发生通信错误 Communication error on send
  168. ECOMM = 69,
  169. /// 协议错误 Protocol error.
  170. EPROTO = 70,
  171. /// 保留使用 Reserved.
  172. EMULTIHOP = 71,
  173. /// RFS特定错误 RFS specific error
  174. EDOTDOT = 72,
  175. /// 错误的消息 Bad message.
  176. EBADMSG = 73,
  177. /// 数值过大,产生溢出 Value too large to be stored in data type.
  178. EOVERFLOW = 74,
  179. /// 名称在网络上不是唯一的 Name not unique on network
  180. ENOTUNIQ = 75,
  181. /// 处于不良状态的文件描述符 File descriptor in bad state
  182. EBADFD = 76,
  183. /// 远程地址已更改 Remote address changed
  184. EREMCHG = 77,
  185. /// 无法访问所需的共享库 Can not access a needed shared library
  186. ELIBACC = 78,
  187. /// 访问损坏的共享库 Accessing a corrupted shared library
  188. ELIBBAD = 79,
  189. /// a. out中的.lib部分已损坏 .lib section in a.out corrupted
  190. ELIBSCN = 80,
  191. /// 尝试链接太多共享库 Attempting to link in too many shared libraries
  192. ELIBMAX = 81,
  193. /// 无法直接执行共享库 Cannot exec a shared library directly
  194. ELIBEXEC = 82,
  195. /// 不合法的字符序列 Illegal byte sequence.
  196. EILSEQ = 83,
  197. /// 中断的系统调用应该重新启动 Interrupted system call should be restarted
  198. ERESTART = 84,
  199. /// 流管道错误 Streams pipe error
  200. ESTRPIPE = 85,
  201. /// 用户太多 Too many users
  202. EUSERS = 86,
  203. /// 不是一个套接字 Not a socket.
  204. ENOTSOCK = 87,
  205. /// 需要目标地址 Destination address required.
  206. EDESTADDRREQ = 88,
  207. /// 消息过大 Message too large.
  208. EMSGSIZE = 89,
  209. /// 对于套接字而言,错误的协议 Protocol wrong type for socket.
  210. EPROTOTYPE = 90,
  211. /// 协议不可用 Protocol not available.
  212. ENOPROTOOPT = 91,
  213. /// 协议不被支持 Protocol not supported.
  214. EPROTONOSUPPORT = 92,
  215. /// 不支持套接字类型 Socket type not supported
  216. ESOCKTNOSUPPORT = 93,
  217. /// 套接字不支持该操作 Operation not supported on socket (may be the same value as [ENOTSUP]).
  218. ///
  219. /// 不被支持 Not supported (may be the same value as [EOPNOTSUPP]).
  220. EOPNOTSUPP_OR_ENOTSUP = 94,
  221. /// 不支持协议系列 Protocol family not supported
  222. EPFNOSUPPORT = 95,
  223. /// 地址family不支持 Address family not supported.
  224. EAFNOSUPPORT = 96,
  225. /// 地址正在被使用 Address in use.
  226. EADDRINUSE = 97,
  227. /// 地址不可用 Address not available.
  228. EADDRNOTAVAIL = 98,
  229. /// 网络已关闭 Network is down.
  230. ENETDOWN = 99,
  231. /// 网络不可达 Network unreachable.
  232. ENETUNREACH = 100,
  233. /// 网络连接已断开 Connection aborted by network.
  234. ENETRESET = 101,
  235. /// 连接已断开 Connection aborted.
  236. ECONNABORTED = 102,
  237. /// 连接被重置 Connection reset.
  238. ECONNRESET = 103,
  239. /// 缓冲区空间不足 No buffer space available.
  240. ENOBUFS = 104,
  241. /// 套接字已连接 Socket is connected.
  242. EISCONN = 105,
  243. /// 套接字未连接 The socket is not connected.
  244. ENOTCONN = 106,
  245. /// 传输端点关闭后无法发送 Cannot send after transport endpoint shutdown
  246. ESHUTDOWN = 107,
  247. /// 引用太多:无法拼接 Too many references: cannot splice
  248. ETOOMANYREFS = 108,
  249. /// 连接超时 Connection timed out.
  250. ETIMEDOUT = 109,
  251. /// 连接被拒绝 Connection refused.
  252. ECONNREFUSED = 110,
  253. /// 主机已关闭 Host is down
  254. EHOSTDOWN = 111,
  255. /// 主机不可达 Host is unreachable.
  256. EHOSTUNREACH = 112,
  257. /// 连接已经在处理 Connection already in progress.
  258. EALREADY = 113,
  259. /// 操作正在处理 Operation in progress.
  260. EINPROGRESS = 114,
  261. /// 保留 Reserved.
  262. ESTALE = 115,
  263. /// 结构需要清理 Structure needs cleaning
  264. EUCLEAN = 116,
  265. /// 不是XENIX命名类型文件 Not a XENIX named type file
  266. ENOTNAM = 117,
  267. /// 没有可用的XENIX信号量 No XENIX semaphores available
  268. ENAVAIL = 118,
  269. /// 是命名类型文件 Is a named type file
  270. EISNAM = 119,
  271. /// 远程I/O错误 Remote I/O error
  272. EREMOTEIO = 120,
  273. /// 保留使用 Reserved
  274. EDQUOT = 121,
  275. /// 没有找到媒介 No medium found
  276. ENOMEDIUM = 122,
  277. /// 介质类型错误 Wrong medium type
  278. EMEDIUMTYPE = 123,
  279. /// 操作被取消 Operation canceled.
  280. ECANCELED = 124,
  281. /// 所需的密钥不可用 Required key not available
  282. ENOKEY = 125,
  283. /// 密钥已过期 Key has expired
  284. EKEYEXPIRED = 126,
  285. /// 密钥已被撤销 Key has been revoked
  286. EKEYREVOKED = 127,
  287. /// 密钥被服务拒绝 Key has been revoked
  288. EKEYREJECTED = 128,
  289. /// 之前的拥有者挂了 Previous owner died.
  290. EOWNERDEAD = 129,
  291. /// 状态不可恢复 State not recoverable.
  292. ENOTRECOVERABLE = 130,
  293. }
  294. impl SystemError {
  295. /// @brief 把posix错误码转换为系统错误枚举类型。
  296. pub fn from_posix_errno(errno: i32) -> Option<SystemError> {
  297. // posix 错误码是小于0的
  298. if errno >= 0 {
  299. return None;
  300. }
  301. return <Self as FromPrimitive>::from_i32(-errno);
  302. }
  303. /// @brief 把系统错误枚举类型转换为负数posix错误码。
  304. pub fn to_posix_errno(&self) -> i32 {
  305. return -<Self as ToPrimitive>::to_i32(self).unwrap();
  306. }
  307. }
  308. // 定义系统调用号
  309. pub const SYS_PUT_STRING: usize = 1;
  310. pub const SYS_OPEN: usize = 2;
  311. pub const SYS_CLOSE: usize = 3;
  312. pub const SYS_READ: usize = 4;
  313. pub const SYS_WRITE: usize = 5;
  314. pub const SYS_LSEEK: usize = 6;
  315. pub const SYS_FORK: usize = 7;
  316. pub const SYS_VFORK: usize = 8;
  317. pub const SYS_BRK: usize = 9;
  318. pub const SYS_SBRK: usize = 10;
  319. pub const SYS_REBOOT: usize = 11;
  320. pub const SYS_CHDIR: usize = 12;
  321. pub const SYS_GET_DENTS: usize = 13;
  322. pub const SYS_EXECVE: usize = 14;
  323. pub const SYS_WAIT4: usize = 15;
  324. pub const SYS_EXIT: usize = 16;
  325. pub const SYS_MKDIR: usize = 17;
  326. pub const SYS_NANOSLEEP: usize = 18;
  327. /// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!! 删的时候记得改C版本的libc
  328. pub const SYS_CLOCK: usize = 19;
  329. pub const SYS_PIPE: usize = 20;
  330. /// 系统调用21曾经是SYS_MSTAT,但是现在已经废弃
  331. pub const __NOT_USED: usize = 21;
  332. pub const SYS_UNLINK_AT: usize = 22;
  333. pub const SYS_KILL: usize = 23;
  334. pub const SYS_SIGACTION: usize = 24;
  335. pub const SYS_RT_SIGRETURN: usize = 25;
  336. pub const SYS_GETPID: usize = 26;
  337. pub const SYS_SCHED: usize = 27;
  338. pub const SYS_DUP: usize = 28;
  339. pub const SYS_DUP2: usize = 29;
  340. pub const SYS_SOCKET: usize = 30;
  341. pub const SYS_SETSOCKOPT: usize = 31;
  342. pub const SYS_GETSOCKOPT: usize = 32;
  343. pub const SYS_CONNECT: usize = 33;
  344. pub const SYS_BIND: usize = 34;
  345. pub const SYS_SENDTO: usize = 35;
  346. pub const SYS_RECVFROM: usize = 36;
  347. pub const SYS_RECVMSG: usize = 37;
  348. pub const SYS_LISTEN: usize = 38;
  349. pub const SYS_SHUTDOWN: usize = 39;
  350. pub const SYS_ACCEPT: usize = 40;
  351. pub const SYS_GETSOCKNAME: usize = 41;
  352. pub const SYS_GETPEERNAME: usize = 42;
  353. pub const SYS_GETTIMEOFDAY: usize = 43;
  354. pub const SYS_MMAP: usize = 44;
  355. pub const SYS_MUNMAP: usize = 45;
  356. pub const SYS_MPROTECT: usize = 46;
  357. pub const SYS_FSTAT: usize = 47;
  358. #[allow(dead_code)]
  359. pub const SYS_GETCWD: usize = 48;
  360. #[allow(dead_code)]
  361. pub const SYS_GETPPID: usize = 49;
  362. #[allow(dead_code)]
  363. pub const SYS_GETPGID: usize = 50;
  364. pub const SYS_FCNTL: usize = 51;
  365. pub const SYS_FTRUNCATE: usize = 52;
  366. #[derive(Debug)]
  367. pub struct Syscall;
  368. extern "C" {
  369. fn do_put_string(s: *const u8, front_color: u32, back_color: u32) -> usize;
  370. }
  371. #[no_mangle]
  372. pub extern "C" fn syscall_init() -> i32 {
  373. kinfo!("Initializing syscall...");
  374. Syscall::init().expect("syscall init failed");
  375. kinfo!("Syscall init successfully!");
  376. return 0;
  377. }
  378. impl Syscall {
  379. /// 初始化系统调用
  380. pub fn init() -> Result<(), SystemError> {
  381. static INIT_FLAG: AtomicBool = AtomicBool::new(false);
  382. let prev = INIT_FLAG.swap(true, Ordering::SeqCst);
  383. if prev {
  384. panic!("Cannot initialize syscall more than once!");
  385. }
  386. return crate::arch::syscall::arch_syscall_init();
  387. }
  388. /// @brief 系统调用分发器,用于分发系统调用。
  389. ///
  390. /// 这个函数内,需要根据系统调用号,调用对应的系统调用处理函数。
  391. /// 并且,对于用户态传入的指针参数,需要在本函数内进行越界检查,防止访问到内核空间。
  392. pub fn handle(syscall_num: usize, args: &[usize], from_user: bool) -> usize {
  393. let r = match syscall_num {
  394. SYS_PUT_STRING => {
  395. Self::put_string(args[0] as *const u8, args[1] as u32, args[2] as u32)
  396. }
  397. SYS_OPEN => {
  398. let path: &CStr = unsafe { CStr::from_ptr(args[0] as *const c_char) };
  399. let path: Result<&str, core::str::Utf8Error> = path.to_str();
  400. let res = if path.is_err() {
  401. Err(SystemError::EINVAL)
  402. } else {
  403. let path: &str = path.unwrap();
  404. let flags = args[1];
  405. let open_flags: FileMode = FileMode::from_bits_truncate(flags as u32);
  406. Self::open(path, open_flags)
  407. };
  408. res
  409. }
  410. SYS_CLOSE => {
  411. let fd = args[0];
  412. Self::close(fd)
  413. }
  414. SYS_READ => {
  415. let fd = args[0] as i32;
  416. let buf_vaddr = args[1];
  417. let len = args[2];
  418. let virt_addr = VirtAddr::new(buf_vaddr);
  419. // 判断缓冲区是否来自用户态,进行权限校验
  420. let res = if from_user && verify_area(virt_addr, len as usize).is_err() {
  421. // 来自用户态,而buffer在内核态,这样的操作不被允许
  422. Err(SystemError::EPERM)
  423. } else {
  424. let buf: &mut [u8] = unsafe {
  425. core::slice::from_raw_parts_mut::<'static, u8>(buf_vaddr as *mut u8, len)
  426. };
  427. Self::read(fd, buf)
  428. };
  429. // kdebug!("sys read, fd: {}, len: {}, res: {:?}", fd, len, res);
  430. res
  431. }
  432. SYS_WRITE => {
  433. let fd = args[0] as i32;
  434. let buf_vaddr = args[1];
  435. let len = args[2];
  436. let virt_addr = VirtAddr::new(buf_vaddr);
  437. // 判断缓冲区是否来自用户态,进行权限校验
  438. let res = if from_user && verify_area(virt_addr, len as usize).is_err() {
  439. // 来自用户态,而buffer在内核态,这样的操作不被允许
  440. Err(SystemError::EPERM)
  441. } else {
  442. let buf: &[u8] = unsafe {
  443. core::slice::from_raw_parts::<'static, u8>(buf_vaddr as *const u8, len)
  444. };
  445. Self::write(fd, buf)
  446. };
  447. // kdebug!("sys write, fd: {}, len: {}, res: {:?}", fd, len, res);
  448. res
  449. }
  450. SYS_LSEEK => {
  451. let fd = args[0] as i32;
  452. let offset = args[1] as i64;
  453. let whence = args[2] as u32;
  454. let w = match whence {
  455. SEEK_SET => Ok(SeekFrom::SeekSet(offset)),
  456. SEEK_CUR => Ok(SeekFrom::SeekCurrent(offset)),
  457. SEEK_END => Ok(SeekFrom::SeekEnd(offset)),
  458. SEEK_MAX => Ok(SeekFrom::SeekEnd(0)),
  459. _ => Err(SystemError::EINVAL),
  460. };
  461. let res = if w.is_err() {
  462. Err(w.unwrap_err())
  463. } else {
  464. let w = w.unwrap();
  465. Self::lseek(fd, w)
  466. };
  467. // kdebug!("sys lseek, fd: {}, offset: {}, whence: {}, res: {:?}", fd, offset, whence, res);
  468. res
  469. }
  470. SYS_BRK => {
  471. let new_brk = VirtAddr::new(args[0]);
  472. Self::brk(new_brk).map(|vaddr| vaddr.data())
  473. }
  474. SYS_SBRK => {
  475. let increment = args[0] as isize;
  476. Self::sbrk(increment).map(|vaddr| vaddr.data())
  477. }
  478. SYS_REBOOT => Self::reboot(),
  479. SYS_CHDIR => {
  480. // Closure for checking arguments
  481. let chdir_check = |arg0: usize| {
  482. if arg0 == 0 {
  483. return Err(SystemError::EFAULT);
  484. }
  485. let path_ptr = arg0 as *const c_char;
  486. let virt_addr = VirtAddr::new(path_ptr as usize);
  487. // 权限校验
  488. if path_ptr.is_null()
  489. || (from_user && verify_area(virt_addr, PAGE_2M_SIZE as usize).is_err())
  490. {
  491. return Err(SystemError::EINVAL);
  492. }
  493. let dest_path: &CStr = unsafe { CStr::from_ptr(path_ptr) };
  494. let dest_path: &str = dest_path.to_str().map_err(|_| SystemError::EINVAL)?;
  495. if dest_path.len() == 0 {
  496. return Err(SystemError::EINVAL);
  497. } else if dest_path.len() > PAGE_4K_SIZE as usize {
  498. return Err(SystemError::ENAMETOOLONG);
  499. }
  500. return Ok(dest_path);
  501. };
  502. let r: Result<&str, SystemError> = chdir_check(args[0]);
  503. if r.is_err() {
  504. Err(r.unwrap_err())
  505. } else {
  506. Self::chdir(r.unwrap())
  507. }
  508. }
  509. SYS_GET_DENTS => {
  510. let fd = args[0] as i32;
  511. let buf_vaddr = args[1];
  512. let len = args[2];
  513. let virt_addr = VirtAddr::new(buf_vaddr);
  514. // 判断缓冲区是否来自用户态,进行权限校验
  515. let res = if from_user && verify_area(virt_addr, len as usize).is_err() {
  516. // 来自用户态,而buffer在内核态,这样的操作不被允许
  517. Err(SystemError::EPERM)
  518. } else if buf_vaddr == 0 {
  519. Err(SystemError::EFAULT)
  520. } else {
  521. let buf: &mut [u8] = unsafe {
  522. core::slice::from_raw_parts_mut::<'static, u8>(buf_vaddr as *mut u8, len)
  523. };
  524. Self::getdents(fd, buf)
  525. };
  526. res
  527. }
  528. SYS_EXECVE => {
  529. let path_ptr = args[0];
  530. let argv_ptr = args[1];
  531. let env_ptr = args[2];
  532. let virt_path_ptr = VirtAddr::new(path_ptr);
  533. let virt_argv_ptr = VirtAddr::new(argv_ptr);
  534. let virt_env_ptr = VirtAddr::new(env_ptr);
  535. // 权限校验
  536. if from_user
  537. && (verify_area(virt_path_ptr, PAGE_4K_SIZE as usize).is_err()
  538. || verify_area(virt_argv_ptr, PAGE_4K_SIZE as usize).is_err())
  539. || verify_area(virt_env_ptr, PAGE_4K_SIZE as usize).is_err()
  540. {
  541. Err(SystemError::EFAULT)
  542. } else {
  543. Self::execve(
  544. path_ptr as *const c_void,
  545. argv_ptr as *const *const c_void,
  546. env_ptr as *const *const c_void,
  547. )
  548. }
  549. }
  550. SYS_WAIT4 => {
  551. let pid = args[0] as pid_t;
  552. let wstatus = args[1] as *mut c_int;
  553. let options = args[2] as c_int;
  554. let rusage = args[3] as *mut c_void;
  555. let virt_wstatus = VirtAddr::new(wstatus as usize);
  556. let virt_rusage = VirtAddr::new(rusage as usize);
  557. // 权限校验
  558. // todo: 引入rusage之后,更正以下权限校验代码中,rusage的大小
  559. if from_user
  560. && (verify_area(virt_wstatus, core::mem::size_of::<c_int>() as usize).is_err()
  561. || verify_area(virt_rusage, PAGE_4K_SIZE as usize).is_err())
  562. {
  563. Err(SystemError::EFAULT)
  564. } else {
  565. Self::wait4(pid, wstatus, options, rusage)
  566. }
  567. }
  568. SYS_EXIT => {
  569. let exit_code = args[0];
  570. Self::exit(exit_code)
  571. }
  572. SYS_MKDIR => {
  573. let path_ptr = args[0] as *const c_char;
  574. let mode = args[1];
  575. let virt_path_ptr = VirtAddr::new(path_ptr as usize);
  576. let security_check = || {
  577. if path_ptr.is_null()
  578. || (from_user && verify_area(virt_path_ptr, PAGE_2M_SIZE as usize).is_err())
  579. {
  580. return Err(SystemError::EINVAL);
  581. }
  582. let path: &CStr = unsafe { CStr::from_ptr(path_ptr) };
  583. let path: &str = path.to_str().map_err(|_| SystemError::EINVAL)?.trim();
  584. if path == "" {
  585. return Err(SystemError::EINVAL);
  586. }
  587. return Ok(path);
  588. };
  589. let path = security_check();
  590. if path.is_err() {
  591. Err(path.unwrap_err())
  592. } else {
  593. Self::mkdir(path.unwrap(), mode)
  594. }
  595. }
  596. SYS_NANOSLEEP => {
  597. let req = args[0] as *const TimeSpec;
  598. let rem = args[1] as *mut TimeSpec;
  599. let virt_req = VirtAddr::new(req as usize);
  600. let virt_rem = VirtAddr::new(rem as usize);
  601. if from_user
  602. && (verify_area(virt_req, core::mem::size_of::<TimeSpec>() as usize).is_err()
  603. || verify_area(virt_rem, core::mem::size_of::<TimeSpec>() as usize)
  604. .is_err())
  605. {
  606. Err(SystemError::EFAULT)
  607. } else {
  608. Self::nanosleep(req, rem)
  609. }
  610. }
  611. SYS_CLOCK => Self::clock(),
  612. SYS_PIPE => {
  613. let pipefd = args[0] as *mut c_int;
  614. let virt_pipefd = VirtAddr::new(pipefd as usize);
  615. if from_user
  616. && verify_area(virt_pipefd, core::mem::size_of::<[c_int; 2]>() as usize)
  617. .is_err()
  618. {
  619. Err(SystemError::EFAULT)
  620. } else if pipefd.is_null() {
  621. Err(SystemError::EFAULT)
  622. } else {
  623. let pipefd = unsafe { core::slice::from_raw_parts_mut(pipefd, 2) };
  624. Self::pipe(pipefd)
  625. }
  626. }
  627. SYS_UNLINK_AT => {
  628. let dirfd = args[0] as i32;
  629. let pathname = args[1] as *const c_char;
  630. let flags = args[2] as u32;
  631. let virt_pathname = VirtAddr::new(pathname as usize);
  632. if from_user && verify_area(virt_pathname, PAGE_4K_SIZE as usize).is_err() {
  633. Err(SystemError::EFAULT)
  634. } else if pathname.is_null() {
  635. Err(SystemError::EFAULT)
  636. } else {
  637. let get_path = || {
  638. let pathname: &CStr = unsafe { CStr::from_ptr(pathname) };
  639. let pathname: &str = pathname.to_str().map_err(|_| SystemError::EINVAL)?;
  640. if pathname.len() >= MAX_PATHLEN {
  641. return Err(SystemError::ENAMETOOLONG);
  642. }
  643. return Ok(pathname.trim());
  644. };
  645. let pathname = get_path();
  646. if pathname.is_err() {
  647. Err(pathname.unwrap_err())
  648. } else {
  649. // kdebug!("sys unlinkat: dirfd: {}, pathname: {}", dirfd, pathname.as_ref().unwrap());
  650. Self::unlinkat(dirfd, pathname.unwrap(), flags)
  651. }
  652. }
  653. }
  654. SYS_KILL => {
  655. let pid = args[0] as pid_t;
  656. let sig = args[1] as c_int;
  657. Self::kill(pid, sig)
  658. }
  659. SYS_SIGACTION => {
  660. let sig = args[0] as c_int;
  661. let act = args[1];
  662. let old_act = args[2];
  663. Self::sigaction(sig, act, old_act, from_user)
  664. }
  665. SYS_RT_SIGRETURN => {
  666. // 由于目前signal机制的实现,与x86_64强关联,因此暂时在arch/x86_64/syscall.rs中调用
  667. // todo: 未来需要将signal机制与平台解耦
  668. todo!()
  669. }
  670. SYS_GETPID => Self::getpid(),
  671. SYS_SCHED => Self::sched(from_user),
  672. SYS_DUP => {
  673. let oldfd: i32 = args[0] as c_int;
  674. Self::dup(oldfd)
  675. }
  676. SYS_DUP2 => {
  677. let oldfd: i32 = args[0] as c_int;
  678. let newfd: i32 = args[1] as c_int;
  679. Self::dup2(oldfd, newfd)
  680. }
  681. SYS_SOCKET => Self::socket(args[0], args[1], args[2]),
  682. SYS_SETSOCKOPT => {
  683. let optval = args[3] as *const u8;
  684. let optlen = args[4] as usize;
  685. let virt_optval = VirtAddr::new(optval as usize);
  686. // 验证optval的地址是否合法
  687. if verify_area(virt_optval, optlen as usize).is_err() {
  688. // 地址空间超出了用户空间的范围,不合法
  689. Err(SystemError::EFAULT)
  690. } else {
  691. let data: &[u8] = unsafe { core::slice::from_raw_parts(optval, optlen) };
  692. Self::setsockopt(args[0], args[1], args[2], data)
  693. }
  694. }
  695. SYS_GETSOCKOPT => {
  696. let optval = args[3] as *mut u8;
  697. let optlen = args[4] as *mut usize;
  698. let virt_optval = VirtAddr::new(optval as usize);
  699. let virt_optlen = VirtAddr::new(optlen as usize);
  700. let security_check = || {
  701. // 验证optval的地址是否合法
  702. if verify_area(virt_optval, PAGE_4K_SIZE as usize).is_err() {
  703. // 地址空间超出了用户空间的范围,不合法
  704. return Err(SystemError::EFAULT);
  705. }
  706. // 验证optlen的地址是否合法
  707. if verify_area(virt_optlen, core::mem::size_of::<u32>() as usize).is_err() {
  708. // 地址空间超出了用户空间的范围,不合法
  709. return Err(SystemError::EFAULT);
  710. }
  711. return Ok(());
  712. };
  713. let r = security_check();
  714. if r.is_err() {
  715. Err(r.unwrap_err())
  716. } else {
  717. Self::getsockopt(args[0], args[1], args[2], optval, optlen as *mut u32)
  718. }
  719. }
  720. SYS_CONNECT => {
  721. let addr = args[1] as *const SockAddr;
  722. let addrlen = args[2] as usize;
  723. let virt_addr = VirtAddr::new(addr as usize);
  724. // 验证addr的地址是否合法
  725. if verify_area(virt_addr, addrlen as usize).is_err() {
  726. // 地址空间超出了用户空间的范围,不合法
  727. Err(SystemError::EFAULT)
  728. } else {
  729. Self::connect(args[0], addr, addrlen)
  730. }
  731. }
  732. SYS_BIND => {
  733. let addr = args[1] as *const SockAddr;
  734. let addrlen = args[2] as usize;
  735. let virt_addr = VirtAddr::new(addr as usize);
  736. // 验证addr的地址是否合法
  737. if verify_area(virt_addr, addrlen as usize).is_err() {
  738. // 地址空间超出了用户空间的范围,不合法
  739. Err(SystemError::EFAULT)
  740. } else {
  741. Self::bind(args[0], addr, addrlen)
  742. }
  743. }
  744. SYS_SENDTO => {
  745. let buf = args[1] as *const u8;
  746. let len = args[2] as usize;
  747. let flags = args[3] as u32;
  748. let addr = args[4] as *const SockAddr;
  749. let addrlen = args[5] as usize;
  750. let virt_buf = VirtAddr::new(buf as usize);
  751. let virt_addr = VirtAddr::new(addr as usize);
  752. // 验证buf的地址是否合法
  753. if verify_area(virt_buf, len as usize).is_err() {
  754. // 地址空间超出了用户空间的范围,不合法
  755. Err(SystemError::EFAULT)
  756. } else if verify_area(virt_addr, addrlen as usize).is_err() {
  757. // 地址空间超出了用户空间的范围,不合法
  758. Err(SystemError::EFAULT)
  759. } else {
  760. let data: &[u8] = unsafe { core::slice::from_raw_parts(buf, len) };
  761. Self::sendto(args[0], data, flags, addr, addrlen)
  762. }
  763. }
  764. SYS_RECVFROM => {
  765. let buf = args[1] as *mut u8;
  766. let len = args[2] as usize;
  767. let flags = args[3] as u32;
  768. let addr = args[4] as *mut SockAddr;
  769. let addrlen = args[5] as *mut usize;
  770. let virt_buf = VirtAddr::new(buf as usize);
  771. let virt_addrlen = VirtAddr::new(addrlen as usize);
  772. let virt_addr = VirtAddr::new(addr as usize);
  773. let security_check = || {
  774. // 验证buf的地址是否合法
  775. if verify_area(virt_buf, len as usize).is_err() {
  776. // 地址空间超出了用户空间的范围,不合法
  777. return Err(SystemError::EFAULT);
  778. }
  779. // 验证addrlen的地址是否合法
  780. if verify_area(virt_addrlen, core::mem::size_of::<u32>() as usize).is_err() {
  781. // 地址空间超出了用户空间的范围,不合法
  782. return Err(SystemError::EFAULT);
  783. }
  784. if verify_area(virt_addr, core::mem::size_of::<SockAddr>() as usize).is_err() {
  785. // 地址空间超出了用户空间的范围,不合法
  786. return Err(SystemError::EFAULT);
  787. }
  788. return Ok(());
  789. };
  790. let r = security_check();
  791. if r.is_err() {
  792. Err(r.unwrap_err())
  793. } else {
  794. let buf = unsafe { core::slice::from_raw_parts_mut(buf, len) };
  795. Self::recvfrom(args[0], buf, flags, addr, addrlen as *mut u32)
  796. }
  797. }
  798. SYS_RECVMSG => {
  799. let msg = args[1] as *mut crate::net::syscall::MsgHdr;
  800. let flags = args[2] as u32;
  801. let virt_msg = VirtAddr::new(msg as usize);
  802. let security_check = || {
  803. // 验证msg的地址是否合法
  804. if verify_area(
  805. virt_msg,
  806. core::mem::size_of::<crate::net::syscall::MsgHdr>() as usize,
  807. )
  808. .is_err()
  809. {
  810. // 地址空间超出了用户空间的范围,不合法
  811. return Err(SystemError::EFAULT);
  812. }
  813. let msg = unsafe { msg.as_mut() }.ok_or(SystemError::EFAULT)?;
  814. return Ok(msg);
  815. };
  816. let r = security_check();
  817. if r.is_err() {
  818. Err(r.unwrap_err())
  819. } else {
  820. let msg = r.unwrap();
  821. Self::recvmsg(args[0], msg, flags)
  822. }
  823. }
  824. SYS_LISTEN => Self::listen(args[0], args[1]),
  825. SYS_SHUTDOWN => Self::shutdown(args[0], args[1]),
  826. SYS_ACCEPT => Self::accept(args[0], args[1] as *mut SockAddr, args[2] as *mut u32),
  827. SYS_GETSOCKNAME => {
  828. Self::getsockname(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  829. }
  830. SYS_GETPEERNAME => {
  831. Self::getpeername(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  832. }
  833. SYS_GETTIMEOFDAY => {
  834. let timeval = args[0] as *mut PosixTimeval;
  835. let timezone_ptr = args[1] as *mut PosixTimeZone;
  836. let virt_timeval = VirtAddr::new(timeval as usize);
  837. let virt_timezone_ptr = VirtAddr::new(timezone_ptr as usize);
  838. let security_check = || {
  839. if verify_area(virt_timeval, core::mem::size_of::<PosixTimeval>() as usize)
  840. .is_err()
  841. {
  842. return Err(SystemError::EFAULT);
  843. }
  844. if verify_area(
  845. virt_timezone_ptr,
  846. core::mem::size_of::<PosixTimeZone>() as usize,
  847. )
  848. .is_err()
  849. {
  850. return Err(SystemError::EFAULT);
  851. }
  852. return Ok(());
  853. };
  854. let r = security_check();
  855. if r.is_err() {
  856. Err(r.unwrap_err())
  857. } else {
  858. if !timeval.is_null() {
  859. Self::gettimeofday(timeval, timezone_ptr)
  860. } else {
  861. Err(SystemError::EFAULT)
  862. }
  863. }
  864. }
  865. SYS_MMAP => {
  866. let len = page_align_up(args[1]);
  867. let virt_addr = VirtAddr::new(args[0] as usize);
  868. if verify_area(virt_addr, len as usize).is_err() {
  869. Err(SystemError::EFAULT)
  870. } else {
  871. Self::mmap(
  872. VirtAddr::new(args[0]),
  873. len,
  874. args[2],
  875. args[3],
  876. args[4] as i32,
  877. args[5],
  878. )
  879. }
  880. }
  881. SYS_MUNMAP => {
  882. let addr = args[0];
  883. let len = page_align_up(args[1]);
  884. if addr & MMArch::PAGE_SIZE != 0 {
  885. // The addr argument is not a multiple of the page size
  886. Err(SystemError::EINVAL)
  887. } else {
  888. Self::munmap(VirtAddr::new(addr), len)
  889. }
  890. }
  891. SYS_MPROTECT => {
  892. let addr = args[0];
  893. let len = page_align_up(args[1]);
  894. if addr & MMArch::PAGE_SIZE != 0 {
  895. // The addr argument is not a multiple of the page size
  896. Err(SystemError::EINVAL)
  897. } else {
  898. Self::mprotect(VirtAddr::new(addr), len, args[2])
  899. }
  900. }
  901. SYS_FSTAT => {
  902. let fd = args[0] as i32;
  903. let kstat = args[1] as *mut PosixKstat;
  904. let vaddr = VirtAddr::new(kstat as usize);
  905. // FIXME 由于c中的verify_area与rust中的verify_area重名,所以在引入时加了前缀区分
  906. // TODO 应该将用了c版本的verify_area都改为rust的verify_area
  907. match verify_area(vaddr, core::mem::size_of::<PosixKstat>()) {
  908. Ok(_) => Self::fstat(fd, kstat),
  909. Err(e) => Err(e),
  910. }
  911. }
  912. SYS_FCNTL => {
  913. let fd = args[0] as i32;
  914. let cmd: Option<FcntlCommand> =
  915. <FcntlCommand as FromPrimitive>::from_u32(args[1] as u32);
  916. let arg = args[2] as i32;
  917. let res = if let Some(cmd) = cmd {
  918. Self::fcntl(fd, cmd, arg)
  919. } else {
  920. Err(SystemError::EINVAL)
  921. };
  922. // kdebug!("FCNTL: fd: {}, cmd: {:?}, arg: {}, res: {:?}", fd, cmd, arg, res);
  923. res
  924. }
  925. SYS_FTRUNCATE => {
  926. let fd = args[0] as i32;
  927. let len = args[1] as usize;
  928. let res = Self::ftruncate(fd, len);
  929. // kdebug!("FTRUNCATE: fd: {}, len: {}, res: {:?}", fd, len, res);
  930. res
  931. }
  932. _ => panic!("Unsupported syscall ID: {}", syscall_num),
  933. };
  934. let r = r.unwrap_or_else(|e| e.to_posix_errno() as usize);
  935. return r;
  936. }
  937. pub fn put_string(
  938. s: *const u8,
  939. front_color: u32,
  940. back_color: u32,
  941. ) -> Result<usize, SystemError> {
  942. return Ok(unsafe { do_put_string(s, front_color, back_color) });
  943. }
  944. pub fn reboot() -> Result<usize, SystemError> {
  945. cpu_reset();
  946. }
  947. }