diff --git a/Cargo.lock b/Cargo.lock index 801412ee94e5dc257cc585526ed0fc34d435ce11..4754c619ab68f44c3ce6e1861c0b5000390a89e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -213,6 +213,17 @@ dependencies = [ "redox_syscall 0.4.1", ] +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall 0.5.0", +] + [[package]] name = "log" version = "0.4.21" @@ -324,6 +335,7 @@ dependencies = [ "fuser", "getrandom", "libc", + "libredox 0.1.3", "log", "range-tree", "redox-path", @@ -409,7 +421,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4648c7def6f2043b2568617b9f9b75eae88ca185dbc1f1fda30e95a85d49d7d" dependencies = [ "libc", - "libredox", + "libredox 0.0.2", "numtoa", "redox_termios", ] diff --git a/Cargo.toml b/Cargo.toml index 3819e5ed6f8cdd5bb66a736f91c05c0d4beea29b..59c549d34150faaa3987f1f7451cf55f8c898ca9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ seahash = { version = "4.1.0", default-features = false } termion = { version = "2", optional = true } uuid = { version = "1.4", default-features = false } redox-path = "0.3.0" +libredox = "0.1.3" # https://github.com/rexlunae/simple-endian-rs/pull/5 [dependencies.redox_simple_endian] diff --git a/src/bin/mount.rs b/src/bin/mount.rs index 479308b4285f7050363dad24d1afe2b340692757..f80cb5ca5ef867b5a59216ba0e37003a1cb80f23 100644 --- a/src/bin/mount.rs +++ b/src/bin/mount.rs @@ -69,11 +69,12 @@ fn bootloader_password() -> Option<Vec<u8>> { #[cfg(target_os = "redox")] fn capability_mode() { - syscall::setrens(0, 0).expect("redoxfs: failed to enter null namespace"); + libredox::call::setrens(0, 0).expect("redoxfs: failed to enter null namespace"); } #[cfg(target_os = "redox")] fn bootloader_password() -> Option<Vec<u8>> { + use libredox::call::MmapArgs; use syscall::MapFlags; let addr_env = env::var_os("REDOXFS_PASSWORD_ADDR")?; @@ -95,27 +96,23 @@ fn bootloader_password() -> Option<Vec<u8>> { unsafe { let aligned_size = size.next_multiple_of(syscall::PAGE_SIZE); - let fd = syscall::open("memory:physical", syscall::O_CLOEXEC) + let fd = libredox::Fd::open("memory:physical", libredox::flag::O_CLOEXEC, 0) .expect("failed to open physical memory file"); - let password_map = syscall::fmap( - fd, - &syscall::Map { - offset: addr, - size: aligned_size, - flags: MapFlags::PROT_READ | MapFlags::MAP_SHARED, - address: 0, // ignored - }, - ) - .expect("failed to map REDOXFS_PASSWORD"); - - let _ = syscall::close(fd); + let password_map = libredox::call::mmap(MmapArgs { + addr: core::ptr::null_mut(), + length: aligned_size, + prot: libredox::flag::PROT_READ, + flags: libredox::flag::MAP_SHARED, + fd: fd.raw(), + offset: addr as u64, + }).expect("failed to map REDOXFS_PASSWORD").cast::<u8>(); for i in 0..size { - password.push(*((password_map + i) as *const u8)); + password.push(password_map.add(i).read()); } - let _ = syscall::funmap(password_map, aligned_size); + let _ = libredox::call::munmap(password_map.cast(), aligned_size); } Some(password) } diff --git a/src/mount/redox/resource.rs b/src/mount/redox/resource.rs index 5c5f5afc0ec6c5854bff898000540e49952de20c..7012d5615ad38393381f17ac24a666fb80350bc9 100644 --- a/src/mount/redox/resource.rs +++ b/src/mount/redox/resource.rs @@ -3,6 +3,7 @@ use std::slice; use std::time::{SystemTime, UNIX_EPOCH}; use alloc::collections::BTreeMap; +use libredox::call::MmapArgs; use range_tree::RangeTree; use syscall::data::{Map, Stat, TimeSpec}; @@ -293,7 +294,7 @@ impl Fmap { { Ok(ok) => ok, Err(err) => { - let _ = syscall::funmap(address as usize, aligned_size); + let _ = libredox::call::munmap(address.cast(), aligned_size); return Err(err); } }; @@ -487,19 +488,18 @@ impl<D: Disk> Resource<D> for FileResource { if new_size > fmap_info.size { fmap_info.base = if fmap_info.base.is_null() { unsafe { - syscall::fmap( - !0, - &Map { - size: new_size, - // PRIVATE/SHARED doesn't matter once the pages are passed in the fmap - // handler. - flags: MapFlags::PROT_READ - | MapFlags::PROT_WRITE - | MapFlags::MAP_PRIVATE, - - offset: 0, - address: 0, - }, + libredox::call::mmap(MmapArgs { + length: new_size, + // PRIVATE/SHARED doesn't matter once the pages are passed in the fmap + // handler. + prot: libredox::flag::PROT_READ + | libredox::flag::PROT_WRITE, + flags: libredox::flag::MAP_PRIVATE, + + offset: 0, + fd: !0, + addr: core::ptr::null_mut(), + } )? as *mut u8 } } else { diff --git a/src/tests.rs b/src/tests.rs index 2fd0ca619e32bc99944312ba870a77fa2f468d5b..bf90242ed95cfd7ed37315bd7445af1f2240e617 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -84,30 +84,30 @@ fn mmap() { let path = dbg!(path.join("test")); let mmap_inner = |write: bool| { - let fd = dbg!(syscall::open( + let fd = dbg!(libredox::call::open( path.to_str().unwrap(), - syscall::O_CREAT | syscall::O_RDWR | syscall::O_CLOEXEC + libredox::flag::O_CREAT | libredox::flag::O_RDWR | libredox::flag::O_CLOEXEC, + 0, )) .unwrap(); let map = unsafe { slice::from_raw_parts_mut( - dbg!(syscall::fmap( + dbg!(libredox::call::mmap(libredox::call::MmapArgs { fd, - &syscall::Map { - offset: 0, - size: 128, - flags: syscall::PROT_READ | syscall::PROT_WRITE, - address: 0, - } - )) + offset: 0, + length: 128, + prot: libredox::flag::PROT_READ | libredox::flag::PROT_WRITE, + flags: libredox::flag::MAP_SHARED, + addr: core::ptr::null_mut(), + })) .unwrap() as *mut u8, 128, ) }; // Maps should be available after closing - assert_eq!(dbg!(syscall::close(fd)), Ok(0)); + assert_eq!(dbg!(libredox::call::close(fd)), Ok(())); for i in 0..128 { if write { @@ -119,8 +119,8 @@ fn mmap() { //TODO: add msync unsafe { assert_eq!( - dbg!(syscall::funmap(map.as_mut_ptr() as usize, map.len())), - Ok(0) + dbg!(libredox::call::munmap(map.as_mut_ptr().cast(), map.len())), + Ok(()) ); } };