Merge branch 'latest_eq' into 'master'
Use latest event queue interface everywhere. See merge request redox-os/drivers!151
This commit is contained in:
Generated
+188
-227
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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,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
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
@@ -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() {
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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" }
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user