hal.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use core::{
  2. ptr::NonNull,
  3. sync::atomic::{AtomicUsize, Ordering},
  4. };
  5. use lazy_static::lazy_static;
  6. use log::trace;
  7. use virtio_drivers::{BufferDirection, Hal, PhysAddr, PAGE_SIZE};
  8. extern "C" {
  9. static dma_region: u8;
  10. }
  11. lazy_static! {
  12. static ref DMA_PADDR: AtomicUsize =
  13. AtomicUsize::new(unsafe { &dma_region as *const u8 as usize });
  14. }
  15. pub struct HalImpl;
  16. unsafe impl Hal for HalImpl {
  17. fn dma_alloc(pages: usize, _direction: BufferDirection) -> (PhysAddr, NonNull<u8>) {
  18. let paddr = DMA_PADDR.fetch_add(PAGE_SIZE * pages, Ordering::SeqCst);
  19. trace!("alloc DMA: paddr={:#x}, pages={}", paddr, pages);
  20. let vaddr = NonNull::new(paddr as _).unwrap();
  21. (paddr, vaddr)
  22. }
  23. unsafe fn dma_dealloc(paddr: PhysAddr, _vaddr: NonNull<u8>, pages: usize) -> i32 {
  24. trace!("dealloc DMA: paddr={:#x}, pages={}", paddr, pages);
  25. 0
  26. }
  27. unsafe fn mmio_phys_to_virt(paddr: PhysAddr, _size: usize) -> NonNull<u8> {
  28. NonNull::new(paddr as _).unwrap()
  29. }
  30. unsafe fn share(buffer: NonNull<[u8]>, _direction: BufferDirection) -> PhysAddr {
  31. let vaddr = buffer.as_ptr() as *mut u8 as usize;
  32. // Nothing to do, as the host already has access to all memory.
  33. virt_to_phys(vaddr)
  34. }
  35. unsafe fn unshare(_paddr: PhysAddr, _buffer: NonNull<[u8]>, _direction: BufferDirection) {
  36. // Nothing to do, as the host already has access to all memory and we didn't copy the buffer
  37. // anywhere else.
  38. }
  39. }
  40. fn virt_to_phys(vaddr: usize) -> PhysAddr {
  41. vaddr
  42. }