mod.rs 45 KB

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