diff --git a/kernel/comps/virtio/src/transport/mmio/device.rs b/kernel/comps/virtio/src/transport/mmio/device.rs index 97584537b..31e394ab1 100644 --- a/kernel/comps/virtio/src/transport/mmio/device.rs +++ b/kernel/comps/virtio/src/transport/mmio/device.rs @@ -46,7 +46,7 @@ impl MmioDevice for VirtioMmioDevice { impl MmioDevice for VirtioMmioTransport { fn device_id(&self) -> u32 { - self.common_device.device_id() + self.device.device_id() } } @@ -58,7 +58,7 @@ impl VirtioMmioTransport { pub(super) fn new(device: MmioCommonDevice) -> Self { let irq = device.irq().clone(); let layout = SafePtr::new(device.io_mem().clone(), 0); - let device_id = device.device_id(); + let device_id = device.read_device_id().unwrap(); let (interrupt_ack, interrupt_status) = { let interrupt_ack_offset = offset_of!(VirtioMmioLayout, interrupt_ack); let interrupt_status_offset = offset_of!(VirtioMmioLayout, interrupt_status); @@ -77,7 +77,7 @@ impl VirtioMmioTransport { multiplex: MultiplexIrq::new(irq, interrupt_ack, interrupt_status), device: Arc::new(VirtioMmioDevice { device_id }), }; - if device.common_device.version() == VirtioMmioVersion::Legacy { + if device.common_device.read_version().unwrap() == VirtioMmioVersion::Legacy { field_ptr!(&device.layout, VirtioMmioLayout, legacy_guest_page_size) .write_once(&(PAGE_SIZE as u32)) .unwrap(); @@ -88,7 +88,7 @@ impl VirtioMmioTransport { impl VirtioTransport for VirtioMmioTransport { fn device_type(&self) -> VirtioDeviceType { - VirtioDeviceType::try_from(self.common_device.device_id() as u8).unwrap() + VirtioDeviceType::try_from(self.device.device_id() as u8).unwrap() } fn set_queue( @@ -120,7 +120,7 @@ impl VirtioTransport for VirtioMmioTransport { .write_once(&(queue_size as u32)) .unwrap(); - match self.common_device.version() { + match self.common_device.read_version().unwrap() { VirtioMmioVersion::Legacy => { // The area should be continuous assert_eq!( @@ -254,7 +254,7 @@ impl VirtioTransport for VirtioMmioTransport { } fn is_legacy_version(&self) -> bool { - self.common_device.version() == VirtioMmioVersion::Legacy + self.common_device.read_version().unwrap() == VirtioMmioVersion::Legacy } fn max_queue_size(&self, idx: u16) -> Result { diff --git a/ostd/src/bus/mmio/bus.rs b/ostd/src/bus/mmio/bus.rs index d7dbd9ae8..d22d38608 100644 --- a/ostd/src/bus/mmio/bus.rs +++ b/ostd/src/bus/mmio/bus.rs @@ -47,7 +47,7 @@ impl MmioBus { let length = self.common_devices.len(); for i in (0..length).rev() { let common_device = self.common_devices.pop_front().unwrap(); - let device_id = common_device.device_id(); + let device_id = common_device.read_device_id().unwrap(); let device = match driver.probe(common_device) { Ok(device) => { debug_assert!(device_id == device.device_id()); @@ -58,7 +58,6 @@ impl MmioBus { if err != BusProbeError::DeviceNotMatch { error!("MMIO device construction failed, reason: {:?}", err); } - debug_assert!(device_id == device.device_id()); device } }; @@ -68,7 +67,7 @@ impl MmioBus { } pub(super) fn register_mmio_device(&mut self, mut mmio_device: MmioCommonDevice) { - let device_id = mmio_device.device_id(); + let device_id = mmio_device.read_device_id().unwrap(); for driver in self.drivers.iter() { mmio_device = match driver.probe(mmio_device) { Ok(device) => { @@ -80,7 +79,6 @@ impl MmioBus { if err != BusProbeError::DeviceNotMatch { error!("MMIO device construction failed, reason: {:?}", err); } - debug_assert!(device_id == common_device.device_id()); common_device } }; diff --git a/ostd/src/bus/mmio/common_device.rs b/ostd/src/bus/mmio/common_device.rs index 4e5504c15..3f9bae40d 100644 --- a/ostd/src/bus/mmio/common_device.rs +++ b/ostd/src/bus/mmio/common_device.rs @@ -10,6 +10,7 @@ use crate::{ io_mem::IoMem, mm::{paddr_to_vaddr, Paddr, VmIoOnce}, trap::IrqLine, + Error, Result, }; /// MMIO Common device. @@ -37,7 +38,7 @@ impl MmioCommonDevice { }; info!( "[Virtio]: Found Virtio mmio device, device id:{:?}, irq number:{:?}", - res.device_id(), + res.read_device_id().unwrap(), res.irq.num() ); res @@ -54,13 +55,14 @@ impl MmioCommonDevice { } /// Device ID - pub fn device_id(&self) -> u32 { - self.io_mem.read_once::(8).unwrap() + pub fn read_device_id(&self) -> Result { + self.io_mem.read_once::(8) } /// Version of the MMIO device. - pub fn version(&self) -> VirtioMmioVersion { - VirtioMmioVersion::try_from(self.io_mem.read_once::(4).unwrap()).unwrap() + pub fn read_version(&self) -> Result { + VirtioMmioVersion::try_from(self.io_mem.read_once::(4)?) + .map_err(|_| Error::InvalidArgs) } /// Interrupt line