|
|
|
@ -7,6 +7,8 @@ use crate::mm::{
|
|
|
|
|
PhysPageNum,
|
|
|
|
|
FrameTracker,
|
|
|
|
|
StepByOne,
|
|
|
|
|
PageTable,
|
|
|
|
|
kernel_token,
|
|
|
|
|
};
|
|
|
|
|
use super::BlockDevice;
|
|
|
|
|
use spin::Mutex;
|
|
|
|
@ -23,12 +25,9 @@ lazy_static! {
|
|
|
|
|
|
|
|
|
|
impl BlockDevice for VirtIOBlock {
|
|
|
|
|
fn read_block(&self, block_id: usize, buf: &mut [u8]) {
|
|
|
|
|
//println!("read block {}", block_id);
|
|
|
|
|
self.0.lock().read_block(block_id, buf).expect("Error when reading VirtIOBlk");
|
|
|
|
|
//println!("read block OK!");
|
|
|
|
|
}
|
|
|
|
|
fn write_block(&self, block_id: usize, buf: &[u8]) {
|
|
|
|
|
//println!("write block {}", block_id);
|
|
|
|
|
self.0.lock().write_block(block_id, buf).expect("Error when writing VirtIOBlk");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -47,7 +46,6 @@ pub extern "C" fn virtio_dma_alloc(pages: usize) -> PhysAddr {
|
|
|
|
|
for i in 0..pages {
|
|
|
|
|
let frame = frame_alloc().unwrap();
|
|
|
|
|
if i == 0 { ppn_base = frame.ppn; }
|
|
|
|
|
println!("virtio_dma_alloc {:?}", frame.ppn);
|
|
|
|
|
assert_eq!(frame.ppn.0, ppn_base.0 + i);
|
|
|
|
|
QUEUE_FRAMES.lock().push(frame);
|
|
|
|
|
}
|
|
|
|
@ -71,5 +69,5 @@ pub extern "C" fn virtio_phys_to_virt(paddr: PhysAddr) -> VirtAddr {
|
|
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
|
pub extern "C" fn virtio_virt_to_phys(vaddr: VirtAddr) -> PhysAddr {
|
|
|
|
|
PhysAddr(vaddr.0)
|
|
|
|
|
PageTable::from_token(kernel_token()).translate_va(vaddr).unwrap()
|
|
|
|
|
}
|
|
|
|
|