From c064e0ee2fe5c3ac64cb34e443e35124fbc42adb Mon Sep 17 00:00:00 2001 From: huangshijia <1055114578@qq.com> Date: Tue, 3 Mar 2026 17:19:46 +0800 Subject: [PATCH] revert virtio-driver version from 0.12 to 0.7.5 --- Cargo.toml | 4 +-- drivers/kdriver/src/bus/pci.rs | 34 +++++-------------- drivers/kdriver/src/drivers.rs | 10 +++--- drivers/kdriver/src/virtio.rs | 26 ++++++--------- drivers/pci/Cargo.toml | 3 +- drivers/pci/src/lib.rs | 4 +-- drivers/virtio/Cargo.toml | 3 +- drivers/virtio/src/input.rs | 3 +- drivers/virtio/src/lib.rs | 18 +++++----- drivers/virtio/src/mock_virtio.rs | 55 +++++-------------------------- 10 files changed, 50 insertions(+), 110 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2319a78d..b6e78196 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ ktask = { path = "core/ktask" } watchdog = { path = "io/watchdog" } kcpu = { path = "arch/kcpu" } + # x-kernel Crates alloc-engine = { path = "mm/alloc-engine" } page_table = { path = "mm/page_table" } @@ -128,7 +129,6 @@ net = { path = "drivers/net" } pci = { path = "drivers/pci" } vsock = { path = "drivers/vsock" } virtio = { path = "drivers/virtio" } -virtio-drivers = { version = "0.12.0", default-features = false } aarch64-pmuv3 = { path = "drivers/aarch64-pmuv3" } fatfs = { path = "fs/fatfs", default-features = false } rsext4 = { path = "fs/rsext4", default-features = false } @@ -143,4 +143,4 @@ unittest = { path = "util/unittest" } kbuild_config = { path = "util/kbuild_config" } kconfig-gen = { path = "xtask/kconfig-gen" } -smoltcp = { version = "0.12.0", package = "x-smoltcp", default-features = false } +smoltcp = { version = "0.12.0",package = "x-smoltcp", default-features = false } \ No newline at end of file diff --git a/drivers/kdriver/src/bus/pci.rs b/drivers/kdriver/src/bus/pci.rs index 05929a69..6fa71c3f 100644 --- a/drivers/kdriver/src/bus/pci.rs +++ b/drivers/kdriver/src/bus/pci.rs @@ -5,8 +5,7 @@ //! PCI bus probing and BAR configuration. use khal::mem::p2v; use pci::{ - BarInfo, Cam, Command, ConfigurationAccess, DeviceFunction, HeaderType, MemoryBarType, MmioCam, - PciRangeAllocator, PciRoot, + BarInfo, Cam, Command, DeviceFunction, HeaderType, MemoryBarType, PciRangeAllocator, PciRoot, }; use crate::{AllDevices, prelude::*}; @@ -14,20 +13,14 @@ use crate::{AllDevices, prelude::*}; const PCI_BAR_NUM: u8 = 6; /// Configure PCI BARs and enable the device. -fn config_pci_device( - root: &mut PciRoot, +fn config_pci_device( + root: &mut PciRoot, bdf: DeviceFunction, allocator: &mut Option, ) -> DriverResult { let mut bar = 0; while bar < PCI_BAR_NUM { - let info = match root.bar_info(bdf, bar).unwrap() { - Some(info) => info, - None => { - bar += 1; - continue; - } - }; + let info = root.bar_info(bdf, bar).unwrap(); if let BarInfo::Memory { address_type, address, @@ -51,14 +44,7 @@ fn config_pci_device( } // read the BAR info again after assignment. - let info = match root.bar_info(bdf, bar).unwrap() { - Some(info) => info, - None => { - bar += 1; - continue; - } - }; - let takes_two = info.takes_two_entries(); + let info = root.bar_info(bdf, bar).unwrap(); match info { BarInfo::IO { address, size } => { if address > 0 && size > 0 { @@ -76,7 +62,7 @@ fn config_pci_device( " BAR {}: MEM [{:#x}, {:#x}){}{}", bar, address, - address + size, + address + size as u64, if address_type == MemoryBarType::Width64 { " 64bit" } else { @@ -89,7 +75,7 @@ fn config_pci_device( } bar += 1; - if takes_two { + if info.takes_two_entries() { bar += 1; } } @@ -110,13 +96,11 @@ impl AllDevices { let mut root = { #[cfg(feature = "pci-mmio")] { - let cam = unsafe { MmioCam::new(base_vaddr.as_mut_ptr(), Cam::MmioCam) }; - PciRoot::new(cam) + unsafe { PciRoot::new(base_vaddr.as_mut_ptr(), Cam::MmioCam) } } #[cfg(not(feature = "pci-mmio"))] { - let cam = unsafe { MmioCam::new(base_vaddr.as_mut_ptr(), Cam::Ecam) }; - PciRoot::new(cam) + unsafe { PciRoot::new(base_vaddr.as_mut_ptr(), Cam::Ecam) } } }; diff --git a/drivers/kdriver/src/drivers.rs b/drivers/kdriver/src/drivers.rs index ab85a393..50118379 100644 --- a/drivers/kdriver/src/drivers.rs +++ b/drivers/kdriver/src/drivers.rs @@ -8,7 +8,7 @@ use driver_base::DeviceKind; #[cfg(feature = "bus-pci")] -use pci::{ConfigurationAccess, DeviceFunction, DeviceFunctionInfo, PciRoot}; +use pci::{DeviceFunction, DeviceFunctionInfo, PciRoot}; pub use super::dummy::*; use crate::DeviceEnum; @@ -30,8 +30,8 @@ pub trait DriverProbe { #[cfg(bus = "pci")] /// Probe a PCI device described by BDF and device info. - fn probe_pci( - _root: &mut PciRoot, + fn probe_pci( + _root: &mut PciRoot, _bdf: DeviceFunction, _dev_info: &DeviceFunctionInfo, ) -> Option { @@ -171,8 +171,8 @@ cfg_if::cfg_if! { register_net_driver!(IxgbeDriver, net::ixgbe::IxgbeNic); impl DriverProbe for IxgbeDriver { #[cfg(bus = "pci")] - fn probe_pci( - root: &mut pci::PciRoot, + fn probe_pci( + root: &mut pci::PciRoot, bdf: pci::DeviceFunction, dev_info: &pci::DeviceFunctionInfo, ) -> Option { diff --git a/drivers/kdriver/src/virtio.rs b/drivers/kdriver/src/virtio.rs index 66a31c5b..ef4e181d 100644 --- a/drivers/kdriver/src/virtio.rs +++ b/drivers/kdriver/src/virtio.rs @@ -16,10 +16,10 @@ use crate::{DeviceEnum, drivers::DriverProbe}; cfg_if! { if #[cfg(bus = "pci")] { - use pci::{ConfigurationAccess, DeviceFunction, DeviceFunctionInfo, PciRoot}; + use pci::{PciRoot, DeviceFunction, DeviceFunctionInfo}; type VirtIoTransport = virtio::PciTransport; } else if #[cfg(bus = "mmio")] { - type VirtIoTransport = virtio::MmioTransport<'static>; + type VirtIoTransport = virtio::MmioTransport; } } @@ -139,8 +139,8 @@ impl DriverProbe for VirtIoDriver { } #[cfg(bus = "pci")] - fn probe_pci( - root: &mut PciRoot, + fn probe_pci( + root: &mut PciRoot, bdf: DeviceFunction, dev_info: &DeviceFunctionInfo, ) -> Option { @@ -157,7 +157,7 @@ impl DriverProbe for VirtIoDriver { } if let Some((ty, transport, irq)) = - virtio::probe_pci_device::(root, bdf, dev_info) + virtio::probe_pci_device::(root, bdf, dev_info) && ty == D::DEVICE_TYPE { match D::try_new(transport, Some(irq)) { @@ -214,7 +214,7 @@ unsafe impl VirtIoHal for VirtIoHalImpl { let layout = Layout::from_size_align(size, PAGE_SIZE).unwrap(); let dma_info = kdma::DMAInfo { cpu_addr: vaddr, - bus_addr: kdma::DmaBusAddress::new(paddr), + bus_addr: kdma::DmaBusAddress::new(paddr as u64), }; unsafe { kdma::deallocate_dma_memory(dma_info, layout) }; #[cfg(feature = "crosvm")] @@ -226,8 +226,7 @@ unsafe impl VirtIoHal for VirtIoHalImpl { #[inline] unsafe fn mmio_phys_to_virt(paddr: PhysAddr, _size: usize) -> NonNull { - let paddr_usize = paddr as usize; - NonNull::new(p2v(paddr_usize.into()).as_mut_ptr()).unwrap() + NonNull::new(p2v(paddr.into()).as_mut_ptr()).unwrap() } #[allow(unused_variables)] @@ -277,8 +276,7 @@ unsafe impl VirtIoHal for VirtIoHalImpl { #[cfg(not(any(feature = "crosvm", feature = "sev")))] { let vaddr = buffer.as_ptr() as *mut u8 as usize; - let paddr_usize: usize = khal::mem::v2p(vaddr.into()).into(); - paddr_usize as PhysAddr + khal::mem::v2p(vaddr.into()).into() } } @@ -298,8 +296,7 @@ unsafe impl VirtIoHal for VirtIoHalImpl { // If data flows from device to driver, copy back from shared buffer if direction != BufferDirection::DriverToDevice { - let paddr_usize = paddr as usize; - let shared_ptr = p2v(paddr_usize.into()).as_ptr(); + let shared_ptr = p2v(paddr.into()).as_ptr(); unsafe { core::ptr::copy_nonoverlapping(shared_ptr, buffer.as_ptr() as *mut u8, len); } @@ -317,10 +314,7 @@ unsafe impl VirtIoHal for VirtIoHalImpl { // Free the bounce buffer via kdma let layout = Layout::from_size_align(aligned_size, PAGE_SIZE).unwrap(); let dma_info = kdma::DMAInfo { - cpu_addr: { - let paddr_usize = paddr as usize; - NonNull::new(p2v(paddr_usize.into()).as_mut_ptr()).unwrap() - }, + cpu_addr: NonNull::new(p2v(paddr.into()).as_mut_ptr()).unwrap(), bus_addr: kdma::DmaBusAddress::new(paddr as u64), }; unsafe { kdma::deallocate_dma_memory(dma_info, layout) }; diff --git a/drivers/pci/Cargo.toml b/drivers/pci/Cargo.toml index 73d2caf7..7077d3f2 100644 --- a/drivers/pci/Cargo.toml +++ b/drivers/pci/Cargo.toml @@ -12,5 +12,4 @@ repository.workspace = true categories.workspace = true [dependencies] -virtio-drivers.workspace = true -kbuild_config.workspace = true +virtio-drivers = "0.7.4" diff --git a/drivers/pci/src/lib.rs b/drivers/pci/src/lib.rs index 100d7f08..177c0c4b 100644 --- a/drivers/pci/src/lib.rs +++ b/drivers/pci/src/lib.rs @@ -13,8 +13,8 @@ #![no_std] pub use virtio_drivers::transport::pci::bus::{ - BarInfo, Cam, CapabilityInfo, Command, ConfigurationAccess, DeviceFunction, DeviceFunctionInfo, - HeaderType, MemoryBarType, MmioCam, PciError, PciRoot, Status, + BarInfo, Cam, CapabilityInfo, Command, DeviceFunction, DeviceFunctionInfo, HeaderType, + MemoryBarType, PciError, PciRoot, Status, }; /// Used to allocate MMIO regions for PCI BARs. diff --git a/drivers/virtio/Cargo.toml b/drivers/virtio/Cargo.toml index 5a0c66a6..44ec290a 100644 --- a/drivers/virtio/Cargo.toml +++ b/drivers/virtio/Cargo.toml @@ -27,6 +27,5 @@ input = { workspace = true, optional = true } net = { workspace = true, optional = true } vsock = { workspace = true, optional = true } log = { workspace = true } -virtio-drivers.workspace = true +virtio-drivers = { version = "0.7.4", default-features = false } unittest = { workspace = true } -zerocopy = "0.8" diff --git a/drivers/virtio/src/input.rs b/drivers/virtio/src/input.rs index 08ba4663..92203285 100644 --- a/drivers/virtio/src/input.rs +++ b/drivers/virtio/src/input.rs @@ -75,8 +75,7 @@ impl InputDriverOps for VirtIoInputDev { fn get_event_bits(&mut self, ty: EventType, out: &mut [u8]) -> DriverResult { let read = self .inner - .query_config_select(InputConfigSelect::EvBits, ty as u8, out) - .map_err(as_driver_error)?; + .query_config_select(InputConfigSelect::EvBits, ty as u8, out); Ok(read != 0) } diff --git a/drivers/virtio/src/lib.rs b/drivers/virtio/src/lib.rs index fa0b6e4c..9ae77335 100644 --- a/drivers/virtio/src/lib.rs +++ b/drivers/virtio/src/lib.rs @@ -56,7 +56,7 @@ pub use virtio_drivers::{ }, }; -use self::pci::{ConfigurationAccess, DeviceFunction, DeviceFunctionInfo, PciRoot}; +use self::pci::{DeviceFunction, DeviceFunctionInfo, PciRoot}; #[cfg(feature = "socket")] pub use self::socket::VirtIoSocketDev; @@ -66,14 +66,14 @@ pub use self::socket::VirtIoSocketDev; /// for later operations. Otherwise, returns [`None`]. pub fn probe_mmio_device( reg_base: *mut u8, - reg_size: usize, -) -> Option<(DeviceKind, MmioTransport<'static>)> { + _reg_size: usize, +) -> Option<(DeviceKind, MmioTransport)> { use core::ptr::NonNull; use virtio_drivers::transport::mmio::VirtIOHeader; let header = NonNull::new(reg_base as *mut VirtIOHeader).unwrap(); - let transport = unsafe { MmioTransport::new(header, reg_size) }.ok()?; + let transport = unsafe { MmioTransport::new(header) }.ok()?; let dev_kind = as_device_kind(transport.device_type())?; Some((dev_kind, transport)) } @@ -82,8 +82,8 @@ pub fn probe_mmio_device( /// /// If the device is recognized, returns the device type and a transport object /// for later operations. Otherwise, returns [`None`]. -pub fn probe_pci_device( - root: &mut PciRoot, +pub fn probe_pci_device( + root: &mut PciRoot, bdf: DeviceFunction, dev_info: &DeviceFunctionInfo, ) -> Option<(DeviceKind, PciTransport, usize)> { @@ -99,7 +99,7 @@ pub fn probe_pci_device( const PCI_IRQ_BASE: usize = 0x23; let dev_kind = virtio_device_type(dev_info).and_then(as_device_kind)?; - let transport = PciTransport::new::(root, bdf).ok()?; + let transport = PciTransport::new::(root, bdf).ok()?; let irq = PCI_IRQ_BASE + (bdf.device & 3) as usize; Some((dev_kind, transport, irq)) } @@ -137,7 +137,9 @@ pub(crate) const fn as_driver_error(e: virtio_drivers::Error) -> DriverError { OutputBufferTooShort(_) | BufferTooShort | BufferTooLong(..) => { DriverError::InvalidInput } - UnexpectedDataInPacket | PeerSocketShutdown => DriverError::Io, + UnexpectedDataInPacket | PeerSocketShutdown | NoResponseReceived | ConnectionFailed => { + DriverError::Io + } InsufficientBufferSpaceInPeer => DriverError::WouldBlock, RecycledWrongBuffer => DriverError::BadState, }, diff --git a/drivers/virtio/src/mock_virtio.rs b/drivers/virtio/src/mock_virtio.rs index aab9d2c2..7a4d2426 100644 --- a/drivers/virtio/src/mock_virtio.rs +++ b/drivers/virtio/src/mock_virtio.rs @@ -1,10 +1,9 @@ use core::{cell::RefCell, ptr::NonNull}; use virtio_drivers::{ - BufferDirection, Error, Hal, PhysAddr, Result, - transport::{DeviceStatus, DeviceType, InterruptStatus, Transport}, + BufferDirection, Hal, PhysAddr, Result, + transport::{DeviceStatus, DeviceType, Transport}, }; -use zerocopy::{FromBytes, Immutable, IntoBytes}; extern crate alloc; use alloc::alloc::{Layout, alloc, dealloc}; @@ -20,7 +19,7 @@ unsafe impl Hal for MockHal { panic!("MockHal: dma_alloc failed"); } unsafe { ptr.write_bytes(0, pages * 4096) }; // Zero memory - (ptr as PhysAddr, NonNull::new(ptr).unwrap()) + (ptr as usize, NonNull::new(ptr).unwrap()) } unsafe fn dma_dealloc(paddr: PhysAddr, _vaddr: NonNull, pages: usize) -> i32 { @@ -34,7 +33,7 @@ unsafe impl Hal for MockHal { } unsafe fn share(buffer: NonNull<[u8]>, _direction: BufferDirection) -> PhysAddr { - buffer.as_ptr() as *mut u8 as PhysAddr + buffer.as_ptr() as *mut u8 as usize } unsafe fn unshare(_paddr: PhysAddr, _buffer: NonNull<[u8]>, _direction: BufferDirection) {} @@ -111,50 +110,14 @@ impl Transport for MockTransport { false } - fn ack_interrupt(&mut self) -> InterruptStatus { - InterruptStatus::empty() - } - - fn read_config_generation(&self) -> u32 { - 0 + fn ack_interrupt(&mut self) -> bool { + false } - fn read_config_space(&self, offset: usize) -> Result { - let size = core::mem::size_of::(); - let config = self.config_space.borrow(); - if offset - .checked_add(size) - .is_none_or(|end| end > config.len()) - { - return Err(Error::ConfigSpaceTooSmall); - } - - let mut value = core::mem::MaybeUninit::::uninit(); + fn config_space(&self) -> Result> { unsafe { - core::ptr::copy_nonoverlapping( - config.as_ptr().add(offset), - value.as_mut_ptr() as *mut u8, - size, - ); - Ok(value.assume_init()) + let ptr = self.config_space.borrow_mut().as_mut_ptr() as *mut T; + Ok(NonNull::new_unchecked(ptr)) } } - - fn write_config_space( - &mut self, - offset: usize, - value: T, - ) -> Result<()> { - let bytes = value.as_bytes(); - let mut config = self.config_space.borrow_mut(); - if offset - .checked_add(bytes.len()) - .is_none_or(|end| end > config.len()) - { - return Err(Error::ConfigSpaceTooSmall); - } - - config[offset..offset + bytes.len()].copy_from_slice(bytes); - Ok(()) - } }