|
@@ -8,26 +8,44 @@ mod header;
|
|
mod queue;
|
|
mod queue;
|
|
|
|
|
|
pub use self::blk::VirtIOBlk;
|
|
pub use self::blk::VirtIOBlk;
|
|
|
|
+pub use self::header::*;
|
|
|
|
|
|
const PAGE_SIZE: usize = 0x1000;
|
|
const PAGE_SIZE: usize = 0x1000;
|
|
|
|
|
|
type VirtAddr = usize;
|
|
type VirtAddr = usize;
|
|
type PhysAddr = usize;
|
|
type PhysAddr = usize;
|
|
|
|
|
|
-fn alloc_dma(_pages: usize) -> Result<(VirtAddr, PhysAddr)> {
|
|
|
|
- unimplemented!()
|
|
|
|
|
|
+fn alloc_dma(pages: usize) -> Result<(VirtAddr, PhysAddr)> {
|
|
|
|
+ let (vaddr, paddr) = unsafe { virtio_alloc_dma(pages) };
|
|
|
|
+ if vaddr == 0 {
|
|
|
|
+ Err(Error::DmaError)
|
|
|
|
+ } else {
|
|
|
|
+ Ok((vaddr, paddr))
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-fn dealloc_dma(_paddr: PhysAddr, _pages: usize) -> Result {
|
|
|
|
- unimplemented!()
|
|
|
|
|
|
+fn dealloc_dma(paddr: PhysAddr, pages: usize) -> Result {
|
|
|
|
+ let ok = unsafe { virtio_dealloc_dma(paddr, pages) };
|
|
|
|
+ if ok {
|
|
|
|
+ Ok(())
|
|
|
|
+ } else {
|
|
|
|
+ Err(Error::DmaError)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-fn phys_to_virt(_paddr: PhysAddr) -> VirtAddr {
|
|
|
|
- unimplemented!()
|
|
|
|
|
|
+fn phys_to_virt(paddr: PhysAddr) -> VirtAddr {
|
|
|
|
+ unsafe { virtio_phys_to_virt(paddr) }
|
|
}
|
|
}
|
|
|
|
|
|
-fn virt_to_phys(_vaddr: VirtAddr) -> PhysAddr {
|
|
|
|
- unimplemented!()
|
|
|
|
|
|
+fn virt_to_phys(vaddr: VirtAddr) -> PhysAddr {
|
|
|
|
+ unsafe { virtio_virt_to_phys(vaddr) }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+extern "C" {
|
|
|
|
+ fn virtio_alloc_dma(pages: usize) -> (VirtAddr, PhysAddr);
|
|
|
|
+ fn virtio_dealloc_dma(paddr: PhysAddr, pages: usize) -> bool;
|
|
|
|
+ fn virtio_phys_to_virt(paddr: PhysAddr) -> VirtAddr;
|
|
|
|
+ fn virtio_virt_to_phys(vaddr: VirtAddr) -> PhysAddr;
|
|
}
|
|
}
|
|
|
|
|
|
/// The type returned by driver methods.
|
|
/// The type returned by driver methods.
|
|
@@ -49,31 +67,6 @@ pub enum Error {
|
|
AlreadyUsed,
|
|
AlreadyUsed,
|
|
/// Invalid parameter.
|
|
/// Invalid parameter.
|
|
InvalidParam,
|
|
InvalidParam,
|
|
-}
|
|
|
|
-
|
|
|
|
-/// Types of virtio devices.
|
|
|
|
-enum DeviceType {
|
|
|
|
- Invalid = 0,
|
|
|
|
- Network = 1,
|
|
|
|
- Block = 2,
|
|
|
|
- Console = 3,
|
|
|
|
- EntropySource = 4,
|
|
|
|
- MemoryBallooning = 5,
|
|
|
|
- IoMemory = 6,
|
|
|
|
- Rpmsg = 7,
|
|
|
|
- ScsiHost = 8,
|
|
|
|
- _9P = 9,
|
|
|
|
- Mac80211 = 10,
|
|
|
|
- RprocSerial = 11,
|
|
|
|
- VirtioCAIF = 12,
|
|
|
|
- MemoryBalloon = 13,
|
|
|
|
- GPU = 16,
|
|
|
|
- Timer = 17,
|
|
|
|
- Input = 18,
|
|
|
|
- Socket = 19,
|
|
|
|
- Crypto = 20,
|
|
|
|
- SignalDistributionModule = 21,
|
|
|
|
- Pstore = 22,
|
|
|
|
- IOMMU = 23,
|
|
|
|
- Memory = 24,
|
|
|
|
|
|
+ /// Failed to alloc DMA memory.
|
|
|
|
+ DmaError,
|
|
}
|
|
}
|