diff --git a/Cargo.lock b/Cargo.lock index 9a868c0..cd047b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,16 +61,10 @@ dependencies = [ ] [[package]] -name = "bitflags" -version = "1.3.2" +name = "autocfg" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "clap" @@ -201,7 +195,16 @@ dependencies = [ "env_logger", "eyre", "log", - "vfio-ioctls", + "pci-driver", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", ] [[package]] @@ -210,6 +213,16 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "pci-driver" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da882b89e91da979a91f6cc32f54e5bdbb18c6b46280a032a2225e30a03390fd" +dependencies = [ + "libc", + "num-traits", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -274,26 +287,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "thiserror" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "unicode-ident" version = "1.0.12" @@ -306,70 +299,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" -[[package]] -name = "vfio-bindings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43449b404c488f70507dca193debd4bea361fe8089869b947adc19720e464bce" - -[[package]] -name = "vfio-ioctls" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068bac78842164a8ecc1d1a84a8d8a9168ab29fa3c96942689e286a30ae22ac4" -dependencies = [ - "byteorder", - "libc", - "log", - "thiserror", - "vfio-bindings", - "vm-memory", - "vmm-sys-util", -] - -[[package]] -name = "vm-memory" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3aba5064cc5f6f7740cddc8dae34d2d9a311cac69b60d942af7f3ab8fc49f4" -dependencies = [ - "libc", - "thiserror", - "winapi", -] - -[[package]] -name = "vmm-sys-util" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1435039746e20da4f8d507a72ee1b916f7b4b05af7a91c093d2c6561934ede" -dependencies = [ - "bitflags", - "libc", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index 949732b..bb828e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,4 @@ clap = { version = "4.5.9", features = ["derive"] } env_logger = "0.11.3" eyre = "0.6.12" log = "0.4.22" -vfio-ioctls = { version = "0.1.0", default-features = false } +pci-driver = "0.1.4" diff --git a/src/main.rs b/src/main.rs index cd6d7a6..bd153fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,5 @@ -use std::sync::Arc; - use clap::Parser; -use vfio_ioctls::{VfioContainer, VfioDevice}; +use pci_driver::{backends::vfio::VfioPciDevice, device::PciDevice}; #[derive(Parser, Debug)] struct Args { @@ -18,14 +16,29 @@ fn main() -> eyre::Result<()> { env_logger::init(); let args = Args::parse(); - let container = Arc::new(VfioContainer::new(())?); - let device = VfioDevice::new(&args.device, container.clone())?; + let device = VfioPciDevice::open(&args.device)?; if args.reset { - device.reset(); + device.reset()?; } - log::info!("max_interrupts: {}", device.()); + let config = device.config(); + // This library got the order backwards... + let class = ( + config.class_code().programming_interface().read()?, + config.class_code().sub_class_code().read()?, + config.class_code().base_class_code().read()?, + ); + println!("{:?}", class); + if class != (0x0c, 0x03, 0x30) { + eyre::bail!("Device is not xHCI controller!"); + } + + log::info!( + "Found PCIe device {:04x}:{:04x}", + config.vendor_id().read()?, + config.device_id().read()? + ); Ok(()) }