mod.rs 45 KB

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