Browse Source

Use NonNull for Transport::config_space.

Andrew Walbran 2 years ago
parent
commit
ea34476f3b
7 changed files with 9 additions and 8 deletions
  1. 1 1
      src/blk.rs
  2. 1 1
      src/console.rs
  3. 1 1
      src/gpu.rs
  4. 1 1
      src/input.rs
  5. 1 1
      src/net.rs
  6. 2 2
      src/transport/mmio.rs
  7. 2 1
      src/transport/mod.rs

+ 1 - 1
src/blk.rs

@@ -28,7 +28,7 @@ impl<'a, H: Hal, T: Transport> VirtIOBlk<'a, H, T> {
         });
 
         // read configuration space
-        let config = unsafe { &mut *(transport.config_space() as *mut BlkConfig) };
+        let config = unsafe { transport.config_space().cast::<BlkConfig>().as_ref() };
         info!("config: {:?}", config);
         info!(
             "found a block device of size {}KB",

+ 1 - 1
src/console.rs

@@ -31,7 +31,7 @@ impl<'a, H: Hal, T: Transport> VirtIOConsole<'a, H, T> {
             let supported_features = Features::empty();
             (features & supported_features).bits()
         });
-        let config = unsafe { &mut *(transport.config_space() as *mut Config) };
+        let config = unsafe { transport.config_space().cast::<Config>().as_ref() };
         info!("Config: {:?}", config);
         let receiveq = VirtQueue::new(transport, QUEUE_RECEIVEQ_PORT_0, QUEUE_SIZE)?;
         let transmitq = VirtQueue::new(transport, QUEUE_TRANSMITQ_PORT_0, QUEUE_SIZE)?;

+ 1 - 1
src/gpu.rs

@@ -43,7 +43,7 @@ impl<'a, H: Hal, T: Transport> VirtIOGpu<'a, H, T> {
         });
 
         // read configuration space
-        let config = unsafe { &mut *(transport.config_space() as *mut Config) };
+        let config = unsafe { transport.config_space().cast::<Config>().as_ref() };
         info!("Config: {:?}", config);
 
         let control_queue = VirtQueue::new(transport, QUEUE_TRANSMIT, 2)?;

+ 1 - 1
src/input.rs

@@ -71,7 +71,7 @@ impl<'a, H: Hal, T: Transport> VirtIOInput<'a, H, T> {
         subsel: u8,
         out: &mut [u8],
     ) -> u8 {
-        let config = unsafe { &mut *(self.transport.config_space() as *mut Config) };
+        let config = unsafe { self.transport.config_space().cast::<Config>().as_mut() };
         config.select.write(select as u8);
         config.subsel.write(subsel);
         let size = config.size.read();

+ 1 - 1
src/net.rs

@@ -31,7 +31,7 @@ impl<'a, H: Hal, T: Transport> VirtIONet<'a, H, T> {
             (features & supported_features).bits()
         });
         // read configuration space
-        let config = unsafe { &mut *(transport.config_space() as *mut Config) };
+        let config = unsafe { transport.config_space().cast::<Config>().as_ref() };
         let mac = config.mac.read();
         debug!("Got MAC={:?}, status={:?}", mac, config.status.read());
 

+ 2 - 2
src/transport/mmio.rs

@@ -429,7 +429,7 @@ impl Transport for MmioTransport {
         }
     }
 
-    fn config_space(&self) -> *mut u64 {
-        (self.header.as_ptr() as usize + CONFIG_SPACE_OFFSET) as _
+    fn config_space(&self) -> NonNull<u64> {
+        NonNull::new((self.header.as_ptr() as usize + CONFIG_SPACE_OFFSET) as _).unwrap()
     }
 }

+ 2 - 1
src/transport/mod.rs

@@ -2,6 +2,7 @@ pub mod mmio;
 
 use crate::{PhysAddr, PAGE_SIZE};
 use bitflags::bitflags;
+use core::ptr::NonNull;
 
 /// A VirtIO transport layer.
 pub trait Transport {
@@ -64,7 +65,7 @@ pub trait Transport {
     }
 
     /// Gets the pointer to the config space.
-    fn config_space(&self) -> *mut u64;
+    fn config_space(&self) -> NonNull<u64>;
 }
 
 bitflags! {