mod.rs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  1. use core::{
  2. ffi::{c_int, c_void},
  3. sync::atomic::{AtomicBool, Ordering},
  4. };
  5. use crate::{
  6. arch::{ipc::signal::SigSet, syscall::nr::*},
  7. filesystem::vfs::syscall::PosixStatfs,
  8. ipc::shm::{ShmCtlCmd, ShmFlags, ShmId, ShmKey},
  9. libs::{futex::constant::FutexFlag, rand::GRandFlags},
  10. mm::{page::PAGE_4K_SIZE, syscall::MremapFlags},
  11. net::syscall::MsgHdr,
  12. process::{
  13. fork::KernelCloneArgs,
  14. process_group::Pgid,
  15. resource::{RLimit64, RUsage},
  16. ProcessFlags, ProcessManager,
  17. },
  18. sched::{schedule, SchedMode},
  19. syscall::user_access::check_and_clone_cstr,
  20. };
  21. use log::{info, warn};
  22. use num_traits::FromPrimitive;
  23. use system_error::SystemError;
  24. use crate::{
  25. arch::{interrupt::TrapFrame, MMArch},
  26. filesystem::vfs::{
  27. fcntl::{AtFlags, FcntlCommand},
  28. file::FileMode,
  29. stat::PosixKstat,
  30. syscall::{ModeType, UtimensFlags},
  31. MAX_PATHLEN,
  32. },
  33. libs::align::page_align_up,
  34. mm::{verify_area, MemoryManagementArch, VirtAddr},
  35. net::syscall::SockAddr,
  36. process::{fork::CloneFlags, syscall::PosixOldUtsName, Pid},
  37. time::{
  38. syscall::{PosixTimeZone, PosixTimeval},
  39. PosixTimeSpec,
  40. },
  41. };
  42. use self::{
  43. misc::SysInfo,
  44. user_access::{UserBufferReader, UserBufferWriter},
  45. };
  46. pub mod misc;
  47. pub mod user_access;
  48. // 与linux不一致的调用,在linux基础上累加
  49. pub const SYS_PUT_STRING: usize = 100000;
  50. pub const SYS_SBRK: usize = 100001;
  51. /// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!! 删的时候记得改C版本的libc
  52. pub const SYS_CLOCK: usize = 100002;
  53. pub const SYS_SCHED: usize = 100003;
  54. #[derive(Debug)]
  55. pub struct Syscall;
  56. impl Syscall {
  57. /// 初始化系统调用
  58. #[inline(never)]
  59. pub fn init() -> Result<(), SystemError> {
  60. static INIT_FLAG: AtomicBool = AtomicBool::new(false);
  61. let prev = INIT_FLAG.swap(true, Ordering::SeqCst);
  62. if prev {
  63. panic!("Cannot initialize syscall more than once!");
  64. }
  65. info!("Initializing syscall...");
  66. let r = crate::arch::syscall::arch_syscall_init();
  67. info!("Syscall init successfully!");
  68. return r;
  69. }
  70. /// 系统调用分发器,用于分发系统调用。
  71. ///
  72. /// 与[handle]不同,这个函数会捕获系统调用处理函数的panic,返回错误码。
  73. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  74. pub fn catch_handle(
  75. syscall_num: usize,
  76. args: &[usize],
  77. frame: &mut TrapFrame,
  78. ) -> Result<usize, SystemError> {
  79. use crate::debug::panic::kernel_catch_unwind;
  80. let res = kernel_catch_unwind(|| Self::handle(syscall_num, args, frame))?;
  81. res
  82. }
  83. /// @brief 系统调用分发器,用于分发系统调用。
  84. ///
  85. /// 这个函数内,需要根据系统调用号,调用对应的系统调用处理函数。
  86. /// 并且,对于用户态传入的指针参数,需要在本函数内进行越界检查,防止访问到内核空间。
  87. #[inline(never)]
  88. pub fn handle(
  89. syscall_num: usize,
  90. args: &[usize],
  91. frame: &mut TrapFrame,
  92. ) -> Result<usize, SystemError> {
  93. let r = match syscall_num {
  94. SYS_PUT_STRING => {
  95. Self::put_string(args[0] as *const u8, args[1] as u32, args[2] as u32)
  96. }
  97. #[cfg(target_arch = "x86_64")]
  98. SYS_OPEN => {
  99. let path = args[0] as *const u8;
  100. let flags = args[1] as u32;
  101. let mode = args[2] as u32;
  102. Self::open(path, flags, mode, true)
  103. }
  104. #[cfg(target_arch = "x86_64")]
  105. SYS_RENAME => {
  106. let oldname: *const u8 = args[0] as *const u8;
  107. let newname: *const u8 = args[1] as *const u8;
  108. Self::do_renameat2(
  109. AtFlags::AT_FDCWD.bits(),
  110. oldname,
  111. AtFlags::AT_FDCWD.bits(),
  112. newname,
  113. 0,
  114. )
  115. }
  116. #[cfg(target_arch = "x86_64")]
  117. SYS_RENAMEAT => {
  118. let oldfd = args[0] as i32;
  119. let oldname: *const u8 = args[1] as *const u8;
  120. let newfd = args[2] as i32;
  121. let newname: *const u8 = args[3] as *const u8;
  122. Self::do_renameat2(oldfd, oldname, newfd, newname, 0)
  123. }
  124. SYS_RENAMEAT2 => {
  125. let oldfd = args[0] as i32;
  126. let oldname: *const u8 = args[1] as *const u8;
  127. let newfd = args[2] as i32;
  128. let newname: *const u8 = args[3] as *const u8;
  129. let flags = args[4] as u32;
  130. Self::do_renameat2(oldfd, oldname, newfd, newname, flags)
  131. }
  132. SYS_OPENAT => {
  133. let dirfd = args[0] as i32;
  134. let path = args[1] as *const u8;
  135. let flags = args[2] as u32;
  136. let mode = args[3] as u32;
  137. Self::openat(dirfd, path, flags, mode, true)
  138. }
  139. SYS_CLOSE => {
  140. let fd = args[0];
  141. Self::close(fd)
  142. }
  143. SYS_READ => {
  144. let fd = args[0] as i32;
  145. let buf_vaddr = args[1];
  146. let len = args[2];
  147. let from_user = frame.is_from_user();
  148. let mut user_buffer_writer =
  149. UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
  150. let user_buf = user_buffer_writer.buffer(0)?;
  151. Self::read(fd, user_buf)
  152. }
  153. SYS_WRITE => {
  154. let fd = args[0] as i32;
  155. let buf_vaddr = args[1];
  156. let len = args[2];
  157. let from_user = frame.is_from_user();
  158. let user_buffer_reader =
  159. UserBufferReader::new(buf_vaddr as *const u8, len, from_user)?;
  160. let user_buf = user_buffer_reader.read_from_user(0)?;
  161. Self::write(fd, user_buf)
  162. }
  163. SYS_LSEEK => {
  164. let fd = args[0] as i32;
  165. let offset = args[1] as i64;
  166. let whence = args[2] as u32;
  167. Self::lseek(fd, offset, whence)
  168. }
  169. SYS_PREAD64 => {
  170. let fd = args[0] as i32;
  171. let buf_vaddr = args[1];
  172. let len = args[2];
  173. let offset = args[3];
  174. let mut user_buffer_writer =
  175. UserBufferWriter::new(buf_vaddr as *mut u8, len, frame.is_from_user())?;
  176. let buf = user_buffer_writer.buffer(0)?;
  177. Self::pread(fd, buf, len, offset)
  178. }
  179. SYS_PWRITE64 => {
  180. let fd = args[0] as i32;
  181. let buf_vaddr = args[1];
  182. let len = args[2];
  183. let offset = args[3];
  184. let user_buffer_reader =
  185. UserBufferReader::new(buf_vaddr as *const u8, len, frame.is_from_user())?;
  186. let buf = user_buffer_reader.read_from_user(0)?;
  187. Self::pwrite(fd, buf, len, offset)
  188. }
  189. SYS_IOCTL => {
  190. let fd = args[0];
  191. let cmd = args[1];
  192. let data = args[2];
  193. Self::ioctl(fd, cmd as u32, data)
  194. }
  195. #[cfg(target_arch = "x86_64")]
  196. SYS_FORK => Self::fork(frame),
  197. #[cfg(target_arch = "x86_64")]
  198. SYS_VFORK => Self::vfork(frame),
  199. SYS_BRK => {
  200. let new_brk = VirtAddr::new(args[0]);
  201. Self::brk(new_brk).map(|vaddr| vaddr.data())
  202. }
  203. SYS_SBRK => {
  204. let increment = args[0] as isize;
  205. Self::sbrk(increment).map(|vaddr: VirtAddr| vaddr.data())
  206. }
  207. SYS_REBOOT => {
  208. let magic1 = args[0] as u32;
  209. let magic2 = args[1] as u32;
  210. let cmd = args[2] as u32;
  211. let arg = args[3];
  212. Self::reboot(magic1, magic2, cmd, arg)
  213. }
  214. SYS_CHDIR => {
  215. let r = args[0] as *const u8;
  216. Self::chdir(r)
  217. }
  218. SYS_FCHDIR => {
  219. let fd = args[0] as i32;
  220. Self::fchdir(fd)
  221. }
  222. #[allow(unreachable_patterns)]
  223. SYS_GETDENTS64 | SYS_GETDENTS => {
  224. let fd = args[0] as i32;
  225. let buf_vaddr = args[1];
  226. let len = args[2];
  227. let virt_addr: VirtAddr = VirtAddr::new(buf_vaddr);
  228. // 判断缓冲区是否来自用户态,进行权限校验
  229. let res = if frame.is_from_user() && verify_area(virt_addr, len).is_err() {
  230. // 来自用户态,而buffer在内核态,这样的操作不被允许
  231. Err(SystemError::EPERM)
  232. } else if buf_vaddr == 0 {
  233. Err(SystemError::EFAULT)
  234. } else {
  235. let buf: &mut [u8] = unsafe {
  236. core::slice::from_raw_parts_mut::<'static, u8>(buf_vaddr as *mut u8, len)
  237. };
  238. Self::getdents(fd, buf)
  239. };
  240. res
  241. }
  242. SYS_EXECVE => {
  243. let path_ptr = args[0];
  244. let argv_ptr = args[1];
  245. let env_ptr = args[2];
  246. let virt_path_ptr = VirtAddr::new(path_ptr);
  247. let virt_argv_ptr = VirtAddr::new(argv_ptr);
  248. let virt_env_ptr = VirtAddr::new(env_ptr);
  249. // 权限校验
  250. if frame.is_from_user()
  251. && (verify_area(virt_path_ptr, MAX_PATHLEN).is_err()
  252. || verify_area(virt_argv_ptr, PAGE_4K_SIZE).is_err())
  253. || verify_area(virt_env_ptr, PAGE_4K_SIZE).is_err()
  254. {
  255. Err(SystemError::EFAULT)
  256. } else {
  257. Self::execve(
  258. path_ptr as *const u8,
  259. argv_ptr as *const *const u8,
  260. env_ptr as *const *const u8,
  261. frame,
  262. )
  263. .map(|_| 0)
  264. }
  265. }
  266. SYS_WAIT4 => {
  267. let pid = args[0] as i32;
  268. let wstatus = args[1] as *mut i32;
  269. let options = args[2] as c_int;
  270. let rusage = args[3] as *mut c_void;
  271. // 权限校验
  272. // todo: 引入rusage之后,更正以下权限校验代码中,rusage的大小
  273. Self::wait4(pid.into(), wstatus, options, rusage)
  274. }
  275. SYS_EXIT => {
  276. let exit_code = args[0];
  277. Self::exit(exit_code)
  278. }
  279. #[cfg(target_arch = "x86_64")]
  280. SYS_MKDIR => {
  281. let path = args[0] as *const u8;
  282. let mode = args[1];
  283. Self::mkdir(path, mode)
  284. }
  285. SYS_MKDIRAT => {
  286. let dirfd = args[0] as i32;
  287. let path = args[1] as *const u8;
  288. let mode = args[2];
  289. Self::mkdir_at(dirfd, path, mode)
  290. }
  291. SYS_NANOSLEEP => {
  292. let req = args[0] as *const PosixTimeSpec;
  293. let rem = args[1] as *mut PosixTimeSpec;
  294. let virt_req = VirtAddr::new(req as usize);
  295. let virt_rem = VirtAddr::new(rem as usize);
  296. if frame.is_from_user()
  297. && (verify_area(virt_req, core::mem::size_of::<PosixTimeSpec>()).is_err()
  298. || verify_area(virt_rem, core::mem::size_of::<PosixTimeSpec>()).is_err())
  299. {
  300. Err(SystemError::EFAULT)
  301. } else {
  302. Self::nanosleep(req, rem)
  303. }
  304. }
  305. SYS_CLOCK => Self::clock(),
  306. #[cfg(target_arch = "x86_64")]
  307. SYS_PIPE => {
  308. let pipefd: *mut i32 = args[0] as *mut c_int;
  309. if pipefd.is_null() {
  310. Err(SystemError::EFAULT)
  311. } else {
  312. Self::pipe2(pipefd, FileMode::empty())
  313. }
  314. }
  315. SYS_PIPE2 => {
  316. let pipefd: *mut i32 = args[0] as *mut c_int;
  317. let arg1 = args[1];
  318. if pipefd.is_null() {
  319. Err(SystemError::EFAULT)
  320. } else {
  321. let flags = FileMode::from_bits_truncate(arg1 as u32);
  322. Self::pipe2(pipefd, flags)
  323. }
  324. }
  325. SYS_UNLINKAT => {
  326. let dirfd = args[0] as i32;
  327. let path = args[1] as *const u8;
  328. let flags = args[2] as u32;
  329. Self::unlinkat(dirfd, path, flags)
  330. }
  331. #[cfg(target_arch = "x86_64")]
  332. SYS_SYMLINK => {
  333. let oldname = args[0] as *const u8;
  334. let newname = args[1] as *const u8;
  335. Self::symlink(oldname, newname)
  336. }
  337. SYS_SYMLINKAT => {
  338. let oldname = args[0] as *const u8;
  339. let newdfd = args[1] as i32;
  340. let newname = args[2] as *const u8;
  341. Self::symlinkat(oldname, newdfd, newname)
  342. }
  343. #[cfg(target_arch = "x86_64")]
  344. SYS_RMDIR => {
  345. let path = args[0] as *const u8;
  346. Self::rmdir(path)
  347. }
  348. #[cfg(target_arch = "x86_64")]
  349. SYS_LINK => {
  350. let old = args[0] as *const u8;
  351. let new = args[1] as *const u8;
  352. return Self::link(old, new);
  353. }
  354. SYS_LINKAT => {
  355. let oldfd = args[0] as i32;
  356. let old = args[1] as *const u8;
  357. let newfd = args[2] as i32;
  358. let new = args[3] as *const u8;
  359. let flags = args[4] as i32;
  360. return Self::linkat(oldfd, old, newfd, new, flags);
  361. }
  362. #[cfg(target_arch = "x86_64")]
  363. SYS_UNLINK => {
  364. let path = args[0] as *const u8;
  365. Self::unlink(path)
  366. }
  367. SYS_KILL => {
  368. let pid = args[0] as i32;
  369. let sig = args[1] as c_int;
  370. // debug!("KILL SYSCALL RECEIVED");
  371. Self::kill(pid, sig)
  372. }
  373. SYS_RT_SIGACTION => {
  374. let sig = args[0] as c_int;
  375. let act = args[1];
  376. let old_act = args[2];
  377. Self::sigaction(sig, act, old_act, frame.is_from_user())
  378. }
  379. SYS_GETPID => Self::getpid().map(|pid| pid.into()),
  380. SYS_SCHED => {
  381. warn!("syscall sched");
  382. schedule(SchedMode::SM_NONE);
  383. Ok(0)
  384. }
  385. SYS_DUP => {
  386. let oldfd: i32 = args[0] as c_int;
  387. Self::dup(oldfd)
  388. }
  389. #[cfg(target_arch = "x86_64")]
  390. SYS_DUP2 => {
  391. let oldfd: i32 = args[0] as c_int;
  392. let newfd: i32 = args[1] as c_int;
  393. Self::dup2(oldfd, newfd)
  394. }
  395. SYS_DUP3 => {
  396. let oldfd: i32 = args[0] as c_int;
  397. let newfd: i32 = args[1] as c_int;
  398. let flags: u32 = args[2] as u32;
  399. Self::dup3(oldfd, newfd, flags)
  400. }
  401. SYS_SOCKET => Self::socket(args[0], args[1], args[2]),
  402. SYS_SETSOCKOPT => {
  403. let optval = args[3] as *const u8;
  404. let optlen = args[4];
  405. let virt_optval = VirtAddr::new(optval as usize);
  406. // 验证optval的地址是否合法
  407. if verify_area(virt_optval, optlen).is_err() {
  408. // 地址空间超出了用户空间的范围,不合法
  409. Err(SystemError::EFAULT)
  410. } else {
  411. let data: &[u8] = unsafe { core::slice::from_raw_parts(optval, optlen) };
  412. Self::setsockopt(args[0], args[1], args[2], data)
  413. }
  414. }
  415. SYS_GETSOCKOPT => {
  416. let optval = args[3] as *mut u8;
  417. let optlen = args[4] as *mut usize;
  418. let virt_optval = VirtAddr::new(optval as usize);
  419. let virt_optlen = VirtAddr::new(optlen as usize);
  420. let security_check = || {
  421. // 验证optval的地址是否合法
  422. if verify_area(virt_optval, PAGE_4K_SIZE).is_err() {
  423. // 地址空间超出了用户空间的范围,不合法
  424. return Err(SystemError::EFAULT);
  425. }
  426. // 验证optlen的地址是否合法
  427. if verify_area(virt_optlen, core::mem::size_of::<u32>()).is_err() {
  428. // 地址空间超出了用户空间的范围,不合法
  429. return Err(SystemError::EFAULT);
  430. }
  431. return Ok(());
  432. };
  433. let r = security_check();
  434. if let Err(e) = r {
  435. Err(e)
  436. } else {
  437. Self::getsockopt(args[0], args[1], args[2], optval, optlen as *mut u32)
  438. }
  439. }
  440. SYS_CONNECT => {
  441. let addr = args[1] as *const SockAddr;
  442. let addrlen = args[2];
  443. let virt_addr = VirtAddr::new(addr as usize);
  444. // 验证addr的地址是否合法
  445. if verify_area(virt_addr, addrlen).is_err() {
  446. // 地址空间超出了用户空间的范围,不合法
  447. Err(SystemError::EFAULT)
  448. } else {
  449. Self::connect(args[0], addr, addrlen)
  450. }
  451. }
  452. SYS_BIND => {
  453. let addr = args[1] as *const SockAddr;
  454. let addrlen = args[2];
  455. let virt_addr = VirtAddr::new(addr as usize);
  456. // 验证addr的地址是否合法
  457. if verify_area(virt_addr, addrlen).is_err() {
  458. // 地址空间超出了用户空间的范围,不合法
  459. Err(SystemError::EFAULT)
  460. } else {
  461. Self::bind(args[0], addr, addrlen)
  462. }
  463. }
  464. SYS_SENDTO => {
  465. let buf = args[1] as *const u8;
  466. let len = args[2];
  467. let flags = args[3] as u32;
  468. let addr = args[4] as *const SockAddr;
  469. let addrlen = args[5];
  470. let virt_buf = VirtAddr::new(buf as usize);
  471. let virt_addr = VirtAddr::new(addr as usize);
  472. // 验证buf的地址是否合法
  473. if verify_area(virt_buf, len).is_err() || verify_area(virt_addr, addrlen).is_err() {
  474. // 地址空间超出了用户空间的范围,不合法
  475. Err(SystemError::EFAULT)
  476. } else {
  477. let data: &[u8] = unsafe { core::slice::from_raw_parts(buf, len) };
  478. Self::sendto(args[0], data, flags, addr, addrlen)
  479. }
  480. }
  481. SYS_RECVFROM => {
  482. let buf = args[1] as *mut u8;
  483. let len = args[2];
  484. let flags = args[3] as u32;
  485. let addr = args[4] as *mut SockAddr;
  486. let addrlen = args[5] as *mut usize;
  487. let virt_buf = VirtAddr::new(buf as usize);
  488. let virt_addrlen = VirtAddr::new(addrlen as usize);
  489. let virt_addr = VirtAddr::new(addr as usize);
  490. let security_check = || {
  491. // 验证buf的地址是否合法
  492. if verify_area(virt_buf, len).is_err() {
  493. // 地址空间超出了用户空间的范围,不合法
  494. return Err(SystemError::EFAULT);
  495. }
  496. // 验证addrlen的地址是否合法
  497. if verify_area(virt_addrlen, core::mem::size_of::<u32>()).is_err() {
  498. // 地址空间超出了用户空间的范围,不合法
  499. return Err(SystemError::EFAULT);
  500. }
  501. if verify_area(virt_addr, core::mem::size_of::<SockAddr>()).is_err() {
  502. // 地址空间超出了用户空间的范围,不合法
  503. return Err(SystemError::EFAULT);
  504. }
  505. return Ok(());
  506. };
  507. let r = security_check();
  508. if let Err(e) = r {
  509. Err(e)
  510. } else {
  511. let buf = unsafe { core::slice::from_raw_parts_mut(buf, len) };
  512. Self::recvfrom(args[0], buf, flags, addr, addrlen as *mut u32)
  513. }
  514. }
  515. SYS_RECVMSG => {
  516. let msg = args[1] as *mut MsgHdr;
  517. let flags = args[2] as u32;
  518. let mut user_buffer_writer = UserBufferWriter::new(
  519. msg,
  520. core::mem::size_of::<MsgHdr>(),
  521. frame.is_from_user(),
  522. )?;
  523. let buffer = user_buffer_writer.buffer::<MsgHdr>(0)?;
  524. let msg = &mut buffer[0];
  525. Self::recvmsg(args[0], msg, flags)
  526. }
  527. SYS_LISTEN => Self::listen(args[0], args[1]),
  528. SYS_SHUTDOWN => Self::shutdown(args[0], args[1]),
  529. SYS_ACCEPT => Self::accept(args[0], args[1] as *mut SockAddr, args[2] as *mut u32),
  530. SYS_ACCEPT4 => Self::accept4(
  531. args[0],
  532. args[1] as *mut SockAddr,
  533. args[2] as *mut u32,
  534. args[3] as u32,
  535. ),
  536. SYS_GETSOCKNAME => {
  537. Self::getsockname(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  538. }
  539. SYS_GETPEERNAME => {
  540. Self::getpeername(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  541. }
  542. SYS_GETTIMEOFDAY => {
  543. let timeval = args[0] as *mut PosixTimeval;
  544. let timezone_ptr = args[1] as *mut PosixTimeZone;
  545. Self::gettimeofday(timeval, timezone_ptr)
  546. }
  547. SYS_MMAP => {
  548. let len = page_align_up(args[1]);
  549. let virt_addr = VirtAddr::new(args[0]);
  550. if verify_area(virt_addr, len).is_err() {
  551. Err(SystemError::EFAULT)
  552. } else {
  553. Self::mmap(
  554. VirtAddr::new(args[0]),
  555. len,
  556. args[2],
  557. args[3],
  558. args[4] as i32,
  559. args[5],
  560. )
  561. }
  562. }
  563. SYS_MREMAP => {
  564. let old_vaddr = VirtAddr::new(args[0]);
  565. let old_len = args[1];
  566. let new_len = args[2];
  567. let mremap_flags = MremapFlags::from_bits_truncate(args[3] as u8);
  568. let new_vaddr = VirtAddr::new(args[4]);
  569. Self::mremap(old_vaddr, old_len, new_len, mremap_flags, new_vaddr)
  570. }
  571. SYS_MUNMAP => {
  572. let addr = args[0];
  573. let len = page_align_up(args[1]);
  574. if addr & (MMArch::PAGE_SIZE - 1) != 0 {
  575. // The addr argument is not a multiple of the page size
  576. Err(SystemError::EINVAL)
  577. } else {
  578. Self::munmap(VirtAddr::new(addr), len)
  579. }
  580. }
  581. SYS_MPROTECT => {
  582. let addr = args[0];
  583. let len = page_align_up(args[1]);
  584. if addr & (MMArch::PAGE_SIZE - 1) != 0 {
  585. // The addr argument is not a multiple of the page size
  586. Err(SystemError::EINVAL)
  587. } else {
  588. Self::mprotect(VirtAddr::new(addr), len, args[2])
  589. }
  590. }
  591. SYS_GETCWD => {
  592. let buf = args[0] as *mut u8;
  593. let size = args[1];
  594. let security_check = || {
  595. verify_area(VirtAddr::new(buf as usize), size)?;
  596. return Ok(());
  597. };
  598. let r = security_check();
  599. if let Err(e) = r {
  600. Err(e)
  601. } else {
  602. let buf = unsafe { core::slice::from_raw_parts_mut(buf, size) };
  603. Self::getcwd(buf).map(|ptr| ptr.data())
  604. }
  605. }
  606. SYS_GETPGID => Self::getpgid(Pid::new(args[0])).map(|pgid| pgid.into()),
  607. SYS_GETPPID => Self::getppid().map(|pid| pid.into()),
  608. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  609. SYS_FSTAT => {
  610. let fd = args[0] as i32;
  611. let kstat: *mut PosixKstat = args[1] as *mut PosixKstat;
  612. let vaddr = VirtAddr::new(kstat as usize);
  613. // FIXME 由于c中的verify_area与rust中的verify_area重名,所以在引入时加了前缀区分
  614. // TODO 应该将用了c版本的verify_area都改为rust的verify_area
  615. match verify_area(vaddr, core::mem::size_of::<PosixKstat>()) {
  616. Ok(_) => Self::fstat(fd, kstat),
  617. Err(e) => Err(e),
  618. }
  619. }
  620. SYS_FCNTL => {
  621. let fd = args[0] as i32;
  622. let cmd: Option<FcntlCommand> =
  623. <FcntlCommand as FromPrimitive>::from_u32(args[1] as u32);
  624. let arg = args[2] as i32;
  625. let res = if let Some(cmd) = cmd {
  626. Self::fcntl(fd, cmd, arg)
  627. } else {
  628. Err(SystemError::EINVAL)
  629. };
  630. // debug!("FCNTL: fd: {}, cmd: {:?}, arg: {}, res: {:?}", fd, cmd, arg, res);
  631. res
  632. }
  633. SYS_FTRUNCATE => {
  634. let fd = args[0] as i32;
  635. let len = args[1];
  636. let res = Self::ftruncate(fd, len);
  637. // debug!("FTRUNCATE: fd: {}, len: {}, res: {:?}", fd, len, res);
  638. res
  639. }
  640. #[cfg(target_arch = "x86_64")]
  641. SYS_MKNOD => {
  642. let path = args[0];
  643. let flags = args[1];
  644. let dev_t = args[2];
  645. let flags: ModeType = ModeType::from_bits_truncate(flags as u32);
  646. Self::mknod(
  647. path as *const u8,
  648. flags,
  649. crate::driver::base::device::device_number::DeviceNumber::from(dev_t as u32),
  650. )
  651. }
  652. SYS_CLONE => {
  653. let parent_tid = VirtAddr::new(args[2]);
  654. let child_tid = VirtAddr::new(args[3]);
  655. // 地址校验
  656. verify_area(parent_tid, core::mem::size_of::<i32>())?;
  657. verify_area(child_tid, core::mem::size_of::<i32>())?;
  658. let mut clone_args = KernelCloneArgs::new();
  659. clone_args.flags = CloneFlags::from_bits_truncate(args[0] as u64);
  660. clone_args.stack = args[1];
  661. clone_args.parent_tid = parent_tid;
  662. clone_args.child_tid = child_tid;
  663. clone_args.tls = args[4];
  664. Self::clone(frame, clone_args)
  665. }
  666. SYS_FUTEX => {
  667. let uaddr = VirtAddr::new(args[0]);
  668. let operation = FutexFlag::from_bits(args[1] as u32).ok_or(SystemError::ENOSYS)?;
  669. let val = args[2] as u32;
  670. let utime = args[3];
  671. let uaddr2 = VirtAddr::new(args[4]);
  672. let val3 = args[5] as u32;
  673. let mut timespec = None;
  674. if utime != 0 && operation.contains(FutexFlag::FLAGS_HAS_TIMEOUT) {
  675. let reader = UserBufferReader::new(
  676. utime as *const PosixTimeSpec,
  677. core::mem::size_of::<PosixTimeSpec>(),
  678. true,
  679. )?;
  680. timespec = Some(*reader.read_one_from_user::<PosixTimeSpec>(0)?);
  681. }
  682. Self::do_futex(uaddr, operation, val, timespec, uaddr2, utime as u32, val3)
  683. }
  684. SYS_SET_ROBUST_LIST => {
  685. let head = args[0];
  686. let head_uaddr = VirtAddr::new(head);
  687. let len = args[1];
  688. let ret = Self::set_robust_list(head_uaddr, len);
  689. return ret;
  690. }
  691. SYS_GET_ROBUST_LIST => {
  692. let pid = args[0];
  693. let head = args[1];
  694. let head_uaddr = VirtAddr::new(head);
  695. let len_ptr = args[2];
  696. let len_ptr_uaddr = VirtAddr::new(len_ptr);
  697. let ret = Self::get_robust_list(pid, head_uaddr, len_ptr_uaddr);
  698. return ret;
  699. }
  700. SYS_READV => Self::readv(args[0] as i32, args[1], args[2]),
  701. SYS_WRITEV => Self::writev(args[0] as i32, args[1], args[2]),
  702. SYS_SET_TID_ADDRESS => Self::set_tid_address(args[0]),
  703. #[cfg(target_arch = "x86_64")]
  704. SYS_LSTAT => {
  705. let path = args[0] as *const u8;
  706. let kstat = args[1] as *mut PosixKstat;
  707. Self::lstat(path, kstat)
  708. }
  709. #[cfg(target_arch = "x86_64")]
  710. SYS_STAT => {
  711. let path = args[0] as *const u8;
  712. let kstat = args[1] as *mut PosixKstat;
  713. Self::stat(path, kstat)
  714. }
  715. SYS_STATFS => {
  716. let path = args[0] as *const u8;
  717. let statfs = args[1] as *mut PosixStatfs;
  718. Self::statfs(path, statfs)
  719. }
  720. SYS_FSTATFS => {
  721. let fd = args[0] as i32;
  722. let statfs = args[1] as *mut PosixStatfs;
  723. Self::fstatfs(fd, statfs)
  724. }
  725. SYS_STATX => Self::statx(
  726. args[0] as i32,
  727. args[1],
  728. args[2] as u32,
  729. args[3] as u32,
  730. args[4],
  731. ),
  732. #[cfg(target_arch = "x86_64")]
  733. SYS_EPOLL_CREATE => Self::epoll_create(args[0] as i32),
  734. SYS_EPOLL_CREATE1 => Self::epoll_create1(args[0]),
  735. SYS_EPOLL_CTL => Self::epoll_ctl(
  736. args[0] as i32,
  737. args[1],
  738. args[2] as i32,
  739. VirtAddr::new(args[3]),
  740. ),
  741. #[cfg(target_arch = "x86_64")]
  742. SYS_EPOLL_WAIT => Self::epoll_wait(
  743. args[0] as i32,
  744. VirtAddr::new(args[1]),
  745. args[2] as i32,
  746. args[3] as i32,
  747. ),
  748. SYS_EPOLL_PWAIT => {
  749. let epfd = args[0] as i32;
  750. let epoll_event = VirtAddr::new(args[1]);
  751. let max_events = args[2] as i32;
  752. let timespec = args[3] as i32;
  753. let sigmask_addr = args[4] as *mut SigSet;
  754. if sigmask_addr.is_null() {
  755. return Self::epoll_wait(epfd, epoll_event, max_events, timespec);
  756. }
  757. let sigmask_reader =
  758. UserBufferReader::new(sigmask_addr, core::mem::size_of::<SigSet>(), true)?;
  759. let mut sigmask = *sigmask_reader.read_one_from_user::<SigSet>(0)?;
  760. Self::epoll_pwait(
  761. args[0] as i32,
  762. VirtAddr::new(args[1]),
  763. args[2] as i32,
  764. args[3] as i32,
  765. &mut sigmask,
  766. )
  767. }
  768. // 目前为了适配musl-libc,以下系统调用先这样写着
  769. SYS_GETRANDOM => {
  770. let flags = GRandFlags::from_bits(args[2] as u8).ok_or(SystemError::EINVAL)?;
  771. Self::get_random(args[0] as *mut u8, args[1], flags)
  772. }
  773. SYS_SOCKETPAIR => {
  774. let mut user_buffer_writer = UserBufferWriter::new(
  775. args[3] as *mut c_int,
  776. core::mem::size_of::<[c_int; 2]>(),
  777. frame.is_from_user(),
  778. )?;
  779. let fds = user_buffer_writer.buffer::<i32>(0)?;
  780. Self::socketpair(args[0], args[1], args[2], fds)
  781. }
  782. #[cfg(target_arch = "x86_64")]
  783. SYS_POLL => {
  784. let fds = args[0];
  785. let nfds = args[1] as u32;
  786. let timeout = args[2] as i32;
  787. Self::poll(fds, nfds, timeout)
  788. }
  789. SYS_PPOLL => Self::ppoll(args[0], args[1] as u32, args[2], args[3]),
  790. SYS_SETPGID => {
  791. let pid = Pid::new(args[0]);
  792. let pgid = Pgid::new(args[1]);
  793. Self::setpgid(pid, pgid)
  794. }
  795. SYS_RT_SIGPROCMASK => {
  796. let how = args[0] as i32;
  797. let nset = args[1];
  798. let oset = args[2];
  799. let sigsetsize = args[3];
  800. Self::rt_sigprocmask(how, nset, oset, sigsetsize)
  801. }
  802. SYS_TKILL => {
  803. warn!("SYS_TKILL has not yet been implemented");
  804. Ok(0)
  805. }
  806. SYS_SIGALTSTACK => {
  807. warn!("SYS_SIGALTSTACK has not yet been implemented");
  808. Ok(0)
  809. }
  810. SYS_EXIT_GROUP => {
  811. warn!("SYS_EXIT_GROUP has not yet been implemented");
  812. Ok(0)
  813. }
  814. SYS_MADVISE => {
  815. let addr = args[0];
  816. let len = page_align_up(args[1]);
  817. if addr & (MMArch::PAGE_SIZE - 1) != 0 {
  818. Err(SystemError::EINVAL)
  819. } else {
  820. Self::madvise(VirtAddr::new(addr), len, args[2])
  821. }
  822. }
  823. SYS_GETTID => Self::gettid().map(|tid| tid.into()),
  824. SYS_SYSLOG => {
  825. let syslog_action_type = args[0];
  826. let buf_vaddr = args[1];
  827. let len = args[2];
  828. let from_user = frame.is_from_user();
  829. let mut user_buffer_writer =
  830. UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
  831. let user_buf = user_buffer_writer.buffer(0)?;
  832. Self::do_syslog(syslog_action_type, user_buf, len)
  833. }
  834. SYS_GETUID => Self::getuid(),
  835. SYS_GETGID => Self::getgid(),
  836. SYS_SETUID => Self::setuid(args[0]),
  837. SYS_SETGID => Self::setgid(args[0]),
  838. SYS_GETEUID => Self::geteuid(),
  839. SYS_GETEGID => Self::getegid(),
  840. SYS_SETRESUID => Self::seteuid(args[1]),
  841. SYS_SETRESGID => Self::setegid(args[1]),
  842. SYS_SETFSUID => Self::setfsuid(args[0]),
  843. SYS_SETFSGID => Self::setfsgid(args[0]),
  844. SYS_SETSID => Self::setsid(),
  845. SYS_GETSID => Self::getsid(Pid::new(args[0])),
  846. SYS_GETRUSAGE => {
  847. let who = args[0] as c_int;
  848. let rusage = args[1] as *mut RUsage;
  849. Self::get_rusage(who, rusage)
  850. }
  851. #[cfg(target_arch = "x86_64")]
  852. SYS_READLINK => {
  853. let path = args[0] as *const u8;
  854. let buf = args[1] as *mut u8;
  855. let bufsiz = args[2];
  856. Self::readlink(path, buf, bufsiz)
  857. }
  858. SYS_READLINKAT => {
  859. let dirfd = args[0] as i32;
  860. let path = args[1] as *const u8;
  861. let buf = args[2] as *mut u8;
  862. let bufsiz = args[3];
  863. Self::readlink_at(dirfd, path, buf, bufsiz)
  864. }
  865. SYS_PRLIMIT64 => {
  866. let pid = args[0];
  867. let pid = Pid::new(pid);
  868. let resource = args[1];
  869. let new_limit = args[2] as *const RLimit64;
  870. let old_limit = args[3] as *mut RLimit64;
  871. Self::prlimit64(pid, resource, new_limit, old_limit)
  872. }
  873. #[cfg(target_arch = "x86_64")]
  874. SYS_ACCESS => {
  875. let pathname = args[0] as *const u8;
  876. let mode = args[1] as u32;
  877. Self::access(pathname, mode)
  878. }
  879. SYS_FACCESSAT => {
  880. let dirfd = args[0] as i32;
  881. let pathname = args[1] as *const u8;
  882. let mode = args[2] as u32;
  883. Self::faccessat2(dirfd, pathname, mode, 0)
  884. }
  885. SYS_FACCESSAT2 => {
  886. let dirfd = args[0] as i32;
  887. let pathname = args[1] as *const u8;
  888. let mode = args[2] as u32;
  889. let flags = args[3] as u32;
  890. Self::faccessat2(dirfd, pathname, mode, flags)
  891. }
  892. SYS_CLOCK_GETTIME => {
  893. let clockid = args[0] as i32;
  894. let timespec = args[1] as *mut PosixTimeSpec;
  895. Self::clock_gettime(clockid, timespec)
  896. }
  897. SYS_SYSINFO => {
  898. let info = args[0] as *mut SysInfo;
  899. Self::sysinfo(info)
  900. }
  901. SYS_UMASK => {
  902. let mask = args[0] as u32;
  903. Self::umask(mask)
  904. }
  905. SYS_FCHOWN => {
  906. let dirfd = args[0] as i32;
  907. let uid = args[1];
  908. let gid = args[2];
  909. Self::fchown(dirfd, uid, gid)
  910. }
  911. #[cfg(target_arch = "x86_64")]
  912. SYS_CHOWN => {
  913. let pathname = args[0] as *const u8;
  914. let uid = args[1];
  915. let gid = args[2];
  916. Self::chown(pathname, uid, gid)
  917. }
  918. #[cfg(target_arch = "x86_64")]
  919. SYS_LCHOWN => {
  920. let pathname = args[0] as *const u8;
  921. let uid = args[1];
  922. let gid = args[2];
  923. Self::lchown(pathname, uid, gid)
  924. }
  925. SYS_FCHOWNAT => {
  926. let dirfd = args[0] as i32;
  927. let pathname = args[1] as *const u8;
  928. let uid = args[2];
  929. let gid = args[3];
  930. let flag = args[4] as i32;
  931. Self::fchownat(dirfd, pathname, uid, gid, flag)
  932. }
  933. SYS_FSYNC => {
  934. warn!("SYS_FSYNC has not yet been implemented");
  935. Ok(0)
  936. }
  937. SYS_RSEQ => {
  938. warn!("SYS_RSEQ has not yet been implemented");
  939. Ok(0)
  940. }
  941. #[cfg(target_arch = "x86_64")]
  942. SYS_CHMOD => {
  943. let pathname = args[0] as *const u8;
  944. let mode = args[1] as u32;
  945. Self::chmod(pathname, mode)
  946. }
  947. SYS_FCHMOD => {
  948. let fd = args[0] as i32;
  949. let mode = args[1] as u32;
  950. Self::fchmod(fd, mode)
  951. }
  952. SYS_FCHMODAT => {
  953. let dirfd = args[0] as i32;
  954. let pathname = args[1] as *const u8;
  955. let mode = args[2] as u32;
  956. Self::fchmodat(dirfd, pathname, mode)
  957. }
  958. SYS_SCHED_YIELD => Self::do_sched_yield(),
  959. SYS_SCHED_GETAFFINITY => {
  960. let pid = args[0] as i32;
  961. let size = args[1];
  962. let set_vaddr = args[2];
  963. let mut user_buffer_writer =
  964. UserBufferWriter::new(set_vaddr as *mut u8, size, frame.is_from_user())?;
  965. let set: &mut [u8] = user_buffer_writer.buffer(0)?;
  966. Self::getaffinity(pid, set)
  967. }
  968. #[cfg(target_arch = "x86_64")]
  969. SYS_GETRLIMIT => {
  970. let resource = args[0];
  971. let rlimit = args[1] as *mut RLimit64;
  972. Self::prlimit64(
  973. ProcessManager::current_pcb().pid(),
  974. resource,
  975. core::ptr::null::<RLimit64>(),
  976. rlimit,
  977. )
  978. }
  979. SYS_FADVISE64 => {
  980. // todo: 这个系统调用还没有实现
  981. Err(SystemError::ENOSYS)
  982. }
  983. SYS_MOUNT => {
  984. let source = args[0] as *const u8;
  985. let target = args[1] as *const u8;
  986. let filesystemtype = args[2] as *const u8;
  987. let mountflags = args[3];
  988. let data = args[4] as *const u8; // 额外的mount参数,实现自己的mountdata来获取
  989. return Self::mount(source, target, filesystemtype, mountflags, data);
  990. }
  991. SYS_UMOUNT2 => {
  992. let target = args[0] as *const u8;
  993. let flags = args[1] as i32;
  994. Self::umount2(target, flags)?;
  995. return Ok(0);
  996. }
  997. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  998. SYS_NEWFSTATAT => {
  999. // todo: 这个系统调用还没有实现
  1000. Err(SystemError::ENOSYS)
  1001. }
  1002. // SYS_SCHED_YIELD => Self::sched_yield(),
  1003. SYS_UNAME => {
  1004. let name = args[0] as *mut PosixOldUtsName;
  1005. Self::uname(name)
  1006. }
  1007. SYS_PRCTL => {
  1008. // todo: 这个系统调用还没有实现
  1009. Err(SystemError::EINVAL)
  1010. }
  1011. #[cfg(target_arch = "x86_64")]
  1012. SYS_ALARM => {
  1013. let second = args[0] as u32;
  1014. Self::alarm(second)
  1015. }
  1016. SYS_SHMGET => {
  1017. let key = ShmKey::new(args[0]);
  1018. let size = args[1];
  1019. let shmflg = ShmFlags::from_bits_truncate(args[2] as u32);
  1020. Self::shmget(key, size, shmflg)
  1021. }
  1022. SYS_SHMAT => {
  1023. let id = ShmId::new(args[0]);
  1024. let vaddr = VirtAddr::new(args[1]);
  1025. let shmflg = ShmFlags::from_bits_truncate(args[2] as u32);
  1026. Self::shmat(id, vaddr, shmflg)
  1027. }
  1028. SYS_SHMDT => {
  1029. let vaddr = VirtAddr::new(args[0]);
  1030. Self::shmdt(vaddr)
  1031. }
  1032. SYS_SHMCTL => {
  1033. let id = ShmId::new(args[0]);
  1034. let cmd = ShmCtlCmd::from(args[1]);
  1035. let user_buf = args[2] as *const u8;
  1036. let from_user = frame.is_from_user();
  1037. Self::shmctl(id, cmd, user_buf, from_user)
  1038. }
  1039. SYS_MSYNC => {
  1040. let start = page_align_up(args[0]);
  1041. let len = page_align_up(args[1]);
  1042. let flags = args[2];
  1043. Self::msync(VirtAddr::new(start), len, flags)
  1044. }
  1045. SYS_UTIMENSAT => Self::sys_utimensat(
  1046. args[0] as i32,
  1047. args[1] as *const u8,
  1048. args[2] as *const PosixTimeSpec,
  1049. args[3] as u32,
  1050. ),
  1051. #[cfg(target_arch = "x86_64")]
  1052. SYS_FUTIMESAT => {
  1053. let flags = UtimensFlags::empty();
  1054. Self::sys_utimensat(
  1055. args[0] as i32,
  1056. args[1] as *const u8,
  1057. args[2] as *const PosixTimeSpec,
  1058. flags.bits(),
  1059. )
  1060. }
  1061. #[cfg(target_arch = "x86_64")]
  1062. SYS_UTIMES => Self::sys_utimes(args[0] as *const u8, args[1] as *const PosixTimeval),
  1063. #[cfg(target_arch = "x86_64")]
  1064. SYS_EVENTFD => {
  1065. let initval = args[0] as u32;
  1066. Self::sys_eventfd(initval, 0)
  1067. }
  1068. SYS_EVENTFD2 => {
  1069. let initval = args[0] as u32;
  1070. let flags = args[1] as u32;
  1071. Self::sys_eventfd(initval, flags)
  1072. }
  1073. SYS_UNSHARE => Self::sys_unshare(args[0] as u64),
  1074. SYS_BPF => {
  1075. let cmd = args[0] as u32;
  1076. let attr = args[1] as *mut u8;
  1077. let size = args[2] as u32;
  1078. Self::sys_bpf(cmd, attr, size)
  1079. }
  1080. SYS_PERF_EVENT_OPEN => {
  1081. let attr = args[0] as *const u8;
  1082. let pid = args[1] as i32;
  1083. let cpu = args[2] as i32;
  1084. let group_fd = args[3] as i32;
  1085. let flags = args[4] as u32;
  1086. Self::sys_perf_event_open(attr, pid, cpu, group_fd, flags)
  1087. }
  1088. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  1089. SYS_SETRLIMIT => Ok(0),
  1090. SYS_RESTART_SYSCALL => Self::restart_syscall(),
  1091. SYS_RT_SIGPENDING => Self::rt_sigpending(args[0], args[1]),
  1092. _ => panic!("Unsupported syscall ID: {}", syscall_num),
  1093. };
  1094. if ProcessManager::current_pcb()
  1095. .flags()
  1096. .contains(ProcessFlags::NEED_SCHEDULE)
  1097. {
  1098. schedule(SchedMode::SM_PREEMPT);
  1099. }
  1100. return r;
  1101. }
  1102. pub fn put_string(
  1103. s: *const u8,
  1104. front_color: u32,
  1105. back_color: u32,
  1106. ) -> Result<usize, SystemError> {
  1107. // todo: 删除这个系统调用
  1108. let s = check_and_clone_cstr(s, Some(4096))?
  1109. .into_string()
  1110. .map_err(|_| SystemError::EINVAL)?;
  1111. let fr = (front_color & 0x00ff0000) >> 16;
  1112. let fg = (front_color & 0x0000ff00) >> 8;
  1113. let fb = front_color & 0x000000ff;
  1114. let br = (back_color & 0x00ff0000) >> 16;
  1115. let bg = (back_color & 0x0000ff00) >> 8;
  1116. let bb = back_color & 0x000000ff;
  1117. print!("\x1B[38;2;{fr};{fg};{fb};48;2;{br};{bg};{bb}m{s}\x1B[0m");
  1118. return Ok(s.len());
  1119. }
  1120. }