mod.rs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908
  1. use crate::process::fork::CloneFlags;
  2. use core::{
  3. ffi::c_int,
  4. sync::atomic::{AtomicBool, Ordering},
  5. };
  6. use crate::{
  7. arch::syscall::nr::*,
  8. filesystem::vfs::syscall::PosixStatfs,
  9. libs::{futex::constant::FutexFlag, rand::GRandFlags},
  10. mm::page::PAGE_4K_SIZE,
  11. net::syscall::MsgHdr,
  12. process::{ProcessFlags, ProcessManager},
  13. sched::{schedule, SchedMode},
  14. syscall::user_access::check_and_clone_cstr,
  15. };
  16. use log::{info, warn};
  17. use num_traits::FromPrimitive;
  18. use system_error::SystemError;
  19. use table::{syscall_table, syscall_table_init};
  20. use crate::{
  21. arch::interrupt::TrapFrame,
  22. filesystem::vfs::{
  23. fcntl::{AtFlags, FcntlCommand},
  24. syscall::{ModeType, UtimensFlags},
  25. },
  26. mm::{verify_area, VirtAddr},
  27. net::syscall::SockAddr,
  28. time::{
  29. syscall::{PosixTimeZone, PosixTimeval},
  30. PosixTimeSpec,
  31. },
  32. };
  33. use self::{
  34. misc::SysInfo,
  35. user_access::{UserBufferReader, UserBufferWriter},
  36. };
  37. pub mod misc;
  38. pub mod table;
  39. pub mod user_access;
  40. // 与linux不一致的调用,在linux基础上累加
  41. pub const SYS_PUT_STRING: usize = 100000;
  42. pub const SYS_SBRK: usize = 100001;
  43. /// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!! 删的时候记得改C版本的libc
  44. pub const SYS_CLOCK: usize = 100002;
  45. pub const SYS_SCHED: usize = 100003;
  46. #[derive(Debug)]
  47. pub struct Syscall;
  48. impl Syscall {
  49. /// 初始化系统调用
  50. #[inline(never)]
  51. pub fn init() -> Result<(), SystemError> {
  52. static INIT_FLAG: AtomicBool = AtomicBool::new(false);
  53. let prev = INIT_FLAG.swap(true, Ordering::SeqCst);
  54. if prev {
  55. panic!("Cannot initialize syscall more than once!");
  56. }
  57. info!("Initializing syscall...");
  58. let r = crate::arch::syscall::arch_syscall_init();
  59. info!("Syscall init successfully!");
  60. return r;
  61. }
  62. /// 系统调用分发器,用于分发系统调用。
  63. ///
  64. /// 与[handle]不同,这个函数会捕获系统调用处理函数的panic,返回错误码。
  65. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  66. pub fn catch_handle(
  67. syscall_num: usize,
  68. args: &[usize],
  69. frame: &mut TrapFrame,
  70. ) -> Result<usize, SystemError> {
  71. use crate::debug::panic::kernel_catch_unwind;
  72. let res = kernel_catch_unwind(|| Self::handle(syscall_num, args, frame))?;
  73. res
  74. }
  75. /// @brief 系统调用分发器,用于分发系统调用。
  76. ///
  77. /// 这个函数内,需要根据系统调用号,调用对应的系统调用处理函数。
  78. /// 并且,对于用户态传入的指针参数,需要在本函数内进行越界检查,防止访问到内核空间。
  79. #[inline(never)]
  80. pub fn handle(
  81. syscall_num: usize,
  82. args: &[usize],
  83. frame: &mut TrapFrame,
  84. ) -> Result<usize, SystemError> {
  85. // 首先尝试从syscall_table获取处理函数
  86. if let Some(handler) = syscall_table().get(syscall_num) {
  87. // 使用以下代码可以打印系统调用号和参数,方便调试
  88. // log::debug!(
  89. // "Syscall {} called with args {}",
  90. // handler.name,
  91. // handler.args_string(args)
  92. // );
  93. return handler.inner_handle.handle(args, frame);
  94. }
  95. // 如果找不到,fallback到原有逻辑
  96. let r = match syscall_num {
  97. SYS_PUT_STRING => {
  98. Self::put_string(args[0] as *const u8, args[1] as u32, args[2] as u32)
  99. }
  100. #[cfg(target_arch = "x86_64")]
  101. SYS_RENAME => {
  102. let oldname: *const u8 = args[0] as *const u8;
  103. let newname: *const u8 = args[1] as *const u8;
  104. Self::do_renameat2(
  105. AtFlags::AT_FDCWD.bits(),
  106. oldname,
  107. AtFlags::AT_FDCWD.bits(),
  108. newname,
  109. 0,
  110. )
  111. }
  112. #[cfg(target_arch = "x86_64")]
  113. SYS_FORK => ProcessManager::fork(frame, CloneFlags::empty()).map(|pid| pid.into()),
  114. #[cfg(target_arch = "x86_64")]
  115. SYS_VFORK => ProcessManager::fork(frame, CloneFlags::empty()).map(|pid| pid.into()),
  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_LSEEK => {
  140. let fd = args[0] as i32;
  141. let offset = args[1] as i64;
  142. let whence = args[2] as u32;
  143. Self::lseek(fd, offset, whence)
  144. }
  145. SYS_PREAD64 => {
  146. let fd = args[0] as i32;
  147. let buf_vaddr = args[1];
  148. let len = args[2];
  149. let offset = args[3];
  150. let mut user_buffer_writer =
  151. UserBufferWriter::new(buf_vaddr as *mut u8, len, frame.is_from_user())?;
  152. let buf = user_buffer_writer.buffer(0)?;
  153. Self::pread(fd, buf, len, offset)
  154. }
  155. SYS_PWRITE64 => {
  156. let fd = args[0] as i32;
  157. let buf_vaddr = args[1];
  158. let len = args[2];
  159. let offset = args[3];
  160. let user_buffer_reader =
  161. UserBufferReader::new(buf_vaddr as *const u8, len, frame.is_from_user())?;
  162. let buf = user_buffer_reader.read_from_user(0)?;
  163. Self::pwrite(fd, buf, len, offset)
  164. }
  165. SYS_SBRK => {
  166. let incr = args[0] as isize;
  167. crate::mm::syscall::sys_sbrk::sys_sbrk(incr)
  168. }
  169. SYS_REBOOT => {
  170. let magic1 = args[0] as u32;
  171. let magic2 = args[1] as u32;
  172. let cmd = args[2] as u32;
  173. let arg = args[3];
  174. Self::reboot(magic1, magic2, cmd, arg)
  175. }
  176. SYS_CHDIR => {
  177. let r = args[0] as *const u8;
  178. Self::chdir(r)
  179. }
  180. SYS_FCHDIR => {
  181. let fd = args[0] as i32;
  182. Self::fchdir(fd)
  183. }
  184. #[allow(unreachable_patterns)]
  185. SYS_GETDENTS64 | SYS_GETDENTS => {
  186. let fd = args[0] as i32;
  187. let buf_vaddr = args[1];
  188. let len = args[2];
  189. let virt_addr: VirtAddr = VirtAddr::new(buf_vaddr);
  190. // 判断缓冲区是否来自用户态,进行权限校验
  191. let res = if frame.is_from_user() && verify_area(virt_addr, len).is_err() {
  192. // 来自用户态,而buffer在内核态,这样的操作不被允许
  193. Err(SystemError::EPERM)
  194. } else if buf_vaddr == 0 {
  195. Err(SystemError::EFAULT)
  196. } else {
  197. let buf: &mut [u8] = unsafe {
  198. core::slice::from_raw_parts_mut::<'static, u8>(buf_vaddr as *mut u8, len)
  199. };
  200. Self::getdents(fd, buf)
  201. };
  202. res
  203. }
  204. #[cfg(target_arch = "x86_64")]
  205. SYS_MKDIR => {
  206. let path = args[0] as *const u8;
  207. let mode = args[1];
  208. Self::mkdir(path, mode)
  209. }
  210. SYS_MKDIRAT => {
  211. let dirfd = args[0] as i32;
  212. let path = args[1] as *const u8;
  213. let mode = args[2];
  214. Self::mkdir_at(dirfd, path, mode)
  215. }
  216. SYS_NANOSLEEP => {
  217. let req = args[0] as *const PosixTimeSpec;
  218. let rem = args[1] as *mut PosixTimeSpec;
  219. let virt_req = VirtAddr::new(req as usize);
  220. let virt_rem = VirtAddr::new(rem as usize);
  221. if frame.is_from_user()
  222. && (verify_area(virt_req, core::mem::size_of::<PosixTimeSpec>()).is_err()
  223. || verify_area(virt_rem, core::mem::size_of::<PosixTimeSpec>()).is_err())
  224. {
  225. Err(SystemError::EFAULT)
  226. } else {
  227. Self::nanosleep(req, rem)
  228. }
  229. }
  230. SYS_CLOCK => Self::clock(),
  231. SYS_UNLINKAT => {
  232. let dirfd = args[0] as i32;
  233. let path = args[1] as *const u8;
  234. let flags = args[2] as u32;
  235. Self::unlinkat(dirfd, path, flags)
  236. }
  237. #[cfg(target_arch = "x86_64")]
  238. SYS_SYMLINK => {
  239. let oldname = args[0] as *const u8;
  240. let newname = args[1] as *const u8;
  241. Self::symlink(oldname, newname)
  242. }
  243. SYS_SYMLINKAT => {
  244. let oldname = args[0] as *const u8;
  245. let newdfd = args[1] as i32;
  246. let newname = args[2] as *const u8;
  247. Self::symlinkat(oldname, newdfd, newname)
  248. }
  249. #[cfg(target_arch = "x86_64")]
  250. SYS_RMDIR => {
  251. let path = args[0] as *const u8;
  252. Self::rmdir(path)
  253. }
  254. #[cfg(target_arch = "x86_64")]
  255. SYS_LINK => {
  256. let old = args[0] as *const u8;
  257. let new = args[1] as *const u8;
  258. return Self::link(old, new);
  259. }
  260. SYS_LINKAT => {
  261. let oldfd = args[0] as i32;
  262. let old = args[1] as *const u8;
  263. let newfd = args[2] as i32;
  264. let new = args[3] as *const u8;
  265. let flags = args[4] as i32;
  266. return Self::linkat(oldfd, old, newfd, new, flags);
  267. }
  268. #[cfg(target_arch = "x86_64")]
  269. SYS_UNLINK => {
  270. let path = args[0] as *const u8;
  271. Self::unlink(path)
  272. }
  273. SYS_SCHED => {
  274. warn!("syscall sched");
  275. schedule(SchedMode::SM_NONE);
  276. Ok(0)
  277. }
  278. SYS_DUP => {
  279. let oldfd: i32 = args[0] as c_int;
  280. Self::dup(oldfd)
  281. }
  282. #[cfg(target_arch = "x86_64")]
  283. SYS_DUP2 => {
  284. let oldfd: i32 = args[0] as c_int;
  285. let newfd: i32 = args[1] as c_int;
  286. Self::dup2(oldfd, newfd)
  287. }
  288. SYS_DUP3 => {
  289. let oldfd: i32 = args[0] as c_int;
  290. let newfd: i32 = args[1] as c_int;
  291. let flags: u32 = args[2] as u32;
  292. Self::dup3(oldfd, newfd, flags)
  293. }
  294. SYS_SOCKET => Self::socket(args[0], args[1], args[2]),
  295. SYS_SETSOCKOPT => {
  296. let optval = args[3] as *const u8;
  297. let optlen = args[4];
  298. let virt_optval = VirtAddr::new(optval as usize);
  299. // 验证optval的地址是否合法
  300. if verify_area(virt_optval, optlen).is_err() {
  301. // 地址空间超出了用户空间的范围,不合法
  302. Err(SystemError::EFAULT)
  303. } else {
  304. let data: &[u8] = unsafe { core::slice::from_raw_parts(optval, optlen) };
  305. Self::setsockopt(args[0], args[1], args[2], data)
  306. }
  307. }
  308. SYS_GETSOCKOPT => {
  309. let optval = args[3] as *mut u8;
  310. let optlen = args[4] as *mut usize;
  311. let virt_optval = VirtAddr::new(optval as usize);
  312. let virt_optlen = VirtAddr::new(optlen as usize);
  313. let security_check = || {
  314. // 验证optval的地址是否合法
  315. if verify_area(virt_optval, PAGE_4K_SIZE).is_err() {
  316. // 地址空间超出了用户空间的范围,不合法
  317. return Err(SystemError::EFAULT);
  318. }
  319. // 验证optlen的地址是否合法
  320. if verify_area(virt_optlen, core::mem::size_of::<u32>()).is_err() {
  321. // 地址空间超出了用户空间的范围,不合法
  322. return Err(SystemError::EFAULT);
  323. }
  324. return Ok(());
  325. };
  326. let r = security_check();
  327. if let Err(e) = r {
  328. Err(e)
  329. } else {
  330. Self::getsockopt(args[0], args[1], args[2], optval, optlen as *mut u32)
  331. }
  332. }
  333. SYS_CONNECT => {
  334. let addr = args[1] as *const SockAddr;
  335. let addrlen = args[2];
  336. let virt_addr = VirtAddr::new(addr as usize);
  337. // 验证addr的地址是否合法
  338. if verify_area(virt_addr, addrlen).is_err() {
  339. // 地址空间超出了用户空间的范围,不合法
  340. Err(SystemError::EFAULT)
  341. } else {
  342. Self::connect(args[0], addr, addrlen)
  343. }
  344. }
  345. SYS_BIND => {
  346. let addr = args[1] as *const SockAddr;
  347. let addrlen = args[2];
  348. let virt_addr = VirtAddr::new(addr as usize);
  349. // 验证addr的地址是否合法
  350. if verify_area(virt_addr, addrlen).is_err() {
  351. // 地址空间超出了用户空间的范围,不合法
  352. Err(SystemError::EFAULT)
  353. } else {
  354. Self::bind(args[0], addr, addrlen)
  355. }
  356. }
  357. SYS_SENDTO => {
  358. let buf = args[1] as *const u8;
  359. let len = args[2];
  360. let flags = args[3] as u32;
  361. let addr = args[4] as *const SockAddr;
  362. let addrlen = args[5];
  363. let virt_buf = VirtAddr::new(buf as usize);
  364. let virt_addr = VirtAddr::new(addr as usize);
  365. // 验证buf的地址是否合法
  366. if verify_area(virt_buf, len).is_err() || verify_area(virt_addr, addrlen).is_err() {
  367. // 地址空间超出了用户空间的范围,不合法
  368. Err(SystemError::EFAULT)
  369. } else {
  370. let data: &[u8] = unsafe { core::slice::from_raw_parts(buf, len) };
  371. Self::sendto(args[0], data, flags, addr, addrlen)
  372. }
  373. }
  374. SYS_RECVFROM => {
  375. let buf = args[1] as *mut u8;
  376. let len = args[2];
  377. let flags = args[3] as u32;
  378. let addr = args[4] as *mut SockAddr;
  379. let addrlen = args[5] as *mut usize;
  380. let virt_buf = VirtAddr::new(buf as usize);
  381. let virt_addrlen = VirtAddr::new(addrlen as usize);
  382. let virt_addr = VirtAddr::new(addr as usize);
  383. let security_check = || {
  384. // 验证buf的地址是否合法
  385. if verify_area(virt_buf, len).is_err() {
  386. // 地址空间超出了用户空间的范围,不合法
  387. return Err(SystemError::EFAULT);
  388. }
  389. // 验证addrlen的地址是否合法
  390. if verify_area(virt_addrlen, core::mem::size_of::<u32>()).is_err() {
  391. // 地址空间超出了用户空间的范围,不合法
  392. return Err(SystemError::EFAULT);
  393. }
  394. if verify_area(virt_addr, core::mem::size_of::<SockAddr>()).is_err() {
  395. // 地址空间超出了用户空间的范围,不合法
  396. return Err(SystemError::EFAULT);
  397. }
  398. return Ok(());
  399. };
  400. let r = security_check();
  401. if let Err(e) = r {
  402. Err(e)
  403. } else {
  404. let buf = unsafe { core::slice::from_raw_parts_mut(buf, len) };
  405. Self::recvfrom(args[0], buf, flags, addr, addrlen as *mut u32)
  406. }
  407. }
  408. SYS_RECVMSG => {
  409. let msg = args[1] as *mut MsgHdr;
  410. let flags = args[2] as u32;
  411. let mut user_buffer_writer = UserBufferWriter::new(
  412. msg,
  413. core::mem::size_of::<MsgHdr>(),
  414. frame.is_from_user(),
  415. )?;
  416. let buffer = user_buffer_writer.buffer::<MsgHdr>(0)?;
  417. let msg = &mut buffer[0];
  418. Self::recvmsg(args[0], msg, flags)
  419. }
  420. SYS_LISTEN => Self::listen(args[0], args[1]),
  421. SYS_SHUTDOWN => Self::shutdown(args[0], args[1]),
  422. SYS_ACCEPT => Self::accept(args[0], args[1] as *mut SockAddr, args[2] as *mut u32),
  423. SYS_ACCEPT4 => Self::accept4(
  424. args[0],
  425. args[1] as *mut SockAddr,
  426. args[2] as *mut u32,
  427. args[3] as u32,
  428. ),
  429. SYS_GETSOCKNAME => {
  430. Self::getsockname(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  431. }
  432. SYS_GETPEERNAME => {
  433. Self::getpeername(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  434. }
  435. SYS_GETTIMEOFDAY => {
  436. let timeval = args[0] as *mut PosixTimeval;
  437. let timezone_ptr = args[1] as *mut PosixTimeZone;
  438. Self::gettimeofday(timeval, timezone_ptr)
  439. }
  440. SYS_GETCWD => {
  441. let buf = args[0] as *mut u8;
  442. let size = args[1];
  443. let security_check = || {
  444. verify_area(VirtAddr::new(buf as usize), size)?;
  445. return Ok(());
  446. };
  447. let r = security_check();
  448. if let Err(e) = r {
  449. Err(e)
  450. } else {
  451. let buf = unsafe { core::slice::from_raw_parts_mut(buf, size) };
  452. Self::getcwd(buf)
  453. }
  454. }
  455. SYS_FCNTL => {
  456. let fd = args[0] as i32;
  457. let cmd: Option<FcntlCommand> =
  458. <FcntlCommand as FromPrimitive>::from_u32(args[1] as u32);
  459. let arg = args[2] as i32;
  460. let res = if let Some(cmd) = cmd {
  461. Self::fcntl(fd, cmd, arg)
  462. } else {
  463. Err(SystemError::EINVAL)
  464. };
  465. // debug!("FCNTL: fd: {}, cmd: {:?}, arg: {}, res: {:?}", fd, cmd, arg, res);
  466. res
  467. }
  468. SYS_FTRUNCATE => {
  469. let fd = args[0] as i32;
  470. let len = args[1];
  471. let res = Self::ftruncate(fd, len);
  472. // debug!("FTRUNCATE: fd: {}, len: {}, res: {:?}", fd, len, res);
  473. res
  474. }
  475. #[cfg(target_arch = "x86_64")]
  476. SYS_MKNOD => {
  477. let path = args[0];
  478. let flags = args[1];
  479. let dev_t = args[2];
  480. let flags: ModeType = ModeType::from_bits_truncate(flags as u32);
  481. Self::mknod(
  482. path as *const u8,
  483. flags,
  484. crate::driver::base::device::device_number::DeviceNumber::from(dev_t as u32),
  485. )
  486. }
  487. SYS_FUTEX => {
  488. let uaddr = VirtAddr::new(args[0]);
  489. let operation = FutexFlag::from_bits(args[1] as u32).ok_or(SystemError::ENOSYS)?;
  490. let val = args[2] as u32;
  491. let utime = args[3];
  492. let uaddr2 = VirtAddr::new(args[4]);
  493. let val3 = args[5] as u32;
  494. let mut timespec = None;
  495. if utime != 0 && operation.contains(FutexFlag::FLAGS_HAS_TIMEOUT) {
  496. let reader = UserBufferReader::new(
  497. utime as *const PosixTimeSpec,
  498. core::mem::size_of::<PosixTimeSpec>(),
  499. true,
  500. )?;
  501. timespec = Some(*reader.read_one_from_user::<PosixTimeSpec>(0)?);
  502. }
  503. Self::do_futex(uaddr, operation, val, timespec, uaddr2, utime as u32, val3)
  504. }
  505. SYS_SET_ROBUST_LIST => {
  506. let head = args[0];
  507. let head_uaddr = VirtAddr::new(head);
  508. let len = args[1];
  509. let ret = Self::set_robust_list(head_uaddr, len);
  510. return ret;
  511. }
  512. SYS_GET_ROBUST_LIST => {
  513. let pid = args[0];
  514. let head = args[1];
  515. let head_uaddr = VirtAddr::new(head);
  516. let len_ptr = args[2];
  517. let len_ptr_uaddr = VirtAddr::new(len_ptr);
  518. let ret = Self::get_robust_list(pid, head_uaddr, len_ptr_uaddr);
  519. return ret;
  520. }
  521. SYS_STATFS => {
  522. let path = args[0] as *const u8;
  523. let statfs = args[1] as *mut PosixStatfs;
  524. Self::statfs(path, statfs)
  525. }
  526. SYS_FSTATFS => {
  527. let fd = args[0] as i32;
  528. let statfs = args[1] as *mut PosixStatfs;
  529. Self::fstatfs(fd, statfs)
  530. }
  531. SYS_STATX => Self::statx(
  532. args[0] as i32,
  533. args[1],
  534. args[2] as u32,
  535. args[3] as u32,
  536. args[4],
  537. ),
  538. // 目前为了适配musl-libc,以下系统调用先这样写着
  539. SYS_GETRANDOM => {
  540. let flags = GRandFlags::from_bits(args[2] as u8).ok_or(SystemError::EINVAL)?;
  541. Self::get_random(args[0] as *mut u8, args[1], flags)
  542. }
  543. SYS_SOCKETPAIR => {
  544. let mut user_buffer_writer = UserBufferWriter::new(
  545. args[3] as *mut c_int,
  546. core::mem::size_of::<[c_int; 2]>(),
  547. frame.is_from_user(),
  548. )?;
  549. let fds = user_buffer_writer.buffer::<i32>(0)?;
  550. Self::socketpair(args[0], args[1], args[2], fds)
  551. }
  552. #[cfg(target_arch = "x86_64")]
  553. SYS_POLL => {
  554. let fds = args[0];
  555. let nfds = args[1] as u32;
  556. let timeout = args[2] as i32;
  557. Self::poll(fds, nfds, timeout)
  558. }
  559. SYS_PPOLL => Self::ppoll(args[0], args[1] as u32, args[2], args[3]),
  560. SYS_TKILL => {
  561. warn!("SYS_TKILL has not yet been implemented");
  562. Ok(0)
  563. }
  564. SYS_SIGALTSTACK => {
  565. warn!("SYS_SIGALTSTACK has not yet been implemented");
  566. Ok(0)
  567. }
  568. SYS_SYSLOG => {
  569. let syslog_action_type = args[0];
  570. let buf_vaddr = args[1];
  571. let len = args[2];
  572. let from_user = frame.is_from_user();
  573. let mut user_buffer_writer =
  574. UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
  575. let user_buf = user_buffer_writer.buffer(0)?;
  576. Self::do_syslog(syslog_action_type, user_buf, len)
  577. }
  578. #[cfg(target_arch = "x86_64")]
  579. SYS_READLINK => {
  580. let path = args[0] as *const u8;
  581. let buf = args[1] as *mut u8;
  582. let bufsiz = args[2];
  583. Self::readlink(path, buf, bufsiz)
  584. }
  585. SYS_READLINKAT => {
  586. let dirfd = args[0] as i32;
  587. let path = args[1] as *const u8;
  588. let buf = args[2] as *mut u8;
  589. let bufsiz = args[3];
  590. Self::readlink_at(dirfd, path, buf, bufsiz)
  591. }
  592. #[cfg(target_arch = "x86_64")]
  593. SYS_ACCESS => {
  594. let pathname = args[0] as *const u8;
  595. let mode = args[1] as u32;
  596. Self::access(pathname, mode)
  597. }
  598. SYS_FACCESSAT => {
  599. let dirfd = args[0] as i32;
  600. let pathname = args[1] as *const u8;
  601. let mode = args[2] as u32;
  602. Self::faccessat2(dirfd, pathname, mode, 0)
  603. }
  604. SYS_FACCESSAT2 => {
  605. let dirfd = args[0] as i32;
  606. let pathname = args[1] as *const u8;
  607. let mode = args[2] as u32;
  608. let flags = args[3] as u32;
  609. Self::faccessat2(dirfd, pathname, mode, flags)
  610. }
  611. SYS_CLOCK_GETTIME => {
  612. let clockid = args[0] as i32;
  613. let timespec = args[1] as *mut PosixTimeSpec;
  614. Self::clock_gettime(clockid, timespec)
  615. }
  616. SYS_SYSINFO => {
  617. let info = args[0] as *mut SysInfo;
  618. Self::sysinfo(info)
  619. }
  620. SYS_UMASK => {
  621. let mask = args[0] as u32;
  622. Self::umask(mask)
  623. }
  624. SYS_FCHOWN => {
  625. let dirfd = args[0] as i32;
  626. let uid = args[1];
  627. let gid = args[2];
  628. Self::fchown(dirfd, uid, gid)
  629. }
  630. #[cfg(target_arch = "x86_64")]
  631. SYS_CHOWN => {
  632. let pathname = args[0] as *const u8;
  633. let uid = args[1];
  634. let gid = args[2];
  635. Self::chown(pathname, uid, gid)
  636. }
  637. #[cfg(target_arch = "x86_64")]
  638. SYS_LCHOWN => {
  639. let pathname = args[0] as *const u8;
  640. let uid = args[1];
  641. let gid = args[2];
  642. Self::lchown(pathname, uid, gid)
  643. }
  644. SYS_FCHOWNAT => {
  645. let dirfd = args[0] as i32;
  646. let pathname = args[1] as *const u8;
  647. let uid = args[2];
  648. let gid = args[3];
  649. let flag = args[4] as i32;
  650. Self::fchownat(dirfd, pathname, uid, gid, flag)
  651. }
  652. SYS_FSYNC => {
  653. warn!("SYS_FSYNC has not yet been implemented");
  654. Ok(0)
  655. }
  656. SYS_RSEQ => {
  657. warn!("SYS_RSEQ has not yet been implemented");
  658. Err(SystemError::ENOSYS)
  659. }
  660. #[cfg(target_arch = "x86_64")]
  661. SYS_CHMOD => {
  662. let pathname = args[0] as *const u8;
  663. let mode = args[1] as u32;
  664. Self::chmod(pathname, mode)
  665. }
  666. SYS_FCHMOD => {
  667. let fd = args[0] as i32;
  668. let mode = args[1] as u32;
  669. Self::fchmod(fd, mode)
  670. }
  671. SYS_FCHMODAT => {
  672. let dirfd = args[0] as i32;
  673. let pathname = args[1] as *const u8;
  674. let mode = args[2] as u32;
  675. Self::fchmodat(dirfd, pathname, mode)
  676. }
  677. SYS_SCHED_YIELD => Self::do_sched_yield(),
  678. SYS_SCHED_GETAFFINITY => {
  679. let pid = args[0] as i32;
  680. let size = args[1];
  681. let set_vaddr = args[2];
  682. let mut user_buffer_writer =
  683. UserBufferWriter::new(set_vaddr as *mut u8, size, frame.is_from_user())?;
  684. let set: &mut [u8] = user_buffer_writer.buffer(0)?;
  685. Self::getaffinity(pid, set)
  686. }
  687. SYS_FADVISE64 => {
  688. // todo: 这个系统调用还没有实现
  689. Err(SystemError::ENOSYS)
  690. }
  691. SYS_MOUNT => {
  692. let source = args[0] as *const u8;
  693. let target = args[1] as *const u8;
  694. let filesystemtype = args[2] as *const u8;
  695. let mountflags = args[3];
  696. let data = args[4] as *const u8; // 额外的mount参数,实现自己的mountdata来获取
  697. return Self::mount(source, target, filesystemtype, mountflags, data);
  698. }
  699. SYS_UMOUNT2 => {
  700. let target = args[0] as *const u8;
  701. let flags = args[1] as i32;
  702. Self::umount2(target, flags)?;
  703. return Ok(0);
  704. }
  705. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  706. SYS_NEWFSTATAT => Self::newfstatat(args[0] as i32, args[1], args[2], args[3] as u32),
  707. // SYS_SCHED_YIELD => Self::sched_yield(),
  708. SYS_PRCTL => {
  709. // todo: 这个系统调用还没有实现
  710. Err(SystemError::EINVAL)
  711. }
  712. #[cfg(target_arch = "x86_64")]
  713. SYS_ALARM => {
  714. let second = args[0] as u32;
  715. Self::alarm(second)
  716. }
  717. SYS_UTIMENSAT => Self::sys_utimensat(
  718. args[0] as i32,
  719. args[1] as *const u8,
  720. args[2] as *const PosixTimeSpec,
  721. args[3] as u32,
  722. ),
  723. #[cfg(target_arch = "x86_64")]
  724. SYS_FUTIMESAT => {
  725. let flags = UtimensFlags::empty();
  726. Self::sys_utimensat(
  727. args[0] as i32,
  728. args[1] as *const u8,
  729. args[2] as *const PosixTimeSpec,
  730. flags.bits(),
  731. )
  732. }
  733. #[cfg(target_arch = "x86_64")]
  734. SYS_UTIMES => Self::sys_utimes(args[0] as *const u8, args[1] as *const PosixTimeval),
  735. #[cfg(target_arch = "x86_64")]
  736. SYS_EVENTFD => {
  737. let initval = args[0] as u32;
  738. Self::sys_eventfd(initval, 0)
  739. }
  740. SYS_EVENTFD2 => {
  741. let initval = args[0] as u32;
  742. let flags = args[1] as u32;
  743. Self::sys_eventfd(initval, flags)
  744. }
  745. SYS_BPF => {
  746. let cmd = args[0] as u32;
  747. let attr = args[1] as *mut u8;
  748. let size = args[2] as u32;
  749. Self::sys_bpf(cmd, attr, size)
  750. }
  751. SYS_PERF_EVENT_OPEN => {
  752. let attr = args[0] as *const u8;
  753. let pid = args[1] as i32;
  754. let cpu = args[2] as i32;
  755. let group_fd = args[3] as i32;
  756. let flags = args[4] as u32;
  757. Self::sys_perf_event_open(attr, pid, cpu, group_fd, flags)
  758. }
  759. #[cfg(any(target_arch = "x86_64", target_arch = "riscv64"))]
  760. SYS_SETRLIMIT => Ok(0),
  761. SYS_RT_SIGTIMEDWAIT => {
  762. log::warn!("SYS_RT_SIGTIMEDWAIT has not yet been implemented");
  763. Ok(0)
  764. }
  765. _ => panic!("Unsupported syscall ID: {}", syscall_num),
  766. };
  767. if ProcessManager::current_pcb()
  768. .flags()
  769. .contains(ProcessFlags::NEED_SCHEDULE)
  770. {
  771. schedule(SchedMode::SM_PREEMPT);
  772. }
  773. return r;
  774. }
  775. pub fn put_string(
  776. s: *const u8,
  777. front_color: u32,
  778. back_color: u32,
  779. ) -> Result<usize, SystemError> {
  780. // todo: 删除这个系统调用
  781. let s = check_and_clone_cstr(s, Some(4096))?
  782. .into_string()
  783. .map_err(|_| SystemError::EINVAL)?;
  784. let fr = (front_color & 0x00ff0000) >> 16;
  785. let fg = (front_color & 0x0000ff00) >> 8;
  786. let fb = front_color & 0x000000ff;
  787. let br = (back_color & 0x00ff0000) >> 16;
  788. let bg = (back_color & 0x0000ff00) >> 8;
  789. let bb = back_color & 0x000000ff;
  790. print!("\x1B[38;2;{fr};{fg};{fb};48;2;{br};{bg};{bb}m{s}\x1B[0m");
  791. return Ok(s.len());
  792. }
  793. }
  794. #[inline(never)]
  795. pub fn syscall_init() -> Result<(), SystemError> {
  796. syscall_table_init()?;
  797. Ok(())
  798. }