From 1580cb8c8370a75bf78bd2b5d000b3164136fb17 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Mon, 19 Jun 2023 12:02:35 +1000 Subject: [PATCH] virtio: stub! Signed-off-by: Anhad Singh --- .gitignore | 3 ++ Cargo.lock | 71 +++++++++++++++++++++++++++++++------------- Cargo.toml | 2 ++ initfs.toml | 10 +++++++ virtiod/Cargo.toml | 16 ++++++++++ virtiod/src/lib.rs | 34 +++++++++++++++++++++ virtiod/src/main.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 188 insertions(+), 20 deletions(-) create mode 100644 virtiod/Cargo.toml create mode 100644 virtiod/src/lib.rs create mode 100644 virtiod/src/main.rs diff --git a/.gitignore b/.gitignore index 2f7896d1d1..9b0fb7e2e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ target/ + +# editor configs: +.vscode diff --git a/Cargo.lock b/Cargo.lock index 33d7a1492c..8d247fb7e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,7 +6,7 @@ version = 3 name = "ac97d" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "log", "redox-daemon", "redox-log", @@ -38,7 +38,7 @@ dependencies = [ name = "ahcid" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "block-io-wrapper", "byteorder 1.4.3", "log", @@ -52,7 +52,7 @@ dependencies = [ name = "alxd" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "netutils", "redox-daemon", "redox_event", @@ -99,6 +99,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + [[package]] name = "arg_parser" version = "0.1.0" @@ -181,6 +187,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bitflags" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded" + [[package]] name = "bitvec" version = "1.0.1" @@ -272,7 +284,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.2.1", "strsim", "textwrap", "unicode-width", @@ -285,7 +297,7 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags", + "bitflags 1.2.1", ] [[package]] @@ -416,7 +428,7 @@ dependencies = [ name = "e1000d" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "netutils", "redox-daemon", "redox_event", @@ -440,7 +452,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags", + "bitflags 1.2.1", "fuchsia-zircon-sys", ] @@ -550,7 +562,7 @@ name = "gpt" version = "0.6.3" source = "git+https://gitlab.redox-os.org/redox-os/gpt#4d800981c5dfae60ae183dbddaa3e026f80a5e5c" dependencies = [ - "bitflags", + "bitflags 1.2.1", "crc", "log", "uuid", @@ -632,7 +644,7 @@ dependencies = [ name = "ihdad" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "log", "pcid", "redox-daemon", @@ -680,7 +692,7 @@ checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" name = "ixgbed" version = "1.0.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "netutils", "redox-daemon", "redox_event", @@ -892,7 +904,7 @@ name = "nvmed" version = "0.1.0" dependencies = [ "arrayvec 0.5.2", - "bitflags", + "bitflags 1.2.1", "block-io-wrapper", "crossbeam-channel 0.4.4", "futures", @@ -1035,7 +1047,7 @@ name = "pcid" version = "0.1.0" dependencies = [ "bincode", - "bitflags", + "bitflags 1.2.1", "byteorder 1.4.3", "libc", "log", @@ -1120,7 +1132,7 @@ dependencies = [ name = "ps2d" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "orbclient", "redox-daemon", "redox_syscall 0.3.5", @@ -1334,7 +1346,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.2.1", ] [[package]] @@ -1343,7 +1355,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.2.1", ] [[package]] @@ -1359,7 +1371,7 @@ dependencies = [ name = "rtl8168d" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "log", "netutils", "pcid", @@ -1396,7 +1408,7 @@ checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" name = "sb16d" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "log", "redox-daemon", "redox-log", @@ -1443,7 +1455,7 @@ version = "0.35.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a" dependencies = [ - "bitflags", + "bitflags 1.2.1", "lazy_static", "libc", "raw-window-handle 0.4.3", @@ -1553,6 +1565,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stb_truetype" version = "0.2.8" @@ -1805,7 +1823,7 @@ dependencies = [ name = "usbhidd" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "log", "orbclient", "redox-log", @@ -1886,6 +1904,19 @@ dependencies = [ "rusttype", ] +[[package]] +name = "virtiod" +version = "0.1.0" +dependencies = [ + "anyhow", + "bitflags 2.3.2", + "log", + "pcid", + "redox-daemon", + "redox-log", + "static_assertions", +] + [[package]] name = "vte" version = "0.3.3" @@ -2106,7 +2137,7 @@ dependencies = [ name = "xhcid" version = "0.1.0" dependencies = [ - "bitflags", + "bitflags 1.2.1", "chashmap", "crossbeam-channel 0.4.4", "futures", diff --git a/Cargo.toml b/Cargo.toml index f68f051017..f1fe9a570b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,8 @@ members = [ "usbctl", "usbhidd", "usbscsid", + + "virtiod", ] [profile.release] diff --git a/initfs.toml b/initfs.toml index 1c1c6015fd..d8d3a62644 100644 --- a/initfs.toml +++ b/initfs.toml @@ -22,3 +22,13 @@ class = 1 subclass = 8 command = ["nvmed"] use_channel = true + +# virtiod +[[drivers]] +name = "VirtIO block storage" +class = 1 +subclass = 0 +# VirtIO PCI vendor identifier. +vendor = 6900 +command = ["virtiod"] +use_channel = true diff --git a/virtiod/Cargo.toml b/virtiod/Cargo.toml new file mode 100644 index 0000000000..07246b5ef2 --- /dev/null +++ b/virtiod/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "virtiod" +version = "0.1.0" +edition = "2021" +authors = ["Anhad Singh "] + +[dependencies] +static_assertions = "1.1.0" +bitflags = "2.3.2" +anyhow = "1.0.71" +log = "0.4" + +redox-daemon = "0.1" +redox-log = "0.1" + +pcid = { path = "../pcid" } diff --git a/virtiod/src/lib.rs b/virtiod/src/lib.rs new file mode 100644 index 0000000000..6f32838461 --- /dev/null +++ b/virtiod/src/lib.rs @@ -0,0 +1,34 @@ +//! https://docs.oasis-open.org/virtio/virtio/v1.1/virtio-v1.1.html + +use static_assertions::const_assert_eq; + +bitflags::bitflags! { + #[repr(transparent)] + pub struct DescriptorFlags: u16 { + /// The next field contains linked buffer index. + const NEXT = 1 << 0; + /// The buffer is write-only (otherwise read-only). + const WRITE_ONLY = 1 << 1; + /// The buffer contains a list of buffer descriptors. + const INDIRECT = 1 << 2; + } +} + +#[repr(C)] +struct Descriptor { + /// Address (guest-physical). + address: u64, + /// Size of the descriptor. + size: u32, + flags: DescriptorFlags, + /// Index of next desciptor in chain. + next: u16, +} + +const_assert_eq!(core::mem::size_of::(), 16); + +pub struct VirtQueue {} + +pub struct Transport {} + + diff --git a/virtiod/src/main.rs b/virtiod/src/main.rs new file mode 100644 index 0000000000..c82fae63a3 --- /dev/null +++ b/virtiod/src/main.rs @@ -0,0 +1,72 @@ +use pcid_interface::{PciFeature, PcidServerHandle}; + +pub fn main() -> anyhow::Result<()> { + #[cfg(target_os = "redox")] + setup_logging(); + + redox_daemon::Daemon::new(daemon).expect("virtio-core: failed to daemonize"); +} + +#[cfg(target_os = "redox")] +fn setup_logging() { + use redox_log::{OutputBuilder, RedoxLogger}; + + let mut logger = RedoxLogger::new().with_output( + OutputBuilder::stderr() + // limit global output to important info + .with_filter(log::LevelFilter::Info) + .with_ansi_escape_codes() + .flush_on_newline(true) + .build(), + ); + + match OutputBuilder::in_redox_logging_scheme("disk", "pcie", "virtiod.log") { + Ok(builder) => { + logger = logger.with_output( + builder + .with_filter(log::LevelFilter::Info) + .flush_on_newline(true) + .build(), + ) + } + Err(err) => eprintln!("virtiod: failed to create log: {}", err), + } + + match OutputBuilder::in_redox_logging_scheme("disk", "pcie", "virtiod.ansi.log") { + Ok(builder) => { + logger = logger.with_output( + builder + .with_filter(log::LevelFilter::Info) + .with_ansi_escape_codes() + .flush_on_newline(true) + .build(), + ) + } + Err(err) => eprintln!("virtiod: failed to create ansi log: {}", err), + } + + logger.enable().unwrap(); + log::info!("virtiod: enabled logger"); +} + +fn daemon(_deamon: redox_daemon::Daemon) -> ! { + let mut pcid_handle = PcidServerHandle::connect_default().unwrap(); + let pci_config = pcid_handle.fetch_config().unwrap(); + + // 0x1001 - virtio-blk + assert_eq!(pci_config.func.devid, 0x1001); + log::info!("virtiod: found `virtio-blk` device"); + + // Get the PCI capabilities. + // for vendor_cap in pcid_handle + // .fetch_all_features() + // .unwrap() + // .iter() + // .filter(|(x, _)| matches!(x, PciFeature::VendorSpecific)) + // { + + // } + // log::info!("{}", x.unwrap() as u8); + + loop {} +}