diff --git a/Cargo.lock b/Cargo.lock index b78f4cdc52..96e79a2f6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,15 +4,15 @@ version = 3 [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bootstrap" @@ -22,6 +22,7 @@ dependencies = [ "linked_list_allocator", "redox-exec", "redox-initfs", + "redox-scheme", "redox_syscall", ] @@ -38,9 +39,26 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] [[package]] name = "linked_list_allocator" @@ -53,9 +71,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -75,18 +93,18 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -94,7 +112,7 @@ dependencies = [ [[package]] name = "redox-exec" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#6ff5691d189945a51b997a6e729646592015cb68" +source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#ac08f016cd3b37fae8434f2da6168542d3171ec6" dependencies = [ "goblin", "plain", @@ -109,10 +127,19 @@ dependencies = [ "plain", ] +[[package]] +name = "redox-scheme" +version = "0.2.0" +source = "git+https://gitlab.redox-os.org/4lDO2/redox-scheme.git?branch=schemev2#54a79f82bf82f14256b33dace7c68673b0851898" +dependencies = [ + "libredox", + "redox_syscall", +] + [[package]] name = "redox_syscall" -version = "0.5.0" -source = "git+https://gitlab.redox-os.org/redox-os/syscall.git#7163519226f89f47d77118af27495de231ad9092" +version = "0.5.1" +source = "git+https://gitlab.redox-os.org/4lDO2/syscall.git?branch=schemev2#f72cc4d7431841aaad039bce57af4e59c82f78c4" dependencies = [ "bitflags", ] @@ -154,9 +181,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.53" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 922db2af88..646c401077 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,8 @@ linked_list_allocator = "0.10" redox-initfs = { git = "https://gitlab.redox-os.org/redox-os/redox-initfs.git", default-features = false } #redox-exec = { git = "https://gitlab.redox-os.org/redox-os/relibc.git" } redox-exec = { git = "https://gitlab.redox-os.org/redox-os/relibc.git" } -redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git" } +redox_syscall = "0.5.1" +redox-scheme = { git = "https://gitlab.redox-os.org/4lDO2/redox-scheme.git", branch = "schemev2" } [profile.release] panic = "abort" @@ -23,3 +24,6 @@ lto = "fat" [profile.dev] panic = "abort" + +[patch.crates-io] +redox_syscall = { git = "https://gitlab.redox-os.org/4lDO2/syscall.git", branch = "schemev2" } diff --git a/src/initfs.rs b/src/initfs.rs index e4ed8d4951..f440ea0b65 100644 --- a/src/initfs.rs +++ b/src/initfs.rs @@ -8,10 +8,16 @@ use alloc::string::String; use hashbrown::HashMap; use redox_initfs::{InitFs, InodeStruct, Inode, InodeDir, InodeKind, types::Timespec}; -use syscall::data::{Packet, Stat}; +use redox_scheme::OpenResult; +use redox_scheme::RequestKind; +use redox_scheme::SchemeV2; + +use redox_scheme::SignalBehavior; +use redox_scheme::Socket; +use redox_scheme::V2; +use syscall::data::Stat; use syscall::error::*; use syscall::flag::*; -use syscall::scheme::{calc_seek_offset_usize, SchemeMut}; struct Handle { inode: Inode, @@ -78,8 +84,8 @@ fn inode_len(inode: InodeStruct<'static>) -> Result { }) } -impl SchemeMut for InitFsScheme { - fn open(&mut self, path: &str, _flags: usize, _uid: u32, _gid: u32) -> Result { +impl SchemeV2 for InitFsScheme { + fn open(&mut self, path: &str, _flags: usize) -> Result { let mut components = path // trim leading and trailing slash .trim_matches('/') @@ -138,7 +144,7 @@ impl SchemeMut for InitFsScheme { }); assert!(old.is_none()); - Ok(id) + Ok(OpenResult::ThisScheme { number: id }) } fn read(&mut self, id: usize, mut buffer: &mut [u8]) -> Result { @@ -191,12 +197,12 @@ impl SchemeMut for InitFsScheme { } } - fn seek(&mut self, id: usize, pos: isize, whence: usize) -> Result { + fn seek(&mut self, id: usize, pos: i64, whence: usize) -> Result { let handle = self.handles.get_mut(&id).ok_or(Error::new(EBADF))?; - let new_offset = calc_seek_offset_usize(handle.seek, pos, whence, inode_len(Self::get_inode(&self.fs, handle.inode)?)?)?; + let new_offset = redox_scheme::calc_seek_offset_usize(handle.seek, pos as isize, whence, inode_len(Self::get_inode(&self.fs, handle.inode)?)?)?; handle.seek = new_offset as usize; - Ok(new_offset) + Ok(new_offset as u64) } fn fcntl(&mut self, id: usize, _cmd: usize, _arg: usize) -> Result { @@ -240,50 +246,66 @@ impl SchemeMut for InitFsScheme { Ok(0) } - fn fsync(&mut self, id: usize) -> Result { + fn fsync(&mut self, id: usize) -> Result<()> { if !self.handles.contains_key(&id) { return Err(Error::new(EBADF)); } - Ok(0) + Ok(()) } - fn close(&mut self, id: usize) -> Result { + fn close(&mut self, id: usize) -> Result<()> { let _ = self.handles.remove(&id).ok_or(Error::new(EBADF))?; - Ok(0) + Ok(()) } } pub fn run(bytes: &'static [u8], sync_pipe: usize) -> ! { let mut scheme = InitFsScheme::new(bytes); - let socket = syscall::open(":initfs", O_RDWR | O_CLOEXEC | O_CREAT) + let socket = Socket::::create("initfs") .expect("failed to open initfs scheme socket"); let _ = syscall::write(sync_pipe, &[0]); let _ = syscall::close(sync_pipe); - let mut packet = Packet::default(); + loop { + let RequestKind::Call(req) = (match socket.next_request(SignalBehavior::Restart).expect("bootstrap: failed to read scheme request from kernel") { + Some(req) => req.kind(), + None => break, + }) else { + continue; + }; + let resp = req.handle_scheme_mut(&mut scheme); - 'packets: loop { - loop { - match syscall::read(socket, &mut packet) { - Ok(0) => break 'packets, - Ok(_) => break, - Err(error) if error == Error::new(EINTR) => continue, - Err(error) => panic!("failed to read from scheme socket: {}", error), - } - } - scheme.handle(&mut packet); - loop { - match syscall::write(socket, &packet) { - Ok(0) => break 'packets, - Ok(_) => break, - Err(error) if error == Error::new(EINTR) => continue, - Err(error) => panic!("failed to write to scheme socket: {}", error), - } + if !socket.write_response(resp, SignalBehavior::Restart).expect("bootstrap: failed to write scheme response to kernel") { + break; } } + syscall::exit(0).expect("initfs: failed to exit"); unreachable!() } + +// TODO: Restructure bootstrap so it calls into relibc, or a split-off derivative without the C +// parts, such as "redox-rt". + +#[no_mangle] +pub unsafe extern "C" fn redox_read_v1(fd: usize, ptr: *mut u8, len: usize) -> isize { + Error::mux(syscall::read(fd, core::slice::from_raw_parts_mut(ptr, len))) as isize +} + +#[no_mangle] +pub unsafe extern "C" fn redox_write_v1(fd: usize, ptr: *const u8, len: usize) -> isize { + Error::mux(syscall::write(fd, core::slice::from_raw_parts(ptr, len))) as isize +} + +#[no_mangle] +pub unsafe extern "C" fn redox_open_v1(ptr: *const u8, len: usize, flags: usize) -> isize { + Error::mux(syscall::open(core::str::from_raw_parts(ptr, len), flags)) as isize +} + +#[no_mangle] +pub extern "C" fn redox_close_v1(fd: usize) -> isize { + Error::mux(syscall::close(fd)) as isize +} diff --git a/src/lib.rs b/src/lib.rs index 4b70f73c1c..3c45afb000 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,9 @@ #![no_std] +#![allow(internal_features)] #![feature( asm_const, core_intrinsics, + str_from_raw_parts, )] #[cfg(target_arch = "aarch64")]