virtio_impl.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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, VirtAddr, PAGE_SIZE};
  8. extern "C" {
  9. fn end();
  10. }
  11. lazy_static! {
  12. static ref DMA_PADDR: AtomicUsize = AtomicUsize::new(end as usize);
  13. }
  14. pub struct HalImpl;
  15. impl Hal for HalImpl {
  16. fn dma_alloc(pages: usize) -> PhysAddr {
  17. let paddr = DMA_PADDR.fetch_add(PAGE_SIZE * pages, Ordering::SeqCst);
  18. trace!("alloc DMA: paddr={:#x}, pages={}", paddr, pages);
  19. paddr
  20. }
  21. fn dma_dealloc(paddr: PhysAddr, pages: usize) -> i32 {
  22. trace!("dealloc DMA: paddr={:#x}, pages={}", paddr, pages);
  23. 0
  24. }
  25. fn phys_to_virt(paddr: PhysAddr) -> VirtAddr {
  26. paddr
  27. }
  28. fn share(buffer: NonNull<[u8]>, _direction: BufferDirection) -> PhysAddr {
  29. let vaddr = buffer.as_ptr() as *mut u8 as usize;
  30. // Nothing to do, as the host already has access to all memory.
  31. virt_to_phys(vaddr)
  32. }
  33. fn unshare(_paddr: PhysAddr, _buffer: NonNull<[u8]>, _direction: BufferDirection) {
  34. // Nothing to do, as the host already has access to all memory and we didn't copy the buffer
  35. // anywhere else.
  36. }
  37. }
  38. fn virt_to_phys(vaddr: VirtAddr) -> PhysAddr {
  39. vaddr
  40. }