123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- use crate::arch::mm::kernel_page_flags;
- use crate::arch::MMArch;
- use crate::mm::kernel_mapper::KernelMapper;
- use crate::mm::page::{page_manager_lock_irqsave, PageFlags};
- use crate::mm::{
- allocator::page_frame::{
- allocate_page_frames, deallocate_page_frames, PageFrameCount, PhysPageFrame,
- },
- MemoryManagementArch, PhysAddr, VirtAddr,
- };
- use core::ptr::NonNull;
- use virtio_drivers::{BufferDirection, Hal, PAGE_SIZE};
- pub struct HalImpl;
- unsafe impl Hal for HalImpl {
-
-
-
- fn dma_alloc(
- pages: usize,
- _direction: BufferDirection,
- ) -> (virtio_drivers::PhysAddr, NonNull<u8>) {
- let page_num = PageFrameCount::new(
- ((pages * PAGE_SIZE + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE).next_power_of_two(),
- );
- unsafe {
- let (paddr, count) =
- allocate_page_frames(page_num).expect("VirtIO Impl: alloc page failed");
- let virt = MMArch::phys_2_virt(paddr).unwrap();
-
- core::ptr::write_bytes(virt.data() as *mut u8, 0, count.data() * MMArch::PAGE_SIZE);
- let dma_flags: PageFlags<MMArch> = PageFlags::mmio_flags();
- let mut kernel_mapper = KernelMapper::lock();
- let kernel_mapper = kernel_mapper.as_mut().unwrap();
- let flusher = kernel_mapper
- .remap(virt, dma_flags)
- .expect("VirtIO Impl: remap failed");
- flusher.flush();
- return (
- paddr.data(),
- NonNull::new(MMArch::phys_2_virt(paddr).unwrap().data() as _).unwrap(),
- );
- }
- }
-
-
-
- unsafe fn dma_dealloc(
- paddr: virtio_drivers::PhysAddr,
- vaddr: NonNull<u8>,
- pages: usize,
- ) -> i32 {
- let page_count = PageFrameCount::new(
- ((pages * PAGE_SIZE + MMArch::PAGE_SIZE - 1) / MMArch::PAGE_SIZE).next_power_of_two(),
- );
-
- let vaddr = VirtAddr::new(vaddr.as_ptr() as usize);
- let mut kernel_mapper = KernelMapper::lock();
- let kernel_mapper = kernel_mapper.as_mut().unwrap();
- let flusher = kernel_mapper
- .remap(vaddr, kernel_page_flags(vaddr))
- .expect("VirtIO Impl: remap failed");
- flusher.flush();
- unsafe {
- deallocate_page_frames(
- PhysPageFrame::new(PhysAddr::new(paddr)),
- page_count,
- &mut page_manager_lock_irqsave(),
- );
- }
- return 0;
- }
-
-
-
- unsafe fn mmio_phys_to_virt(paddr: virtio_drivers::PhysAddr, _size: usize) -> NonNull<u8> {
- NonNull::new((MMArch::phys_2_virt(PhysAddr::new(paddr))).unwrap().data() as _).unwrap()
- }
-
-
-
- unsafe fn share(
- buffer: NonNull<[u8]>,
- _direction: BufferDirection,
- ) -> virtio_drivers::PhysAddr {
- let vaddr = VirtAddr::new(buffer.as_ptr() as *mut u8 as usize);
-
-
- return MMArch::virt_2_phys(vaddr).unwrap().data();
- }
-
- unsafe fn unshare(
- _paddr: virtio_drivers::PhysAddr,
- _buffer: NonNull<[u8]>,
- _direction: BufferDirection,
- ) {
-
-
- }
- }
|