mod.rs 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054
  1. use core::{
  2. ffi::{c_int, c_void},
  3. ptr::null,
  4. sync::atomic::{AtomicBool, Ordering},
  5. };
  6. use crate::{
  7. arch::{ipc::signal::SigSet, syscall::nr::*},
  8. filesystem::vfs::syscall::{PosixStatfs, PosixStatx},
  9. libs::{futex::constant::FutexFlag, rand::GRandFlags},
  10. mm::syscall::MremapFlags,
  11. net::syscall::MsgHdr,
  12. process::{
  13. fork::KernelCloneArgs,
  14. resource::{RLimit64, RUsage},
  15. ProcessManager,
  16. },
  17. syscall::user_access::check_and_clone_cstr,
  18. };
  19. use num_traits::FromPrimitive;
  20. use system_error::SystemError;
  21. use crate::{
  22. arch::{cpu::cpu_reset, interrupt::TrapFrame, MMArch},
  23. filesystem::vfs::{
  24. fcntl::{AtFlags, FcntlCommand},
  25. file::FileMode,
  26. syscall::{ModeType, PosixKstat},
  27. MAX_PATHLEN,
  28. },
  29. include::bindings::bindings::PAGE_4K_SIZE,
  30. kinfo,
  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. TimeSpec,
  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. kinfo!("Initializing syscall...");
  64. let r = crate::arch::syscall::arch_syscall_init();
  65. kinfo!("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 as usize).is_err())
  228. || verify_area(virt_env_ptr, PAGE_4K_SIZE as usize).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_NANOSLEEP => {
  261. let req = args[0] as *const TimeSpec;
  262. let rem = args[1] as *mut TimeSpec;
  263. let virt_req = VirtAddr::new(req as usize);
  264. let virt_rem = VirtAddr::new(rem as usize);
  265. if frame.is_from_user()
  266. && (verify_area(virt_req, core::mem::size_of::<TimeSpec>()).is_err()
  267. || verify_area(virt_rem, core::mem::size_of::<TimeSpec>()).is_err())
  268. {
  269. Err(SystemError::EFAULT)
  270. } else {
  271. Self::nanosleep(req, rem)
  272. }
  273. }
  274. SYS_CLOCK => Self::clock(),
  275. #[cfg(target_arch = "x86_64")]
  276. SYS_PIPE => {
  277. let pipefd: *mut i32 = args[0] as *mut c_int;
  278. if pipefd.is_null() {
  279. Err(SystemError::EFAULT)
  280. } else {
  281. Self::pipe2(pipefd, FileMode::empty())
  282. }
  283. }
  284. SYS_PIPE2 => {
  285. let pipefd: *mut i32 = args[0] as *mut c_int;
  286. let arg1 = args[1];
  287. if pipefd.is_null() {
  288. Err(SystemError::EFAULT)
  289. } else {
  290. let flags = FileMode::from_bits_truncate(arg1 as u32);
  291. Self::pipe2(pipefd, flags)
  292. }
  293. }
  294. SYS_UNLINKAT => {
  295. let dirfd = args[0] as i32;
  296. let path = args[1] as *const u8;
  297. let flags = args[2] as u32;
  298. Self::unlinkat(dirfd, path, flags)
  299. }
  300. #[cfg(target_arch = "x86_64")]
  301. SYS_RMDIR => {
  302. let path = args[0] as *const u8;
  303. Self::rmdir(path)
  304. }
  305. #[cfg(target_arch = "x86_64")]
  306. SYS_LINK => {
  307. let old = args[0] as *const u8;
  308. let new = args[1] as *const u8;
  309. return Self::link(old, new);
  310. }
  311. SYS_LINKAT => {
  312. let oldfd = args[0] as i32;
  313. let old = args[1] as *const u8;
  314. let newfd = args[2] as i32;
  315. let new = args[3] as *const u8;
  316. let flags = args[4] as i32;
  317. return Self::linkat(oldfd, old, newfd, new, flags);
  318. }
  319. #[cfg(target_arch = "x86_64")]
  320. SYS_UNLINK => {
  321. let path = args[0] as *const u8;
  322. Self::unlink(path)
  323. }
  324. SYS_KILL => {
  325. let pid = Pid::new(args[0]);
  326. let sig = args[1] as c_int;
  327. // kdebug!("KILL SYSCALL RECEIVED");
  328. Self::kill(pid, sig)
  329. }
  330. SYS_RT_SIGACTION => {
  331. let sig = args[0] as c_int;
  332. let act = args[1];
  333. let old_act = args[2];
  334. Self::sigaction(sig, act, old_act, frame.is_from_user())
  335. }
  336. SYS_GETPID => Self::getpid().map(|pid| pid.into()),
  337. SYS_SCHED => Self::sched(frame.is_from_user()),
  338. SYS_DUP => {
  339. let oldfd: i32 = args[0] as c_int;
  340. Self::dup(oldfd)
  341. }
  342. #[cfg(target_arch = "x86_64")]
  343. SYS_DUP2 => {
  344. let oldfd: i32 = args[0] as c_int;
  345. let newfd: i32 = args[1] as c_int;
  346. Self::dup2(oldfd, newfd)
  347. }
  348. SYS_SOCKET => Self::socket(args[0], args[1], args[2]),
  349. SYS_SETSOCKOPT => {
  350. let optval = args[3] as *const u8;
  351. let optlen = args[4];
  352. let virt_optval = VirtAddr::new(optval as usize);
  353. // 验证optval的地址是否合法
  354. if verify_area(virt_optval, optlen).is_err() {
  355. // 地址空间超出了用户空间的范围,不合法
  356. Err(SystemError::EFAULT)
  357. } else {
  358. let data: &[u8] = unsafe { core::slice::from_raw_parts(optval, optlen) };
  359. Self::setsockopt(args[0], args[1], args[2], data)
  360. }
  361. }
  362. SYS_GETSOCKOPT => {
  363. let optval = args[3] as *mut u8;
  364. let optlen = args[4] as *mut usize;
  365. let virt_optval = VirtAddr::new(optval as usize);
  366. let virt_optlen = VirtAddr::new(optlen as usize);
  367. let security_check = || {
  368. // 验证optval的地址是否合法
  369. if verify_area(virt_optval, PAGE_4K_SIZE as usize).is_err() {
  370. // 地址空间超出了用户空间的范围,不合法
  371. return Err(SystemError::EFAULT);
  372. }
  373. // 验证optlen的地址是否合法
  374. if verify_area(virt_optlen, core::mem::size_of::<u32>()).is_err() {
  375. // 地址空间超出了用户空间的范围,不合法
  376. return Err(SystemError::EFAULT);
  377. }
  378. return Ok(());
  379. };
  380. let r = security_check();
  381. if let Err(e) = r {
  382. Err(e)
  383. } else {
  384. Self::getsockopt(args[0], args[1], args[2], optval, optlen as *mut u32)
  385. }
  386. }
  387. SYS_CONNECT => {
  388. let addr = args[1] as *const SockAddr;
  389. let addrlen = args[2];
  390. let virt_addr = VirtAddr::new(addr as usize);
  391. // 验证addr的地址是否合法
  392. if verify_area(virt_addr, addrlen).is_err() {
  393. // 地址空间超出了用户空间的范围,不合法
  394. Err(SystemError::EFAULT)
  395. } else {
  396. Self::connect(args[0], addr, addrlen)
  397. }
  398. }
  399. SYS_BIND => {
  400. let addr = args[1] as *const SockAddr;
  401. let addrlen = args[2];
  402. let virt_addr = VirtAddr::new(addr as usize);
  403. // 验证addr的地址是否合法
  404. if verify_area(virt_addr, addrlen).is_err() {
  405. // 地址空间超出了用户空间的范围,不合法
  406. Err(SystemError::EFAULT)
  407. } else {
  408. Self::bind(args[0], addr, addrlen)
  409. }
  410. }
  411. SYS_SENDTO => {
  412. let buf = args[1] as *const u8;
  413. let len = args[2];
  414. let flags = args[3] as u32;
  415. let addr = args[4] as *const SockAddr;
  416. let addrlen = args[5];
  417. let virt_buf = VirtAddr::new(buf as usize);
  418. let virt_addr = VirtAddr::new(addr as usize);
  419. // 验证buf的地址是否合法
  420. if verify_area(virt_buf, len).is_err() || verify_area(virt_addr, addrlen).is_err() {
  421. // 地址空间超出了用户空间的范围,不合法
  422. Err(SystemError::EFAULT)
  423. } else {
  424. let data: &[u8] = unsafe { core::slice::from_raw_parts(buf, len) };
  425. Self::sendto(args[0], data, flags, addr, addrlen)
  426. }
  427. }
  428. SYS_RECVFROM => {
  429. let buf = args[1] as *mut u8;
  430. let len = args[2];
  431. let flags = args[3] as u32;
  432. let addr = args[4] as *mut SockAddr;
  433. let addrlen = args[5] as *mut usize;
  434. let virt_buf = VirtAddr::new(buf as usize);
  435. let virt_addrlen = VirtAddr::new(addrlen as usize);
  436. let virt_addr = VirtAddr::new(addr as usize);
  437. let security_check = || {
  438. // 验证buf的地址是否合法
  439. if verify_area(virt_buf, len).is_err() {
  440. // 地址空间超出了用户空间的范围,不合法
  441. return Err(SystemError::EFAULT);
  442. }
  443. // 验证addrlen的地址是否合法
  444. if verify_area(virt_addrlen, core::mem::size_of::<u32>()).is_err() {
  445. // 地址空间超出了用户空间的范围,不合法
  446. return Err(SystemError::EFAULT);
  447. }
  448. if verify_area(virt_addr, core::mem::size_of::<SockAddr>()).is_err() {
  449. // 地址空间超出了用户空间的范围,不合法
  450. return Err(SystemError::EFAULT);
  451. }
  452. return Ok(());
  453. };
  454. let r = security_check();
  455. if let Err(e) = r {
  456. Err(e)
  457. } else {
  458. let buf = unsafe { core::slice::from_raw_parts_mut(buf, len) };
  459. Self::recvfrom(args[0], buf, flags, addr, addrlen as *mut u32)
  460. }
  461. }
  462. SYS_RECVMSG => {
  463. let msg = args[1] as *mut MsgHdr;
  464. let flags = args[2] as u32;
  465. let mut user_buffer_writer = UserBufferWriter::new(
  466. msg,
  467. core::mem::size_of::<MsgHdr>(),
  468. frame.is_from_user(),
  469. )?;
  470. let buffer = user_buffer_writer.buffer::<MsgHdr>(0)?;
  471. let msg = &mut buffer[0];
  472. Self::recvmsg(args[0], msg, flags)
  473. }
  474. SYS_LISTEN => Self::listen(args[0], args[1]),
  475. SYS_SHUTDOWN => Self::shutdown(args[0], args[1]),
  476. SYS_ACCEPT => Self::accept(args[0], args[1] as *mut SockAddr, args[2] as *mut u32),
  477. SYS_ACCEPT4 => Self::accept4(
  478. args[0],
  479. args[1] as *mut SockAddr,
  480. args[2] as *mut u32,
  481. args[3] as u32,
  482. ),
  483. SYS_GETSOCKNAME => {
  484. Self::getsockname(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  485. }
  486. SYS_GETPEERNAME => {
  487. Self::getpeername(args[0], args[1] as *mut SockAddr, args[2] as *mut u32)
  488. }
  489. SYS_GETTIMEOFDAY => {
  490. let timeval = args[0] as *mut PosixTimeval;
  491. let timezone_ptr = args[1] as *mut PosixTimeZone;
  492. Self::gettimeofday(timeval, timezone_ptr)
  493. }
  494. SYS_MMAP => {
  495. let len = page_align_up(args[1]);
  496. let virt_addr = VirtAddr::new(args[0]);
  497. if verify_area(virt_addr, len).is_err() {
  498. Err(SystemError::EFAULT)
  499. } else {
  500. Self::mmap(
  501. VirtAddr::new(args[0]),
  502. len,
  503. args[2],
  504. args[3],
  505. args[4] as i32,
  506. args[5],
  507. )
  508. }
  509. }
  510. SYS_MREMAP => {
  511. let old_vaddr = VirtAddr::new(args[0]);
  512. let old_len = args[1];
  513. let new_len = args[2];
  514. let mremap_flags = MremapFlags::from_bits_truncate(args[3] as u8);
  515. let new_vaddr = VirtAddr::new(args[4]);
  516. Self::mremap(old_vaddr, old_len, new_len, mremap_flags, new_vaddr)
  517. }
  518. SYS_MUNMAP => {
  519. let addr = args[0];
  520. let len = page_align_up(args[1]);
  521. if addr & (MMArch::PAGE_SIZE - 1) != 0 {
  522. // The addr argument is not a multiple of the page size
  523. Err(SystemError::EINVAL)
  524. } else {
  525. Self::munmap(VirtAddr::new(addr), len)
  526. }
  527. }
  528. SYS_MPROTECT => {
  529. let addr = args[0];
  530. let len = page_align_up(args[1]);
  531. if addr & (MMArch::PAGE_SIZE - 1) != 0 {
  532. // The addr argument is not a multiple of the page size
  533. Err(SystemError::EINVAL)
  534. } else {
  535. Self::mprotect(VirtAddr::new(addr), len, args[2])
  536. }
  537. }
  538. SYS_GETCWD => {
  539. let buf = args[0] as *mut u8;
  540. let size = args[1];
  541. let security_check = || {
  542. verify_area(VirtAddr::new(buf as usize), size)?;
  543. return Ok(());
  544. };
  545. let r = security_check();
  546. if let Err(e) = r {
  547. Err(e)
  548. } else {
  549. let buf = unsafe { core::slice::from_raw_parts_mut(buf, size) };
  550. Self::getcwd(buf).map(|ptr| ptr.data())
  551. }
  552. }
  553. SYS_GETPGID => Self::getpgid(Pid::new(args[0])).map(|pid| pid.into()),
  554. SYS_GETPPID => Self::getppid().map(|pid| pid.into()),
  555. SYS_FSTAT => {
  556. let fd = args[0] as i32;
  557. let kstat: *mut PosixKstat = args[1] as *mut PosixKstat;
  558. let vaddr = VirtAddr::new(kstat as usize);
  559. // FIXME 由于c中的verify_area与rust中的verify_area重名,所以在引入时加了前缀区分
  560. // TODO 应该将用了c版本的verify_area都改为rust的verify_area
  561. match verify_area(vaddr, core::mem::size_of::<PosixKstat>()) {
  562. Ok(_) => Self::fstat(fd, kstat),
  563. Err(e) => Err(e),
  564. }
  565. }
  566. SYS_FCNTL => {
  567. let fd = args[0] as i32;
  568. let cmd: Option<FcntlCommand> =
  569. <FcntlCommand as FromPrimitive>::from_u32(args[1] as u32);
  570. let arg = args[2] as i32;
  571. let res = if let Some(cmd) = cmd {
  572. Self::fcntl(fd, cmd, arg)
  573. } else {
  574. Err(SystemError::EINVAL)
  575. };
  576. // kdebug!("FCNTL: fd: {}, cmd: {:?}, arg: {}, res: {:?}", fd, cmd, arg, res);
  577. res
  578. }
  579. SYS_FTRUNCATE => {
  580. let fd = args[0] as i32;
  581. let len = args[1];
  582. let res = Self::ftruncate(fd, len);
  583. // kdebug!("FTRUNCATE: fd: {}, len: {}, res: {:?}", fd, len, res);
  584. res
  585. }
  586. #[cfg(target_arch = "x86_64")]
  587. SYS_MKNOD => {
  588. use crate::driver::base::device::device_number::DeviceNumber;
  589. let path = args[0];
  590. let flags = args[1];
  591. let dev_t = args[2];
  592. let flags: ModeType = ModeType::from_bits_truncate(flags as u32);
  593. Self::mknod(path as *const u8, flags, DeviceNumber::from(dev_t as u32))
  594. }
  595. SYS_CLONE => {
  596. let parent_tid = VirtAddr::new(args[2]);
  597. let child_tid = VirtAddr::new(args[3]);
  598. // 地址校验
  599. verify_area(parent_tid, core::mem::size_of::<i32>())?;
  600. verify_area(child_tid, core::mem::size_of::<i32>())?;
  601. let mut clone_args = KernelCloneArgs::new();
  602. clone_args.flags = CloneFlags::from_bits_truncate(args[0] as u64);
  603. clone_args.stack = args[1];
  604. clone_args.parent_tid = parent_tid;
  605. clone_args.child_tid = child_tid;
  606. clone_args.tls = args[4];
  607. Self::clone(frame, clone_args)
  608. }
  609. SYS_FUTEX => {
  610. let uaddr = VirtAddr::new(args[0]);
  611. let operation = FutexFlag::from_bits(args[1] as u32).ok_or(SystemError::ENOSYS)?;
  612. let val = args[2] as u32;
  613. let utime = args[3];
  614. let uaddr2 = VirtAddr::new(args[4]);
  615. let val3 = args[5] as u32;
  616. verify_area(uaddr, core::mem::size_of::<u32>())?;
  617. verify_area(uaddr2, core::mem::size_of::<u32>())?;
  618. let mut timespec = None;
  619. if utime != 0 && operation.contains(FutexFlag::FLAGS_HAS_TIMEOUT) {
  620. let reader = UserBufferReader::new(
  621. utime as *const TimeSpec,
  622. core::mem::size_of::<TimeSpec>(),
  623. true,
  624. )?;
  625. timespec = Some(*reader.read_one_from_user::<TimeSpec>(0)?);
  626. }
  627. Self::do_futex(uaddr, operation, val, timespec, uaddr2, utime as u32, val3)
  628. }
  629. SYS_READV => Self::readv(args[0] as i32, args[1], args[2]),
  630. SYS_WRITEV => Self::writev(args[0] as i32, args[1], args[2]),
  631. SYS_SET_TID_ADDRESS => Self::set_tid_address(args[0]),
  632. #[cfg(target_arch = "x86_64")]
  633. SYS_LSTAT => {
  634. let path = args[0] as *const u8;
  635. let kstat = args[1] as *mut PosixKstat;
  636. Self::lstat(path, kstat)
  637. }
  638. #[cfg(target_arch = "x86_64")]
  639. SYS_STAT => {
  640. let path = args[0] as *const u8;
  641. let kstat = args[1] as *mut PosixKstat;
  642. Self::stat(path, kstat)
  643. }
  644. SYS_STATFS => {
  645. let path = args[0] as *const u8;
  646. let statfs = args[1] as *mut PosixStatfs;
  647. Self::statfs(path, statfs)
  648. }
  649. SYS_FSTATFS => {
  650. let fd = args[0] as i32;
  651. let statfs = args[1] as *mut PosixStatfs;
  652. Self::fstatfs(fd, statfs)
  653. }
  654. SYS_STATX => {
  655. let fd = args[0] as i32;
  656. let path = args[1] as *const u8;
  657. let flags = args[2] as u32;
  658. let mask = args[3] as u32;
  659. let kstat = args[4] as *mut PosixStatx;
  660. Self::do_statx(fd, path, flags, mask, kstat)
  661. }
  662. #[cfg(target_arch = "x86_64")]
  663. SYS_EPOLL_CREATE => Self::epoll_create(args[0] as i32),
  664. SYS_EPOLL_CREATE1 => Self::epoll_create1(args[0]),
  665. SYS_EPOLL_CTL => Self::epoll_ctl(
  666. args[0] as i32,
  667. args[1],
  668. args[2] as i32,
  669. VirtAddr::new(args[3]),
  670. ),
  671. #[cfg(target_arch = "x86_64")]
  672. SYS_EPOLL_WAIT => Self::epoll_wait(
  673. args[0] as i32,
  674. VirtAddr::new(args[1]),
  675. args[2] as i32,
  676. args[3] as i32,
  677. ),
  678. SYS_EPOLL_PWAIT => {
  679. let epfd = args[0] as i32;
  680. let epoll_event = VirtAddr::new(args[1]);
  681. let max_events = args[2] as i32;
  682. let timespec = args[3] as i32;
  683. let sigmask_addr = args[4] as *mut SigSet;
  684. if sigmask_addr.is_null() {
  685. return Self::epoll_wait(epfd, epoll_event, max_events, timespec);
  686. }
  687. let sigmask_reader =
  688. UserBufferReader::new(sigmask_addr, core::mem::size_of::<SigSet>(), true)?;
  689. let mut sigmask = *sigmask_reader.read_one_from_user::<SigSet>(0)?;
  690. Self::epoll_pwait(
  691. args[0] as i32,
  692. VirtAddr::new(args[1]),
  693. args[2] as i32,
  694. args[3] as i32,
  695. &mut sigmask,
  696. )
  697. }
  698. // 目前为了适配musl-libc,以下系统调用先这样写着
  699. SYS_GETRANDOM => {
  700. let flags = GRandFlags::from_bits(args[2] as u8).ok_or(SystemError::EINVAL)?;
  701. Self::get_random(args[0] as *mut u8, args[1], flags)
  702. }
  703. SYS_SOCKETPAIR => {
  704. let mut user_buffer_writer = UserBufferWriter::new(
  705. args[3] as *mut c_int,
  706. core::mem::size_of::<[c_int; 2]>(),
  707. frame.is_from_user(),
  708. )?;
  709. let fds = user_buffer_writer.buffer::<i32>(0)?;
  710. Self::socketpair(args[0], args[1], args[2], fds)
  711. }
  712. #[cfg(target_arch = "x86_64")]
  713. SYS_POLL => {
  714. kwarn!("SYS_POLL has not yet been implemented");
  715. Ok(0)
  716. }
  717. SYS_SETPGID => {
  718. kwarn!("SYS_SETPGID has not yet been implemented");
  719. Ok(0)
  720. }
  721. SYS_RT_SIGPROCMASK => {
  722. kwarn!("SYS_RT_SIGPROCMASK has not yet been implemented");
  723. Ok(0)
  724. }
  725. SYS_TKILL => {
  726. kwarn!("SYS_TKILL has not yet been implemented");
  727. Ok(0)
  728. }
  729. SYS_SIGALTSTACK => {
  730. kwarn!("SYS_SIGALTSTACK has not yet been implemented");
  731. Ok(0)
  732. }
  733. SYS_EXIT_GROUP => {
  734. kwarn!("SYS_EXIT_GROUP has not yet been implemented");
  735. Ok(0)
  736. }
  737. SYS_MADVISE => {
  738. // 这个太吵了,总是打印,先注释掉
  739. // kwarn!("SYS_MADVISE has not yet been implemented");
  740. Ok(0)
  741. }
  742. SYS_GETTID => Self::gettid().map(|tid| tid.into()),
  743. SYS_GETUID => Self::getuid(),
  744. SYS_SYSLOG => {
  745. let syslog_action_type = args[0];
  746. let buf_vaddr = args[1];
  747. let len = args[2];
  748. let from_user = frame.is_from_user();
  749. let mut user_buffer_writer =
  750. UserBufferWriter::new(buf_vaddr as *mut u8, len, from_user)?;
  751. let user_buf = user_buffer_writer.buffer(0)?;
  752. Self::do_syslog(syslog_action_type, user_buf, len)
  753. }
  754. SYS_GETGID => Self::getgid(),
  755. SYS_SETUID => {
  756. kwarn!("SYS_SETUID has not yet been implemented");
  757. Ok(0)
  758. }
  759. SYS_SETGID => {
  760. kwarn!("SYS_SETGID has not yet been implemented");
  761. Ok(0)
  762. }
  763. SYS_SETSID => {
  764. kwarn!("SYS_SETSID has not yet been implemented");
  765. Ok(0)
  766. }
  767. SYS_GETEUID => Self::geteuid(),
  768. SYS_GETEGID => Self::getegid(),
  769. SYS_GETRUSAGE => {
  770. let who = args[0] as c_int;
  771. let rusage = args[1] as *mut RUsage;
  772. Self::get_rusage(who, rusage)
  773. }
  774. #[cfg(target_arch = "x86_64")]
  775. SYS_READLINK => {
  776. let path = args[0] as *const u8;
  777. let buf = args[1] as *mut u8;
  778. let bufsiz = args[2];
  779. Self::readlink(path, buf, bufsiz)
  780. }
  781. SYS_READLINKAT => {
  782. let dirfd = args[0] as i32;
  783. let path = args[1] as *const u8;
  784. let buf = args[2] as *mut u8;
  785. let bufsiz = args[3];
  786. Self::readlink_at(dirfd, path, buf, bufsiz)
  787. }
  788. SYS_PRLIMIT64 => {
  789. let pid = args[0];
  790. let pid = Pid::new(pid);
  791. let resource = args[1];
  792. let new_limit = args[2] as *const RLimit64;
  793. let old_limit = args[3] as *mut RLimit64;
  794. Self::prlimit64(pid, resource, new_limit, old_limit)
  795. }
  796. #[cfg(target_arch = "x86_64")]
  797. SYS_ACCESS => {
  798. let pathname = args[0] as *const u8;
  799. let mode = args[1] as u32;
  800. Self::access(pathname, mode)
  801. }
  802. SYS_FACCESSAT => {
  803. let dirfd = args[0] as i32;
  804. let pathname = args[1] as *const u8;
  805. let mode = args[2] as u32;
  806. Self::faccessat2(dirfd, pathname, mode, 0)
  807. }
  808. SYS_FACCESSAT2 => {
  809. let dirfd = args[0] as i32;
  810. let pathname = args[1] as *const u8;
  811. let mode = args[2] as u32;
  812. let flags = args[3] as u32;
  813. Self::faccessat2(dirfd, pathname, mode, flags)
  814. }
  815. SYS_CLOCK_GETTIME => {
  816. let clockid = args[0] as i32;
  817. let timespec = args[1] as *mut TimeSpec;
  818. Self::clock_gettime(clockid, timespec)
  819. }
  820. SYS_SYSINFO => {
  821. let info = args[0] as *mut SysInfo;
  822. Self::sysinfo(info)
  823. }
  824. SYS_UMASK => {
  825. let mask = args[0] as u32;
  826. Self::umask(mask)
  827. }
  828. SYS_FCHOWN => {
  829. kwarn!("SYS_FCHOWN has not yet been implemented");
  830. Ok(0)
  831. }
  832. SYS_FSYNC => {
  833. kwarn!("SYS_FSYNC has not yet been implemented");
  834. Ok(0)
  835. }
  836. SYS_SET_ROBUST_LIST => {
  837. kwarn!("SYS_SET_ROBUST_LIST has not yet been implemented");
  838. Ok(0)
  839. }
  840. SYS_RSEQ => {
  841. kwarn!("SYS_RSEQ has not yet been implemented");
  842. Ok(0)
  843. }
  844. #[cfg(target_arch = "x86_64")]
  845. SYS_CHMOD => {
  846. let pathname = args[0] as *const u8;
  847. let mode = args[1] as u32;
  848. Self::chmod(pathname, mode)
  849. }
  850. SYS_FCHMOD => {
  851. let fd = args[0] as i32;
  852. let mode = args[1] as u32;
  853. Self::fchmod(fd, mode)
  854. }
  855. SYS_FCHMODAT => {
  856. let dirfd = args[0] as i32;
  857. let pathname = args[1] as *const u8;
  858. let mode = args[2] as u32;
  859. Self::fchmodat(dirfd, pathname, mode)
  860. }
  861. SYS_SCHED_GETAFFINITY => {
  862. let pid = args[0] as i32;
  863. let size = args[1];
  864. let set_vaddr = args[2];
  865. let mut user_buffer_writer =
  866. UserBufferWriter::new(set_vaddr as *mut u8, size, frame.is_from_user())?;
  867. let set: &mut [u8] = user_buffer_writer.buffer(0)?;
  868. Self::getaffinity(pid, set)
  869. }
  870. #[cfg(target_arch = "x86_64")]
  871. SYS_GETRLIMIT => {
  872. let resource = args[0];
  873. let rlimit = args[1] as *mut RLimit64;
  874. Self::prlimit64(
  875. ProcessManager::current_pcb().pid(),
  876. resource,
  877. core::ptr::null::<RLimit64>(),
  878. rlimit,
  879. )
  880. }
  881. SYS_FADVISE64 => {
  882. // todo: 这个系统调用还没有实现
  883. Err(SystemError::ENOSYS)
  884. }
  885. SYS_MOUNT => {
  886. let source = args[0] as *const u8;
  887. let target = args[1] as *const u8;
  888. let filesystemtype = args[2] as *const u8;
  889. return Self::mount(source, target, filesystemtype, 0, null());
  890. }
  891. SYS_NEWFSTATAT => {
  892. // todo: 这个系统调用还没有实现
  893. Err(SystemError::ENOSYS)
  894. }
  895. SYS_SCHED_YIELD => Self::sched_yield(),
  896. SYS_UNAME => {
  897. let name = args[0] as *mut PosixOldUtsName;
  898. Self::uname(name)
  899. }
  900. _ => panic!("Unsupported syscall ID: {}", syscall_num),
  901. };
  902. return r;
  903. }
  904. pub fn put_string(
  905. s: *const u8,
  906. front_color: u32,
  907. back_color: u32,
  908. ) -> Result<usize, SystemError> {
  909. // todo: 删除这个系统调用
  910. let s = check_and_clone_cstr(s, Some(4096))?;
  911. let fr = (front_color & 0x00ff0000) >> 16;
  912. let fg = (front_color & 0x0000ff00) >> 8;
  913. let fb = front_color & 0x000000ff;
  914. let br = (back_color & 0x00ff0000) >> 16;
  915. let bg = (back_color & 0x0000ff00) >> 8;
  916. let bb = back_color & 0x000000ff;
  917. print!("\x1B[38;2;{fr};{fg};{fb};48;2;{br};{bg};{bb}m{s}\x1B[0m");
  918. return Ok(s.len());
  919. }
  920. pub fn reboot() -> Result<usize, SystemError> {
  921. unsafe { cpu_reset() };
  922. }
  923. }