hal.rs 871 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. use core::sync::atomic::*;
  2. use lazy_static::lazy_static;
  3. use log::trace;
  4. use virtio_drivers::{Hal, PhysAddr, VirtAddr};
  5. const PAGE_SIZE: usize = 0x1000;
  6. extern "C" {
  7. static dma_region: u8;
  8. }
  9. lazy_static! {
  10. static ref DMA_PADDR: AtomicUsize =
  11. AtomicUsize::new(unsafe { &dma_region as *const u8 as usize });
  12. }
  13. pub struct HalImpl;
  14. impl Hal for HalImpl {
  15. fn dma_alloc(pages: usize) -> PhysAddr {
  16. let paddr = DMA_PADDR.fetch_add(PAGE_SIZE * pages, Ordering::SeqCst);
  17. trace!("alloc DMA: paddr={:#x}, pages={}", paddr, pages);
  18. paddr
  19. }
  20. fn dma_dealloc(paddr: PhysAddr, pages: usize) -> i32 {
  21. trace!("dealloc DMA: paddr={:#x}, pages={}", paddr, pages);
  22. 0
  23. }
  24. fn phys_to_virt(paddr: PhysAddr) -> VirtAddr {
  25. paddr
  26. }
  27. fn virt_to_phys(vaddr: VirtAddr) -> PhysAddr {
  28. vaddr
  29. }
  30. }