@@ -4,12 +4,11 @@ use super::common::Feature;
44use crate :: hal:: Hal ;
55use crate :: queue:: VirtQueue ;
66use crate :: transport:: Transport ;
7- use crate :: volatile:: { volread , volwrite , ReadOnly , VolatileReadable , WriteOnly } ;
7+ use crate :: volatile:: { ReadOnly , WriteOnly } ;
88use crate :: Error ;
99use alloc:: { boxed:: Box , string:: String } ;
1010use core:: cmp:: min;
11- use core:: mem:: size_of;
12- use core:: ptr:: { addr_of, NonNull } ;
11+ use core:: mem:: { offset_of, size_of} ;
1312use zerocopy:: { AsBytes , FromBytes , FromZeroes } ;
1413
1514/// Virtual human interface devices such as keyboards, mice and tablets.
@@ -22,7 +21,6 @@ pub struct VirtIOInput<H: Hal, T: Transport> {
2221 event_queue : VirtQueue < H , QUEUE_SIZE > ,
2322 status_queue : VirtQueue < H , QUEUE_SIZE > ,
2423 event_buf : Box < [ InputEvent ; 32 ] > ,
25- config : NonNull < Config > ,
2624}
2725
2826impl < H : Hal , T : Transport > VirtIOInput < H , T > {
@@ -32,8 +30,6 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
3230
3331 let negotiated_features = transport. begin_init ( SUPPORTED_FEATURES ) ;
3432
35- let config = transport. config_space :: < Config > ( ) ?;
36-
3733 let mut event_queue = VirtQueue :: new (
3834 & mut transport,
3935 QUEUE_EVENT ,
@@ -62,7 +58,6 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
6258 event_queue,
6359 status_queue,
6460 event_buf,
65- config,
6661 } )
6762 }
6863
@@ -108,17 +103,19 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
108103 subsel : u8 ,
109104 out : & mut [ u8 ] ,
110105 ) -> u8 {
111- let size;
106+ self . transport
107+ . write_config_space ( offset_of ! ( Config , select) , select as u8 ) ;
108+ self . transport
109+ . write_config_space ( offset_of ! ( Config , subsel) , subsel) ;
110+ let size: u8 = self . transport . read_config_space ( offset_of ! ( Config , size) ) ;
112111 // Safe because config points to a valid MMIO region for the config space.
113- unsafe {
114- volwrite ! ( self . config, select, select as u8 ) ;
115- volwrite ! ( self . config, subsel, subsel) ;
116- size = volread ! ( self . config, size) ;
117- let size_to_copy = min ( usize:: from ( size) , out. len ( ) ) ;
118- for ( i, out_item) in out. iter_mut ( ) . take ( size_to_copy) . enumerate ( ) {
119- * out_item = addr_of ! ( ( * self . config. as_ptr( ) ) . data[ i] ) . vread ( ) ;
120- }
112+ let size_to_copy = min ( usize:: from ( size) , out. len ( ) ) ;
113+ for ( i, out_item) in out. iter_mut ( ) . take ( size_to_copy) . enumerate ( ) {
114+ * out_item = self
115+ . transport
116+ . read_config_space ( offset_of ! ( Config , data) + i * size_of :: < u8 > ( ) ) ;
121117 }
118+
122119 size
123120 }
124121
@@ -129,20 +126,24 @@ impl<H: Hal, T: Transport> VirtIOInput<H, T> {
129126 select : InputConfigSelect ,
130127 subsel : u8 ,
131128 ) -> Result < Box < [ u8 ] > , Error > {
132- // Safe because config points to a valid MMIO region for the config space.
133- unsafe {
134- volwrite ! ( self . config, select, select as u8 ) ;
135- volwrite ! ( self . config, subsel, subsel) ;
136- let size = usize:: from ( volread ! ( self . config, size) ) ;
137- if size > CONFIG_DATA_MAX_LENGTH {
138- return Err ( Error :: IoError ) ;
139- }
140- let mut buf = u8:: new_box_slice_zeroed ( size) ;
141- for i in 0 ..size {
142- buf[ i] = addr_of ! ( ( * self . config. as_ptr( ) ) . data[ i] ) . vread ( ) ;
143- }
144- Ok ( buf)
129+ self . transport
130+ . write_config_space ( offset_of ! ( Config , select) , select as u8 ) ;
131+ self . transport
132+ . write_config_space ( offset_of ! ( Config , subsel) , subsel) ;
133+ let size = usize:: from (
134+ self . transport
135+ . read_config_space :: < u8 > ( offset_of ! ( Config , size) ) ,
136+ ) ;
137+ if size > CONFIG_DATA_MAX_LENGTH {
138+ return Err ( Error :: IoError ) ;
139+ }
140+ let mut buf = u8:: new_box_slice_zeroed ( size) ;
141+ for i in 0 ..size {
142+ buf[ i] = self
143+ . transport
144+ . read_config_space ( offset_of ! ( Config , data) + i * size_of :: < u8 > ( ) ) ;
145145 }
146+ Ok ( buf)
146147 }
147148
148149 /// Queries a specific piece of information by `select` and `subsel` into a newly-allocated
@@ -322,7 +323,7 @@ mod tests {
322323 } ,
323324 } ;
324325 use alloc:: { sync:: Arc , vec} ;
325- use core:: convert:: TryInto ;
326+ use core:: { convert:: TryInto , ptr :: NonNull } ;
326327 use std:: sync:: Mutex ;
327328
328329 #[ test]
0 commit comments