mod.rs 40 KB

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