tg_rcore_tutorial_driver/
block.rs1extern 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}