未验证 提交 109d3339 编写于 作者: Y Yifan Wu 提交者: GitHub

Merge pull request #87 from DeathWish5/ch6

...@@ -6,12 +6,12 @@ use crate::mm::{ ...@@ -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,44 +37,47 @@ impl VirtIOBlock { ...@@ -37,44 +37,47 @@ 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 {
let mut ppn_base = PhysPageNum(0); impl Hal for VirtioHal {
for i in 0..pages { fn dma_alloc(pages: usize) -> usize {
let frame = frame_alloc().unwrap(); let mut ppn_base = PhysPageNum(0);
if i == 0 { for i in 0..pages {
ppn_base = frame.ppn; let frame = frame_alloc().unwrap();
if i == 0 {
ppn_base = frame.ppn;
}
assert_eq!(frame.ppn.0, ppn_base.0 + i);
QUEUE_FRAMES.exclusive_access().push(frame);
} }
assert_eq!(frame.ppn.0, ppn_base.0 + i); let pa: PhysAddr = ppn_base.into();
QUEUE_FRAMES.exclusive_access().push(frame); pa.0
} }
ppn_base.into()
}
#[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(VirtAddr::from(vaddr))
.translate_va(vaddr) .unwrap()
.unwrap() .0
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册