Skip to main content

tg_rcore_tutorial_driver/
block.rs

1extern crate alloc;
2
3use core::any::Any;
4use spin::Mutex;
5use virtio_drivers::{Hal, MmioTransport, VirtIOBlk};
6
7use crate::devices::Device;
8
9pub trait BlockDevice: Device + Send + Sync + Any {
10    fn read_block(&self, block_id: usize, buf: &mut [u8]);
11    fn write_block(&self, block_id: usize, buf: &[u8]);
12}
13
14pub struct VirtIOBlockWrapper<H: Hal> {
15    block: Mutex<VirtIOBlk<H, MmioTransport>>,
16}
17
18unsafe impl<H: Hal> Send for VirtIOBlockWrapper<H> {}
19unsafe impl<H: Hal> Sync for VirtIOBlockWrapper<H> {}
20
21impl<H: Hal> VirtIOBlockWrapper<H> {
22    pub fn new(transport: MmioTransport) -> Result<Self, virtio_drivers::Error> {
23        let virtio = VirtIOBlk::new(transport)?;
24        Ok(Self {
25            block: Mutex::new(virtio),
26        })
27    }
28}
29
30impl<H: Hal + 'static> BlockDevice for VirtIOBlockWrapper<H> {
31    fn read_block(&self, block_id: usize, buf: &mut [u8]) {
32        self.block.lock().read_block(block_id, buf).expect("Error when reading VirtIOBlk");
33    }
34
35    fn write_block(&self, block_id: usize, buf: &[u8]) {
36        self.block.lock().write_block(block_id, buf).expect("Error when writing VirtIOBlk");
37    }
38}
39
40impl<H: Hal + 'static> Device for VirtIOBlockWrapper<H> {
41    fn handle_irq(&self) {}
42}