mod.rs 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237
  1. use core::{
  2. ffi::{c_int, c_void},
  3. sync::atomic::{AtomicBool, Ordering},
  4. };
  5. use crate::{
  6. arch::{ipc::signal::SigSet, syscall::nr::*},
  7. filesystem::vfs::syscall::{PosixStatfs, PosixStatx},
  8. ipc::shm::{ShmCtlCmd, ShmFlags, ShmId, ShmKey},
  9. libs::{futex::constant::FutexFlag, rand::GRandFlags},
  10. mm::{page::PAGE_4K_SIZE, syscall::MremapFlags},
  11. net::syscall::MsgHdr,
  12. process::{
  13. fork::KernelCloneArgs,
  14. resource::{RLimit64, RUsage},
  15. ProcessFlags, ProcessManager,
  16. },
  17. sched::{schedule, SchedMode},
  18. syscall::user_access::check_and_clone_cstr,
  19. };
  20. use log::{info, warn};
  21. use num_traits::FromPrimitive;
  22. use system_error::SystemError;
  23. use crate::{
  24. arch::{cpu::cpu_reset, interrupt::TrapFrame, MMArch},
  25. filesystem::vfs::{
  26. fcntl::{AtFlags, FcntlCommand},
  27. file::FileMode,
  28. syscall::{ModeType, PosixKstat, UtimensFlags},
  29. MAX_PATHLEN,
  30. },
  31. libs::align::page_align_up,
  32. mm::{verify_area, MemoryManagementArch, VirtAddr},
  33. net::syscall::SockAddr,
  34. process::{fork::CloneFlags, syscall::PosixOldUtsName, Pid},
  35. time::{
  36. syscall::{PosixTimeZone, PosixTimeval},
  37. PosixTimeSpec,
  38. },
  39. };
  40. use self::{
  41. misc::SysInfo,
  42. user_access::{UserBufferReader, UserBufferWriter},
  43. };
  44. pub mod misc;
  45. pub mod user_access;
  46. // 与linux不一致的调用,在linux基础上累加
  47. pub const SYS_PUT_STRING: usize = 100000;
  48. pub const SYS_SBRK: usize = 100001;
  49. /// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!! 删的时候记得改C版本的libc
  50. pub const SYS_CLOCK: usize = 100002;
  51. pub const SYS_SCHED: usize = 100003;
  52. #[derive(Debug)]
  53. pub struct Syscall;
  54. impl Syscall {
  55. /// 初始化系统调用
  56. #[inline(never)]
  57. pub fn init() -> Result<(), SystemError> {
  58. static INIT_FLAG: AtomicBool = AtomicBool::new(false);
  59. let prev = INIT_FLAG.swap(true, Ordering::SeqCst);
  60. if prev {
  61. panic!("Cannot initialize syscall more than once!");
  62. }
  63. info!("Initializing syscall...");
  64. let r = crate::arch::syscall::arch_syscall_init();
  65. info!("Syscall init successfully!");
  66. return r;
  67. }
  68. /// @brief 系统调用分发器,用于分发系统调用。
  69. ///
  70. /// 这个函数内,需要根据系统调用号,调用对应的系统调用处理函数。
  71. /// 并且,对于用户态传入的指针参数,需要在本函数内进行越界检查,防止访问到内核空间。
  72. #[inline(never)]
  73. pub fn handle(
  74. syscall_num: usize,
  75. args: &[usize],
  76. frame: &mut TrapFrame,
  77. ) -> Result<usize, SystemError> {
  78. let r = match syscall_num {
  79. SYS_PUT_STRING => {
  80. Self::put_string(args[0] as *const u8, args[1] as u32, args[2] as u32)
  81. }
  82. #[cfg(target_arch = "x86_64")]
  83. SYS_OPEN => {
  84. let path = args[0] as *const u8;
  85. let flags = args[1] as u32;
  86. let mode = args[2] as u32;
  87. Self::open(path, flags, mode, true)
  88. }
  89. #[cfg(target_arch = "x86_64")]
  90. SYS_RENAME => {
  91. let oldname: *const u8 = args[0] as *const u8;
  92. let newname: *const u8 = args[1] as *const u8;
  93. Self::do_renameat2(
  94. AtFlags::AT_FDCWD.bits(),
  95. oldname,
  96. AtFlags::AT_FDCWD.bits(),
  97. newname,
  98. 0,
  99. )
  100. }
  101. #[cfg(target_arch = "x86_64")]
  102. SYS_RENAMEAT => {
  103. let oldfd = args[0] as i32;
  104. let oldname: *const u8 = args[1] as *const u8;
  105. let newfd = args[2] as i32;
  106. let newname: *const u8 = args[3] as *const u8;
  107. Self::do_renameat2(oldfd, oldname, newfd, newname, 0)
  108. }
  109. SYS_RENAMEAT2 => {
  110. let oldfd = args[0] as i32;
  111. let oldname: *const u8 = args[1] as *const u8;
  112. let newfd = args[2] as i32;
  113. let newname: *const u8 = args[3] as *const u8;
  114. let flags = args[4] as u32;
  115. Self::do_renameat2(oldfd, oldname, newfd, newname, flags)
  116. }
  117. SYS_OPENAT => {
  118. let dirfd = args[0] as i32;
  119. let path = args[1] as *const u8;
  120. let flags = args[2] as u32;
  121. let mode = args[3] as u32;
  122. Self::openat(dirfd, path, flags, mode, true)
  123. }
  124. SYS_CLOSE => {
  125. let fd = args[0];
  126. Self::close(fd)
  127. }
  128. SYS_READ => {
  129. let fd = args[0] as i32;
  130. let buf_vaddr = args[1];
  131. let len = args[2];
  132. let from_user = frame.is_from_user();
  133. let mut user_buffer_writer =
  134. UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
  135. let user_buf = user_buffer_writer.buffer(0)?;
  136. Self::read(fd, user_buf)
  137. }
  138. SYS_WRITE => {
  139. let fd = args[0] as i32;
  140. let buf_vaddr = args[1];
  141. let len = args[2];
  142. let from_user = frame.is_from_user();
  143. let user_buffer_reader =
  144. UserBufferReader::new(buf_vaddr as *const u8, len, from_user)?;
  145. let user_buf = user_buffer_reader.read_from_user(0)?;
  146. Self::write(fd, user_buf)
  147. }
  148. SYS_LSEEK => {
  149. let fd = args[0] as i32;
  150. let offset = args[1] as i64;
  151. let whence = args[2] as u32;
  152. Self::lseek(fd, offset, whence)
  153. }
  154. SYS_PREAD64 => {
  155. let fd = args[0] as i32;
  156. let buf_vaddr = args[1];
  157. let len = args[2];
  158. let offset = args[3];
  159. let mut user_buffer_writer =
  160. UserBufferWriter::new(buf_vaddr as *mut u8, len, frame.is_from_user())?;
  161. let buf = user_buffer_writer.buffer(0)?;
  162. Self::pread(fd, buf, len, offset)
  163. }
  164. SYS_PWRITE64 => {
  165. let fd = args[0] as i32;
  166. let buf_vaddr = args[1];
  167. let len = args[2];
  168. let offset = args[3];
  169. let user_buffer_reader =
  170. UserBufferReader::new(buf_vaddr as *const u8, len, frame.is_from_user())?;
  171. let buf = user_buffer_reader.read_from_user(0)?;
  172. Self::pwrite(fd, buf, len, offset)
  173. }
  174. SYS_IOCTL => {
  175. let fd = args[0];
  176. let cmd = args[1];
  177. let data = args[2];
  178. Self::ioctl(fd, cmd as u32, data)
  179. }
  180. #[cfg(target_arch = "x86_64")]
  181. SYS_FORK => Self::fork(frame),
  182. #[cfg(target_arch = "x86_64")]
  183. SYS_VFORK => Self::vfork(frame),
  184. SYS_BRK => {
  185. let new_brk = VirtAddr::new(args[0]);
  186. Self::brk(new_brk).map(|vaddr| vaddr.data())
  187. }
  188. SYS_SBRK => {
  189. let increment = args[0] as isize;
  190. Self::sbrk(increment).map(|vaddr: VirtAddr| vaddr.data())
  191. }
  192. SYS_REBOOT => Self::reboot(),
  193. SYS_CHDIR => {
  194. let r = args[0] as *const u8;
  195. Self::chdir(r)
  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.into(), 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 = Pid::new(args[0]);
  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(|pid| pid.into()),
  582. SYS_GETPPID => Self::getppid().map(|pid| pid.into()),
  583. SYS_FSTAT => {
  584. let fd = args[0] as i32;
  585. let kstat: *mut PosixKstat = args[1] as *mut PosixKstat;
  586. let vaddr = VirtAddr::new(kstat as usize);
  587. // FIXME 由于c中的verify_area与rust中的verify_area重名,所以在引入时加了前缀区分
  588. // TODO 应该将用了c版本的verify_area都改为rust的verify_area
  589. match verify_area(vaddr, core::mem::size_of::<PosixKstat>()) {
  590. Ok(_) => Self::fstat(fd, kstat),
  591. Err(e) => Err(e),
  592. }
  593. }
  594. SYS_FCNTL => {
  595. let fd = args[0] as i32;
  596. let cmd: Option<FcntlCommand> =
  597. <FcntlCommand as FromPrimitive>::from_u32(args[1] as u32);
  598. let arg = args[2] as i32;
  599. let res = if let Some(cmd) = cmd {
  600. Self::fcntl(fd, cmd, arg)
  601. } else {
  602. Err(SystemError::EINVAL)
  603. };
  604. // debug!("FCNTL: fd: {}, cmd: {:?}, arg: {}, res: {:?}", fd, cmd, arg, res);
  605. res
  606. }
  607. SYS_FTRUNCATE => {
  608. let fd = args[0] as i32;
  609. let len = args[1];
  610. let res = Self::ftruncate(fd, len);
  611. // debug!("FTRUNCATE: fd: {}, len: {}, res: {:?}", fd, len, res);
  612. res
  613. }
  614. #[cfg(target_arch = "x86_64")]
  615. SYS_MKNOD => {
  616. let path = args[0];
  617. let flags = args[1];
  618. let dev_t = args[2];
  619. let flags: ModeType = ModeType::from_bits_truncate(flags as u32);
  620. Self::mknod(
  621. path as *const u8,
  622. flags,
  623. crate::driver::base::device::device_number::DeviceNumber::from(dev_t as u32),
  624. )
  625. }
  626. SYS_CLONE => {
  627. let parent_tid = VirtAddr::new(args[2]);
  628. let child_tid = VirtAddr::new(args[3]);
  629. // 地址校验
  630. verify_area(parent_tid, core::mem::size_of::<i32>())?;
  631. verify_area(child_tid, core::mem::size_of::<i32>())?;
  632. let mut clone_args = KernelCloneArgs::new();
  633. clone_args.flags = CloneFlags::from_bits_truncate(args[0] as u64);
  634. clone_args.stack = args[1];
  635. clone_args.parent_tid = parent_tid;
  636. clone_args.child_tid = child_tid;
  637. clone_args.tls = args[4];
  638. Self::clone(frame, clone_args)
  639. }
  640. SYS_FUTEX => {
  641. let uaddr = VirtAddr::new(args[0]);
  642. let operation = FutexFlag::from_bits(args[1] as u32).ok_or(SystemError::ENOSYS)?;
  643. let val = args[2] as u32;
  644. let utime = args[3];
  645. let uaddr2 = VirtAddr::new(args[4]);
  646. let val3 = args[5] as u32;
  647. let mut timespec = None;
  648. if utime != 0 && operation.contains(FutexFlag::FLAGS_HAS_TIMEOUT) {
  649. let reader = UserBufferReader::new(
  650. utime as *const PosixTimeSpec,
  651. core::mem::size_of::<PosixTimeSpec>(),
  652. true,
  653. )?;
  654. timespec = Some(*reader.read_one_from_user::<PosixTimeSpec>(0)?);
  655. }
  656. Self::do_futex(uaddr, operation, val, timespec, uaddr2, utime as u32, val3)
  657. }
  658. SYS_SET_ROBUST_LIST => {
  659. let head = args[0];
  660. let head_uaddr = VirtAddr::new(head);
  661. let len = args[1];
  662. let ret = Self::set_robust_list(head_uaddr, len);
  663. return ret;
  664. }
  665. SYS_GET_ROBUST_LIST => {
  666. let pid = args[0];
  667. let head = args[1];
  668. let head_uaddr = VirtAddr::new(head);
  669. let len_ptr = args[2];
  670. let len_ptr_uaddr = VirtAddr::new(len_ptr);
  671. let ret = Self::get_robust_list(pid, head_uaddr, len_ptr_uaddr);
  672. return ret;
  673. }
  674. SYS_READV => Self::readv(args[0] as i32, args[1], args[2]),
  675. SYS_WRITEV => Self::writev(args[0] as i32, args[1], args[2]),
  676. SYS_SET_TID_ADDRESS => Self::set_tid_address(args[0]),
  677. #[cfg(target_arch = "x86_64")]
  678. SYS_LSTAT => {
  679. let path = args[0] as *const u8;
  680. let kstat = args[1] as *mut PosixKstat;
  681. Self::lstat(path, kstat)
  682. }
  683. #[cfg(target_arch = "x86_64")]
  684. SYS_STAT => {
  685. let path = args[0] as *const u8;
  686. let kstat = args[1] as *mut PosixKstat;
  687. Self::stat(path, kstat)
  688. }
  689. SYS_STATFS => {
  690. let path = args[0] as *const u8;
  691. let statfs = args[1] as *mut PosixStatfs;
  692. Self::statfs(path, statfs)
  693. }
  694. SYS_FSTATFS => {
  695. let fd = args[0] as i32;
  696. let statfs = args[1] as *mut PosixStatfs;
  697. Self::fstatfs(fd, statfs)
  698. }
  699. SYS_STATX => {
  700. let fd = args[0] as i32;
  701. let path = args[1] as *const u8;
  702. let flags = args[2] as u32;
  703. let mask = args[3] as u32;
  704. let kstat = args[4] as *mut PosixStatx;
  705. Self::do_statx(fd, path, flags, mask, kstat)
  706. }
  707. #[cfg(target_arch = "x86_64")]
  708. SYS_EPOLL_CREATE => Self::epoll_create(args[0] as i32),
  709. SYS_EPOLL_CREATE1 => Self::epoll_create1(args[0]),
  710. SYS_EPOLL_CTL => Self::epoll_ctl(
  711. args[0] as i32,
  712. args[1],
  713. args[2] as i32,
  714. VirtAddr::new(args[3]),
  715. ),
  716. #[cfg(target_arch = "x86_64")]
  717. SYS_EPOLL_WAIT => Self::epoll_wait(
  718. args[0] as i32,
  719. VirtAddr::new(args[1]),
  720. args[2] as i32,
  721. args[3] as i32,
  722. ),
  723. SYS_EPOLL_PWAIT => {
  724. let epfd = args[0] as i32;
  725. let epoll_event = VirtAddr::new(args[1]);
  726. let max_events = args[2] as i32;
  727. let timespec = args[3] as i32;
  728. let sigmask_addr = args[4] as *mut SigSet;
  729. if sigmask_addr.is_null() {
  730. return Self::epoll_wait(epfd, epoll_event, max_events, timespec);
  731. }
  732. let sigmask_reader =
  733. UserBufferReader::new(sigmask_addr, core::mem::size_of::<SigSet>(), true)?;
  734. let mut sigmask = *sigmask_reader.read_one_from_user::<SigSet>(0)?;
  735. Self::epoll_pwait(
  736. args[0] as i32,
  737. VirtAddr::new(args[1]),
  738. args[2] as i32,
  739. args[3] as i32,
  740. &mut sigmask,
  741. )
  742. }
  743. // 目前为了适配musl-libc,以下系统调用先这样写着
  744. SYS_GETRANDOM => {
  745. let flags = GRandFlags::from_bits(args[2] as u8).ok_or(SystemError::EINVAL)?;
  746. Self::get_random(args[0] as *mut u8, args[1], flags)
  747. }
  748. SYS_SOCKETPAIR => {
  749. let mut user_buffer_writer = UserBufferWriter::new(
  750. args[3] as *mut c_int,
  751. core::mem::size_of::<[c_int; 2]>(),
  752. frame.is_from_user(),
  753. )?;
  754. let fds = user_buffer_writer.buffer::<i32>(0)?;
  755. Self::socketpair(args[0], args[1], args[2], fds)
  756. }
  757. #[cfg(target_arch = "x86_64")]
  758. SYS_POLL => {
  759. warn!("SYS_POLL has not yet been implemented");
  760. Ok(0)
  761. }
  762. SYS_SETPGID => {
  763. warn!("SYS_SETPGID has not yet been implemented");
  764. Ok(0)
  765. }
  766. SYS_RT_SIGPROCMASK => {
  767. warn!("SYS_RT_SIGPROCMASK has not yet been implemented");
  768. Ok(0)
  769. }
  770. SYS_TKILL => {
  771. warn!("SYS_TKILL has not yet been implemented");
  772. Ok(0)
  773. }
  774. SYS_SIGALTSTACK => {
  775. warn!("SYS_SIGALTSTACK has not yet been implemented");
  776. Ok(0)
  777. }
  778. SYS_EXIT_GROUP => {
  779. warn!("SYS_EXIT_GROUP has not yet been implemented");
  780. Ok(0)
  781. }
  782. SYS_MADVISE => {
  783. let addr = args[0];
  784. let len = page_align_up(args[1]);
  785. if addr & (MMArch::PAGE_SIZE - 1) != 0 {
  786. Err(SystemError::EINVAL)
  787. } else {
  788. Self::madvise(VirtAddr::new(addr), len, args[2])
  789. }
  790. }
  791. SYS_GETTID => Self::gettid().map(|tid| tid.into()),
  792. SYS_SYSLOG => {
  793. let syslog_action_type = args[0];
  794. let buf_vaddr = args[1];
  795. let len = args[2];
  796. let from_user = frame.is_from_user();
  797. let mut user_buffer_writer =
  798. UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
  799. let user_buf = user_buffer_writer.buffer(0)?;
  800. Self::do_syslog(syslog_action_type, user_buf, len)
  801. }
  802. SYS_GETUID => Self::getuid(),
  803. SYS_GETGID => Self::getgid(),
  804. SYS_SETUID => Self::setuid(args[0]),
  805. SYS_SETGID => Self::setgid(args[0]),
  806. SYS_GETEUID => Self::geteuid(),
  807. SYS_GETEGID => Self::getegid(),
  808. SYS_SETRESUID => Self::seteuid(args[1]),
  809. SYS_SETRESGID => Self::setegid(args[1]),
  810. SYS_SETFSUID => Self::setfsuid(args[0]),
  811. SYS_SETFSGID => Self::setfsgid(args[0]),
  812. SYS_SETSID => {
  813. warn!("SYS_SETSID has not yet been implemented");
  814. Ok(0)
  815. }
  816. SYS_GETRUSAGE => {
  817. let who = args[0] as c_int;
  818. let rusage = args[1] as *mut RUsage;
  819. Self::get_rusage(who, rusage)
  820. }
  821. #[cfg(target_arch = "x86_64")]
  822. SYS_READLINK => {
  823. let path = args[0] as *const u8;
  824. let buf = args[1] as *mut u8;
  825. let bufsiz = args[2];
  826. Self::readlink(path, buf, bufsiz)
  827. }
  828. SYS_READLINKAT => {
  829. let dirfd = args[0] as i32;
  830. let path = args[1] as *const u8;
  831. let buf = args[2] as *mut u8;
  832. let bufsiz = args[3];
  833. Self::readlink_at(dirfd, path, buf, bufsiz)
  834. }
  835. SYS_PRLIMIT64 => {
  836. let pid = args[0];
  837. let pid = Pid::new(pid);
  838. let resource = args[1];
  839. let new_limit = args[2] as *const RLimit64;
  840. let old_limit = args[3] as *mut RLimit64;
  841. Self::prlimit64(pid, resource, new_limit, old_limit)
  842. }
  843. #[cfg(target_arch = "x86_64")]
  844. SYS_ACCESS => {
  845. let pathname = args[0] as *const u8;
  846. let mode = args[1] as u32;
  847. Self::access(pathname, mode)
  848. }
  849. SYS_FACCESSAT => {
  850. let dirfd = args[0] as i32;
  851. let pathname = args[1] as *const u8;
  852. let mode = args[2] as u32;
  853. Self::faccessat2(dirfd, pathname, mode, 0)
  854. }
  855. SYS_FACCESSAT2 => {
  856. let dirfd = args[0] as i32;
  857. let pathname = args[1] as *const u8;
  858. let mode = args[2] as u32;
  859. let flags = args[3] as u32;
  860. Self::faccessat2(dirfd, pathname, mode, flags)
  861. }
  862. SYS_CLOCK_GETTIME => {
  863. let clockid = args[0] as i32;
  864. let timespec = args[1] as *mut PosixTimeSpec;
  865. Self::clock_gettime(clockid, timespec)
  866. }
  867. SYS_SYSINFO => {
  868. let info = args[0] as *mut SysInfo;
  869. Self::sysinfo(info)
  870. }
  871. SYS_UMASK => {
  872. let mask = args[0] as u32;
  873. Self::umask(mask)
  874. }
  875. SYS_FCHOWN => {
  876. let dirfd = args[0] as i32;
  877. let uid = args[1];
  878. let gid = args[2];
  879. Self::fchown(dirfd, uid, gid)
  880. }
  881. #[cfg(target_arch = "x86_64")]
  882. SYS_CHOWN => {
  883. let pathname = args[0] as *const u8;
  884. let uid = args[1];
  885. let gid = args[2];
  886. Self::chown(pathname, uid, gid)
  887. }
  888. #[cfg(target_arch = "x86_64")]
  889. SYS_LCHOWN => {
  890. let pathname = args[0] as *const u8;
  891. let uid = args[1];
  892. let gid = args[2];
  893. Self::lchown(pathname, uid, gid)
  894. }
  895. SYS_FCHOWNAT => {
  896. let dirfd = args[0] as i32;
  897. let pathname = args[1] as *const u8;
  898. let uid = args[2];
  899. let gid = args[3];
  900. let flag = args[4] as i32;
  901. Self::fchownat(dirfd, pathname, uid, gid, flag)
  902. }
  903. SYS_FSYNC => {
  904. warn!("SYS_FSYNC has not yet been implemented");
  905. Ok(0)
  906. }
  907. SYS_RSEQ => {
  908. warn!("SYS_RSEQ has not yet been implemented");
  909. Ok(0)
  910. }
  911. #[cfg(target_arch = "x86_64")]
  912. SYS_CHMOD => {
  913. let pathname = args[0] as *const u8;
  914. let mode = args[1] as u32;
  915. Self::chmod(pathname, mode)
  916. }
  917. SYS_FCHMOD => {
  918. let fd = args[0] as i32;
  919. let mode = args[1] as u32;
  920. Self::fchmod(fd, mode)
  921. }
  922. SYS_FCHMODAT => {
  923. let dirfd = args[0] as i32;
  924. let pathname = args[1] as *const u8;
  925. let mode = args[2] as u32;
  926. Self::fchmodat(dirfd, pathname, mode)
  927. }
  928. SYS_SCHED_YIELD => Self::do_sched_yield(),
  929. SYS_SCHED_GETAFFINITY => {
  930. let pid = args[0] as i32;
  931. let size = args[1];
  932. let set_vaddr = args[2];
  933. let mut user_buffer_writer =
  934. UserBufferWriter::new(set_vaddr as *mut u8, size, frame.is_from_user())?;
  935. let set: &mut [u8] = user_buffer_writer.buffer(0)?;
  936. Self::getaffinity(pid, set)
  937. }
  938. #[cfg(target_arch = "x86_64")]
  939. SYS_GETRLIMIT => {
  940. let resource = args[0];
  941. let rlimit = args[1] as *mut RLimit64;
  942. Self::prlimit64(
  943. ProcessManager::current_pcb().pid(),
  944. resource,
  945. core::ptr::null::<RLimit64>(),
  946. rlimit,
  947. )
  948. }
  949. SYS_FADVISE64 => {
  950. // todo: 这个系统调用还没有实现
  951. Err(SystemError::ENOSYS)
  952. }
  953. SYS_MOUNT => {
  954. let source = args[0] as *const u8;
  955. let target = args[1] as *const u8;
  956. let filesystemtype = args[2] as *const u8;
  957. let mountflags = args[3];
  958. let data = args[4] as *const u8; // 额外的mount参数,实现自己的mountdata来获取
  959. return Self::mount(source, target, filesystemtype, mountflags, data);
  960. }
  961. SYS_UMOUNT2 => {
  962. let target = args[0] as *const u8;
  963. let flags = args[1] as i32;
  964. Self::umount2(target, flags)?;
  965. return Ok(0);
  966. }
  967. SYS_NEWFSTATAT => {
  968. // todo: 这个系统调用还没有实现
  969. Err(SystemError::ENOSYS)
  970. }
  971. // SYS_SCHED_YIELD => Self::sched_yield(),
  972. SYS_UNAME => {
  973. let name = args[0] as *mut PosixOldUtsName;
  974. Self::uname(name)
  975. }
  976. SYS_PRCTL => {
  977. // todo: 这个系统调用还没有实现
  978. Err(SystemError::EINVAL)
  979. }
  980. #[cfg(target_arch = "x86_64")]
  981. SYS_ALARM => {
  982. let second = args[0] as u32;
  983. Self::alarm(second)
  984. }
  985. SYS_SHMGET => {
  986. let key = ShmKey::new(args[0]);
  987. let size = args[1];
  988. let shmflg = ShmFlags::from_bits_truncate(args[2] as u32);
  989. Self::shmget(key, size, shmflg)
  990. }
  991. SYS_SHMAT => {
  992. let id = ShmId::new(args[0]);
  993. let vaddr = VirtAddr::new(args[1]);
  994. let shmflg = ShmFlags::from_bits_truncate(args[2] as u32);
  995. Self::shmat(id, vaddr, shmflg)
  996. }
  997. SYS_SHMDT => {
  998. let vaddr = VirtAddr::new(args[0]);
  999. Self::shmdt(vaddr)
  1000. }
  1001. SYS_SHMCTL => {
  1002. let id = ShmId::new(args[0]);
  1003. let cmd = ShmCtlCmd::from(args[1]);
  1004. let user_buf = args[2] as *const u8;
  1005. let from_user = frame.is_from_user();
  1006. Self::shmctl(id, cmd, user_buf, from_user)
  1007. }
  1008. SYS_MSYNC => {
  1009. let start = page_align_up(args[0]);
  1010. let len = page_align_up(args[1]);
  1011. let flags = args[2];
  1012. Self::msync(VirtAddr::new(start), len, flags)
  1013. }
  1014. SYS_UTIMENSAT => Self::sys_utimensat(
  1015. args[0] as i32,
  1016. args[1] as *const u8,
  1017. args[2] as *const PosixTimeSpec,
  1018. args[3] as u32,
  1019. ),
  1020. #[cfg(target_arch = "x86_64")]
  1021. SYS_FUTIMESAT => {
  1022. let flags = UtimensFlags::empty();
  1023. Self::sys_utimensat(
  1024. args[0] as i32,
  1025. args[1] as *const u8,
  1026. args[2] as *const PosixTimeSpec,
  1027. flags.bits(),
  1028. )
  1029. }
  1030. #[cfg(target_arch = "x86_64")]
  1031. SYS_UTIMES => Self::sys_utimes(args[0] as *const u8, args[1] as *const PosixTimeval),
  1032. #[cfg(target_arch = "x86_64")]
  1033. SYS_EVENTFD => {
  1034. let initval = args[0] as u32;
  1035. Self::sys_eventfd(initval, 0)
  1036. }
  1037. SYS_EVENTFD2 => {
  1038. let initval = args[0] as u32;
  1039. let flags = args[1] as u32;
  1040. Self::sys_eventfd(initval, flags)
  1041. }
  1042. SYS_UNSHARE => Self::sys_unshare(args[0] as u64),
  1043. SYS_BPF => {
  1044. let cmd = args[0] as u32;
  1045. let attr = args[1] as *mut u8;
  1046. let size = args[2] as u32;
  1047. Self::sys_bpf(cmd, attr, size)
  1048. }
  1049. SYS_PERF_EVENT_OPEN => {
  1050. let attr = args[0] as *const u8;
  1051. let pid = args[1] as i32;
  1052. let cpu = args[2] as i32;
  1053. let group_fd = args[3] as i32;
  1054. let flags = args[4] as u32;
  1055. Self::sys_perf_event_open(attr, pid, cpu, group_fd, flags)
  1056. }
  1057. _ => panic!("Unsupported syscall ID: {}", syscall_num),
  1058. };
  1059. if ProcessManager::current_pcb()
  1060. .flags()
  1061. .contains(ProcessFlags::NEED_SCHEDULE)
  1062. {
  1063. schedule(SchedMode::SM_PREEMPT);
  1064. }
  1065. return r;
  1066. }
  1067. pub fn put_string(
  1068. s: *const u8,
  1069. front_color: u32,
  1070. back_color: u32,
  1071. ) -> Result<usize, SystemError> {
  1072. // todo: 删除这个系统调用
  1073. let s = check_and_clone_cstr(s, Some(4096))?
  1074. .into_string()
  1075. .map_err(|_| SystemError::EINVAL)?;
  1076. let fr = (front_color & 0x00ff0000) >> 16;
  1077. let fg = (front_color & 0x0000ff00) >> 8;
  1078. let fb = front_color & 0x000000ff;
  1079. let br = (back_color & 0x00ff0000) >> 16;
  1080. let bg = (back_color & 0x0000ff00) >> 8;
  1081. let bb = back_color & 0x000000ff;
  1082. print!("\x1B[38;2;{fr};{fg};{fb};48;2;{br};{bg};{bb}m{s}\x1B[0m");
  1083. return Ok(s.len());
  1084. }
  1085. pub fn reboot() -> Result<usize, SystemError> {
  1086. unsafe { cpu_reset() };
  1087. }
  1088. }