Move virtio-mmio bus outside OSTD

This commit is contained in:
Ruihan Li
2025-05-26 23:51:37 +08:00
committed by Tate, Hongliang Tian
parent 238b89da46
commit a3c5ab8cb4
8 changed files with 40 additions and 45 deletions

View File

@ -24,5 +24,9 @@ component = { path = "../../libs/comp-sys/component" }
log = "0.4" log = "0.4"
int-to-c-enum = { path = "../../libs/int-to-c-enum" } int-to-c-enum = { path = "../../libs/int-to-c-enum" }
[features]
all = ["cvm_guest"]
cvm_guest = ["ostd/cvm_guest"]
[lints] [lints]
workspace = true workspace = true

View File

@ -2,14 +2,12 @@
//! MMIO bus. //! MMIO bus.
#![expect(unused_variables)]
use alloc::{collections::VecDeque, fmt::Debug, sync::Arc, vec::Vec}; use alloc::{collections::VecDeque, fmt::Debug, sync::Arc, vec::Vec};
use log::{debug, error}; use log::{debug, error};
use ostd::bus::BusProbeError;
use super::common_device::MmioCommonDevice; use super::common_device::MmioCommonDevice;
use crate::bus::BusProbeError;
/// MMIO device trait /// MMIO device trait
pub trait MmioDevice: Sync + Send + Debug { pub trait MmioDevice: Sync + Send + Debug {
@ -45,7 +43,7 @@ impl MmioBus {
pub fn register_driver(&mut self, driver: Arc<dyn MmioDriver>) { pub fn register_driver(&mut self, driver: Arc<dyn MmioDriver>) {
debug!("Register driver:{:#x?}", driver); debug!("Register driver:{:#x?}", driver);
let length = self.common_devices.len(); 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 common_device = self.common_devices.pop_front().unwrap();
let device_id = common_device.read_device_id().unwrap(); let device_id = common_device.read_device_id().unwrap();
let device = match driver.probe(common_device) { let device = match driver.probe(common_device) {

View File

@ -4,12 +4,11 @@
use int_to_c_enum::TryFromInt; use int_to_c_enum::TryFromInt;
use log::info; use log::info;
#[cfg(target_arch = "x86_64")] #[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. #[cfg(target_arch = "riscv64")] // TODO: Add `MappedIrqLine` support for RISC-V.
use crate::trap::IrqLine as MappedIrqLine; use ostd::trap::IrqLine as MappedIrqLine;
use crate::{io::IoMem, mm::VmIoOnce, trap::IrqLine, Error, Result}; use ostd::{io::IoMem, mm::VmIoOnce, trap::IrqLine, Error, Result};
/// A MMIO common device. /// A MMIO common device.
#[derive(Debug)] #[derive(Debug)]
@ -53,11 +52,6 @@ impl MmioCommonDevice {
pub fn irq(&self) -> &IrqLine { pub fn irq(&self) -> &IrqLine {
&self.irq &self.irq
} }
/// Returns a mutable reference to the IRQ line.
pub fn irq_mut(&mut self) -> &mut IrqLine {
&mut self.irq
}
} }
/// Virtio MMIO version. /// Virtio MMIO version.

View File

@ -3,18 +3,18 @@
//! Virtio over MMIO //! Virtio over MMIO
use bus::MmioBus; use bus::MmioBus;
use ostd::sync::SpinLock;
use crate::sync::SpinLock; #[expect(clippy::module_inception)]
pub(super) mod bus;
pub mod bus; pub(super) mod common_device;
pub mod common_device;
/// The MMIO bus instance. /// The MMIO bus instance.
pub static MMIO_BUS: SpinLock<MmioBus> = SpinLock::new(MmioBus::new()); pub(super) static MMIO_BUS: SpinLock<MmioBus> = SpinLock::new(MmioBus::new());
pub(crate) fn init() { pub(super) fn init() {
#[cfg(target_arch = "x86_64")] #[cfg(target_arch = "x86_64")]
crate::arch::if_tdx_enabled!({ ostd::if_tdx_enabled!({
// TODO: support virtio-mmio devices on TDX. // TODO: support virtio-mmio devices on TDX.
// //
// Currently, virtio-mmio devices need to acquire sub-page MMIO regions, // Currently, virtio-mmio devices need to acquire sub-page MMIO regions,
@ -28,8 +28,7 @@ pub(crate) fn init() {
fn x86_probe() { fn x86_probe() {
use common_device::{mmio_check_magic, mmio_read_device_id, MmioCommonDevice}; use common_device::{mmio_check_magic, mmio_read_device_id, MmioCommonDevice};
use log::debug; use log::debug;
use ostd::{arch::kernel::IRQ_CHIP, io::IoMem, trap::IrqLine};
use crate::{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 // 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 // kernel command line if ACPI tables are absent [1], or the ACPI SSDT if ACPI tables are

View File

@ -7,20 +7,21 @@ use aster_rights::{ReadOp, WriteOp};
use aster_util::{field_ptr, safe_ptr::SafePtr}; use aster_util::{field_ptr, safe_ptr::SafePtr};
use log::warn; use log::warn;
use ostd::{ use ostd::{
bus::{ bus::pci::cfg_space::Bar,
mmio::{
bus::MmioDevice,
common_device::{MmioCommonDevice, VirtioMmioVersion},
},
pci::cfg_space::Bar,
},
io::IoMem, io::IoMem,
mm::{DmaCoherent, PAGE_SIZE}, mm::{DmaCoherent, PAGE_SIZE},
sync::RwLock, sync::RwLock,
trap::IrqCallbackFunction, trap::IrqCallbackFunction,
}; };
use super::{layout::VirtioMmioLayout, multiplex::MultiplexIrq}; use super::{
bus::{
bus::MmioDevice,
common_device::{MmioCommonDevice, VirtioMmioVersion},
},
layout::VirtioMmioLayout,
multiplex::MultiplexIrq,
};
use crate::{ use crate::{
queue::{AvailRing, Descriptor, UsedRing}, queue::{AvailRing, Descriptor, UsedRing},
transport::{ConfigManager, DeviceStatus, VirtioTransport, VirtioTransportError}, transport::{ConfigManager, DeviceStatus, VirtioTransport, VirtioTransportError},
@ -36,7 +37,7 @@ pub struct VirtioMmioDevice {
pub struct VirtioMmioTransport { pub struct VirtioMmioTransport {
layout: SafePtr<VirtioMmioLayout, IoMem>, layout: SafePtr<VirtioMmioLayout, IoMem>,
device: Arc<VirtioMmioDevice>, device: Arc<VirtioMmioDevice>,
common_device: ostd::bus::mmio::common_device::MmioCommonDevice, common_device: MmioCommonDevice,
multiplex: Arc<RwLock<MultiplexIrq>>, multiplex: Arc<RwLock<MultiplexIrq>>,
} }

View File

@ -2,19 +2,16 @@
use alloc::{sync::Arc, vec::Vec}; use alloc::{sync::Arc, vec::Vec};
use ostd::{ use ostd::{bus::BusProbeError, sync::SpinLock};
use super::{
bus::{ bus::{
mmio::{
bus::{MmioDevice, MmioDriver}, bus::{MmioDevice, MmioDriver},
common_device::MmioCommonDevice, common_device::MmioCommonDevice,
}, },
BusProbeError, device::VirtioMmioTransport,
},
sync::SpinLock,
}; };
use super::device::VirtioMmioTransport;
#[derive(Debug)] #[derive(Debug)]
pub struct VirtioMmioDriver { pub struct VirtioMmioDriver {
devices: SpinLock<Vec<VirtioMmioTransport>>, devices: SpinLock<Vec<VirtioMmioTransport>>,

View File

@ -2,18 +2,22 @@
use alloc::sync::Arc; use alloc::sync::Arc;
use ostd::bus::mmio::MMIO_BUS; use bus::MMIO_BUS;
use spin::Once; use spin::Once;
use self::driver::VirtioMmioDriver; use self::driver::VirtioMmioDriver;
mod bus;
pub mod device; pub mod device;
pub mod driver; pub mod driver;
pub mod layout; pub mod layout;
pub mod multiplex; pub mod multiplex;
pub static VIRTIO_MMIO_DRIVER: Once<Arc<VirtioMmioDriver>> = Once::new(); pub static VIRTIO_MMIO_DRIVER: Once<Arc<VirtioMmioDriver>> = Once::new();
pub fn virtio_mmio_init() { pub fn virtio_mmio_init() {
bus::init();
VIRTIO_MMIO_DRIVER.call_once(|| Arc::new(VirtioMmioDriver::new())); VIRTIO_MMIO_DRIVER.call_once(|| Arc::new(VirtioMmioDriver::new()));
MMIO_BUS MMIO_BUS
.lock() .lock()

View File

@ -2,7 +2,6 @@
//! Bus operations //! Bus operations
pub mod mmio;
pub mod pci; pub mod pci;
/// An error that occurs during bus probing. /// An error that occurs during bus probing.
@ -17,5 +16,4 @@ pub enum BusProbeError {
/// Initializes the bus /// Initializes the bus
pub(crate) fn init() { pub(crate) fn init() {
pci::init(); pci::init();
mmio::init();
} }