@@ -42,11 +42,15 @@ use std::cmp;
42
42
use std:: collections:: VecDeque ;
43
43
use std:: fmt;
44
44
use std:: io:: { self , IoSlice , Write } ;
45
+ use std:: ops:: Deref ;
45
46
use std:: ptr:: copy_nonoverlapping;
46
47
47
- use vm_memory:: bitmap:: { BitmapSlice , MS } ;
48
- use vm_memory:: { ByteValued , GuestMemory , GuestMemoryError , VolatileMemoryError , VolatileSlice } ;
49
- use vm_virtio:: { DescriptorChain , Error as QueueError } ;
48
+ use virtio_queue:: { DescriptorChain , Error as QueueError } ;
49
+ use vm_memory:: bitmap:: BitmapSlice ;
50
+ use vm_memory:: {
51
+ Address , ByteValued , GuestMemory , GuestMemoryAtomic , GuestMemoryError , GuestMemoryMmap ,
52
+ GuestMemoryRegion , VolatileMemory , VolatileMemoryError , VolatileSlice ,
53
+ } ;
50
54
51
55
use super :: { FileReadWriteVolatile , IoBuffers , Reader } ;
52
56
@@ -99,19 +103,14 @@ pub type Result<T> = std::result::Result<T, Error>;
99
103
100
104
impl std:: error:: Error for Error { }
101
105
102
- impl < ' a , M : GuestMemory > Reader < ' a , M > {
106
+ impl < ' a > Reader < ' a > {
103
107
/// Construct a new Reader wrapper over `desc_chain`.
104
- #[ allow( clippy:: new_ret_no_self) ]
105
- pub fn new ( mem : & ' a M , desc_chain : DescriptorChain < ' a , M > ) -> Result < Reader < ' a , MS < ' a , M > > > {
108
+ pub fn new (
109
+ mem : & ' a GuestMemoryMmap ,
110
+ desc_chain : DescriptorChain < GuestMemoryAtomic < GuestMemoryMmap > > ,
111
+ ) -> Result < Reader < ' a > > {
106
112
let mut total_len: usize = 0 ;
107
- let chain = if desc_chain. is_indirect ( ) {
108
- desc_chain
109
- . new_from_indirect ( )
110
- . map_err ( Error :: ConvertIndirectDescriptor ) ?
111
- } else {
112
- desc_chain
113
- } ;
114
- let buffers = chain
113
+ let buffers = desc_chain
115
114
. readable ( )
116
115
. map ( |desc| {
117
116
// Verify that summing the descriptor sizes does not overflow.
@@ -121,10 +120,19 @@ impl<'a, M: GuestMemory> Reader<'a, M> {
121
120
. checked_add ( desc. len ( ) as usize )
122
121
. ok_or ( Error :: DescriptorChainOverflow ) ?;
123
122
124
- mem. get_slice ( desc. addr ( ) , desc. len ( ) as usize )
125
- . map_err ( Error :: GuestMemoryError )
123
+ let region = mem
124
+ . find_region ( desc. addr ( ) )
125
+ . ok_or ( Error :: FindMemoryRegion ) ?;
126
+ let offset = desc
127
+ . addr ( )
128
+ . checked_sub ( region. start_addr ( ) . raw_value ( ) )
129
+ . unwrap ( ) ;
130
+ region
131
+ . deref ( )
132
+ . get_slice ( offset. raw_value ( ) as usize , desc. len ( ) as usize )
133
+ . map_err ( Error :: VolatileMemoryError )
126
134
} )
127
- . collect :: < Result < VecDeque < VolatileSlice < ' a , MS < M > > > > > ( ) ?;
135
+ . collect :: < Result < VecDeque < VolatileSlice < ' a > > > > ( ) ?;
128
136
129
137
Ok ( Reader {
130
138
buffers : IoBuffers {
@@ -147,19 +155,14 @@ pub struct Writer<'a, S = ()> {
147
155
buffers : IoBuffers < ' a , S > ,
148
156
}
149
157
150
- impl < ' a , M : GuestMemory > Writer < ' a , M > {
158
+ impl < ' a > Writer < ' a > {
151
159
/// Construct a new Writer wrapper over `desc_chain`.
152
- #[ allow( clippy:: new_ret_no_self) ]
153
- pub fn new ( mem : & ' a M , desc_chain : DescriptorChain < ' a , M > ) -> Result < Writer < ' a , MS < ' a , M > > > {
160
+ pub fn new (
161
+ mem : & ' a GuestMemoryMmap ,
162
+ desc_chain : DescriptorChain < GuestMemoryAtomic < GuestMemoryMmap > > ,
163
+ ) -> Result < Writer < ' a > > {
154
164
let mut total_len: usize = 0 ;
155
- let chain = if desc_chain. is_indirect ( ) {
156
- desc_chain
157
- . new_from_indirect ( )
158
- . map_err ( Error :: ConvertIndirectDescriptor ) ?
159
- } else {
160
- desc_chain
161
- } ;
162
- let buffers = chain
165
+ let buffers = desc_chain
163
166
. writable ( )
164
167
. map ( |desc| {
165
168
// Verify that summing the descriptor sizes does not overflow.
@@ -169,10 +172,19 @@ impl<'a, M: GuestMemory> Writer<'a, M> {
169
172
. checked_add ( desc. len ( ) as usize )
170
173
. ok_or ( Error :: DescriptorChainOverflow ) ?;
171
174
172
- mem. get_slice ( desc. addr ( ) , desc. len ( ) as usize )
173
- . map_err ( Error :: GuestMemoryError )
175
+ let region = mem
176
+ . find_region ( desc. addr ( ) )
177
+ . ok_or ( Error :: FindMemoryRegion ) ?;
178
+ let offset = desc
179
+ . addr ( )
180
+ . checked_sub ( region. start_addr ( ) . raw_value ( ) )
181
+ . unwrap ( ) ;
182
+ region
183
+ . deref ( )
184
+ . get_slice ( offset. raw_value ( ) as usize , desc. len ( ) as usize )
185
+ . map_err ( Error :: VolatileMemoryError )
174
186
} )
175
- . collect :: < Result < VecDeque < VolatileSlice < ' a , MS < M > > > > > ( ) ?;
187
+ . collect :: < Result < VecDeque < VolatileSlice < ' a > > > > ( ) ?;
176
188
177
189
Ok ( Writer {
178
190
buffers : IoBuffers {
@@ -437,7 +449,9 @@ mod async_io {
437
449
}
438
450
}
439
451
440
- #[ cfg( test) ]
452
+ /// Disabled since vm-virtio doesn't export any DescriptorChain constructors.
453
+ /// Should re-enable once it does.
454
+ #[ cfg( testff) ]
441
455
mod tests {
442
456
use super :: * ;
443
457
use std:: io:: { Read , Seek , SeekFrom , Write } ;
@@ -472,7 +486,7 @@ mod tests {
472
486
mut buffers_start_addr : GuestAddress ,
473
487
descriptors : Vec < ( DescriptorType , u32 ) > ,
474
488
spaces_between_regions : u32 ,
475
- ) -> Result < DescriptorChain < GuestMemoryMmap > > {
489
+ ) -> Result < DescriptorChain < GuestMemoryAtomic < GuestMemoryMmap > > > {
476
490
let descriptors_len = descriptors. len ( ) ;
477
491
for ( index, ( type_, size) ) in descriptors. into_iter ( ) . enumerate ( ) {
478
492
let mut flags = 0 ;
@@ -504,7 +518,7 @@ mod tests {
504
518
) ;
505
519
}
506
520
507
- DescriptorChain :: checked_new ( memory, descriptor_array_addr, 0x100 , 0 )
521
+ DescriptorChain :: < & GuestMemoryMmap > :: new ( memory, descriptor_array_addr, 0x100 , 0 )
508
522
. ok_or ( Error :: InvalidChain )
509
523
}
510
524
0 commit comments