diff --git a/kernel/comps/virtio/Cargo.toml b/kernel/comps/virtio/Cargo.toml index 4c5fb1440..a610949fb 100644 --- a/kernel/comps/virtio/Cargo.toml +++ b/kernel/comps/virtio/Cargo.toml @@ -24,5 +24,9 @@ component = { path = "../../libs/comp-sys/component" } log = "0.4" int-to-c-enum = { path = "../../libs/int-to-c-enum" } +[features] +all = ["cvm_guest"] +cvm_guest = ["ostd/cvm_guest"] + [lints] workspace = true diff --git a/ostd/src/bus/mmio/bus.rs b/kernel/comps/virtio/src/transport/mmio/bus/bus.rs similarity index 96% rename from ostd/src/bus/mmio/bus.rs rename to kernel/comps/virtio/src/transport/mmio/bus/bus.rs index e03a20725..ab455528c 100644 --- a/ostd/src/bus/mmio/bus.rs +++ b/kernel/comps/virtio/src/transport/mmio/bus/bus.rs @@ -2,14 +2,12 @@ //! MMIO bus. -#![expect(unused_variables)] - use alloc::{collections::VecDeque, fmt::Debug, sync::Arc, vec::Vec}; use log::{debug, error}; +use ostd::bus::BusProbeError; use super::common_device::MmioCommonDevice; -use crate::bus::BusProbeError; /// MMIO device trait pub trait MmioDevice: Sync + Send + Debug { @@ -45,7 +43,7 @@ impl MmioBus { pub fn register_driver(&mut self, driver: Arc) { debug!("Register driver:{:#x?}", driver); let length = self.common_devices.len(); - for i in (0..length).rev() { + for _ in (0..length).rev() { let common_device = self.common_devices.pop_front().unwrap(); let device_id = common_device.read_device_id().unwrap(); let device = match driver.probe(common_device) { diff --git a/ostd/src/bus/mmio/common_device.rs b/kernel/comps/virtio/src/transport/mmio/bus/common_device.rs similarity index 88% rename from ostd/src/bus/mmio/common_device.rs rename to kernel/comps/virtio/src/transport/mmio/bus/common_device.rs index c040f8e06..552a2f918 100644 --- a/ostd/src/bus/mmio/common_device.rs +++ b/kernel/comps/virtio/src/transport/mmio/bus/common_device.rs @@ -4,12 +4,11 @@ use int_to_c_enum::TryFromInt; use log::info; - #[cfg(target_arch = "x86_64")] -use crate::arch::kernel::MappedIrqLine; +use ostd::arch::kernel::MappedIrqLine; #[cfg(target_arch = "riscv64")] // TODO: Add `MappedIrqLine` support for RISC-V. -use crate::trap::IrqLine as MappedIrqLine; -use crate::{io::IoMem, mm::VmIoOnce, trap::IrqLine, Error, Result}; +use ostd::trap::IrqLine as MappedIrqLine; +use ostd::{io::IoMem, mm::VmIoOnce, trap::IrqLine, Error, Result}; /// A MMIO common device. #[derive(Debug)] @@ -53,11 +52,6 @@ impl MmioCommonDevice { pub fn irq(&self) -> &IrqLine { &self.irq } - - /// Returns a mutable reference to the IRQ line. - pub fn irq_mut(&mut self) -> &mut IrqLine { - &mut self.irq - } } /// Virtio MMIO version. diff --git a/ostd/src/bus/mmio/mod.rs b/kernel/comps/virtio/src/transport/mmio/bus/mod.rs similarity index 92% rename from ostd/src/bus/mmio/mod.rs rename to kernel/comps/virtio/src/transport/mmio/bus/mod.rs index 246183854..db5a9a43e 100644 --- a/ostd/src/bus/mmio/mod.rs +++ b/kernel/comps/virtio/src/transport/mmio/bus/mod.rs @@ -3,18 +3,18 @@ //! Virtio over MMIO use bus::MmioBus; +use ostd::sync::SpinLock; -use crate::sync::SpinLock; - -pub mod bus; -pub mod common_device; +#[expect(clippy::module_inception)] +pub(super) mod bus; +pub(super) mod common_device; /// The MMIO bus instance. -pub static MMIO_BUS: SpinLock = SpinLock::new(MmioBus::new()); +pub(super) static MMIO_BUS: SpinLock = SpinLock::new(MmioBus::new()); -pub(crate) fn init() { +pub(super) fn init() { #[cfg(target_arch = "x86_64")] - crate::arch::if_tdx_enabled!({ + ostd::if_tdx_enabled!({ // TODO: support virtio-mmio devices on TDX. // // Currently, virtio-mmio devices need to acquire sub-page MMIO regions, @@ -28,8 +28,7 @@ pub(crate) fn init() { fn x86_probe() { use common_device::{mmio_check_magic, mmio_read_device_id, MmioCommonDevice}; use log::debug; - - use crate::{arch::kernel::IRQ_CHIP, io::IoMem, trap::IrqLine}; + use ostd::{arch::kernel::IRQ_CHIP, io::IoMem, trap::IrqLine}; // TODO: The correct method for detecting VirtIO-MMIO devices on x86_64 systems is to parse the // kernel command line if ACPI tables are absent [1], or the ACPI SSDT if ACPI tables are diff --git a/kernel/comps/virtio/src/transport/mmio/device.rs b/kernel/comps/virtio/src/transport/mmio/device.rs index 12c1297dd..cf0bc8bc1 100644 --- a/kernel/comps/virtio/src/transport/mmio/device.rs +++ b/kernel/comps/virtio/src/transport/mmio/device.rs @@ -7,20 +7,21 @@ use aster_rights::{ReadOp, WriteOp}; use aster_util::{field_ptr, safe_ptr::SafePtr}; use log::warn; use ostd::{ - bus::{ - mmio::{ - bus::MmioDevice, - common_device::{MmioCommonDevice, VirtioMmioVersion}, - }, - pci::cfg_space::Bar, - }, + bus::pci::cfg_space::Bar, io::IoMem, mm::{DmaCoherent, PAGE_SIZE}, sync::RwLock, trap::IrqCallbackFunction, }; -use super::{layout::VirtioMmioLayout, multiplex::MultiplexIrq}; +use super::{ + bus::{ + bus::MmioDevice, + common_device::{MmioCommonDevice, VirtioMmioVersion}, + }, + layout::VirtioMmioLayout, + multiplex::MultiplexIrq, +}; use crate::{ queue::{AvailRing, Descriptor, UsedRing}, transport::{ConfigManager, DeviceStatus, VirtioTransport, VirtioTransportError}, @@ -36,7 +37,7 @@ pub struct VirtioMmioDevice { pub struct VirtioMmioTransport { layout: SafePtr, device: Arc, - common_device: ostd::bus::mmio::common_device::MmioCommonDevice, + common_device: MmioCommonDevice, multiplex: Arc>, } diff --git a/kernel/comps/virtio/src/transport/mmio/driver.rs b/kernel/comps/virtio/src/transport/mmio/driver.rs index 5dff50353..42c47904c 100644 --- a/kernel/comps/virtio/src/transport/mmio/driver.rs +++ b/kernel/comps/virtio/src/transport/mmio/driver.rs @@ -2,18 +2,15 @@ use alloc::{sync::Arc, vec::Vec}; -use ostd::{ - bus::{ - mmio::{ - bus::{MmioDevice, MmioDriver}, - common_device::MmioCommonDevice, - }, - BusProbeError, - }, - sync::SpinLock, -}; +use ostd::{bus::BusProbeError, sync::SpinLock}; -use super::device::VirtioMmioTransport; +use super::{ + bus::{ + bus::{MmioDevice, MmioDriver}, + common_device::MmioCommonDevice, + }, + device::VirtioMmioTransport, +}; #[derive(Debug)] pub struct VirtioMmioDriver { diff --git a/kernel/comps/virtio/src/transport/mmio/mod.rs b/kernel/comps/virtio/src/transport/mmio/mod.rs index 2bf16e294..dc03ab335 100644 --- a/kernel/comps/virtio/src/transport/mmio/mod.rs +++ b/kernel/comps/virtio/src/transport/mmio/mod.rs @@ -2,18 +2,22 @@ use alloc::sync::Arc; -use ostd::bus::mmio::MMIO_BUS; +use bus::MMIO_BUS; use spin::Once; use self::driver::VirtioMmioDriver; +mod bus; pub mod device; pub mod driver; pub mod layout; pub mod multiplex; pub static VIRTIO_MMIO_DRIVER: Once> = Once::new(); + pub fn virtio_mmio_init() { + bus::init(); + VIRTIO_MMIO_DRIVER.call_once(|| Arc::new(VirtioMmioDriver::new())); MMIO_BUS .lock() diff --git a/ostd/src/bus/mod.rs b/ostd/src/bus/mod.rs index f22a58363..fc9f460aa 100644 --- a/ostd/src/bus/mod.rs +++ b/ostd/src/bus/mod.rs @@ -2,7 +2,6 @@ //! Bus operations -pub mod mmio; pub mod pci; /// An error that occurs during bus probing. @@ -17,5 +16,4 @@ pub enum BusProbeError { /// Initializes the bus pub(crate) fn init() { pci::init(); - mmio::init(); }