mod.rs 42 KB

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