Merged PR #87
This commit is contained in:
parent
25f4e37168
commit
25a398adc2
6 changed files with 66 additions and 52 deletions
1
os/src/drivers/bus/mod.rs
Normal file
1
os/src/drivers/bus/mod.rs
Normal file
|
@ -0,0 +1 @@
|
|||
pub mod virtio;
|
52
os/src/drivers/bus/virtio.rs
Normal file
52
os/src/drivers/bus/virtio.rs
Normal file
|
@ -0,0 +1,52 @@
|
|||
use alloc::vec::Vec;
|
||||
use crate::mm::{
|
||||
frame_alloc, frame_dealloc, kernel_token, FrameTracker, PageTable, PhysAddr, PhysPageNum,
|
||||
StepByOne, VirtAddr,
|
||||
};
|
||||
use crate::sync::UPIntrFreeCell;
|
||||
use lazy_static::*;
|
||||
use virtio_drivers::Hal;
|
||||
|
||||
lazy_static! {
|
||||
static ref QUEUE_FRAMES: UPIntrFreeCell<Vec<FrameTracker>> =
|
||||
unsafe { UPIntrFreeCell::new(Vec::new()) };
|
||||
}
|
||||
|
||||
pub struct VirtioHal;
|
||||
|
||||
impl Hal for VirtioHal {
|
||||
fn dma_alloc(pages: usize) -> usize {
|
||||
let mut ppn_base = PhysPageNum(0);
|
||||
for i in 0..pages {
|
||||
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);
|
||||
}
|
||||
let pa: PhysAddr = ppn_base.into();
|
||||
pa.0
|
||||
}
|
||||
|
||||
fn dma_dealloc(pa: usize, pages: usize) -> i32 {
|
||||
let pa = PhysAddr::from(pa);
|
||||
let mut ppn_base: PhysPageNum = pa.into();
|
||||
for _ in 0..pages {
|
||||
frame_dealloc(ppn_base);
|
||||
ppn_base.step();
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
fn phys_to_virt(addr: usize) -> usize {
|
||||
addr
|
||||
}
|
||||
|
||||
fn virt_to_phys(vaddr: usize) -> usize {
|
||||
PageTable::from_token(kernel_token())
|
||||
.translate_va(VirtAddr::from(vaddr))
|
||||
.unwrap()
|
||||
.0
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue