tg-rcore-tutorial-driver 0.1.1-preview.1

device drivers for tg-rcore-tutorial
Documentation
extern crate alloc;

use core::any::Any;
use spin::Mutex;
use virtio_drivers::{Hal, MmioTransport, VirtIOBlk};

use crate::devices::Device;

pub trait BlockDevice: Device + Send + Sync + Any {
    fn read_block(&self, block_id: usize, buf: &mut [u8]);
    fn write_block(&self, block_id: usize, buf: &[u8]);
}

pub struct VirtIOBlockWrapper<H: Hal> {
    block: Mutex<VirtIOBlk<H, MmioTransport>>,
}

unsafe impl<H: Hal> Send for VirtIOBlockWrapper<H> {}
unsafe impl<H: Hal> Sync for VirtIOBlockWrapper<H> {}

impl<H: Hal> VirtIOBlockWrapper<H> {
    pub fn new(transport: MmioTransport) -> Result<Self, virtio_drivers::Error> {
        let virtio = VirtIOBlk::new(transport)?;
        Ok(Self {
            block: Mutex::new(virtio),
        })
    }
}

impl<H: Hal + 'static> BlockDevice for VirtIOBlockWrapper<H> {
    fn read_block(&self, block_id: usize, buf: &mut [u8]) {
        self.block.lock().read_block(block_id, buf).expect("Error when reading VirtIOBlk");
    }

    fn write_block(&self, block_id: usize, buf: &[u8]) {
        self.block.lock().write_block(block_id, buf).expect("Error when writing VirtIOBlk");
    }
}

impl<H: Hal + 'static> Device for VirtIOBlockWrapper<H> {
    fn handle_irq(&self) {}
}