diff --git a/drivers/audio/ihdad/src/main.rs b/drivers/audio/ihdad/src/main.rs index 31a2add7..a75a0a35 100755 --- a/drivers/audio/ihdad/src/main.rs +++ b/drivers/audio/ihdad/src/main.rs @@ -57,7 +57,15 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { EventQueue::::new().expect("ihdad: Could not create event queue."); let socket = Socket::nonblock().expect("ihdad: failed to create socket"); let mut device = unsafe { - hda::IntelHDA::new(address, vend_prod).expect("ihdad: failed to allocate device") + match hda::IntelHDA::new(address, vend_prod) { + Ok(dev) => dev, + Err(e) => { + log::error!("ihdad: failed to initialize HDA device (err {}), exiting gracefully", e); + log::info!("ihdad: this is expected in virtual environments without functional HDA hardware"); + daemon.ready(); + return loop {}; + } + } }; let mut readiness_based = ReadinessBased::new(&socket, 16); diff --git a/drivers/net/e1000d/src/main.rs b/drivers/net/e1000d/src/main.rs index 373ea9b3..2e4cf579 100644 --- a/drivers/net/e1000d/src/main.rs +++ b/drivers/net/e1000d/src/main.rs @@ -70,15 +70,15 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { libredox::call::setrens(0, 0).expect("e1000d: failed to enter null namespace"); - scheme.tick().unwrap(); + scheme.tick().expect("e1000d: initial scheme tick failed"); 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).unwrap(); + irq_file.read(&mut irq).expect("e1000d: failed to read IRQ from kernel"); if unsafe { scheme.adapter().irq() } { - irq_file.write(&mut irq).unwrap(); + irq_file.write(&mut irq).expect("e1000d: failed to acknowledge IRQ"); scheme.tick().expect("e1000d: failed to handle IRQ") } diff --git a/drivers/net/rtl8168d/src/main.rs b/drivers/net/rtl8168d/src/main.rs index 1d9963a3..08efda6c 100644 --- a/drivers/net/rtl8168d/src/main.rs +++ b/drivers/net/rtl8168d/src/main.rs @@ -81,33 +81,33 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { Source::Irq, event::EventFlags::READ, ) - .unwrap(); + .expect("rtl8168d: failed to subscribe to scheme event"); event_queue .subscribe( scheme.event_handle().raw(), Source::Scheme, event::EventFlags::READ, ) - .unwrap(); + .expect("rtl8168d: failed to subscribe to scheme event"); libredox::call::setrens(0, 0).expect("rtl8168d: failed to enter null namespace"); - scheme.tick().unwrap(); + scheme.tick().expect("rtl8168d: scheme tick failed"); 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.irq_handle().read(&mut irq).unwrap(); + irq_file.irq_handle().read(&mut irq).expect("rtl8168d: failed to read IRQ"); //TODO: This may be causing spurious interrupts if unsafe { scheme.adapter_mut().irq() } { - irq_file.irq_handle().write(&mut irq).unwrap(); + irq_file.irq_handle().write(&mut irq).expect("rtl8168d: failed to acknowledge IRQ"); - scheme.tick().unwrap(); + scheme.tick().expect("rtl8168d: scheme tick failed"); } } Source::Scheme => { - scheme.tick().unwrap(); + scheme.tick().expect("rtl8168d: scheme tick failed"); } } }