diff --git a/Cargo.lock b/Cargo.lock index 0f5f5d06ef..786227566f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/Cargo.toml b/Cargo.toml index 8078a99e90..48733bd4e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" } diff --git a/acpid/Cargo.toml b/acpid/Cargo.toml index 06fc3c698f..0cdb909538 100644 --- a/acpid/Cargo.toml +++ b/acpid/Cargo.toml @@ -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" diff --git a/acpid/src/main.rs b/acpid/src/main.rs index ebc105dcc6..0247bb6fac 100644 --- a/acpid/src/main.rs +++ b/acpid/src/main.rs @@ -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"); } diff --git a/ahcid/Cargo.toml b/ahcid/Cargo.toml index 74f11ce48a..f8eaa7afde 100644 --- a/ahcid/Cargo.toml +++ b/ahcid/Cargo.toml @@ -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" } diff --git a/ahcid/src/main.rs b/ahcid/src/main.rs index cef16638a2..6690684c3e 100644 --- a/ahcid/src/main.rs +++ b/ahcid/src/main.rs @@ -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::().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); } diff --git a/alxd/Cargo.toml b/alxd/Cargo.toml index 89c08b7ff9..4064bea456 100644 --- a/alxd/Cargo.toml +++ b/alxd/Cargo.toml @@ -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" diff --git a/alxd/src/main.rs b/alxd/src/main.rs index 7acdd1df7d..f0877eacd4 100644 --- a/alxd/src/main.rs +++ b/alxd/src/main.rs @@ -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"); } diff --git a/bgad/Cargo.toml b/bgad/Cargo.toml index 8dd06e8520..f4ef93efa3 100644 --- a/bgad/Cargo.toml +++ b/bgad/Cargo.toml @@ -5,4 +5,5 @@ edition = "2018" [dependencies] orbclient = "0.3.27" +redox-daemon = "0.1" redox_syscall = "0.2.12" diff --git a/bgad/src/main.rs b/bgad/src/main.rs index 47ad94ae74..f441acf75e 100644 --- a/bgad/src/main.rs +++ b/bgad/src/main.rs @@ -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"); } diff --git a/e1000d/Cargo.toml b/e1000d/Cargo.toml index 4a1a005d01..4d558ff412 100644 --- a/e1000d/Cargo.toml +++ b/e1000d/Cargo.toml @@ -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" diff --git a/e1000d/src/main.rs b/e1000d/src/main.rs index 093d567b98..67f8a4012a 100644 --- a/e1000d/src/main.rs +++ b/e1000d/src/main.rs @@ -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, diff --git a/ihdad/Cargo.toml b/ihdad/Cargo.toml index c38f53e167..b43f31e321 100755 --- a/ihdad/Cargo.toml +++ b/ihdad/Cargo.toml @@ -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" diff --git a/ihdad/src/main.rs b/ihdad/src/main.rs index 70b486e1e6..13df709e70 100755 --- a/ihdad/src/main.rs +++ b/ihdad/src/main.rs @@ -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::::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"); } diff --git a/ixgbed/Cargo.toml b/ixgbed/Cargo.toml index 5833964c71..73a9a39d47 100644 --- a/ixgbed/Cargo.toml +++ b/ixgbed/Cargo.toml @@ -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" diff --git a/ixgbed/src/main.rs b/ixgbed/src/main.rs index 0f1b1ea3dd..ae8be8d5b7 100644 --- a/ixgbed/src/main.rs +++ b/ixgbed/src/main.rs @@ -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)); } diff --git a/nvmed/Cargo.toml b/nvmed/Cargo.toml index fed14c7a00..1ce0b956b7 100644 --- a/nvmed/Cargo.toml +++ b/nvmed/Cargo.toml @@ -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" } diff --git a/nvmed/src/main.rs b/nvmed/src/main.rs index a8d290768a..9151a9791a 100644 --- a/nvmed/src/main.rs +++ b/nvmed/src/main.rs @@ -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); } diff --git a/pcid/src/main.rs b/pcid/src/main.rs index fce37d5b25..daff50513a 100644 --- a/pcid/src/main.rs +++ b/pcid/src/main.rs @@ -468,6 +468,9 @@ fn handle_parsed_header(state: Arc, 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() { diff --git a/pcspkrd/Cargo.toml b/pcspkrd/Cargo.toml index cbe70ea730..1d7b6ce8d9 100644 --- a/pcspkrd/Cargo.toml +++ b/pcspkrd/Cargo.toml @@ -6,3 +6,4 @@ edition = "2018" [dependencies] redox_syscall = "0.2.12" +redox-daemon = "0.1" diff --git a/pcspkrd/src/main.rs b/pcspkrd/src/main.rs index f5692c0dcb..7f9bfc1e40 100644 --- a/pcspkrd/src/main.rs +++ b/pcspkrd/src/main.rs @@ -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"); } diff --git a/ps2d/Cargo.toml b/ps2d/Cargo.toml index c9192a3972..b6af7bbd37 100644 --- a/ps2d/Cargo.toml +++ b/ps2d/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" bitflags = "1" orbclient = "0.3.27" redox_syscall = "0.2.12" +redox-daemon = "0.1" diff --git a/ps2d/src/main.rs b/ps2d/src/main.rs index 947bce2cd1..5a845e415f 100644 --- a/ps2d/src/main.rs +++ b/ps2d/src/main.rs @@ -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"); } diff --git a/rtl8168d/Cargo.toml b/rtl8168d/Cargo.toml index 6687ced3ed..f0c3c47b5a 100644 --- a/rtl8168d/Cargo.toml +++ b/rtl8168d/Cargo.toml @@ -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" diff --git a/rtl8168d/src/main.rs b/rtl8168d/src/main.rs index d2d3f34ebf..d8e40a40c6 100644 --- a/rtl8168d/src/main.rs +++ b/rtl8168d/src/main.rs @@ -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, diff --git a/usbscsid/Cargo.toml b/usbscsid/Cargo.toml index a5a5eff5c3..1cc137ecad 100644 --- a/usbscsid/Cargo.toml +++ b/usbscsid/Cargo.toml @@ -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" } diff --git a/usbscsid/src/main.rs b/usbscsid/src/main.rs index 601512b558..05d37942f0 100644 --- a/usbscsid/src/main.rs +++ b/usbscsid/src/main.rs @@ -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); } diff --git a/vboxd/Cargo.toml b/vboxd/Cargo.toml index 774fe4fca9..43cea1e68d 100644 --- a/vboxd/Cargo.toml +++ b/vboxd/Cargo.toml @@ -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" diff --git a/vboxd/src/main.rs b/vboxd/src/main.rs index 2cd7cd8e65..0ed4a1975d 100644 --- a/vboxd/src/main.rs +++ b/vboxd/src/main.rs @@ -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"); } diff --git a/vesad/Cargo.toml b/vesad/Cargo.toml index 49af3ac6b3..8f4b457d3c 100644 --- a/vesad/Cargo.toml +++ b/vesad/Cargo.toml @@ -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 = [] diff --git a/vesad/src/main.rs b/vesad/src/main.rs index ed1bdc0965..fa3778cce6 100644 --- a/vesad/src/main.rs +++ b/vesad/src/main.rs @@ -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); } diff --git a/xhcid/Cargo.toml b/xhcid/Cargo.toml index 026d4b0c9e..d9112921c3 100644 --- a/xhcid/Cargo.toml +++ b/xhcid/Cargo.toml @@ -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" diff --git a/xhcid/src/main.rs b/xhcid/src/main.rs index 0918206a6b..82073e4741 100644 --- a/xhcid/src/main.rs +++ b/xhcid/src/main.rs @@ -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::::new())); let todo_futures = Arc::new(Mutex::new(Vec:: + Send + Sync + 'static>>>::new())); @@ -326,4 +327,5 @@ fn main() { unsafe { let _ = syscall::physunmap(address); } + std::process::exit(0); } diff --git a/xhcid/src/xhci/mod.rs b/xhcid/src/xhci/mod.rs index 083cd281bc..7d7918fe9e 100644 --- a/xhcid/src/xhci/mod.rs +++ b/xhcid/src/xhci/mod.rs @@ -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(ac64: bool) -> Result> { - Ok(Dma::from_physbox_zeroed(Self::alloc_phys(ac64, mem::size_of::())?)?.assume_init()) + Ok(Dma::from_physbox_zeroed(Self::alloc_phys(ac64, Self::page_align(mem::size_of::()))?)?.assume_init()) } pub unsafe fn alloc_dma_zeroed(&self) -> Result> { Self::alloc_dma_zeroed_raw(self.cap.ac64()) } pub unsafe fn alloc_dma_zeroed_unsized_raw(ac64: bool, count: usize) -> Result> { - Ok(Dma::from_physbox_zeroed_unsized(Self::alloc_phys(ac64, mem::size_of::() * count)?, count)?.assume_init()) + Ok(Dma::from_physbox_zeroed_unsized(Self::alloc_phys(ac64, Self::page_align(mem::size_of::() * count))?, count)?.assume_init()) } pub unsafe fn alloc_dma_zeroed_unsized(&self, count: usize) -> Result> { Self::alloc_dma_zeroed_unsized_raw(self.cap.ac64(), count)