Merge branch 'on_demand_paging' into 'master'
Ensure stack does not remain as RWX! See merge request redox-os/bootstrap!4
This commit is contained in:
Generated
+7
-19
@@ -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",
|
||||
]
|
||||
|
||||
+5
-1
@@ -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" }
|
||||
|
||||
+3
-1
@@ -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]
|
||||
|
||||
+7
-6
@@ -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::<Vec<_>>()
|
||||
};
|
||||
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;
|
||||
}
|
||||
|
||||
+3
-1
@@ -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]
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
+5
-2
@@ -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),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user