hal.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. use alloc::alloc::{alloc_zeroed, dealloc, handle_alloc_error};
  2. use core::{alloc::Layout, ptr::NonNull};
  3. use log::trace;
  4. use virtio_drivers::{BufferDirection, Hal, PhysAddr, PAGE_SIZE};
  5. pub struct HalImpl;
  6. unsafe impl Hal for HalImpl {
  7. fn dma_alloc(pages: usize, _direction: BufferDirection) -> (PhysAddr, NonNull<u8>) {
  8. let layout = Layout::from_size_align(pages * PAGE_SIZE, PAGE_SIZE).unwrap();
  9. // Safe because the layout has a non-zero size.
  10. let vaddr = unsafe { alloc_zeroed(layout) };
  11. let vaddr = if let Some(vaddr) = NonNull::new(vaddr) {
  12. vaddr
  13. } else {
  14. handle_alloc_error(layout)
  15. };
  16. let paddr = virt_to_phys(vaddr.as_ptr() as _);
  17. trace!("alloc DMA: paddr={:#x}, pages={}", paddr, pages);
  18. (paddr, vaddr)
  19. }
  20. unsafe fn dma_dealloc(paddr: PhysAddr, vaddr: NonNull<u8>, pages: usize) -> i32 {
  21. trace!("dealloc DMA: paddr={:#x}, pages={}", paddr, pages);
  22. let layout = Layout::from_size_align(pages * PAGE_SIZE, PAGE_SIZE).unwrap();
  23. // Safe because the memory was allocated by `dma_alloc` above using the same allocator, and
  24. // the layout is the same as was used then.
  25. unsafe {
  26. dealloc(vaddr.as_ptr(), layout);
  27. }
  28. 0
  29. }
  30. unsafe fn mmio_phys_to_virt(paddr: PhysAddr, _size: usize) -> NonNull<u8> {
  31. NonNull::new(paddr as _).unwrap()
  32. }
  33. unsafe fn share(buffer: NonNull<[u8]>, _direction: BufferDirection) -> PhysAddr {
  34. let vaddr = buffer.as_ptr() as *mut u8 as usize;
  35. // Nothing to do, as the host already has access to all memory.
  36. virt_to_phys(vaddr)
  37. }
  38. unsafe fn unshare(_paddr: PhysAddr, _buffer: NonNull<[u8]>, _direction: BufferDirection) {
  39. // Nothing to do, as the host already has access to all memory and we didn't copy the buffer
  40. // anywhere else.
  41. }
  42. }
  43. fn virt_to_phys(vaddr: usize) -> PhysAddr {
  44. vaddr
  45. }