Pārlūkot izejas kodu

Return raw slices rather than slice references from Dma.

Andrew Walbran 2 gadi atpakaļ
vecāks
revīzija
87b41425fb
3 mainītis faili ar 14 papildinājumiem un 8 dzēšanām
  1. 6 1
      src/device/console.rs
  2. 4 4
      src/device/gpu.rs
  3. 4 3
      src/hal.rs

+ 6 - 1
src/device/console.rs

@@ -75,7 +75,12 @@ impl<H: Hal, T: Transport> VirtIOConsole<'_, H, T> {
         let receiveq = VirtQueue::new(&mut transport, QUEUE_RECEIVEQ_PORT_0, QUEUE_SIZE)?;
         let transmitq = VirtQueue::new(&mut transport, QUEUE_TRANSMITQ_PORT_0, QUEUE_SIZE)?;
         let queue_buf_dma = Dma::new(1, BufferDirection::DeviceToDriver)?;
-        let queue_buf_rx = unsafe { queue_buf_dma.as_buf() };
+
+        // Safe because no alignment or initialisation is required for [u8], the DMA buffer is
+        // dereferenceable, and the lifetime of the reference matches the lifetime of the DMA buffer
+        // (which we don't otherwise access).
+        let queue_buf_rx = unsafe { queue_buf_dma.raw_slice().as_mut() };
+
         transport.finish_init();
         let mut console = VirtIOConsole {
             transport,

+ 4 - 4
src/device/gpu.rs

@@ -62,8 +62,8 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
 
         let dma_send = Dma::new(1, BufferDirection::DriverToDevice)?;
         let dma_recv = Dma::new(1, BufferDirection::DeviceToDriver)?;
-        let queue_buf_send = unsafe { dma_send.as_buf() };
-        let queue_buf_recv = unsafe { dma_recv.as_buf() };
+        let queue_buf_send = unsafe { dma_send.raw_slice().as_mut() };
+        let queue_buf_recv = unsafe { dma_recv.raw_slice().as_mut() };
 
         transport.finish_init();
 
@@ -116,7 +116,7 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
         // map frame buffer to screen
         self.set_scanout(display_info.rect, SCANOUT_ID, RESOURCE_ID_FB)?;
 
-        let buf = unsafe { frame_buffer_dma.as_buf() };
+        let buf = unsafe { frame_buffer_dma.raw_slice().as_mut() };
         self.frame_buffer_dma = Some(frame_buffer_dma);
         Ok(buf)
     }
@@ -145,7 +145,7 @@ impl<H: Hal, T: Transport> VirtIOGpu<'_, H, T> {
             return Err(Error::InvalidParam);
         }
         let cursor_buffer_dma = Dma::new(pages(size as usize), BufferDirection::DriverToDevice)?;
-        let buf = unsafe { cursor_buffer_dma.as_buf() };
+        let buf = unsafe { cursor_buffer_dma.raw_slice().as_mut() };
         buf.copy_from_slice(cursor_image);
 
         self.resource_create_2d(RESOURCE_ID_CURSOR, CURSOR_RECT.width, CURSOR_RECT.height)?;

+ 4 - 3
src/hal.rs

@@ -39,9 +39,10 @@ impl<H: Hal> Dma<H> {
         H::phys_to_virt(self.paddr)
     }
 
-    /// Convert to a buffer
-    pub unsafe fn as_buf(&self) -> &'static mut [u8] {
-        core::slice::from_raw_parts_mut(self.vaddr() as _, PAGE_SIZE * self.pages)
+    pub fn raw_slice(&self) -> NonNull<[u8]> {
+        let raw_slice =
+            core::ptr::slice_from_raw_parts_mut(self.vaddr() as *mut u8, self.pages * PAGE_SIZE);
+        NonNull::new(raw_slice).unwrap()
     }
 }