From 3abe41d258402111a0aff89a950da1e2e8c4192e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Wed, 3 Dec 2025 22:40:52 +0100 Subject: [PATCH] drivers/pcid: Add pci_daemon function This handles daemonization and getting the PciFunctionHandle. --- drivers/audio/ac97d/src/main.rs | 5 ++-- drivers/audio/ihdad/src/main.rs | 10 +++---- drivers/graphics/bgad/src/main.rs | 5 ++-- drivers/graphics/virtio-gpud/src/main.rs | 35 +++++++++++----------- drivers/net/e1000d/src/main.rs | 5 ++-- drivers/net/ixgbed/src/main.rs | 5 ++-- drivers/net/rtl8139d/src/main.rs | 10 +++---- drivers/net/rtl8168d/src/main.rs | 10 +++---- drivers/net/virtio-netd/src/main.rs | 37 ++++++++++++------------ drivers/pcid/src/driver_interface/mod.rs | 10 ++++++- drivers/pcid/src/lib.rs | 2 ++ drivers/storage/ahcid/src/main.rs | 5 ++-- drivers/storage/ided/src/main.rs | 6 ++-- drivers/storage/nvmed/src/main.rs | 6 ++-- drivers/storage/virtio-blkd/src/main.rs | 35 +++++++++++----------- drivers/usb/xhcid/src/main.rs | 11 ++++--- drivers/vboxd/src/main.rs | 5 ++-- 17 files changed, 98 insertions(+), 104 deletions(-) diff --git a/drivers/audio/ac97d/src/main.rs b/drivers/audio/ac97d/src/main.rs index 1aa36ca774..9d9e785199 100644 --- a/drivers/audio/ac97d/src/main.rs +++ b/drivers/audio/ac97d/src/main.rs @@ -18,11 +18,10 @@ use std::cell::RefCell; pub mod device; fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let pcid_handle = PciFunctionHandle::connect_default(); +fn daemon(daemon: daemon::Daemon, pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); diff --git a/drivers/audio/ihdad/src/main.rs b/drivers/audio/ihdad/src/main.rs index 4bb4652fdb..7331a59197 100755 --- a/drivers/audio/ihdad/src/main.rs +++ b/drivers/audio/ihdad/src/main.rs @@ -23,9 +23,11 @@ QEMU ICH9 8086:293E 82801H ICH8 8086:284B */ -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn main() { + pcid_interface::pci_daemon(daemon); +} +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); @@ -138,7 +140,3 @@ fn daemon(daemon: daemon::Daemon) -> ! { std::process::exit(0); } } - -fn main() { - daemon::Daemon::new(daemon); -} diff --git a/drivers/graphics/bgad/src/main.rs b/drivers/graphics/bgad/src/main.rs index 7abb2beba0..2170d21b2d 100644 --- a/drivers/graphics/bgad/src/main.rs +++ b/drivers/graphics/bgad/src/main.rs @@ -13,11 +13,10 @@ mod scheme; // FIXME add a driver-graphics implementation fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); diff --git a/drivers/graphics/virtio-gpud/src/main.rs b/drivers/graphics/virtio-gpud/src/main.rs index bcd170d905..5852efaebb 100644 --- a/drivers/graphics/virtio-gpud/src/main.rs +++ b/drivers/graphics/virtio-gpud/src/main.rs @@ -430,8 +430,23 @@ impl MoveCursor { static DEVICE: spin::Once = spin::Once::new(); -fn deamon(deamon: daemon::Daemon) -> anyhow::Result<()> { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn main() { + pcid_interface::pci_daemon(daemon_runner); +} + +fn daemon_runner(daemon: daemon::Daemon, pcid_handle: PciFunctionHandle) -> ! { + deamon(daemon, pcid_handle).unwrap(); + unreachable!(); +} + +fn deamon(deamon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> anyhow::Result<()> { + common::setup_logging( + "graphics", + "pci", + "virtio-gpud", + common::output_level(), + common::file_level(), + ); // Double check that we have the right device. // @@ -542,19 +557,3 @@ fn deamon(deamon: daemon::Daemon) -> anyhow::Result<()> { std::process::exit(0); } - -fn daemon_runner(daemon: daemon::Daemon) -> ! { - common::setup_logging( - "graphics", - "pci", - "virtio-gpud", - common::output_level(), - common::file_level(), - ); - deamon(daemon).unwrap(); - unreachable!(); -} - -pub fn main() { - daemon::Daemon::new(daemon_runner); -} diff --git a/drivers/net/e1000d/src/main.rs b/drivers/net/e1000d/src/main.rs index 81e5bd77da..373ea9b38b 100644 --- a/drivers/net/e1000d/src/main.rs +++ b/drivers/net/e1000d/src/main.rs @@ -8,11 +8,10 @@ use pcid_interface::PciFunctionHandle; pub mod device; fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); diff --git a/drivers/net/ixgbed/src/main.rs b/drivers/net/ixgbed/src/main.rs index f3ded2abd0..4a6ce74dcd 100644 --- a/drivers/net/ixgbed/src/main.rs +++ b/drivers/net/ixgbed/src/main.rs @@ -10,11 +10,10 @@ pub mod device; mod ixgbe; fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); diff --git a/drivers/net/rtl8139d/src/main.rs b/drivers/net/rtl8139d/src/main.rs index df736ec565..d470e814df 100644 --- a/drivers/net/rtl8139d/src/main.rs +++ b/drivers/net/rtl8139d/src/main.rs @@ -35,9 +35,11 @@ fn map_bar(pcid_handle: &mut PciFunctionHandle) -> *mut u8 { panic!("rtl8139d: failed to find BAR"); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn main() { + pcid_interface::pci_daemon(daemon); +} +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); @@ -111,7 +113,3 @@ fn daemon(daemon: daemon::Daemon) -> ! { } unreachable!() } - -fn main() { - daemon::Daemon::new(daemon); -} diff --git a/drivers/net/rtl8168d/src/main.rs b/drivers/net/rtl8168d/src/main.rs index 11742dd574..1d9963a3ad 100644 --- a/drivers/net/rtl8168d/src/main.rs +++ b/drivers/net/rtl8168d/src/main.rs @@ -35,9 +35,11 @@ fn map_bar(pcid_handle: &mut PciFunctionHandle) -> *mut u8 { panic!("rtl8168d: failed to find BAR"); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn main() { + pcid_interface::pci_daemon(daemon); +} +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); @@ -111,7 +113,3 @@ fn daemon(daemon: daemon::Daemon) -> ! { } unreachable!() } - -fn main() { - daemon::Daemon::new(daemon); -} diff --git a/drivers/net/virtio-netd/src/main.rs b/drivers/net/virtio-netd/src/main.rs index 04c943d6ba..17d168efdf 100644 --- a/drivers/net/virtio-netd/src/main.rs +++ b/drivers/net/virtio-netd/src/main.rs @@ -26,9 +26,26 @@ pub struct VirtHeader { static_assertions::const_assert_eq!(core::mem::size_of::(), 12); const MAX_BUFFER_LEN: usize = 65535; +fn main() { + pcid_interface::pci_daemon(daemon_runner); +} -fn deamon(daemon: daemon::Daemon) -> Result<(), Box> { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn daemon_runner(daemon: daemon::Daemon, pcid_handle: PciFunctionHandle) -> ! { + deamon(daemon, pcid_handle).unwrap(); + unreachable!(); +} + +fn deamon( + daemon: daemon::Daemon, + mut pcid_handle: PciFunctionHandle, +) -> Result<(), Box> { + common::setup_logging( + "net", + "pci", + "virtio-netd", + common::output_level(), + common::file_level(), + ); // Double check that we have the right device. // @@ -118,19 +135,3 @@ fn deamon(daemon: daemon::Daemon) -> Result<(), Box> { scheme.tick()?; } } - -fn daemon_runner(daemon: daemon::Daemon) -> ! { - common::setup_logging( - "net", - "pci", - "virtio-netd", - common::output_level(), - common::file_level(), - ); - deamon(daemon).unwrap(); - unreachable!(); -} - -pub fn main() { - daemon::Daemon::new(daemon_runner); -} diff --git a/drivers/pcid/src/driver_interface/mod.rs b/drivers/pcid/src/driver_interface/mod.rs index d1fa8d733d..f7c93b51f8 100644 --- a/drivers/pcid/src/driver_interface/mod.rs +++ b/drivers/pcid/src/driver_interface/mod.rs @@ -6,6 +6,7 @@ use std::ptr::NonNull; use std::{env, io}; use std::{fmt, process}; +use daemon::Daemon; use serde::{de::DeserializeOwned, Deserialize, Serialize}; pub use bar::PciBar; @@ -297,7 +298,7 @@ fn recv(r: &mut File) -> T { } impl PciFunctionHandle { - pub fn connect_default() -> Self { + fn connect_default() -> Self { let channel_fd = match env::var("PCID_CLIENT_CHANNEL") { Ok(channel_fd) => channel_fd, Err(err) => { @@ -471,3 +472,10 @@ impl PciFunctionHandle { } } } + +pub fn pci_daemon !>(f: F) -> ! { + Daemon::new(|daemon| { + let pcid_handle = PciFunctionHandle::connect_default(); + f(daemon, pcid_handle) + }) +} diff --git a/drivers/pcid/src/lib.rs b/drivers/pcid/src/lib.rs index 312a886cf5..e8098a1786 100644 --- a/drivers/pcid/src/lib.rs +++ b/drivers/pcid/src/lib.rs @@ -1,4 +1,6 @@ //! Interface to `pcid`. +#![feature(never_type)] + mod driver_interface; pub use driver_interface::*; diff --git a/drivers/storage/ahcid/src/main.rs b/drivers/storage/ahcid/src/main.rs index 4b6a34523f..45415732bf 100644 --- a/drivers/storage/ahcid/src/main.rs +++ b/drivers/storage/ahcid/src/main.rs @@ -14,11 +14,10 @@ use log::{error, info}; pub mod ahci; fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); diff --git a/drivers/storage/ided/src/main.rs b/drivers/storage/ided/src/main.rs index a5c07e331d..e94998a713 100644 --- a/drivers/storage/ided/src/main.rs +++ b/drivers/storage/ided/src/main.rs @@ -18,12 +18,10 @@ use crate::ide::{AtaCommand, AtaDisk, Channel}; pub mod ide; fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let pcid_handle = PciFunctionHandle::connect_default(); - +fn daemon(daemon: daemon::Daemon, pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name(); diff --git a/drivers/storage/nvmed/src/main.rs b/drivers/storage/nvmed/src/main.rs index bdf4a8c08f..beb1b68940 100644 --- a/drivers/storage/nvmed/src/main.rs +++ b/drivers/storage/nvmed/src/main.rs @@ -57,10 +57,10 @@ fn time_arm(time_handle: &mut File, secs: i64) -> io::Result<()> { } fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); + +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let scheme_name = format!("disk.{}-nvme", pci_config.func.name()); diff --git a/drivers/storage/virtio-blkd/src/main.rs b/drivers/storage/virtio-blkd/src/main.rs index 4f47c6ecd6..d21236b377 100644 --- a/drivers/storage/virtio-blkd/src/main.rs +++ b/drivers/storage/virtio-blkd/src/main.rs @@ -30,10 +30,6 @@ pub enum Error { SyscallError(syscall::Error), } -pub fn main() { - daemon::Daemon::new(daemon_runner); -} - #[repr(C)] pub struct BlockGeometry { pub cylinders: VolatileCell, @@ -102,8 +98,23 @@ pub struct BlockVirtRequest { const_assert_eq!(core::mem::size_of::(), 16); -fn daemon(daemon: daemon::Daemon) -> anyhow::Result<()> { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn main() { + pcid_interface::pci_daemon(daemon_runner); +} + +fn daemon_runner(redox_daemon: daemon::Daemon, pcid_handle: PciFunctionHandle) -> ! { + daemon(redox_daemon, pcid_handle).unwrap(); + unreachable!(); +} + +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> anyhow::Result<()> { + common::setup_logging( + "disk", + "pci", + "virtio-blkd", + common::output_level(), + common::file_level(), + ); // Double check that we have the right device. // @@ -169,15 +180,3 @@ fn daemon(daemon: daemon::Daemon) -> anyhow::Result<()> { Ok(()) } - -fn daemon_runner(redox_daemon: daemon::Daemon) -> ! { - common::setup_logging( - "disk", - "pci", - "virtio-blkd", - common::output_level(), - common::file_level(), - ); - daemon(redox_daemon).unwrap(); - unreachable!(); -} diff --git a/drivers/usb/xhcid/src/main.rs b/drivers/usb/xhcid/src/main.rs index 0a20f84d71..613bd1c7be 100644 --- a/drivers/usb/xhcid/src/main.rs +++ b/drivers/usb/xhcid/src/main.rs @@ -115,10 +115,6 @@ fn get_int_method(pcid_handle: &mut PciFunctionHandle) -> (Option, Interru } } -fn main() { - daemon::Daemon::new(daemon); -} - //TODO: cleanup CSZ support fn daemon_with_context_size( daemon: daemon::Daemon, @@ -185,8 +181,11 @@ fn daemon_with_context_size( } } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn main() { + pcid_interface::pci_daemon(daemon); +} + +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let address = unsafe { pcid_handle.map_bar(0) }.ptr.as_ptr() as usize; let cap = unsafe { &mut *(address as *mut xhci::CapabilityRegs) }; if cap.csz() { diff --git a/drivers/vboxd/src/main.rs b/drivers/vboxd/src/main.rs index 341bdcc130..710f6afa06 100644 --- a/drivers/vboxd/src/main.rs +++ b/drivers/vboxd/src/main.rs @@ -191,11 +191,10 @@ impl VboxGuestInfo { } fn main() { - daemon::Daemon::new(daemon); + pcid_interface::pci_daemon(daemon); } -fn daemon(daemon: daemon::Daemon) -> ! { - let mut pcid_handle = PciFunctionHandle::connect_default(); +fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let pci_config = pcid_handle.config(); let mut name = pci_config.func.name();