Adapt clone_grant_using_fmap to fork and deprecate.
This commit is contained in:
7
Cargo.lock
generated
7
Cargo.lock
generated
@@ -6,6 +6,7 @@ version = 3
|
|||||||
name = "acid"
|
name = "acid"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"libc",
|
||||||
"redox_syscall 0.2.12 (git+https://gitlab.redox-os.org/redox-os/syscall.git)",
|
"redox_syscall 0.2.12 (git+https://gitlab.redox-os.org/redox-os/syscall.git)",
|
||||||
"strace",
|
"strace",
|
||||||
"x86",
|
"x86",
|
||||||
@@ -23,6 +24,12 @@ version = "1.3.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.126"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "raw-cpuid"
|
name = "raw-cpuid"
|
||||||
version = "10.3.0"
|
version = "10.3.0"
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ authors = ["Jeremy Soller <jackpot51@gmail.com>"]
|
|||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
x86 = "0.47.0"
|
libc = "0.2"
|
||||||
redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git" }
|
redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git" }
|
||||||
strace = { git = "https://gitlab.redox-os.org/redox-os/strace-redox", default-features = false }
|
strace = { git = "https://gitlab.redox-os.org/redox-os/strace-redox", default-features = false }
|
||||||
|
x86 = "0.47.0"
|
||||||
#strace = { path = "../../strace/source", default-features = false }
|
#strace = { path = "../../strace/source", default-features = false }
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// TODO: This is no longer implemented by the kernel. Should it be moved to resist?
|
||||||
|
|
||||||
use syscall::data::{Map, Packet};
|
use syscall::data::{Map, Packet};
|
||||||
use syscall::error::{Error, Result, EFAULT, EINVAL};
|
use syscall::error::{Error, Result, EFAULT, EINVAL};
|
||||||
use syscall::flag::{CloneFlags, MapFlags, O_CREAT, O_RDONLY, O_RDWR, O_CLOEXEC, WaitFlags};
|
use syscall::flag::{CloneFlags, MapFlags, O_CREAT, O_RDONLY, O_RDWR, O_CLOEXEC, WaitFlags};
|
||||||
@@ -28,7 +30,9 @@ impl Daemon {
|
|||||||
|
|
||||||
let [read_pipe, write_pipe] = pipes;
|
let [read_pipe, write_pipe] = pipes;
|
||||||
|
|
||||||
if unsafe { clone(CloneFlags::empty())? } == 0 {
|
let result = unsafe { libc::fork() };
|
||||||
|
|
||||||
|
if result == 0 {
|
||||||
let _ = close(read_pipe);
|
let _ = close(read_pipe);
|
||||||
|
|
||||||
f(Daemon {
|
f(Daemon {
|
||||||
@@ -36,7 +40,7 @@ impl Daemon {
|
|||||||
});
|
});
|
||||||
// TODO: Replace Infallible with the never type once it is stabilized.
|
// TODO: Replace Infallible with the never type once it is stabilized.
|
||||||
unreachable!();
|
unreachable!();
|
||||||
} else {
|
} else if result > 0 {
|
||||||
let _ = close(write_pipe);
|
let _ = close(write_pipe);
|
||||||
|
|
||||||
let mut data = [0];
|
let mut data = [0];
|
||||||
@@ -50,6 +54,8 @@ impl Daemon {
|
|||||||
} else {
|
} else {
|
||||||
Err(Error::new(EIO))
|
Err(Error::new(EIO))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return Err(Error::new(std::io::Error::last_os_error().raw_os_error().unwrap_or(EINVAL)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,24 +138,16 @@ fn inner(readonly: bool) -> Result<()> {
|
|||||||
|
|
||||||
let pid;
|
let pid;
|
||||||
unsafe {
|
unsafe {
|
||||||
pid = syscall::clone(CloneFlags::empty())?;
|
pid = libc::fork() as usize;
|
||||||
|
|
||||||
// Keep in mind these two constants may disappear in the near future.
|
assert_ne!(pid, (-1_isize) as usize);
|
||||||
const PML4_SIZE: usize = 0x0000_0080_0000_0000;
|
|
||||||
const USER_TMP_GRANT_OFFSET: usize = 7 * PML4_SIZE;
|
|
||||||
const USER_GRANT_OFFSET: usize = 2 * PML4_SIZE;
|
|
||||||
|
|
||||||
assert!((ptr as usize) >= USER_GRANT_OFFSET);
|
println!("Fork was successful, for the {} process", if pid == 0 { "child" } else { "parent" });
|
||||||
assert!((ptr as usize) <= USER_TMP_GRANT_OFFSET);
|
|
||||||
|
|
||||||
// Make sure the temporary addresses are not left after the kernel has cloned.
|
|
||||||
assert_eq!(syscall::virttophys((ptr as usize) - USER_GRANT_OFFSET + USER_TMP_GRANT_OFFSET), Err(Error::new(EFAULT)));
|
|
||||||
println!("Old memory was correctly unmapped, for the {} process", if pid == 0 { "child" } else { "parent" });
|
|
||||||
|
|
||||||
if pid == 0 {
|
if pid == 0 {
|
||||||
println!("Child process: checking...");
|
println!("Child process: checking...");
|
||||||
|
|
||||||
// We are the child process. Hopefully the kernel copied the grant properly and without
|
// We are the child process. Hopefully relibc copied the grant properly and without
|
||||||
// aliasing.
|
// aliasing.
|
||||||
if readonly {
|
if readonly {
|
||||||
assert_eq!(ptr.read_volatile(), 42);
|
assert_eq!(ptr.read_volatile(), 42);
|
||||||
|
|||||||
Reference in New Issue
Block a user