ch6:update virtio interface
This commit is contained in:
parent
3f0d1abad2
commit
066ec932c8
1 changed files with 34 additions and 31 deletions
|
@ -6,12 +6,12 @@ use crate::mm::{
|
||||||
use crate::sync::UPSafeCell;
|
use crate::sync::UPSafeCell;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use lazy_static::*;
|
use lazy_static::*;
|
||||||
use virtio_drivers::{VirtIOBlk, VirtIOHeader};
|
use virtio_drivers::{Hal, VirtIOBlk, VirtIOHeader};
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
const VIRTIO0: usize = 0x10001000;
|
const VIRTIO0: usize = 0x10001000;
|
||||||
|
|
||||||
pub struct VirtIOBlock(UPSafeCell<VirtIOBlk<'static>>);
|
pub struct VirtIOBlock(UPSafeCell<VirtIOBlk<'static, VirtioHal>>);
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref QUEUE_FRAMES: UPSafeCell<Vec<FrameTracker>> = unsafe { UPSafeCell::new(Vec::new()) };
|
static ref QUEUE_FRAMES: UPSafeCell<Vec<FrameTracker>> = unsafe { UPSafeCell::new(Vec::new()) };
|
||||||
|
@ -37,14 +37,16 @@ impl VirtIOBlock {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
unsafe {
|
unsafe {
|
||||||
Self(UPSafeCell::new(
|
Self(UPSafeCell::new(
|
||||||
VirtIOBlk::new(&mut *(VIRTIO0 as *mut VirtIOHeader)).unwrap(),
|
VirtIOBlk::<VirtioHal>::new(&mut *(VIRTIO0 as *mut VirtIOHeader)).unwrap(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
pub struct VirtioHal;
|
||||||
pub extern "C" fn virtio_dma_alloc(pages: usize) -> PhysAddr {
|
|
||||||
|
impl Hal for VirtioHal {
|
||||||
|
fn dma_alloc(pages: usize) -> usize {
|
||||||
let mut ppn_base = PhysPageNum(0);
|
let mut ppn_base = PhysPageNum(0);
|
||||||
for i in 0..pages {
|
for i in 0..pages {
|
||||||
let frame = frame_alloc().unwrap();
|
let frame = frame_alloc().unwrap();
|
||||||
|
@ -54,27 +56,28 @@ pub extern "C" fn virtio_dma_alloc(pages: usize) -> PhysAddr {
|
||||||
assert_eq!(frame.ppn.0, ppn_base.0 + i);
|
assert_eq!(frame.ppn.0, ppn_base.0 + i);
|
||||||
QUEUE_FRAMES.exclusive_access().push(frame);
|
QUEUE_FRAMES.exclusive_access().push(frame);
|
||||||
}
|
}
|
||||||
ppn_base.into()
|
let pa: PhysAddr = ppn_base.into();
|
||||||
}
|
pa.0
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
fn dma_dealloc(pa: usize, pages: usize) -> i32 {
|
||||||
pub extern "C" fn virtio_dma_dealloc(pa: PhysAddr, pages: usize) -> i32 {
|
let pa = PhysAddr::from(pa);
|
||||||
let mut ppn_base: PhysPageNum = pa.into();
|
let mut ppn_base: PhysPageNum = pa.into();
|
||||||
for _ in 0..pages {
|
for _ in 0..pages {
|
||||||
frame_dealloc(ppn_base);
|
frame_dealloc(ppn_base);
|
||||||
ppn_base.step();
|
ppn_base.step();
|
||||||
}
|
}
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
fn phys_to_virt(addr: usize) -> usize {
|
||||||
pub extern "C" fn virtio_phys_to_virt(paddr: PhysAddr) -> VirtAddr {
|
addr
|
||||||
VirtAddr(paddr.0)
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
fn virt_to_phys(vaddr: usize) -> usize {
|
||||||
pub extern "C" fn virtio_virt_to_phys(vaddr: VirtAddr) -> PhysAddr {
|
|
||||||
PageTable::from_token(kernel_token())
|
PageTable::from_token(kernel_token())
|
||||||
.translate_va(vaddr)
|
.translate_va(VirtAddr::from(vaddr))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue