Switch to v2 scheme format.

This commit is contained in:
4lDO2
2024-06-10 19:59:01 +02:00
parent 9edc328fd1
commit d9bc645185
4 changed files with 104 additions and 49 deletions
Generated
+44 -17
View File
@@ -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",
+5 -1
View File
@@ -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" }
+53 -31
View File
@@ -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<usize> {
})
}
impl SchemeMut for InitFsScheme {
fn open(&mut self, path: &str, _flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
impl SchemeV2 for InitFsScheme {
fn open(&mut self, path: &str, _flags: usize) -> Result<OpenResult> {
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<usize> {
@@ -191,12 +197,12 @@ impl SchemeMut for InitFsScheme {
}
}
fn seek(&mut self, id: usize, pos: isize, whence: usize) -> Result<isize> {
fn seek(&mut self, id: usize, pos: i64, whence: usize) -> Result<u64> {
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<usize> {
@@ -240,50 +246,66 @@ impl SchemeMut for InitFsScheme {
Ok(0)
}
fn fsync(&mut self, id: usize) -> Result<usize> {
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<usize> {
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::<V2>::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
}
+2
View File
@@ -1,7 +1,9 @@
#![no_std]
#![allow(internal_features)]
#![feature(
asm_const,
core_intrinsics,
str_from_raw_parts,
)]
#[cfg(target_arch = "aarch64")]