Merge branch 'userspace_fexec' into 'master'
Userspace fexec See merge request redox-os/drivers!81
This commit is contained in:
Generated
+27
-3
@@ -11,6 +11,7 @@ dependencies = [
|
||||
"num-traits",
|
||||
"parking_lot 0.11.2",
|
||||
"plain",
|
||||
"redox-daemon",
|
||||
"redox-log",
|
||||
"redox_syscall",
|
||||
"thiserror",
|
||||
@@ -25,6 +26,7 @@ dependencies = [
|
||||
"byteorder 1.4.3",
|
||||
"log",
|
||||
"partitionlib",
|
||||
"redox-daemon",
|
||||
"redox-log",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -35,6 +37,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"netutils",
|
||||
"redox-daemon",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -105,6 +108,7 @@ name = "bgad"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"orbclient",
|
||||
"redox-daemon",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
@@ -287,6 +291,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"netutils",
|
||||
"redox-daemon",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -453,6 +458,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"log",
|
||||
"redox-daemon",
|
||||
"redox-log",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
@@ -489,6 +495,7 @@ version = "1.0.0"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"netutils",
|
||||
"redox-daemon",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -616,7 +623,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "netutils"
|
||||
version = "0.1.0"
|
||||
source = "git+https://gitlab.redox-os.org/redox-os/netutils.git?branch=redox-unix#55c55eb6452ee886dfd81f1cbb7f9ec45012d95e"
|
||||
source = "git+https://gitlab.redox-os.org/redox-os/netutils.git?branch=redox-unix#a55df137538fabadea2eff74153ac0b8d3ce3dcf"
|
||||
dependencies = [
|
||||
"arg_parser",
|
||||
"extra",
|
||||
@@ -695,6 +702,7 @@ dependencies = [
|
||||
"log",
|
||||
"partitionlib",
|
||||
"pcid",
|
||||
"redox-daemon",
|
||||
"redox-log",
|
||||
"redox_syscall",
|
||||
"smallvec 1.9.0",
|
||||
@@ -850,6 +858,7 @@ dependencies = [
|
||||
name = "pcspkrd"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"redox-daemon",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
@@ -916,6 +925,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"orbclient",
|
||||
"redox-daemon",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
@@ -1085,6 +1095,16 @@ dependencies = [
|
||||
"rand_core 0.3.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox-daemon"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "21e31c834277709c7ff3eb74959fe62be4b45b1189ba9d41fd3744cd3a9c554f"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox-log"
|
||||
version = "0.1.1"
|
||||
@@ -1108,8 +1128,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.2.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
|
||||
source = "git+https://gitlab.redox-os.org/4lDO2/syscall.git?branch=userspace_fexec#d6af266119e7b4a3b0e9a04c63b3cfcfac94781a"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
@@ -1129,6 +1148,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"netutils",
|
||||
"redox-daemon",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -1480,6 +1500,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"plain",
|
||||
"redox-daemon",
|
||||
"redox_syscall",
|
||||
"thiserror",
|
||||
"xhcid",
|
||||
@@ -1511,6 +1532,7 @@ name = "vboxd"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"orbclient",
|
||||
"redox-daemon",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -1539,6 +1561,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"orbclient",
|
||||
"ransid",
|
||||
"redox-daemon",
|
||||
"redox_syscall",
|
||||
"rusttype",
|
||||
]
|
||||
@@ -1678,6 +1701,7 @@ dependencies = [
|
||||
"log",
|
||||
"pcid",
|
||||
"plain",
|
||||
"redox-daemon",
|
||||
"redox-log",
|
||||
"redox_event",
|
||||
"redox_syscall",
|
||||
|
||||
@@ -25,3 +25,4 @@ members = [
|
||||
mio = { git = "https://gitlab.redox-os.org/redox-os/mio.git", branch = "redox-unix" }
|
||||
net2 = { git = "https://gitlab.redox-os.org/redox-os/net2-rs.git", branch = "master" }
|
||||
orbclient = { git = "https://gitlab.redox-os.org/redox-os/orbclient.git", version = "0.3.28" }
|
||||
redox_syscall = { git = "https://gitlab.redox-os.org/4lDO2/syscall.git", branch = "userspace_fexec" }
|
||||
|
||||
@@ -12,6 +12,7 @@ num-derive = "0.3"
|
||||
num-traits = "0.2"
|
||||
parking_lot = "0.11.1"
|
||||
plain = "0.2.3"
|
||||
redox-daemon = "0.1"
|
||||
redox-log = "0.1.1"
|
||||
redox_syscall = "0.2.16"
|
||||
thiserror = "1"
|
||||
|
||||
+7
-24
@@ -79,7 +79,7 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
|
||||
}
|
||||
}
|
||||
|
||||
fn daemon(mut write_part: File) {
|
||||
fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
setup_logging();
|
||||
|
||||
let rxsdt_raw_data: Arc<[u8]> = std::fs::read("kernel/acpi:rxsdt")
|
||||
@@ -135,8 +135,7 @@ fn daemon(mut write_part: File) {
|
||||
.open(":acpi")
|
||||
.expect("acpid: failed to open scheme socket");
|
||||
|
||||
write_part.write_all(&[0]).expect("acpid: failed to write to sync pipe");
|
||||
drop(write_part);
|
||||
daemon.ready().expect("acpid: failed to notify parent");
|
||||
|
||||
syscall::setrens(0, 0).expect("acpid: failed to enter null namespace");
|
||||
|
||||
@@ -163,14 +162,14 @@ fn daemon(mut write_part: File) {
|
||||
match scheme_socket.read(&mut packet) {
|
||||
Ok(0) => {
|
||||
log::info!("Terminating acpid driver, without shutting down the main system.");
|
||||
return;
|
||||
break 'events;
|
||||
}
|
||||
Ok(n) => break 'eintr1 n,
|
||||
Err(error) if error.kind() == io::ErrorKind::Interrupted => continue 'eintr1,
|
||||
Err(error) if error.kind() == io::ErrorKind::WouldBlock => break 'packets,
|
||||
Err(other) => {
|
||||
log::error!("failed to read from scheme socket: {}", other);
|
||||
return;
|
||||
break 'events;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -185,14 +184,14 @@ fn daemon(mut write_part: File) {
|
||||
match scheme_socket.write(&packet) {
|
||||
Ok(0) => {
|
||||
log::info!("Terminating acpid driver, without shutting down the main system.");
|
||||
return;
|
||||
break 'events;
|
||||
}
|
||||
Ok(n) => break 'eintr2 n,
|
||||
Err(error) if error.kind() == io::ErrorKind::Interrupted => continue 'eintr2,
|
||||
Err(error) if error.kind() == io::ErrorKind::WouldBlock => break 'packets,
|
||||
Err(other) => {
|
||||
log::error!("failed to read from scheme socket: {}", other);
|
||||
return;
|
||||
break 'events;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -222,21 +221,5 @@ fn daemon(mut write_part: File) {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut pipes = [0; 2];
|
||||
syscall::pipe2(&mut pipes, 0).expect("acpid: failed to create synchronization pipe");
|
||||
|
||||
let mut read_part = unsafe { File::from_raw_fd(pipes[0] as RawFd) };
|
||||
let mut write_part = unsafe { File::from_raw_fd(pipes[1] as RawFd) };
|
||||
|
||||
if unsafe { syscall::clone(syscall::CloneFlags::empty()).expect("failed to daemonize acpid") } == 0 {
|
||||
drop(read_part);
|
||||
daemon(write_part);
|
||||
} else {
|
||||
drop(write_part);
|
||||
|
||||
let mut res = [0];
|
||||
let bytes_read = read_part.read_exact(&mut res).expect("acpid: failed to read from sync pipe");
|
||||
|
||||
std::process::exit(res[0].into());
|
||||
}
|
||||
redox_daemon::Daemon::new(daemon).expect("acpid: failed to daemonize");
|
||||
}
|
||||
|
||||
+2
-1
@@ -8,6 +8,7 @@ bitflags = "1.2"
|
||||
byteorder = "1.2"
|
||||
log = "0.4"
|
||||
partitionlib = { git = "https://gitlab.redox-os.org/redox-os/partitionlib.git" }
|
||||
redox-daemon = "0.1"
|
||||
redox-log = "0.1"
|
||||
redox_syscall = "0.2.12"
|
||||
redox_syscall = { git = "https://gitlab.redox-os.org/4lDO2/syscall.git", branch = "userspace_fexec" }
|
||||
block-io-wrapper = { path = "../block-io-wrapper" }
|
||||
|
||||
+10
-7
@@ -8,7 +8,7 @@ use std::os::unix::io::{FromRawFd, RawFd};
|
||||
|
||||
use syscall::error::{Error, ENODEV};
|
||||
use syscall::data::{Event, Packet};
|
||||
use syscall::flag::{CloneFlags, EVENT_READ, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::flag::{EVENT_READ, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::scheme::SchemeBlockMut;
|
||||
|
||||
use log::{error, info};
|
||||
@@ -64,6 +64,10 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
redox_daemon::Daemon::new(daemon).expect("ahcid: failed to daemonize");
|
||||
}
|
||||
|
||||
fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
let mut args = env::args().skip(1);
|
||||
|
||||
let mut name = args.next().expect("ahcid: no name provided");
|
||||
@@ -78,17 +82,12 @@ fn main() {
|
||||
let irq_str = args.next().expect("ahcid: no irq provided");
|
||||
let irq = irq_str.parse::<u8>().expect("ahcid: failed to parse irq");
|
||||
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } != 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
let _logger_ref = setup_logging();
|
||||
|
||||
info!(" + AHCI {} on: {:X} size: {} IRQ: {}", name, bar, bar_size, irq);
|
||||
|
||||
let address = unsafe {
|
||||
syscall::physmap(bar, bar_size, PHYSMAP_WRITE | PHYSMAP_NO_CACHE)
|
||||
syscall::physmap(bar, (bar_size+4095)/4096*4096, PHYSMAP_WRITE | PHYSMAP_NO_CACHE)
|
||||
.expect("ahcid: failed to map address")
|
||||
};
|
||||
{
|
||||
@@ -109,6 +108,8 @@ fn main() {
|
||||
|
||||
syscall::setrens(0, 0).expect("ahcid: failed to enter null namespace");
|
||||
|
||||
daemon.ready().expect("ahcid: failed to notify parent");
|
||||
|
||||
event_file.write(&Event {
|
||||
id: socket_fd,
|
||||
flags: EVENT_READ,
|
||||
@@ -198,4 +199,6 @@ fn main() {
|
||||
}
|
||||
}
|
||||
unsafe { let _ = syscall::physunmap(address); }
|
||||
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
@@ -8,3 +8,4 @@ bitflags = "1"
|
||||
netutils = { git = "https://gitlab.redox-os.org/redox-os/netutils.git", branch = "redox-unix" }
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
+6
-4
@@ -15,7 +15,7 @@ use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
||||
use std::sync::Arc;
|
||||
|
||||
use event::EventQueue;
|
||||
use syscall::{CloneFlags, EventFlags, Packet, SchemeMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::{EventFlags, Packet, SchemeMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::error::EWOULDBLOCK;
|
||||
|
||||
pub mod device;
|
||||
@@ -35,11 +35,12 @@ fn main() {
|
||||
print!("{}", format!(" + ALX {} on: {:X}, IRQ: {}\n", name, bar, irq));
|
||||
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } == 0
|
||||
{
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
let socket_fd = syscall::open(":network", syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK).expect("alxd: failed to create network scheme");
|
||||
let socket = Arc::new(RefCell::new(unsafe { File::from_raw_fd(socket_fd as RawFd) }));
|
||||
|
||||
daemon.ready().expect("alxd: failed to signal readiness");
|
||||
|
||||
let mut irq_file = File::open(format!("irq:{}", irq)).expect("alxd: failed to open IRQ file");
|
||||
|
||||
let address = unsafe { syscall::physmap(bar, 128*1024, PHYSMAP_WRITE | PHYSMAP_NO_CACHE).expect("alxd: failed to map address") };
|
||||
@@ -141,5 +142,6 @@ fn main() {
|
||||
}
|
||||
}
|
||||
unsafe { let _ = syscall::physunmap(address); }
|
||||
}
|
||||
std::process::exit(0);
|
||||
}).expect("alxd: failed to daemonize");
|
||||
}
|
||||
|
||||
@@ -5,4 +5,5 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
orbclient = "0.3.27"
|
||||
redox-daemon = "0.1"
|
||||
redox_syscall = "0.2.12"
|
||||
|
||||
+5
-4
@@ -9,7 +9,6 @@ use std::io::{Read, Write};
|
||||
|
||||
use syscall::call::iopl;
|
||||
use syscall::data::Packet;
|
||||
use syscall::flag::CloneFlags;
|
||||
use syscall::scheme::SchemeMut;
|
||||
|
||||
use crate::bga::Bga;
|
||||
@@ -29,8 +28,7 @@ fn main() {
|
||||
|
||||
print!("{}", format!(" + BGA {} on: {:X}\n", name, bar));
|
||||
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } == 0 {
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
unsafe { iopl(3).unwrap() };
|
||||
|
||||
let mut socket = File::create(":bga").expect("bgad: failed to create bga scheme");
|
||||
@@ -45,6 +43,8 @@ fn main() {
|
||||
|
||||
syscall::setrens(0, 0).expect("bgad: failed to enter null namespace");
|
||||
|
||||
daemon.ready().expect("bgad: failed to notify parent");
|
||||
|
||||
loop {
|
||||
let mut packet = Packet::default();
|
||||
if socket.read(&mut packet).expect("bgad: failed to read events from bga scheme") == 0 {
|
||||
@@ -53,5 +53,6 @@ fn main() {
|
||||
scheme.handle(&mut packet);
|
||||
socket.write(&packet).expect("bgad: failed to write responses to bga scheme");
|
||||
}
|
||||
}
|
||||
std::process::exit(0);
|
||||
}).expect("bgad: failed to daemonize");
|
||||
}
|
||||
|
||||
@@ -6,5 +6,6 @@ edition = "2018"
|
||||
[dependencies]
|
||||
bitflags = "1"
|
||||
netutils = { git = "https://gitlab.redox-os.org/redox-os/netutils.git", branch = "redox-unix" }
|
||||
redox-daemon = "0.1"
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox_syscall = "0.2.12"
|
||||
|
||||
+2
-2
@@ -10,7 +10,7 @@ use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
||||
use std::sync::Arc;
|
||||
|
||||
use event::EventQueue;
|
||||
use syscall::{CloneFlags, EventFlags, Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::{EventFlags, Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
|
||||
pub mod device;
|
||||
|
||||
@@ -74,7 +74,7 @@ fn main() {
|
||||
|
||||
eprintln!(" + E1000 {} on: {:X} size: {} IRQ: {}", name, bar, bar_size, irq);
|
||||
|
||||
syscall::Daemon::new(move |daemon| {
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
let socket_fd = syscall::open(
|
||||
":network",
|
||||
syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK,
|
||||
|
||||
@@ -6,6 +6,7 @@ edition = "2018"
|
||||
[dependencies]
|
||||
bitflags = "1"
|
||||
log = "0.4"
|
||||
redox-daemon = "0.1"
|
||||
redox-log = "0.1"
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox_syscall = "0.2.12"
|
||||
|
||||
+5
-3
@@ -9,7 +9,7 @@ use std::{env, usize};
|
||||
use std::fs::File;
|
||||
use std::io::{ErrorKind, Read, Write, Result};
|
||||
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
||||
use syscall::{CloneFlags, PHYSMAP_NO_CACHE, PHYSMAP_WRITE, Packet, SchemeBlockMut, EventFlags};
|
||||
use syscall::{PHYSMAP_NO_CACHE, PHYSMAP_WRITE, Packet, SchemeBlockMut, EventFlags};
|
||||
use std::cell::RefCell;
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -93,7 +93,7 @@ fn main() {
|
||||
print!("{}", format!(" + ihda {} on: {:X} size: {} IRQ: {}\n", name, bar, bar_size, irq));
|
||||
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } == 0 {
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
let _logger_ref = setup_logging();
|
||||
|
||||
let address = unsafe {
|
||||
@@ -108,6 +108,7 @@ fn main() {
|
||||
let device = Arc::new(RefCell::new(unsafe { hda::IntelHDA::new(address, vend_prod).expect("ihdad: failed to allocate device") }));
|
||||
let socket_fd = syscall::open(":hda", syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK).expect("IHDA: failed to create hda scheme");
|
||||
let socket = Arc::new(RefCell::new(unsafe { File::from_raw_fd(socket_fd as RawFd) }));
|
||||
daemon.ready().expect("IHDA: failed to signal readiness");
|
||||
|
||||
let mut event_queue = EventQueue::<usize>::new().expect("IHDA: Could not create event queue.");
|
||||
|
||||
@@ -220,5 +221,6 @@ fn main() {
|
||||
}
|
||||
|
||||
unsafe { let _ = syscall::physunmap(address); }
|
||||
}
|
||||
std::process::exit(0);
|
||||
}).expect("IHDA: failed to daemonize");
|
||||
}
|
||||
|
||||
@@ -7,3 +7,4 @@ bitflags = "1.0"
|
||||
netutils = { git = "https://gitlab.redox-os.org/redox-os/netutils.git", branch = "redox-unix" }
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
+6
-4
@@ -11,7 +11,7 @@ use std::{env, thread};
|
||||
|
||||
use event::EventQueue;
|
||||
use std::time::Duration;
|
||||
use syscall::{CloneFlags, EventFlags, Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::{EventFlags, Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
|
||||
pub mod device;
|
||||
#[rustfmt::skip]
|
||||
@@ -76,8 +76,7 @@ fn main() {
|
||||
|
||||
println!(" + IXGBE {} on: {:X} IRQ: {}", name, bar, irq);
|
||||
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } == 0 {
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
let socket_fd = syscall::open(
|
||||
":network",
|
||||
syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK,
|
||||
@@ -87,6 +86,8 @@ fn main() {
|
||||
File::from_raw_fd(socket_fd as RawFd)
|
||||
}));
|
||||
|
||||
daemon.ready().expect("ixgbed: failed to signal readiness");
|
||||
|
||||
let mut irq_file =
|
||||
File::open(format!("irq:{}", irq)).expect("ixgbed: failed to open IRQ file");
|
||||
|
||||
@@ -197,7 +198,8 @@ fn main() {
|
||||
unsafe {
|
||||
let _ = syscall::physunmap(address);
|
||||
}
|
||||
}
|
||||
std::process::exit(0);
|
||||
}).expect("ixgbed: failed to daemonize");
|
||||
|
||||
thread::sleep(Duration::from_secs(20));
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ bitflags = "1"
|
||||
crossbeam-channel = "0.4"
|
||||
futures = "0.3"
|
||||
log = "0.4"
|
||||
redox-daemon = "0.1"
|
||||
redox-log = "0.1"
|
||||
redox_syscall = "0.2.12"
|
||||
partitionlib = { git = "https://gitlab.redox-os.org/redox-os/partitionlib.git" }
|
||||
|
||||
+8
-6
@@ -10,7 +10,7 @@ use std::{slice, usize};
|
||||
|
||||
use pcid_interface::{PciBar, PciFeature, PciFeatureInfo, PciFunction, PcidServerHandle};
|
||||
use syscall::{
|
||||
CloneFlags, Event, Mmio, Packet, Result, SchemeBlockMut, PHYSMAP_NO_CACHE,
|
||||
Event, Mmio, Packet, Result, SchemeBlockMut, PHYSMAP_NO_CACHE,
|
||||
PHYSMAP_WRITE,
|
||||
};
|
||||
use redox_log::{OutputBuilder, RedoxLogger};
|
||||
@@ -280,11 +280,9 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } != 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
redox_daemon::Daemon::new(daemon).expect("nvmed: failed to daemonize");
|
||||
}
|
||||
fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
let _logger_ref = setup_logging();
|
||||
|
||||
let mut pcid_handle =
|
||||
@@ -334,6 +332,8 @@ fn main() {
|
||||
)
|
||||
.expect("nvmed: failed to create disk scheme");
|
||||
|
||||
daemon.ready().expect("nvmed: failed to signal readiness");
|
||||
|
||||
syscall::write(
|
||||
event_fd,
|
||||
&syscall::Event {
|
||||
@@ -406,4 +406,6 @@ fn main() {
|
||||
|
||||
//TODO: destroy NVMe stuff
|
||||
reactor_thread.join().expect("nvmed: failed to join reactor thread");
|
||||
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
@@ -468,6 +468,9 @@ fn handle_parsed_header(state: Arc<State>, config: &Config, bus_num: u8,
|
||||
capabilities,
|
||||
};
|
||||
let thread = thread::spawn(move || {
|
||||
// RFLAGS are no longer kept in the relibc clone() implementation.
|
||||
unsafe { syscall::iopl(3).expect("pcid: failed to set IOPL"); }
|
||||
|
||||
driver_handler.handle_spawn(pcid_to_client_write, pcid_from_client_read, subdriver_args);
|
||||
});
|
||||
match child.wait() {
|
||||
|
||||
@@ -6,3 +6,4 @@ edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
+6
-5
@@ -6,24 +6,25 @@ use std::io::{Read, Write};
|
||||
|
||||
use syscall::call::iopl;
|
||||
use syscall::data::Packet;
|
||||
use syscall::flag::CloneFlags;
|
||||
use syscall::scheme::SchemeMut;
|
||||
|
||||
use redox_daemon::Daemon;
|
||||
|
||||
use self::pcspkr::Pcspkr;
|
||||
use self::scheme::PcspkrScheme;
|
||||
|
||||
fn main() {
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } == 0 {
|
||||
Daemon::new(move |daemon| {
|
||||
unsafe { iopl(3).unwrap() };
|
||||
|
||||
let mut socket = File::create(":pcspkr").expect("pcspkrd: failed to create pcspkr scheme");
|
||||
daemon.ready().expect("failed to notify parent");
|
||||
|
||||
let pcspkr = Pcspkr::new();
|
||||
println!(" + pcspkr");
|
||||
|
||||
let mut scheme = PcspkrScheme {
|
||||
pcspkr: pcspkr,
|
||||
pcspkr,
|
||||
handle: None,
|
||||
next_id: 0,
|
||||
};
|
||||
@@ -40,5 +41,5 @@ fn main() {
|
||||
.write(&packet)
|
||||
.expect("pcspkrd: failed to write responses to pcspkr scheme");
|
||||
}
|
||||
}
|
||||
}).expect("pcspkrd: failed to daemonize");
|
||||
}
|
||||
|
||||
@@ -7,3 +7,4 @@ edition = "2018"
|
||||
bitflags = "1"
|
||||
orbclient = "0.3.27"
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
+2
-2
@@ -20,7 +20,7 @@ mod keymap;
|
||||
mod state;
|
||||
mod vm;
|
||||
|
||||
fn daemon(daemon: syscall::Daemon) -> core::convert::Infallible {
|
||||
fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
unsafe {
|
||||
iopl(3).expect("ps2d: failed to get I/O permission");
|
||||
}
|
||||
@@ -124,5 +124,5 @@ fn daemon(daemon: syscall::Daemon) -> core::convert::Infallible {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
syscall::Daemon::new(daemon).expect("ps2d: failed to create daemon");
|
||||
redox_daemon::Daemon::new(daemon).expect("ps2d: failed to create daemon");
|
||||
}
|
||||
|
||||
@@ -8,3 +8,4 @@ bitflags = "1"
|
||||
netutils = { git = "https://gitlab.redox-os.org/redox-os/netutils.git", branch = "redox-unix" }
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
@@ -10,7 +10,7 @@ use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
|
||||
use std::sync::Arc;
|
||||
|
||||
use event::EventQueue;
|
||||
use syscall::{CloneFlags, EventFlags, Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::{EventFlags, Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
|
||||
pub mod device;
|
||||
|
||||
@@ -74,7 +74,7 @@ fn main() {
|
||||
|
||||
eprintln!(" + RTL8168 {} on: {:X} size: {} IRQ: {}", name, bar, bar_size, irq);
|
||||
|
||||
syscall::Daemon::new(move |daemon| {
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
let socket_fd = syscall::open(
|
||||
":network",
|
||||
syscall::O_RDWR | syscall::O_CREAT | syscall::O_NONBLOCK,
|
||||
|
||||
@@ -10,6 +10,7 @@ license = "MIT"
|
||||
[dependencies]
|
||||
base64 = "0.11" # Only for debugging
|
||||
plain = "0.2"
|
||||
redox-daemon = "0.1"
|
||||
redox_syscall = "0.2.12"
|
||||
thiserror = "1"
|
||||
xhcid = { path = "../xhcid" }
|
||||
|
||||
@@ -3,7 +3,7 @@ use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
use std::os::unix::io::{FromRawFd, RawFd};
|
||||
|
||||
use syscall::{CloneFlags, Packet, SchemeMut};
|
||||
use syscall::{Packet, SchemeMut};
|
||||
use xhcid_interface::{ConfigureEndpointsReq, DeviceReqData, XhciClientHandle};
|
||||
|
||||
pub mod protocol;
|
||||
@@ -36,16 +36,15 @@ fn main() {
|
||||
scheme, port, protocol
|
||||
);
|
||||
|
||||
// Daemonize so that xhcid can continue to do other useful work (until proper IRQs,
|
||||
// async-await, and multithreading :D)
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } != 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
redox_daemon::Daemon::new(move |d| daemon(d, scheme, port, protocol)).expect("usbscsid: failed to daemonize");
|
||||
}
|
||||
fn daemon(daemon: redox_daemon::Daemon, scheme: String, port: usize, protocol: u8) -> ! {
|
||||
let disk_scheme_name = format!(":disk/{}-{}_scsi", scheme, port);
|
||||
|
||||
// TODO: Use eventfds.
|
||||
let handle = XhciClientHandle::new(scheme, port);
|
||||
let handle = XhciClientHandle::new(scheme.to_owned(), port);
|
||||
|
||||
daemon.ready().expect("usbscsid: failed to signal rediness");
|
||||
|
||||
let desc = handle
|
||||
.get_standard_descs()
|
||||
@@ -111,4 +110,6 @@ fn main() {
|
||||
.write(&packet)
|
||||
.expect("scsid: failed to write packet");
|
||||
}
|
||||
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
@@ -7,3 +7,4 @@ edition = "2018"
|
||||
orbclient = "0.3.27"
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
+7
-3
@@ -11,7 +11,7 @@ use std::fs::File;
|
||||
use std::io::{Result, Read, Write};
|
||||
|
||||
use syscall::call::iopl;
|
||||
use syscall::flag::{CloneFlags, EventFlags, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::flag::{EventFlags, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::io::{Dma, Io, Mmio, Pio};
|
||||
|
||||
use crate::bga::Bga;
|
||||
@@ -199,7 +199,9 @@ fn main() {
|
||||
print!("{}", format!(" + VirtualBox {} on: {:X}, {:X}, IRQ {}\n", name, bar0, bar1, irq));
|
||||
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } == 0 {
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
daemon.ready().expect("failed to signal readiness");
|
||||
|
||||
unsafe { iopl(3).expect("vboxd: failed to get I/O permission"); };
|
||||
|
||||
let mut width = 0;
|
||||
@@ -295,5 +297,7 @@ fn main() {
|
||||
event_queue.run().expect("vboxd: failed to run event loop");
|
||||
}
|
||||
unsafe { let _ = syscall::physunmap(address); }
|
||||
}
|
||||
|
||||
std::process::exit(0);
|
||||
}).expect("vboxd: failed to daemonize");
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ orbclient = "0.3.27"
|
||||
ransid = "0.4"
|
||||
rusttype = { version = "0.2", optional = true }
|
||||
redox_syscall = "0.2.12"
|
||||
redox-daemon = "0.1"
|
||||
|
||||
[features]
|
||||
default = []
|
||||
|
||||
+76
-92
@@ -46,105 +46,89 @@ fn main() {
|
||||
|
||||
println!("vesad: {}x{} at 0x{:X}", width, height, physbaseptr);
|
||||
|
||||
if physbaseptr > 0 {
|
||||
// Daemonize
|
||||
let mut pipes = [0; 2];
|
||||
syscall::pipe2(&mut pipes, 0).unwrap();
|
||||
let mut read = unsafe { File::from_raw_fd(pipes[0] as RawFd) };
|
||||
let mut write = unsafe { File::from_raw_fd(pipes[1] as RawFd) };
|
||||
let pid = unsafe { syscall::clone(syscall::CloneFlags::empty()).unwrap() };
|
||||
if pid != 0 {
|
||||
drop(write);
|
||||
if physbaseptr == 0 {
|
||||
return;
|
||||
}
|
||||
redox_daemon::Daemon::new(|daemon| inner(daemon, width, height, physbaseptr, &spec)).expect("failed to create daemon");
|
||||
}
|
||||
fn inner(daemon: redox_daemon::Daemon, width: usize, height: usize, physbaseptr: usize, spec: &[bool]) -> ! {
|
||||
let mut socket = File::create(":display").expect("vesad: failed to create display scheme");
|
||||
|
||||
let mut res = [0];
|
||||
if read.read(&mut res).unwrap() == res.len() {
|
||||
process::exit(res[0] as i32);
|
||||
} else {
|
||||
eprintln!("vesad: daemon pipe EOF");
|
||||
process::exit(1);
|
||||
}
|
||||
let size = width * height;
|
||||
//TODO: Remap on resize
|
||||
let largest_size = 8 * 1024 * 1024;
|
||||
let onscreen = unsafe { physmap(physbaseptr, largest_size * 4, PHYSMAP_WRITE | PHYSMAP_WRITE_COMBINE).expect("vesad: failed to map VBE LFB") };
|
||||
unsafe { ptr::write_bytes(onscreen as *mut u32, 0, size); }
|
||||
|
||||
let mut scheme = DisplayScheme::new(width, height, onscreen, &spec);
|
||||
|
||||
syscall::setrens(0, 0).expect("vesad: failed to enter null namespace");
|
||||
|
||||
daemon.ready().expect("failed to notify parent");
|
||||
|
||||
let mut blocked = Vec::new();
|
||||
loop {
|
||||
let mut packet = Packet::default();
|
||||
if socket.read(&mut packet).expect("vesad: failed to read display scheme") == 0 {
|
||||
//TODO: Handle blocked
|
||||
break;
|
||||
}
|
||||
|
||||
// If it is a read packet, and there is no data, block it. Otherwise, handle packet
|
||||
if packet.a == syscall::number::SYS_READ && packet.d > 0 && scheme.can_read(packet.b).is_none() {
|
||||
blocked.push(packet);
|
||||
} else {
|
||||
drop(read);
|
||||
scheme.handle(&mut packet);
|
||||
socket.write(&packet).expect("vesad: failed to write display scheme");
|
||||
}
|
||||
|
||||
let mut socket = File::create(":display").expect("vesad: failed to create display scheme");
|
||||
|
||||
let size = width * height;
|
||||
//TODO: Remap on resize
|
||||
let largest_size = 8 * 1024 * 1024;
|
||||
let onscreen = unsafe { physmap(physbaseptr, largest_size * 4, PHYSMAP_WRITE | PHYSMAP_WRITE_COMBINE).expect("vesad: failed to map VBE LFB") };
|
||||
unsafe { ptr::write_bytes(onscreen as *mut u32, 0, size); }
|
||||
|
||||
let mut scheme = DisplayScheme::new(width, height, onscreen, &spec);
|
||||
|
||||
syscall::setrens(0, 0).expect("vesad: failed to enter null namespace");
|
||||
|
||||
write.write(&[0]).unwrap();
|
||||
drop(write);
|
||||
|
||||
let mut blocked = Vec::new();
|
||||
loop {
|
||||
let mut packet = Packet::default();
|
||||
if socket.read(&mut packet).expect("vesad: failed to read display scheme") == 0 {
|
||||
//TODO: Handle blocked
|
||||
break;
|
||||
}
|
||||
|
||||
// If it is a read packet, and there is no data, block it. Otherwise, handle packet
|
||||
if packet.a == syscall::number::SYS_READ && packet.d > 0 && scheme.can_read(packet.b).is_none() {
|
||||
blocked.push(packet);
|
||||
} else {
|
||||
// If there are blocked readers, and data is available, handle them
|
||||
{
|
||||
let mut i = 0;
|
||||
while i < blocked.len() {
|
||||
if scheme.can_read(blocked[i].b).is_some() {
|
||||
let mut packet = blocked.remove(i);
|
||||
scheme.handle(&mut packet);
|
||||
socket.write(&packet).expect("vesad: failed to write display scheme");
|
||||
}
|
||||
|
||||
// If there are blocked readers, and data is available, handle them
|
||||
{
|
||||
let mut i = 0;
|
||||
while i < blocked.len() {
|
||||
if scheme.can_read(blocked[i].b).is_some() {
|
||||
let mut packet = blocked.remove(i);
|
||||
scheme.handle(&mut packet);
|
||||
socket.write(&packet).expect("vesad: failed to write display scheme");
|
||||
} else {
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (handle_id, handle) in scheme.handles.iter_mut() {
|
||||
if !handle.events.contains(EVENT_READ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Can't use scheme.can_read() because we borrow handles as mutable.
|
||||
// (and because it'd treat O_NONBLOCK sockets differently)
|
||||
let count = if let HandleKind::Screen(screen_i) = handle.kind {
|
||||
scheme.screens.get(&screen_i)
|
||||
.and_then(|screen| screen.can_read())
|
||||
.unwrap_or(0)
|
||||
} else { 0 };
|
||||
|
||||
if count > 0 {
|
||||
if !handle.notified_read {
|
||||
handle.notified_read = true;
|
||||
let event_packet = Packet {
|
||||
id: 0,
|
||||
pid: 0,
|
||||
uid: 0,
|
||||
gid: 0,
|
||||
a: syscall::number::SYS_FEVENT,
|
||||
b: *handle_id,
|
||||
c: EVENT_READ.bits(),
|
||||
d: count
|
||||
};
|
||||
|
||||
socket.write(&event_packet).expect("vesad: failed to write display event");
|
||||
}
|
||||
} else {
|
||||
handle.notified_read = false;
|
||||
}
|
||||
} else {
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (handle_id, handle) in scheme.handles.iter_mut() {
|
||||
if !handle.events.contains(EVENT_READ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Can't use scheme.can_read() because we borrow handles as mutable.
|
||||
// (and because it'd treat O_NONBLOCK sockets differently)
|
||||
let count = if let HandleKind::Screen(screen_i) = handle.kind {
|
||||
scheme.screens.get(&screen_i)
|
||||
.and_then(|screen| screen.can_read())
|
||||
.unwrap_or(0)
|
||||
} else { 0 };
|
||||
|
||||
if count > 0 {
|
||||
if !handle.notified_read {
|
||||
handle.notified_read = true;
|
||||
let event_packet = Packet {
|
||||
id: 0,
|
||||
pid: 0,
|
||||
uid: 0,
|
||||
gid: 0,
|
||||
a: syscall::number::SYS_FEVENT,
|
||||
b: *handle_id,
|
||||
c: EVENT_READ.bits(),
|
||||
d: count
|
||||
};
|
||||
|
||||
socket.write(&event_packet).expect("vesad: failed to write display event");
|
||||
}
|
||||
} else {
|
||||
handle.notified_read = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ futures = "0.3"
|
||||
plain = "0.2"
|
||||
lazy_static = "1.4"
|
||||
log = "0.4"
|
||||
redox-daemon = "0.1"
|
||||
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
|
||||
redox-log = "0.1"
|
||||
redox_syscall = "0.2.12"
|
||||
|
||||
+7
-5
@@ -20,7 +20,7 @@ use log::info;
|
||||
use redox_log::{RedoxLogger, OutputBuilder};
|
||||
use syscall::data::Packet;
|
||||
use syscall::error::EWOULDBLOCK;
|
||||
use syscall::flag::{CloneFlags, EventFlags, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::flag::{EventFlags, PHYSMAP_NO_CACHE, PHYSMAP_WRITE};
|
||||
use syscall::scheme::Scheme;
|
||||
use syscall::io::Io;
|
||||
|
||||
@@ -229,11 +229,10 @@ fn get_int_method(pcid_handle: &mut PcidServerHandle, address: usize) -> (Option
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Daemonize
|
||||
if unsafe { syscall::clone(CloneFlags::empty()).unwrap() } != 0 {
|
||||
return;
|
||||
}
|
||||
redox_daemon::Daemon::new(daemon).expect("xhcid: failed to daemonize");
|
||||
}
|
||||
|
||||
fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
let _logger_ref = setup_logging();
|
||||
|
||||
let mut pcid_handle = PcidServerHandle::connect_default().expect("xhcid: failed to setup channel to pcid");
|
||||
@@ -286,6 +285,8 @@ fn main() {
|
||||
|
||||
syscall::setrens(0, 0).expect("xhcid: failed to enter null namespace");
|
||||
|
||||
daemon.ready().expect("xhcid: failed to notify parent");
|
||||
|
||||
let todo = Arc::new(Mutex::new(Vec::<Packet>::new()));
|
||||
let todo_futures = Arc::new(Mutex::new(Vec::<Pin<Box<dyn Future<Output = usize> + Send + Sync + 'static>>>::new()));
|
||||
|
||||
@@ -326,4 +327,5 @@ fn main() {
|
||||
unsafe {
|
||||
let _ = syscall::physunmap(address);
|
||||
}
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
@@ -449,14 +449,18 @@ impl Xhci {
|
||||
};
|
||||
PhysBox::new_with_flags(byte_count, flags)
|
||||
}
|
||||
fn page_align(size: usize) -> usize {
|
||||
// TODO: PAGE_SIZE
|
||||
(size+4095)/4096*4096
|
||||
}
|
||||
pub unsafe fn alloc_dma_zeroed_raw<T>(ac64: bool) -> Result<Dma<T>> {
|
||||
Ok(Dma::from_physbox_zeroed(Self::alloc_phys(ac64, mem::size_of::<T>())?)?.assume_init())
|
||||
Ok(Dma::from_physbox_zeroed(Self::alloc_phys(ac64, Self::page_align(mem::size_of::<T>()))?)?.assume_init())
|
||||
}
|
||||
pub unsafe fn alloc_dma_zeroed<T>(&self) -> Result<Dma<T>> {
|
||||
Self::alloc_dma_zeroed_raw(self.cap.ac64())
|
||||
}
|
||||
pub unsafe fn alloc_dma_zeroed_unsized_raw<T>(ac64: bool, count: usize) -> Result<Dma<[T]>> {
|
||||
Ok(Dma::from_physbox_zeroed_unsized(Self::alloc_phys(ac64, mem::size_of::<T>() * count)?, count)?.assume_init())
|
||||
Ok(Dma::from_physbox_zeroed_unsized(Self::alloc_phys(ac64, Self::page_align(mem::size_of::<T>() * count))?, count)?.assume_init())
|
||||
}
|
||||
pub unsafe fn alloc_dma_zeroed_unsized<T>(&self, count: usize) -> Result<Dma<[T]>> {
|
||||
Self::alloc_dma_zeroed_unsized_raw(self.cap.ac64(), count)
|
||||
|
||||
Reference in New Issue
Block a user