Merge branch 'latest_eq' into 'master'

Use latest event queue interface everywhere.

See merge request redox-os/drivers!151
This commit is contained in:
Jeremy Soller
2024-04-01 13:24:31 +00:00
32 changed files with 689 additions and 918 deletions
Generated
+188 -227
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -1,17 +1,17 @@
[package]
name = "ac97d"
version = "0.1.0"
edition = "2018"
edition = "2021"
[dependencies]
bitflags = "1"
common = { path = "../../common" }
libredox = "0.1.3"
log = "0.4"
redox-daemon = "0.1"
redox-log = "0.1"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
redox-log = "0.1.2"
redox_event = "0.4.1"
redox_syscall = "0.5"
spin = "0.9"
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+90 -124
View File
@@ -12,7 +12,7 @@ use std::cell::RefCell;
use std::sync::Arc;
use std::usize;
use event::EventQueue;
use event::{user_data, EventQueue};
use libredox::flag;
use pcid_interface::{PciBar, PcidServerHandle};
use redox_log::{OutputBuilder, RedoxLogger};
@@ -24,10 +24,10 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
let mut logger = RedoxLogger::new()
.with_output(
OutputBuilder::stderr()
.with_filter(log::LevelFilter::Info) // limit global output to important info
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
.with_filter(log::LevelFilter::Info) // limit global output to important info
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
);
#[cfg(target_os = "redox")]
@@ -35,8 +35,8 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
Ok(b) => logger = logger.with_output(
// TODO: Add a configuration file for this
b.with_filter(log::LevelFilter::Info)
.flush_on_newline(true)
.build()
.flush_on_newline(true)
.build()
),
Err(error) => eprintln!("ac97d: failed to create ac97.log: {}", error),
}
@@ -45,9 +45,9 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
match OutputBuilder::in_redox_logging_scheme("audio", "pcie", "ac97.ansi.log") {
Ok(b) => logger = logger.with_output(
b.with_filter(log::LevelFilter::Info)
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
),
Err(error) => eprintln!("ac97d: failed to create ac97.ansi.log: {}", error),
}
@@ -65,145 +65,111 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
}
fn main() {
let mut pcid_handle =
let mut pcid_handle =
PcidServerHandle::connect_default().expect("ac97d: failed to setup channel to pcid");
let pci_config = pcid_handle
.fetch_config()
.expect("ac97d: failed to fetch config");
let mut name = pci_config.func.name();
name.push_str("_ac97");
let mut name = pci_config.func.name();
name.push_str("_ac97");
let bar0 = pci_config.func.bars[0].expect_port();
let bar1 = pci_config.func.bars[1].expect_port();
let bar0 = pci_config.func.bars[0].expect_port();
let bar1 = pci_config.func.bars[1].expect_port();
let irq = pci_config.func.legacy_interrupt_line.expect("ac97d: no legacy interrupts supported");
let irq = pci_config.func.legacy_interrupt_line.expect("ac97d: no legacy interrupts supported");
println!(" + ac97 {}", pci_config.func.display());
println!(" + ac97 {}", pci_config.func.display());
// Daemonize
// Daemonize
redox_daemon::Daemon::new(move |daemon| {
let _logger_ref = setup_logging();
let _logger_ref = setup_logging();
common::acquire_port_io_rights().expect("ac97d: failed to set I/O privilege level to Ring 3");
let mut irq_file = irq.irq_handle("ac97d");
let mut irq_file = irq.irq_handle("ac97d");
let device = Arc::new(RefCell::new(unsafe { device::Ac97::new(bar0, bar1).expect("ac97d: failed to allocate device") }));
let socket_fd = libredox::call::open(":audiohw", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("ac97d: failed to create hda scheme");
let socket = Arc::new(RefCell::new(unsafe { File::from_raw_fd(socket_fd as RawFd) }));
let mut device = unsafe { device::Ac97::new(bar0, bar1).expect("ac97d: failed to allocate device") };
let socket_fd = libredox::call::open(":audiohw", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("ac97d: failed to create hda scheme");
let mut socket = unsafe { File::from_raw_fd(socket_fd as RawFd) };
user_data! {
enum Source {
Irq,
Scheme,
}
}
let mut event_queue = EventQueue::<Source>::new().expect("ac97d: Could not create event queue.");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
event_queue.subscribe(socket_fd, Source::Scheme, event::EventFlags::READ).unwrap();
daemon.ready().expect("ac97d: failed to signal readiness");
let mut event_queue = EventQueue::<usize>::new().expect("ac97d: Could not create event queue.");
libredox::call::setrens(0, 0).expect("ac97d: failed to enter null namespace");
let todo = Arc::new(RefCell::new(Vec::<Packet>::new()));
let mut todo = Vec::<Packet>::new();
let todo_irq = todo.clone();
let device_irq = device.clone();
let socket_irq = socket.clone();
let all = [Source::Irq, Source::Scheme];
'events: for event in all.into_iter().chain(event_queue.map(|e| e.expect("ac97d: failed to get next event").user_data)) {
match event {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq).unwrap();
event_queue.add(irq_file.as_raw_fd(), move |_event| -> Result<Option<usize>> {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
if device.irq() {
irq_file.write(&mut irq).unwrap();
if device_irq.borrow_mut().irq() {
irq_file.write(&mut irq)?;
let mut i = 0;
while i < todo.len() {
if let Some(a) = device.handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket.write(&packet).unwrap();
} else {
i += 1;
}
}
let mut todo = todo_irq.borrow_mut();
let mut i = 0;
while i < todo.len() {
if let Some(a) = device_irq.borrow_mut().handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket_irq.borrow_mut().write(&packet)?;
} else {
i += 1;
}
}
/*
let next_read = device_irq.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
Source::Scheme => {
loop {
let mut packet = Packet::default();
match socket.read(&mut packet) {
Ok(0) => break 'events,
Ok(_) => (),
Err(err) => if err.kind() == ErrorKind::WouldBlock {
break;
} else {
panic!("ac97d: failed to read socket: {err}");
}
}
/*
let next_read = device_irq.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
Ok(None)
}).expect("ac97d: failed to catch events on IRQ file");
let socket_fd = socket.borrow().as_raw_fd();
let socket_packet = socket.clone();
event_queue.add(socket_fd, move |_event| -> Result<Option<usize>> {
loop {
let mut packet = Packet::default();
match socket_packet.borrow_mut().read(&mut packet) {
Ok(0) => return Ok(Some(0)),
Ok(_) => (),
Err(err) => if err.kind() == ErrorKind::WouldBlock {
break;
} else {
return Err(err);
}
}
if let Some(a) = device.handle(&mut packet) {
packet.a = a;
socket.write(&packet).unwrap();
} else {
todo.push(packet);
}
}
if let Some(a) = device.borrow_mut().handle(&mut packet) {
packet.a = a;
socket_packet.borrow_mut().write(&packet)?;
} else {
todo.borrow_mut().push(packet);
}
}
/*
let next_read = device.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
Ok(None)
}).expect("ac97d: failed to catch events on IRQ file");
for event_count in event_queue.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
}).expect("ac97d: failed to trigger events") {
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("ac97d: failed to write event");
}
loop {
{
//device_loop.borrow_mut().handle_interrupts();
}
let event_count = event_queue.run().expect("ac97d: failed to handle events");
if event_count == 0 {
//TODO: Handle todo
break;
}
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("ac97d: failed to write event");
}
/*
let next_read = device.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
}
std::process::exit(0);
}).expect("ac97d: failed to daemonize");
}).expect("ac97d: failed to daemonize");
}
+6 -6
View File
@@ -1,17 +1,17 @@
[package]
name = "ihdad"
version = "0.1.0"
edition = "2018"
edition = "2021"
[dependencies]
bitflags = "1"
bitflags = "2"
libredox = "0.1.3"
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.4"
redox-log = "0.1.2"
redox_event = "0.4.1"
redox_syscall = "0.5"
spin = "0.9"
common = { path = "../../common" }
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+91 -122
View File
@@ -15,7 +15,7 @@ use syscall::{Packet, SchemeBlockMut, EventFlags};
use std::cell::RefCell;
use std::sync::Arc;
use event::EventQueue;
use event::{user_data, EventQueue};
use pcid_interface::{MsiSetFeatureInfo, PcidServerHandle, PciFeature, PciFeatureInfo, SetFeatureInfo};
#[cfg(target_arch = "x86_64")]
use pcid_interface::irq_helpers::allocate_single_interrupt_vector_for_msi;
@@ -25,20 +25,20 @@ use redox_log::{OutputBuilder, RedoxLogger};
pub mod hda;
/*
VEND:PROD
Virtualbox 8086:2668
QEMU ICH9 8086:293E
82801H ICH8 8086:284B
*/
VEND:PROD
Virtualbox 8086:2668
QEMU ICH9 8086:293E
82801H ICH8 8086:284B
*/
fn setup_logging() -> Option<&'static RedoxLogger> {
let mut logger = RedoxLogger::new()
.with_output(
OutputBuilder::stderr()
.with_filter(log::LevelFilter::Debug) // limit global output to important info
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
.with_filter(log::LevelFilter::Debug) // limit global output to important info
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
);
#[cfg(target_os = "redox")]
@@ -46,8 +46,8 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
Ok(b) => logger = logger.with_output(
// TODO: Add a configuration file for this
b.with_filter(log::LevelFilter::Info)
.flush_on_newline(true)
.build()
.flush_on_newline(true)
.build()
),
Err(error) => eprintln!("ihdad: failed to create ihda.log: {}", error),
}
@@ -56,9 +56,9 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
match OutputBuilder::in_redox_logging_scheme("audio", "pcie", "ihda.ansi.log") {
Ok(b) => logger = logger.with_output(
b.with_filter(log::LevelFilter::Info)
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
.with_ansi_escape_codes()
.flush_on_newline(true)
.build()
),
Err(error) => eprintln!("ihdad: failed to create ihda.ansi.log: {}", error),
}
@@ -153,133 +153,102 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
log::info!(" + IHDA {}", pci_config.func.display());
let address = unsafe { bar.physmap_mem("ihdad") } as usize;
let address = unsafe { bar.physmap_mem("ihdad") } as usize;
//TODO: MSI-X
let mut irq_file = get_int_method(&mut pcid_handle);
{
let vend_prod: u32 = ((pci_config.func.full_device_id.vendor_id as u32) << 16)
{
let vend_prod: u32 = ((pci_config.func.full_device_id.vendor_id as u32) << 16)
| (pci_config.func.full_device_id.device_id as u32);
let device = Arc::new(RefCell::new(unsafe { hda::IntelHDA::new(address, vend_prod).expect("ihdad: failed to allocate device") }));
let socket_fd = libredox::call::open(":audiohw", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("ihdad: failed to create hda scheme");
let socket = Arc::new(RefCell::new(unsafe { File::from_raw_fd(socket_fd as RawFd) }));
daemon.ready().expect("ihdad: failed to signal readiness");
user_data! {
enum Source {
Irq,
Scheme,
}
}
let mut event_queue = EventQueue::<usize>::new().expect("ihdad: Could not create event queue.");
let mut event_queue = EventQueue::<Source>::new().expect("ihdad: Could not create event queue.");
let mut device = unsafe { hda::IntelHDA::new(address, vend_prod).expect("ihdad: failed to allocate device") };
let socket_fd = libredox::call::open(":audiohw", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("ihdad: failed to create hda scheme");
let mut socket = unsafe { File::from_raw_fd(socket_fd as RawFd) };
event_queue.subscribe(socket_fd, Source::Scheme, event::EventFlags::READ).unwrap();
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
daemon.ready().expect("ihdad: failed to signal readiness");
libredox::call::setrens(0, 0).expect("ihdad: failed to enter null namespace");
let todo = Arc::new(RefCell::new(Vec::<Packet>::new()));
let mut todo = Vec::<Packet>::new();
let todo_irq = todo.clone();
let device_irq = device.clone();
let socket_irq = socket.clone();
event_queue.add(irq_file.as_raw_fd(), move |_event| -> Result<Option<usize>> {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
let all = [Source::Irq, Source::Scheme];
if device_irq.borrow_mut().irq() {
irq_file.write(&mut irq)?;
'events: for event in all.into_iter().chain(event_queue.map(|e| e.expect("failed to get next event").user_data)) {
match event {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq).unwrap();
let mut todo = todo_irq.borrow_mut();
let mut i = 0;
while i < todo.len() {
if let Some(a) = device_irq.borrow_mut().handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket_irq.borrow_mut().write(&packet)?;
} else {
i += 1;
}
}
if device.irq() {
irq_file.write(&mut irq).unwrap();
/*
let next_read = device_irq.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
Ok(None)
}).expect("ihdad: failed to catch events on IRQ file");
let socket_fd = socket.borrow().as_raw_fd();
let socket_packet = socket.clone();
event_queue.add(socket_fd, move |_event| -> Result<Option<usize>> {
loop {
let mut packet = Packet::default();
match socket_packet.borrow_mut().read(&mut packet) {
Ok(0) => return Ok(Some(0)),
Ok(_) => (),
Err(err) => if err.kind() == ErrorKind::WouldBlock {
break;
} else {
return Err(err);
}
}
let mut i = 0;
while i < todo.len() {
if let Some(a) = device.handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket.write(&packet).unwrap();
} else {
i += 1;
}
}
if let Some(a) = device.borrow_mut().handle(&mut packet) {
packet.a = a;
socket_packet.borrow_mut().write(&packet)?;
} else {
todo.borrow_mut().push(packet);
}
}
/*
let next_read = device_irq.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
Source::Scheme => {
loop {
let mut packet = Packet::default();
match socket.read(&mut packet) {
Ok(0) => break 'events,
Ok(_) => (),
Err(err) => if err.kind() == ErrorKind::WouldBlock {
break;
} else {
panic!("ihdad: failed to read from socket: {err}");
}
}
/*
let next_read = device.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
if let Some(a) = device.handle(&mut packet) {
packet.a = a;
socket.write(&packet).unwrap();
} else {
todo.push(packet);
}
}
Ok(None)
}).expect("ihdad: failed to catch events on IRQ file");
/*
let next_read = device.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
}
for event_count in event_queue.trigger_all(event::Event {
fd: 0,
flags: EventFlags::empty(),
}).expect("ihdad: failed to trigger events") {
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("ihdad: failed to write event");
}
loop {
{
//device_loop.borrow_mut().handle_interrupts();
}
let event_count = event_queue.run().expect("ihdad: failed to handle events");
if event_count == 0 {
//TODO: Handle todo
break;
}
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("ihdad: failed to write event");
}
}
std::process::exit(0);
std::process::exit(0);
}
}
fn main() {
// Daemonize
// Daemonize
redox_daemon::Daemon::new(daemon).expect("ihdad: failed to daemonize");
}
+1 -1
View File
@@ -5,6 +5,6 @@ authors = ["Tibor Nagy <xnagytibor@gmail.com>"]
edition = "2018"
[dependencies]
redox_syscall = "0.4"
redox_syscall = "0.5"
redox-daemon = "0.1"
libredox = "0.1.3"
+5 -5
View File
@@ -1,15 +1,15 @@
[package]
name = "sb16d"
version = "0.1.0"
edition = "2018"
edition = "2021"
[dependencies]
bitflags = "1"
bitflags = "2"
common = { path = "../../common" }
libredox = "0.1.3"
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.4"
redox-log = "0.1.2"
redox_event = "0.4.1"
redox_syscall = "0.5"
spin = "0.9"
+4 -4
View File
@@ -1,11 +1,11 @@
#![allow(dead_code)]
use std::{mem, thread, time};
use std::{thread, time};
use std::collections::BTreeMap;
use std::sync::atomic::{AtomicUsize, Ordering};
use syscall::error::{Error, EACCES, EBADF, Result, EINVAL, ENODEV, ENOENT};
use syscall::io::{Mmio, Pio, Io, ReadOnly, WriteOnly};
use syscall::error::{Error, EACCES, EBADF, Result, ENODEV};
use syscall::io::{Pio, Io, ReadOnly, WriteOnly};
use syscall::scheme::SchemeBlockMut;
use spin::Mutex;
@@ -191,7 +191,7 @@ impl SchemeBlockMut for Sb16 {
}
}
fn write(&mut self, id: usize, buf: &[u8]) -> Result<Option<usize>> {
fn write(&mut self, _id: usize, _buf: &[u8]) -> Result<Option<usize>> {
//TODO
Err(Error::new(EBADF))
}
+61 -114
View File
@@ -1,20 +1,11 @@
//#![deny(warnings)]
extern crate bitflags;
extern crate spin;
extern crate syscall;
extern crate event;
use std::{env, usize};
use std::fs::File;
use std::io::{ErrorKind, Read, Write, Result};
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
use libredox::flag;
use syscall::{Packet, SchemeBlockMut, EventFlags};
use std::cell::RefCell;
use std::sync::Arc;
use libredox::errno::{EAGAIN, EWOULDBLOCK};
use libredox::{flag, Fd};
use syscall::{Packet, SchemeBlockMut};
use event::EventQueue;
use event::{user_data, EventQueue};
use redox_log::{OutputBuilder, RedoxLogger};
pub mod device;
@@ -77,127 +68,83 @@ fn main() {
common::acquire_port_io_rights().expect("sb16d: failed to acquire port IO rights");
let device = Arc::new(RefCell::new(unsafe { device::Sb16::new(addr).expect("sb16d: failed to allocate device") }));
let socket_fd = libredox::call::open(":audiohw", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("sb16d: failed to create hda scheme");
let socket = Arc::new(RefCell::new(unsafe { File::from_raw_fd(socket_fd as RawFd) }));
let mut device = unsafe { device::Sb16::new(addr).expect("sb16d: failed to allocate device") };
let socket = Fd::open(":audiohw", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("sb16d: failed to create hda scheme");
//TODO: error on multiple IRQs?
let mut irq_file = match device.borrow().irqs.first() {
Some(irq) => File::open(format!("irq:{}", irq)).expect("sb16d: failed to open IRQ file"),
let irq_file = match device.irqs.first() {
Some(irq) => Fd::open(&format!("irq:{}", irq), flag::O_RDWR, 0).expect("sb16d: failed to open IRQ file"),
None => panic!("sb16d: no IRQs found"),
};
user_data! {
enum Source {
Irq,
Scheme,
}
}
let event_queue = EventQueue::<Source>::new().expect("sb16d: Could not create event queue.");
event_queue.subscribe(irq_file.raw(), Source::Irq, event::EventFlags::READ).unwrap();
event_queue.subscribe(socket.raw(), Source::Scheme, event::EventFlags::READ).unwrap();
daemon.ready().expect("sb16d: failed to signal readiness");
let mut event_queue = EventQueue::<usize>::new().expect("sb16d: Could not create event queue.");
libredox::call::setrens(0, 0).expect("sb16d: failed to enter null namespace");
let todo = Arc::new(RefCell::new(Vec::<Packet>::new()));
let mut todo = Vec::<Packet>::new();
let todo_irq = todo.clone();
let device_irq = device.clone();
let socket_irq = socket.clone();
let all = [Source::Irq, Source::Scheme];
// TODO: Use new event queue API
'events: for event in all.into_iter().chain(event_queue.map(|e| e.expect("sb16d: failed to get next event").user_data)) {
match event {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq).unwrap();
event_queue.add(irq_file.as_raw_fd(), move |_event| -> Result<Option<usize>> {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
if device.irq() {
irq_file.write(&mut irq).unwrap();
if device_irq.borrow_mut().irq() {
irq_file.write(&mut irq)?;
let mut i = 0;
while i < todo.len() {
if let Some(a) = device.handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket.write(&packet).expect("sb16d: failed to write to socket");
} else {
i += 1;
}
}
let mut todo = todo_irq.borrow_mut();
let mut i = 0;
while i < todo.len() {
if let Some(a) = device_irq.borrow_mut().handle(&mut todo[i]) {
let mut packet = todo.remove(i);
packet.a = a;
socket_irq.borrow_mut().write(&packet)?;
} else {
i += 1;
/*
let next_read = device_irq.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
Source::Scheme => {
loop {
let mut packet = Packet::default();
match socket.read(&mut packet) {
Ok(0) => break 'events,
Ok(_) => (),
Err(err) => if err.errno() == EWOULDBLOCK || err.errno() == EAGAIN {
break;
} else {
panic!("sb16d: failed to read from scheme socket");
}
}
/*
let next_read = device_irq.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
Ok(None)
}).expect("sb16d: failed to catch events on IRQ file");
let socket_fd = socket.borrow().as_raw_fd();
let socket_packet = socket.clone();
event_queue.add(socket_fd, move |_event| -> Result<Option<usize>> {
loop {
let mut packet = Packet::default();
match socket_packet.borrow_mut().read(&mut packet) {
Ok(0) => return Ok(Some(0)),
Ok(_) => (),
Err(err) => if err.kind() == ErrorKind::WouldBlock {
break;
} else {
return Err(err);
if let Some(a) = device.handle(&mut packet) {
packet.a = a;
socket.write(&packet).expect("sb16d: failed to write to scheme socket");
} else {
todo.push(packet);
}
}
}
if let Some(a) = device.borrow_mut().handle(&mut packet) {
packet.a = a;
socket_packet.borrow_mut().write(&packet)?;
} else {
todo.borrow_mut().push(packet);
}
}
/*
let next_read = device.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
Ok(None)
}).expect("sb16d: failed to catch events on IRQ file");
for event_count in event_queue.trigger_all(event::Event {
fd: 0,
flags: EventFlags::empty(),
}).expect("sb16d: failed to trigger events") {
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("sb16d: failed to write event");
}
loop {
{
//device_loop.borrow_mut().handle_interrupts();
}
let event_count = event_queue.run().expect("sb16d: failed to handle events");
if event_count == 0 {
//TODO: Handle todo
break;
}
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("sb16d: failed to write event");
}
std::process::exit(0);
+2 -2
View File
@@ -4,9 +4,9 @@ version = "0.1.0"
edition = "2018"
[dependencies]
orbclient = "0.3.27"
orbclient = "0.3.47"
redox-daemon = "0.1"
redox_syscall = "0.4"
redox_syscall = "0.5"
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+1 -1
View File
@@ -6,7 +6,7 @@ edition = "2021"
[dependencies]
orbclient = "0.3.27"
ransid = "0.4"
redox_event = "0.2"
redox_event = "0.4"
redox_syscall = "0.5"
redox-daemon = "0.1"
+2 -2
View File
@@ -4,8 +4,8 @@ version = "0.1.0"
edition = "2018"
[dependencies]
bitflags = "1"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
bitflags = "2"
redox_event = "0.4.1"
redox_syscall = "0.5"
redox-daemon = "0.1"
+68 -91
View File
@@ -6,16 +6,15 @@
extern crate event;
extern crate syscall;
use std::cell::RefCell;
use std::env;
use std::{env, iter};
use std::fs::File;
use std::io::{Read, Write, Result};
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
use std::sync::Arc;
use std::io::{Read, Write};
use std::os::fd::AsRawFd;
use std::os::unix::io::{FromRawFd, RawFd};
use event::EventQueue;
use event::{user_data, EventQueue};
use libredox::flag;
use syscall::{EventFlags, Packet, SchemeMut};
use syscall::{Packet, SchemeMut};
use syscall::error::EWOULDBLOCK;
pub mod device;
@@ -37,7 +36,7 @@ fn main() {
// Daemonize
redox_daemon::Daemon::new(move |daemon| {
let socket_fd = libredox::call::open(":network", flag::O_RDWR | flag::O_CREAT | flag::O_NONBLOCK, 0).expect("alxd: failed to create network scheme");
let socket = Arc::new(RefCell::new(unsafe { File::from_raw_fd(socket_fd as RawFd) }));
let mut socket = unsafe { File::from_raw_fd(socket_fd as RawFd) };
daemon.ready().expect("alxd: failed to signal readiness");
@@ -45,100 +44,78 @@ fn main() {
let address = unsafe { common::physmap(bar, 128*1024, common::Prot::RW, common::MemoryType::Uncacheable).expect("alxd: failed to map address") as usize };
{
let device = Arc::new(RefCell::new(unsafe { device::Alx::new(address).expect("alxd: failed to allocate device") }));
let mut device = unsafe { device::Alx::new(address).expect("alxd: failed to allocate device") };
let mut event_queue = EventQueue::<usize>::new().expect("alxd: failed to create event queue");
user_data! {
enum Source {
Irq,
Scheme,
}
}
let event_queue = EventQueue::<Source>::new().expect("alxd: failed to create event queue");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
event_queue.subscribe(socket_fd, Source::Scheme, event::EventFlags::READ).unwrap();
libredox::call::setrens(0, 0).expect("alxd: failed to enter null namespace");
let todo = Arc::new(RefCell::new(Vec::<Packet>::new()));
let mut todo = Vec::<Packet>::new();
let device_irq = device.clone();
let socket_irq = socket.clone();
let todo_irq = todo.clone();
event_queue.add(irq_file.as_raw_fd(), move |_event| -> Result<Option<usize>> {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
if unsafe { device_irq.borrow_mut().intr_legacy() } {
irq_file.write(&mut irq)?;
for event in iter::once(Source::Scheme).chain(event_queue.map(|e| e.expect("alxd: failed to get next event").user_data)) {
match event {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq).unwrap();
if unsafe { device.intr_legacy() } {
irq_file.write(&mut irq).unwrap();
let mut todo = todo_irq.borrow_mut();
let mut i = 0;
while i < todo.len() {
let a = todo[i].a;
device_irq.borrow_mut().handle(&mut todo[i]);
if todo[i].a == (-EWOULDBLOCK) as usize {
todo[i].a = a;
i += 1;
} else {
socket_irq.borrow_mut().write(&mut todo[i])?;
todo.remove(i);
let mut i = 0;
while i < todo.len() {
let a = todo[i].a;
device.handle(&mut todo[i]);
if todo[i].a == (-EWOULDBLOCK) as usize {
todo[i].a = a;
i += 1;
} else {
socket.write(&mut todo[i]).expect("alxd: failed to write to socket");
todo.remove(i);
}
}
/* TODO: Currently a no-op
let next_read = device.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
Source::Scheme => {
loop {
let mut packet = Packet::default();
if socket.read(&mut packet).expect("alxd: failed read from socket") == 0 {
break;
}
let next_read = device_irq.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
let a = packet.a;
device.handle(&mut packet);
if packet.a == (-EWOULDBLOCK) as usize {
packet.a = a;
todo.push(packet);
} else {
socket.write(&mut packet).expect("alxd: failed to write to socket");
}
}
// TODO
/*
let next_read = device.next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
*/
}
}
Ok(None)
}).expect("alxd: failed to catch events on IRQ file");
let socket_packet = socket.clone();
event_queue.add(socket_fd as RawFd, move |_event| -> Result<Option<usize>> {
loop {
let mut packet = Packet::default();
if socket_packet.borrow_mut().read(&mut packet)? == 0 {
break;
}
let a = packet.a;
device.borrow_mut().handle(&mut packet);
if packet.a == (-EWOULDBLOCK) as usize {
packet.a = a;
todo.borrow_mut().push(packet);
} else {
socket_packet.borrow_mut().write(&mut packet)?;
}
}
let next_read = device.borrow().next_read();
if next_read > 0 {
return Ok(Some(next_read));
}
Ok(None)
}).expect("alxd: failed to catch events on IRQ file");
for event_count in event_queue.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
}).expect("alxd: failed to trigger events") {
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("alxd: failed to write event");
}
loop {
let event_count = event_queue.run().expect("alxd: failed to handle events");
socket.borrow_mut().write(&Packet {
id: 0,
pid: 0,
uid: 0,
gid: 0,
a: syscall::number::SYS_FEVENT,
b: 0,
c: syscall::flag::EVENT_READ.bits(),
d: event_count
}).expect("alxd: failed to write event");
}
}
std::process::exit(0);
-1
View File
@@ -5,5 +5,4 @@ edition = "2021"
[dependencies]
libredox = "0.1.3"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
redox_syscall = "0.5"
+4 -4
View File
@@ -4,12 +4,12 @@ version = "0.1.0"
edition = "2018"
[dependencies]
bitflags = "1"
redox-daemon = "0.1"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
bitflags = "2"
redox-daemon = "0.1.2"
libredox = "0.1.3"
redox_event = "0.4.1"
redox_syscall = "0.5"
common = { path = "../../common" }
driver-network = { path = "../driver-network" }
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+29 -36
View File
@@ -5,7 +5,7 @@ use std::os::unix::io::AsRawFd;
use std::rc::Rc;
use driver_network::NetworkScheme;
use event::EventQueue;
use event::{user_data, EventQueue};
use pcid_interface::PcidServerHandle;
use syscall::EventFlags;
@@ -38,10 +38,22 @@ fn main() {
let device =
unsafe { device::Intel8254x::new(address).expect("e1000d: failed to allocate device") };
let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}"))));
let mut scheme = NetworkScheme::new(device, format!("network.{name}"));
user_data! {
enum Source {
Irq,
Scheme,
}
}
let mut event_queue =
EventQueue::<Infallible>::new().expect("e1000d: failed to create event queue");
EventQueue::<Source>::new().expect("e1000d: failed to create event queue");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ)
.expect("e1000d: failed to subscribe to IRQ fd");
event_queue.subscribe(scheme.event_handle() as usize, Source::Scheme, event::EventFlags::READ)
.expect("e1000d: failed to subscribe to scheme fd");
libredox::call::setrens(0, 0).expect("e1000d: failed to enter null namespace");
@@ -49,42 +61,23 @@ fn main() {
.ready()
.expect("e1000d: failed to mark daemon as ready");
let scheme_irq = scheme.clone();
event_queue
.add(
irq_file.as_raw_fd(),
move |_event| -> Result<Option<Infallible>> {
scheme.tick().unwrap();
for event in event_queue.map(|e| e.expect("e1000d: failed to get event")) {
match event.user_data {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
if unsafe { scheme_irq.borrow().adapter().irq() } {
irq_file.write(&mut irq)?;
irq_file.read(&mut irq).unwrap();
if unsafe { scheme.adapter().irq() } {
irq_file.write(&mut irq).unwrap();
return scheme_irq.borrow_mut().tick().map(|()| None);
scheme.tick().expect("e1000d: failed to handle IRQ")
}
Ok(None)
},
)
.expect("e1000d: failed to catch events on IRQ file");
let scheme_packet = scheme.clone();
event_queue
.add(
scheme.borrow().event_handle(),
move |_event| -> Result<Option<Infallible>> {
scheme_packet.borrow_mut().tick().map(|()| None)
},
)
.expect("e1000d: failed to catch events on scheme file");
event_queue
.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
})
.expect("e1000d: failed to trigger events");
#[allow(unreachable_code)]
match event_queue.run().expect("e1000d: failed to handle events") {}
}
Source::Scheme => scheme.tick().expect("e1000d: failed to handle scheme op"),
}
}
unreachable!()
})
.expect("e1000d: failed to create daemon");
}
+3 -3
View File
@@ -4,12 +4,12 @@ version = "1.0.0"
edition = "2021"
[dependencies]
bitflags = "1.0"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
bitflags = "2"
libredox = "0.1.3"
redox_event = "0.4.1"
redox_syscall = "0.5"
redox-daemon = "0.1"
common = { path = "../../common" }
driver-network = { path = "../driver-network" }
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+28 -37
View File
@@ -5,7 +5,7 @@ use std::os::unix::io::AsRawFd;
use std::rc::Rc;
use driver_network::NetworkScheme;
use event::EventQueue;
use event::{user_data, EventQueue};
use pcid_interface::PcidServerHandle;
use syscall::EventFlags;
@@ -50,10 +50,18 @@ fn main() {
let device = device::Intel8259x::new(address, IXGBE_MMIO_SIZE)
.expect("ixgbed: failed to allocate device");
let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}"))));
let mut scheme = NetworkScheme::new(device, format!("network.{name}"));
let mut event_queue =
EventQueue::<Infallible>::new().expect("ixgbed: failed to create event queue");
user_data! {
enum Source {
Irq,
Scheme,
}
}
let mut event_queue = EventQueue::<Source>::new().expect("ixgbed: Could not create event queue.");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
event_queue.subscribe(scheme.event_handle() as usize, Source::Scheme, event::EventFlags::READ).unwrap();
libredox::call::setrens(0, 0).expect("ixgbed: failed to enter null namespace");
@@ -61,42 +69,25 @@ fn main() {
.ready()
.expect("ixgbed: failed to mark daemon as ready");
let scheme_irq = scheme.clone();
event_queue
.add(
irq_file.as_raw_fd(),
move |_event| -> Result<Option<Infallible>> {
scheme.tick().unwrap();
for event in event_queue.map(|e| e.expect("ixgbed: failed to get next event")) {
match event.user_data {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
if scheme_irq.borrow().adapter().irq() {
irq_file.write(&mut irq)?;
irq_file.read(&mut irq).unwrap();
if scheme.adapter().irq() {
irq_file.write(&mut irq).unwrap();
return scheme_irq.borrow_mut().tick().map(|()| None);
scheme.tick().unwrap();
}
Ok(None)
},
)
.expect("ixgbed: failed to catch events on IRQ file");
let scheme_packet = scheme.clone();
event_queue
.add(
scheme.borrow().event_handle(),
move |_event| -> Result<Option<Infallible>> {
scheme_packet.borrow_mut().tick().map(|()| None)
},
)
.expect("ixgbed: failed to catch events on scheme file");
event_queue
.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
})
.expect("ixgbed: failed to trigger events");
#[allow(unreachable_code)]
match event_queue.run().expect("ixgbed: failed to handle events") {}
}
Source::Scheme => {
scheme.tick().unwrap();
}
}
}
unreachable!()
})
.expect("ixgbed: failed to create daemon");
}
+3 -3
View File
@@ -4,9 +4,10 @@ version = "0.1.0"
edition = "2018"
[dependencies]
bitflags = "1"
bitflags = "2"
libredox = "0.1.3"
log = "0.4"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
redox_event = "0.4.1"
redox_syscall = "0.5"
redox-daemon = "0.1"
redox-log = "0.1"
@@ -14,4 +15,3 @@ redox-log = "0.1"
common = { path = "../../common" }
driver-network = { path = "../driver-network" }
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+28 -39
View File
@@ -9,7 +9,7 @@ use std::ptr::NonNull;
use std::rc::Rc;
use driver_network::NetworkScheme;
use event::EventQueue;
use event::{user_data, EventQueue};
#[cfg(target_arch = "x86_64")]
use pcid_interface::irq_helpers::allocate_single_interrupt_vector_for_msi;
use pcid_interface::irq_helpers::read_bsp_apic_id;
@@ -237,10 +237,18 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
let device =
unsafe { device::Rtl8139::new(address).expect("rtl8139d: failed to allocate device") };
let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}"))));
let mut scheme = NetworkScheme::new(device, format!("network.{name}"));
let mut event_queue =
EventQueue::<Infallible>::new().expect("rtl8139d: failed to create event queue");
user_data! {
enum Source {
Irq,
Scheme,
}
}
let mut event_queue = EventQueue::<Source>::new().expect("rtl8139d: Could not create event queue.");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
event_queue.subscribe(scheme.event_handle() as usize, Source::Scheme, event::EventFlags::READ).unwrap();
libredox::call::setrens(0, 0).expect("rtl8139d: failed to enter null namespace");
@@ -248,45 +256,26 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
.ready()
.expect("rtl8139d: failed to mark daemon as ready");
let scheme_irq = scheme.clone();
event_queue
.add(
irq_file.as_raw_fd(),
move |_event| -> Result<Option<Infallible>> {
scheme.tick().unwrap();
for event in event_queue.map(|e| e.expect("rtl8139d: failed to get next event")) {
match event.user_data {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
irq_file.read(&mut irq).unwrap();
//TODO: This may be causing spurious interrupts
if unsafe { scheme_irq.borrow_mut().adapter_mut().irq() } {
irq_file.write(&mut irq)?;
if unsafe { scheme.adapter_mut().irq() } {
irq_file.write(&mut irq).unwrap();
return scheme_irq.borrow_mut().tick().map(|()| None);
scheme.tick().unwrap();
}
Ok(None)
},
)
.expect("rtl8139d: failed to catch events on IRQ file");
let scheme_packet = scheme.clone();
event_queue
.add(
scheme.borrow().event_handle(),
move |_event| -> Result<Option<Infallible>> {
scheme_packet.borrow_mut().tick().map(|()| None)
},
)
.expect("rtl8139d: failed to catch events on scheme file");
event_queue
.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
})
.expect("rtl8139d: failed to trigger events");
#[allow(unreachable_code)]
match event_queue
.run()
.expect("rtl8139d: failed to handle events") {}
}
Source::Scheme => {
scheme.tick().unwrap();
}
}
}
unreachable!()
}
fn main() {
+3 -3
View File
@@ -4,9 +4,10 @@ version = "0.1.0"
edition = "2018"
[dependencies]
bitflags = "1"
bitflags = "2"
libredox = "0.1.3"
log = "0.4"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
redox_event = "0.4.1"
redox_syscall = "0.5"
redox-daemon = "0.1"
redox-log = "0.1"
@@ -14,4 +15,3 @@ redox-log = "0.1"
common = { path = "../../common" }
driver-network = { path = "../driver-network" }
pcid = { path = "../../pcid" }
libredox = "0.1.3"
+28 -39
View File
@@ -7,7 +7,7 @@ use std::ptr::NonNull;
use std::rc::Rc;
use driver_network::NetworkScheme;
use event::EventQueue;
use event::{user_data, EventQueue};
use pcid_interface::{MsiSetFeatureInfo, PcidServerHandle, PciFeature, PciFeatureInfo, SetFeatureInfo, SubdriverArguments};
#[cfg(target_arch = "x86_64")]
use pcid_interface::irq_helpers::allocate_single_interrupt_vector_for_msi;
@@ -232,10 +232,18 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
let device =
unsafe { device::Rtl8168::new(address).expect("rtl8168d: failed to allocate device") };
let scheme = Rc::new(RefCell::new(NetworkScheme::new(device, format!("network.{name}"))));
let mut scheme = NetworkScheme::new(device, format!("network.{name}"));
let mut event_queue =
EventQueue::<Infallible>::new().expect("rtl8168d: failed to create event queue");
user_data! {
enum Source {
Irq,
Scheme,
}
}
let mut event_queue = EventQueue::<Source>::new().expect("rtl8168d: Could not create event queue.");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
event_queue.subscribe(scheme.event_handle() as usize, Source::Scheme, event::EventFlags::READ).unwrap();
libredox::call::setrens(0, 0).expect("rtl8168d: failed to enter null namespace");
@@ -243,45 +251,26 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
.ready()
.expect("rtl8168d: failed to mark daemon as ready");
let scheme_irq = scheme.clone();
event_queue
.add(
irq_file.as_raw_fd(),
move |_event| -> Result<Option<Infallible>> {
scheme.tick().unwrap();
for event in event_queue.map(|e| e.expect("rtl8168d: failed to get next event")) {
match event.user_data {
Source::Irq => {
let mut irq = [0; 8];
irq_file.read(&mut irq)?;
irq_file.read(&mut irq).unwrap();
//TODO: This may be causing spurious interrupts
if unsafe { scheme_irq.borrow_mut().adapter_mut().irq() } {
irq_file.write(&mut irq)?;
if unsafe { scheme.adapter_mut().irq() } {
irq_file.write(&mut irq).unwrap();
return scheme_irq.borrow_mut().tick().map(|()| None);
scheme.tick().unwrap();
}
Ok(None)
},
)
.expect("rtl8168d: failed to catch events on IRQ file");
let scheme_packet = scheme.clone();
event_queue
.add(
scheme.borrow().event_handle(),
move |_event| -> Result<Option<Infallible>> {
scheme_packet.borrow_mut().tick().map(|()| None)
},
)
.expect("rtl8168d: failed to catch events on scheme file");
event_queue
.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
})
.expect("rtl8168d: failed to trigger events");
#[allow(unreachable_code)]
match event_queue
.run()
.expect("rtl8168d: failed to handle events") {}
}
Source::Scheme => {
scheme.tick().unwrap();
}
}
}
unreachable!()
}
fn main() {
+1 -1
View File
@@ -23,7 +23,7 @@ paw = "1.0"
pci_types = "0.6.1"
plain = "0.2"
redox-log = "0.1"
redox_syscall = "0.4"
redox_syscall = "0.5"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
structopt = { version = "0.3", default-features = false, features = [ "paw" ] }
+1 -1
View File
@@ -6,6 +6,6 @@ edition = "2018"
[dependencies]
bitflags = "1"
orbclient = "0.3.27"
redox_syscall = "0.4"
redox_syscall = "0.5"
redox-daemon = "0.1"
libredox = "0.1.3"
+1 -1
View File
@@ -11,5 +11,5 @@ license = "MIT"
anyhow = "1"
libredox = "0.1.3"
redox-daemon = "0.1"
redox_syscall = "0.4"
redox_syscall = "0.5"
slab = "0.4"
+1 -1
View File
@@ -12,6 +12,6 @@ base64 = "0.11" # Only for debugging
libredox = "0.1.3"
plain = "0.2"
redox-daemon = "0.1"
redox_syscall = "0.4"
redox_syscall = "0.5"
thiserror = "1"
xhcid = { path = "../../xhcid" }
+3 -3
View File
@@ -8,10 +8,10 @@ license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
bitflags = "1.2"
bitflags = "2"
log = "0.4"
orbclient = "0.3.27"
orbclient = "0.3.47"
redox-log = "0.1"
redox_syscall = "0.4"
redox_syscall = "0.5"
ux = "0.1"
xhcid = { path = "../xhcid" }
+1
View File
@@ -9,6 +9,7 @@ enum Protocol {
}*/
bitflags! {
#[derive(Clone, Copy, Debug)]
pub struct MainItemFlags: u32 {
const CONSTANT = 1 << 0;
const VARIABLE = 1 << 1;
+3 -3
View File
@@ -4,11 +4,11 @@ version = "0.1.0"
edition = "2018"
[dependencies]
orbclient = "0.3.27"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
libredox = "0.1.3"
orbclient = "0.3.47"
redox_event = "0.4.1"
redox_syscall = "0.5"
redox-daemon = "0.1"
common = { path = "../common" }
pcid = { path = "../pcid" }
libredox = "0.1.3"
+19 -23
View File
@@ -1,11 +1,7 @@
//#![deny(warnings)]
extern crate event;
extern crate orbclient;
extern crate syscall;
use event::EventQueue;
use std::mem;
use event::{user_data, EventQueue};
use std::{iter, mem};
use std::os::unix::io::AsRawFd;
use std::fs::File;
use std::io::{Result, Read, Write};
@@ -203,8 +199,6 @@ fn main() {
// Daemonize
redox_daemon::Daemon::new(move |daemon| {
daemon.ready().expect("failed to signal readiness");
common::acquire_port_io_rights().expect("vboxd: failed to get I/O permission");
let mut width = 0;
@@ -242,7 +236,16 @@ fn main() {
vmmdev.guest_events.write(VBOX_EVENT_DISPLAY | VBOX_EVENT_MOUSE);
let mut event_queue = EventQueue::<()>::new().expect("vboxd: failed to create event queue");
user_data! {
enum Source {
Irq,
}
}
let event_queue = EventQueue::<Source>::new().expect("vboxd: Could not create event queue.");
event_queue.subscribe(irq_file.as_raw_fd() as usize, Source::Irq, event::EventFlags::READ).unwrap();
daemon.ready().expect("failed to signal readiness");
libredox::call::setrens(0, 0).expect("vboxd: failed to enter null namespace");
@@ -250,13 +253,14 @@ fn main() {
let get_mouse = VboxGetMouse::new().expect("vboxd: failed to map GetMouse");
let display_change = VboxDisplayChange::new().expect("vboxd: failed to map DisplayChange");
let ack_events = VboxAckEvents::new().expect("vboxd: failed to map AckEvents");
event_queue.add(irq_file.as_raw_fd(), move |_event| -> Result<Option<()>> {
for Source::Irq in iter::once(Source::Irq).chain(event_queue.map(|e| e.expect("vboxd: failed to get next event").user_data)) {
let mut irq = [0; 8];
if irq_file.read(&mut irq)? >= irq.len() {
if irq_file.read(&mut irq).unwrap() >= irq.len() {
let host_events = vmmdev.host_events.read();
if host_events != 0 {
port.write(ack_events.physical() as u32);
irq_file.write(&irq)?;
irq_file.write(&irq).unwrap();
if host_events & VBOX_EVENT_DISPLAY == VBOX_EVENT_DISPLAY {
port.write(display_change.physical() as u32);
@@ -269,8 +273,8 @@ fn main() {
println!("Display {}, {}", width, height);
bga.set_size(width as u16, height as u16);
let _ = display.write(&orbclient::ResizeEvent {
width: width,
height: height,
width,
height,
}.to_event());
}
}
@@ -289,15 +293,7 @@ fn main() {
}
}
}
Ok(None)
}).expect("vboxd: failed to poll irq");
event_queue.trigger_all(event::Event {
fd: 0,
flags: Default::default(),
}).expect("vboxd: failed to trigger events");
event_queue.run().expect("vboxd: failed to run event loop");
}
}
std::process::exit(0);
+2 -2
View File
@@ -8,14 +8,14 @@ authors = ["Anhad Singh <andypython@protonmail.com>"]
static_assertions = "1.1.0"
bitflags = "2.3.2"
redox_syscall = "0.5"
libredox = "0.1.3"
log = "0.4"
thiserror = "1.0.40"
futures = { version = "0.3.28", features = ["executor"] }
crossbeam-queue = "0.3.8"
redox-log = "0.1"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
redox_event = "0.4.1"
common = { path = "../common" }
pcid = { path = "../pcid" }
libredox = "0.1.3"
+8 -15
View File
@@ -2,7 +2,7 @@ use crate::spec::*;
use crate::utils::align;
use common::dma::Dma;
use event::EventQueue;
use event::{EventQueue, RawEventQueue};
use core::mem::size_of;
use core::sync::atomic::{AtomicU16, Ordering};
@@ -67,22 +67,15 @@ pub fn spawn_irq_thread(irq_handle: &File, queue: &Arc<Queue<'static>>) {
let queue_copy = queue.clone();
std::thread::spawn(move || {
let mut event_queue = EventQueue::<usize>::new().unwrap();
let mut event_queue = RawEventQueue::new().unwrap();
event_queue
.add(irq_fd, move |_| -> Result<Option<usize>, std::io::Error> {
// Wake up the tasks waiting on the queue.
for (_, task) in queue_copy.waker.lock().unwrap().iter() {
task.wake_by_ref();
}
event_queue.subscribe(irq_fd as usize, 0, event::EventFlags::READ).unwrap();
// Wake up the tasks waiting on the queue.
Ok(None)
})
.unwrap();
loop {
event_queue.run().unwrap();
for event in event_queue.map(Result::unwrap) {
// Wake up the tasks waiting on the queue.
for (_, task) in queue_copy.waker.lock().unwrap().iter() {
task.wake_by_ref();
}
}
});
}