Merge branch 'userspace_fexec' into 'master'

Userspace fexec

See merge request redox-os/drivers!81
This commit is contained in:
Jeremy Soller
2022-07-27 15:21:31 +00:00
34 changed files with 211 additions and 177 deletions
Generated
+27 -3
View File
@@ -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",
+1
View File
@@ -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" }
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
+1
View File
@@ -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
View File
@@ -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");
}
+1
View File
@@ -5,4 +5,5 @@ edition = "2018"
[dependencies]
orbclient = "0.3.27"
redox-daemon = "0.1"
redox_syscall = "0.2.12"
+5 -4
View File
@@ -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");
}
+1
View File
@@ -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
View File
@@ -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,
+1
View File
@@ -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
View File
@@ -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");
}
+1
View File
@@ -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
View File
@@ -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));
}
+1
View File
@@ -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
View File
@@ -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);
}
+3
View File
@@ -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() {
+1
View File
@@ -6,3 +6,4 @@ edition = "2018"
[dependencies]
redox_syscall = "0.2.12"
redox-daemon = "0.1"
+6 -5
View File
@@ -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");
}
+1
View File
@@ -7,3 +7,4 @@ edition = "2018"
bitflags = "1"
orbclient = "0.3.27"
redox_syscall = "0.2.12"
redox-daemon = "0.1"
+2 -2
View File
@@ -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");
}
+1
View File
@@ -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"
+2 -2
View File
@@ -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,
+1
View File
@@ -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" }
+9 -8
View File
@@ -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);
}
+1
View File
@@ -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
View File
@@ -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");
}
+1
View File
@@ -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
View File
@@ -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);
}
+1
View File
@@ -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
View File
@@ -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);
}
+6 -2
View File
@@ -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)