diff --git a/Cargo.lock b/Cargo.lock index 2dbd6be7ed231ce015de7444913b34acc02d218d..07f1b0718bc127307d07a1e92848a89a58473d7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -361,7 +361,13 @@ dependencies = [ ] [[package]] -name = "redox-exec" +name = "redox-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7" + +[[package]] +name = "redox-rt" version = "0.1.0" dependencies = [ "goblin", @@ -369,12 +375,6 @@ dependencies = [ "redox_syscall", ] -[[package]] -name = "redox-path" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7" - [[package]] name = "redox_event" version = "0.4.0" @@ -415,8 +415,8 @@ dependencies = [ "rand", "rand_jitter", "rand_xorshift", - "redox-exec", "redox-path", + "redox-rt", "redox_event", "redox_syscall", "sc", diff --git a/Cargo.toml b/Cargo.toml index 49e6a5bd5841012b0798d1646b92365d6b8c292f..6eb6c4a9903830f7288847855c4c491018d44b87 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ members = [ "src/crt0", "src/crti", "src/crtn", - "src/platform/redox/redox-exec", + "redox-rt", "ld_so", ] exclude = ["tests", "dlmalloc-rs"] @@ -59,7 +59,7 @@ sc = "0.2.3" [target.'cfg(target_os = "redox")'.dependencies] redox_syscall = "0.5.1" -redox-exec = { path = "src/platform/redox/redox-exec" } +redox-rt = { path = "redox-rt" } redox-path = "0.2" redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git", default-features = false, features = ["redox_syscall"] } diff --git a/src/platform/redox/redox-exec/Cargo.toml b/redox-rt/Cargo.toml similarity index 83% rename from src/platform/redox/redox-exec/Cargo.toml rename to redox-rt/Cargo.toml index 18212a34572db3a40b36e2ea80406ae5d65fc488..56cecb9b3d2c4e3e750a82b9fdf2eb5960a059f2 100644 --- a/src/platform/redox/redox-exec/Cargo.toml +++ b/redox-rt/Cargo.toml @@ -1,9 +1,10 @@ [package] -name = "redox-exec" +name = "redox-rt" authors = ["4lDO2 <4lDO2@protonmail.com>"] version = "0.1.0" edition = "2021" license = "MIT" +description = "Libc-independent runtime for Redox" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/platform/redox/redox-exec/src/arch/aarch64.rs b/redox-rt/src/arch/aarch64.rs similarity index 100% rename from src/platform/redox/redox-exec/src/arch/aarch64.rs rename to redox-rt/src/arch/aarch64.rs diff --git a/src/platform/redox/redox-exec/src/arch/mod.rs b/redox-rt/src/arch/mod.rs similarity index 100% rename from src/platform/redox/redox-exec/src/arch/mod.rs rename to redox-rt/src/arch/mod.rs diff --git a/src/platform/redox/redox-exec/src/arch/x86.rs b/redox-rt/src/arch/x86.rs similarity index 100% rename from src/platform/redox/redox-exec/src/arch/x86.rs rename to redox-rt/src/arch/x86.rs diff --git a/src/platform/redox/redox-exec/src/arch/x86_64.rs b/redox-rt/src/arch/x86_64.rs similarity index 98% rename from src/platform/redox/redox-exec/src/arch/x86_64.rs rename to redox-rt/src/arch/x86_64.rs index 17aef4568134fac53d2b35be8368efad7920d928..00bb7253b678f2b2c241ff87c30e8a38c6212f39 100644 --- a/src/platform/redox/redox-exec/src/arch/x86_64.rs +++ b/redox-rt/src/arch/x86_64.rs @@ -1,6 +1,6 @@ use syscall::error::*; -use crate::{fork_inner, FdGuard}; +use crate::proc::{fork_inner, FdGuard}; // Setup a stack starting from the very end of the address space, and then growing downwards. pub(crate) const STACK_TOP: usize = 1 << 47; diff --git a/redox-rt/src/lib.rs b/redox-rt/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..2bf6f31e70c1467ed918ad3fdc62e72a258896af --- /dev/null +++ b/redox-rt/src/lib.rs @@ -0,0 +1,12 @@ +#![no_std] +#![feature(array_chunks, int_roundings, let_chains, slice_ptr_get)] +#![forbid(unreachable_patterns)] + +extern crate alloc; + +pub mod arch; +pub mod proc; + +// TODO: Replace auxvs with a non-stack-based interface, but keep getauxval for compatibility +#[path = "../../src/platform/auxv_defs.rs"] +pub mod auxv_defs; diff --git a/src/platform/redox/redox-exec/src/lib.rs b/redox-rt/src/proc.rs similarity index 99% rename from src/platform/redox/redox-exec/src/lib.rs rename to redox-rt/src/proc.rs index 17f4a645885a5b91a2938e4cd6dbe820990a5bee..c6a820740cbc3fe50287398529d4e64e52a925d6 100644 --- a/src/platform/redox/redox-exec/src/lib.rs +++ b/redox-rt/src/proc.rs @@ -1,10 +1,5 @@ -#![no_std] -#![feature(array_chunks, int_roundings, let_chains, slice_ptr_get)] -#![forbid(unreachable_patterns)] - -extern crate alloc; - use core::mem::size_of; +use crate::{arch::*, auxv_defs::*}; use alloc::{boxed::Box, collections::BTreeMap, vec}; @@ -27,9 +22,6 @@ use syscall::{ PAGE_SIZE, PROT_EXEC, PROT_READ, PROT_WRITE, }; -pub use self::arch::*; -mod arch; - pub enum FexecResult { Normal { addrspace_handle: FdGuard, @@ -713,11 +705,6 @@ pub fn create_set_addr_space_buf( buf } -#[path = "../../../auxv_defs.rs"] -pub mod auxv_defs; - -use auxv_defs::*; - /// Spawns a new context which will not share the same address space as the current one. File /// descriptors from other schemes are reobtained with `dup`, and grants referencing such file /// descriptors are reobtained through `fmap`. Other mappings are kept but duplicated using CoW. @@ -732,7 +719,7 @@ pub fn fork_impl() -> Result<usize> { Ok(pid) } -fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { +pub fn fork_inner(initial_rsp: *mut usize) -> Result<usize> { let (cur_filetable_fd, new_pid_fd, new_pid); { diff --git a/src/platform/mod.rs b/src/platform/mod.rs index 9a5fbaa01e45ac47e4006b8c37397eed251162eb..f523842108253b0d2987d4d9dc971a444ddf914d 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -33,7 +33,7 @@ pub mod rlb; pub mod auxv_defs; #[cfg(target_os = "redox")] -pub use redox_exec::auxv_defs; +pub use redox_rt::auxv_defs; use self::types::*; pub mod types; diff --git a/src/platform/redox/clone.rs b/src/platform/redox/clone.rs index 336c0937cf7e2eedb60790373ccad1f482132b70..408e117e8ce1950c45fed19c4f6a195185f7ddb4 100644 --- a/src/platform/redox/clone.rs +++ b/src/platform/redox/clone.rs @@ -10,11 +10,11 @@ use syscall::{ use crate::sync::rwlock::Rwlock; use super::{ - extra::{create_set_addr_space_buf, FdGuard}, + extra::FdGuard, signal::sighandler_function, }; -pub use redox_exec::*; +pub use redox_rt::proc::*; static CLONE_LOCK: Rwlock = Rwlock::new(crate::pthread::Pshared::Private); diff --git a/src/platform/redox/exec.rs b/src/platform/redox/exec.rs index 4323242cadf480410e452ac69d925b9ffe8b5361..56f3093a408dec3410d8605c93c18bdb17231f26 100644 --- a/src/platform/redox/exec.rs +++ b/src/platform/redox/exec.rs @@ -9,7 +9,7 @@ use crate::{ }, }; -use redox_exec::{ExtraInfo, FdGuard, FexecResult}; +use redox_rt::proc::{ExtraInfo, FdGuard, FexecResult, InterpOverride}; use syscall::{data::Stat, error::*, flag::*}; fn fexec_impl( @@ -20,11 +20,11 @@ fn fexec_impl( envs: &[&[u8]], total_args_envs_size: usize, extrainfo: &ExtraInfo, - interp_override: Option<redox_exec::InterpOverride>, + interp_override: Option<InterpOverride>, ) -> Result<usize> { let memory = FdGuard::new(syscall::open("memory:", 0)?); - let addrspace_selection_fd = match redox_exec::fexec_impl( + let addrspace_selection_fd = match redox_rt::proc::fexec_impl( exec_file, open_via_dup, &memory, @@ -88,7 +88,7 @@ pub enum Executable<'a> { pub fn execve( exec: Executable<'_>, arg_env: ArgEnv, - interp_override: Option<redox_exec::InterpOverride>, + interp_override: Option<InterpOverride>, ) -> Result<usize> { // NOTE: We must omit O_CLOEXEC and close manually, otherwise it will be closed before we // have even read it! diff --git a/src/platform/redox/extra.rs b/src/platform/redox/extra.rs index 5dd09c274cc7e3ed56fa88eddc47d57b2ddca355..3c96933cddb71c456c94c146fedc7c908123dcdb 100644 --- a/src/platform/redox/extra.rs +++ b/src/platform/redox/extra.rs @@ -3,7 +3,7 @@ use core::{ptr, slice}; use crate::platform::{sys::e, types::*}; use syscall::{error::*, F_SETFD, F_SETFL}; -pub use redox_exec::*; +pub use redox_rt::proc::FdGuard; #[no_mangle] pub unsafe extern "C" fn redox_fpath(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t { diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 079031c28be96930eb1271699c8c2b6533de01bd..dae77e6d433bce81e8ec146d245e3e06ceff9967 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -27,7 +27,7 @@ use crate::{ pthread::{self, Errno, ResultExt}, }; -pub use redox_exec::FdGuard; +pub use redox_rt::proc::FdGuard; use super::{types::*, Pal, Read, ERRNO};