diff --git a/Cargo.lock b/Cargo.lock index fb45a7b29a..2dc10c0160 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -201,9 +201,9 @@ checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7" [[package]] name = "redox_syscall" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d94dd2f7cd932d4dc02cc8b2b50dfd38bd079a4e5d79198b99743d7fcf9a4b4" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ "bitflags 2.10.0", ] diff --git a/Cargo.toml b/Cargo.toml index 725b82075b..a822f97cfd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ bitflags = "2" hashbrown = { version = "0.14.3", default-features = false, features = ["ahash", "inline-more"] } linked_list_allocator = "0.9.0" redox-path = "0.2.0" -redox_syscall = { version = "0.7.2", default-features = false } +redox_syscall = { version = "0.7.3", default-features = false } rmm = { path = "rmm", default-features = false } slab = { version = "0.4", default-features = false } spin = { version = "0.9.8" } diff --git a/src/scheme/memory.rs b/src/scheme/memory.rs index b8d13a7b97..9a483bd2eb 100644 --- a/src/scheme/memory.rs +++ b/src/scheme/memory.rs @@ -5,7 +5,7 @@ use rmm::PhysicalAddress; use crate::{ context::{ - file::InternalFlags, + file::{FileDescription, InternalFlags}, memory::{handle_notify_files, AddrSpace, AddrSpaceWrapper, Grant, PageSpan}, }, memory::{free_frames, used_frames, Frame, PAGE_SIZE}, @@ -19,7 +19,7 @@ use crate::paging::entry::EntryFlags; use crate::syscall::{ data::{Map, StatVfs}, error::*, - flag::MapFlags, + flag::{CallFlags, MapFlags}, usercopy::UserSliceWo, }; @@ -335,4 +335,32 @@ impl KernelScheme for MemoryScheme { Ok(()) } + fn kstdfscall( + &self, + id: usize, + _desc: Arc>, + payload: UserSliceRw, + _flags: CallFlags, + metadata: &[u64], + token: &mut CleanLockToken, + ) -> Result { + use syscall::flag::StdFsCallKind::{self, *}; + let Some(raw_kind) = metadata.first().map(|v| *v as u8) else { + return Err(Error::new(EOPNOTSUPP)); + }; + let Some(kind) = StdFsCallKind::try_from_raw(raw_kind) else { + return Err(Error::new(EOPNOTSUPP)); + }; + + match kind { + Fstatvfs => { + if payload.len() != core::mem::size_of::() { + return Err(Error::new(EINVAL)); + } + self.kfstatvfs(id, UserSliceWo::new(payload.addr(), payload.len())?, token) + .map(|_| 0) + } + _ => Err(Error::new(EOPNOTSUPP)), + } + } }