kernel_thread/utils/
blk.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#![allow(missing_docs)]
use alloc::boxed::Box;
use common::root::create_channel;
use srv_gate::BLK_IMPLS;
use vfscore::BlockDevice;

const BLOCK_SIZE: usize = 0x200;

pub struct BlockDev;

impl BlockDevice for BlockDev {
    fn read_block(&self, block: usize, buffer: &mut [u8]) -> vfscore::VfsResult<usize> {
        assert_eq!(buffer.len() % BLOCK_SIZE, 0);
        let rlen = core::cmp::min(buffer.len(), 0x4000);
        let ptr = 0x3_0000_0000 as *const u8;
        BLK_IMPLS[0].lock().read_block(block, rlen / BLOCK_SIZE);
        unsafe {
            ptr.copy_to_nonoverlapping(buffer.as_mut_ptr(), rlen);
        }
        Ok(rlen)
    }

    fn write_block(&self, block: usize, buf: &[u8]) -> vfscore::VfsResult<usize> {
        assert_eq!(buf.len() % BLOCK_SIZE, 0);
        let wlen = core::cmp::min(buf.len(), 0x4000);
        let ptr = 0x3_0000_0000 as *mut u8;
        unsafe {
            ptr.copy_from_nonoverlapping(buf.as_ptr(), wlen);
        }
        BLK_IMPLS[0].lock().write_block(block, wlen / BLOCK_SIZE);
        Ok(wlen)
    }

    fn capacity(&self) -> vfscore::VfsResult<u64> {
        Ok(BLK_IMPLS[0].lock().capacity())
    }
}

pub fn get_blk_dev() -> Box<dyn BlockDevice> {
    let channel_id = create_channel(0x3_0000_0000, 4);
    BLK_IMPLS[0].lock().init(channel_id);
    Box::new(BlockDev)
}