diff --git a/Cargo.lock b/Cargo.lock index bd5dd9446a..6cb2650de8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,12 +24,6 @@ dependencies = [ "redox_syscall", ] -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - [[package]] name = "goblin" version = "0.0.21" @@ -52,9 +46,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ "autocfg", "scopeguard", @@ -62,12 +56,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "plain" @@ -96,7 +87,6 @@ dependencies = [ [[package]] name = "redox-exec" version = "0.1.0" -source = "git+https://gitlab.redox-os.org/redox-os/relibc.git#38576a37abfd7ac5ceb6b52ceea97368c3ad91fd" dependencies = [ "goblin", "plain", @@ -113,9 +103,7 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da878fa5823593d85e75e0f702fdf2ae5de760b9b4e3ee4ef1b133b7d989360f" +version = "0.3.5" dependencies = [ "bitflags", ] @@ -173,9 +161,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "spinning_top" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75adad84ee84b521fb2cca2d4fd0f1dab1d8d026bda3c5bea4ca63b5f9f9293c" +checksum = "5b9eb1a2f4c41445a3a0ff9abc5221c5fcd28e1f13cd7c0397706f9ac938ddb0" dependencies = [ "lock_api", ] diff --git a/Cargo.toml b/Cargo.toml index 685b584fa4..dd06e45b9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,8 @@ crate-type = ["staticlib"] [dependencies] linked_list_allocator = "0.9" redox-initfs = { git = "https://gitlab.redox-os.org/redox-os/redox-initfs.git", features = ["kernel"], 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-exec = { path = "../../../../relibc/src/platform/redox/redox-exec" } redox_syscall = "0.3.2" [profile.release] @@ -20,3 +21,6 @@ panic = "abort" [profile.dev] panic = "abort" + +[patch.crates-io] +redox_syscall = { path = "../../kernel/source/syscall" } diff --git a/src/aarch64.rs b/src/aarch64.rs index 52257fb495..3726cdc41e 100644 --- a/src/aarch64.rs +++ b/src/aarch64.rs @@ -5,6 +5,8 @@ use syscall::{ number::SYS_FMAP, }; +pub const STACK_START: usize = 0x0000_8000_0000_0000 - STACK_SIZE; + const STACK_SIZE: usize = 64 * 1024; // 64 KiB static MAP: Map = Map { offset: 0, @@ -13,7 +15,7 @@ static MAP: Map = Map { .union(MapFlags::PROT_WRITE) .union(MapFlags::MAP_PRIVATE) .union(MapFlags::MAP_FIXED_NOREPLACE), - address: 0x0000_8000_0000_0000 - STACK_SIZE, // highest possible user address + address: STACK_START, // highest possible user address }; #[naked] diff --git a/src/exec.rs b/src/exec.rs index c0587cc85d..8008d9f243 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -1,6 +1,7 @@ use alloc::borrow::ToOwned; use alloc::vec::Vec; +use syscall::{Error, EINTR}; use syscall::flag::{O_CLOEXEC, O_RDONLY}; use redox_exec::*; @@ -45,11 +46,6 @@ pub fn main() -> ! { iter().map(|var| var.to_owned()).collect::>() }; unsafe { - use syscall::flag::MapFlags; - // XXX: It may be a little unsafe to mprotect this after relibc has started, but since only - // the bootloader can influence the data we use, it should be fine security-wise. - let _ = syscall::mprotect(initfs_offset, initfs_length, MapFlags::PROT_READ | MapFlags::MAP_PRIVATE).expect("mprotect failed for initfs"); - spawn_initfs(initfs_offset, initfs_length); } const CWD: &[u8] = b"initfs:"; @@ -86,7 +82,12 @@ unsafe fn spawn_initfs(initfs_start: usize, initfs_length: usize) { // Return in order to execute init, as the parent. Ok(_) => { let _ = syscall::close(write); - let _ = syscall::read(read, &mut [0]); + loop { + match syscall::read(read, &mut [0]) { + Err(Error { errno: EINTR }) => continue, + _ => break, + } + } return; } diff --git a/src/i686.rs b/src/i686.rs index 1c73d45293..f5b46c9b7d 100644 --- a/src/i686.rs +++ b/src/i686.rs @@ -6,6 +6,8 @@ use syscall::{ }; const STACK_SIZE: usize = 64 * 1024; // 64 KiB +pub const STACK_START: usize = 0x8000_0000 - STACK_SIZE; + static MAP: Map = Map { offset: 0, size: STACK_SIZE, @@ -13,7 +15,7 @@ static MAP: Map = Map { .union(MapFlags::PROT_WRITE) .union(MapFlags::MAP_PRIVATE) .union(MapFlags::MAP_FIXED_NOREPLACE), - address: 0x8000_0000 - STACK_SIZE, // highest possible user address + address: STACK_START, // highest possible user address }; #[naked] diff --git a/src/start.rs b/src/start.rs index 12ea3b195f..c05980865c 100644 --- a/src/start.rs +++ b/src/start.rs @@ -37,9 +37,13 @@ pub unsafe extern "C" fn start() -> ! { let _ = syscall::open("debug:", syscall::O_WRONLY); // stdout let _ = syscall::open("debug:", syscall::O_WRONLY); // stderr + // TODO: PROT_NONE + let _ = syscall::mprotect(0, 4096, MapFlags::PROT_READ | MapFlags::MAP_PRIVATE).expect("mprotect failed for NULL page"); + let _ = syscall::mprotect(text_start, text_end - text_start, MapFlags::PROT_READ | MapFlags::PROT_EXEC | MapFlags::MAP_PRIVATE).expect("mprotect failed for .text"); let _ = syscall::mprotect(rodata_start, rodata_end - rodata_start, MapFlags::PROT_READ | MapFlags::MAP_PRIVATE).expect("mprotect failed for .rodata"); let _ = syscall::mprotect(data_start, data_end - data_start, MapFlags::PROT_READ | MapFlags::PROT_WRITE | MapFlags::MAP_PRIVATE).expect("mprotect failed for .data/.bss"); + let _ = syscall::mprotect(data_end, crate::arch::STACK_START - data_end, MapFlags::PROT_READ | MapFlags::MAP_PRIVATE).expect("mprotect failed for rest of memory"); crate::exec::main(); } diff --git a/src/x86_64.rs b/src/x86_64.rs index 9ca5018afc..cb6cef71c0 100644 --- a/src/x86_64.rs +++ b/src/x86_64.rs @@ -6,6 +6,9 @@ use syscall::{ }; const STACK_SIZE: usize = 64 * 1024; // 64 KiB + +pub const STACK_START: usize = 0x0000_8000_0000_0000 - STACK_SIZE; + static MAP: Map = Map { offset: 0, size: STACK_SIZE, @@ -13,7 +16,7 @@ static MAP: Map = Map { .union(MapFlags::PROT_WRITE) .union(MapFlags::MAP_PRIVATE) .union(MapFlags::MAP_FIXED_NOREPLACE), - address: 0x0000_8000_0000_0000 - STACK_SIZE, // highest possible user address + address: STACK_START, // highest possible user address }; #[naked] @@ -50,4 +53,4 @@ pub unsafe extern "C" fn ustart() { stack_size = const STACK_SIZE, options(noreturn), ); -} \ No newline at end of file +}