@@ -97,13 +97,13 @@ impl GuestMemory {
97
97
/// # Examples
98
98
///
99
99
/// ```
100
- /// # use memory_model::{Address, GuestAddress, GuestMemory, MemoryMapping};
101
- /// # fn test_end_addr() -> Result<(), ()> {
100
+ /// use memory_model::{Address, GuestAddress, GuestMemory, MemoryMapping};
101
+ /// fn test_end_addr() -> Result<(), ()> {
102
102
/// let start_addr = GuestAddress(0x1000);
103
103
/// let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
104
104
/// assert_eq!(start_addr.checked_add(0x400), Some(gm.end_addr()));
105
105
/// Ok(())
106
- /// # }
106
+ /// }
107
107
/// ```
108
108
pub fn end_addr ( & self ) -> GuestAddress {
109
109
self . regions
@@ -180,14 +180,16 @@ impl GuestMemory {
180
180
/// * Write a slice at guestaddress 0x200.
181
181
///
182
182
/// ```
183
- /// # use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
184
- /// # fn test_write_u64() -> Result<(), ()> {
185
- /// # let start_addr = GuestAddress(0x1000);
186
- /// # let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
187
- /// let res = gm.write_slice_at_addr(&[1,2,3,4,5], GuestAddress(0x200)).map_err(|_| ())?;
183
+ /// use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
184
+ /// fn test_write_u64() -> Result<(), ()> {
185
+ /// let start_addr = GuestAddress(0x1000);
186
+ /// let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
187
+ /// let res = gm
188
+ /// .write_slice_at_addr(&[1, 2, 3, 4, 5], GuestAddress(0x200))
189
+ /// .map_err(|_| ())?;
188
190
/// assert_eq!(5, res);
189
191
/// Ok(())
190
- /// # }
192
+ /// }
191
193
/// ```
192
194
pub fn write_slice_at_addr ( & self , buf : & [ u8 ] , guest_addr : GuestAddress ) -> Result < usize > {
193
195
self . do_in_region_partial ( guest_addr, move |mapping, offset| {
@@ -206,15 +208,17 @@ impl GuestMemory {
206
208
/// * Read a slice of length 16 at guestaddress 0x200.
207
209
///
208
210
/// ```
209
- /// # use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
210
- /// # fn test_write_u64() -> Result<(), ()> {
211
- /// # let start_addr = GuestAddress(0x1000);
212
- /// # let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
211
+ /// use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
212
+ /// fn test_write_u64() -> Result<(), ()> {
213
+ /// let start_addr = GuestAddress(0x1000);
214
+ /// let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
213
215
/// let buf = &mut [0u8; 16];
214
- /// let res = gm.read_slice_at_addr(buf, GuestAddress(0x200)).map_err(|_| ())?;
216
+ /// let res = gm
217
+ /// .read_slice_at_addr(buf, GuestAddress(0x200))
218
+ /// .map_err(|_| ())?;
215
219
/// assert_eq!(16, res);
216
220
/// Ok(())
217
- /// # }
221
+ /// }
218
222
/// ```
219
223
pub fn read_slice_at_addr ( & self , buf : & mut [ u8 ] , guest_addr : GuestAddress ) -> Result < usize > {
220
224
self . do_in_region_partial ( guest_addr, move |mapping, offset| {
@@ -236,16 +240,18 @@ impl GuestMemory {
236
240
/// * Read a u64 from two areas of guest memory backed by separate mappings.
237
241
///
238
242
/// ```
239
- /// # use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
240
- /// # fn test_read_u64() -> Result<u64, ()> {
241
- /// # let start_addr1 = GuestAddress(0x0);
242
- /// # let start_addr2 = GuestAddress(0x400);
243
- /// # let mut gm = GuestMemory::new(&vec![(start_addr1, 0x400), (start_addr2, 0x400)])
244
- /// # .map_err(|_| ())?;
245
- /// let num1: u64 = gm.read_obj_from_addr(GuestAddress(32)).map_err(|_| ())?;
246
- /// let num2: u64 = gm.read_obj_from_addr(GuestAddress(0x400+32)).map_err(|_| ())?;
247
- /// # Ok(num1 + num2)
248
- /// # }
243
+ /// use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
244
+ /// fn test_read_u64() -> Result<u64, ()> {
245
+ /// let start_addr1 = GuestAddress(0x0);
246
+ /// let start_addr2 = GuestAddress(0x400);
247
+ /// let mut gm =
248
+ /// GuestMemory::new(&vec![(start_addr1, 0x400), (start_addr2, 0x400)]).map_err(|_| ())?;
249
+ /// let num1: u64 = gm.read_obj_from_addr(GuestAddress(32)).map_err(|_| ())?;
250
+ /// let num2: u64 = gm
251
+ /// .read_obj_from_addr(GuestAddress(0x400 + 32))
252
+ /// .map_err(|_| ())?;
253
+ /// Ok(num1 + num2)
254
+ /// }
249
255
/// ```
250
256
pub fn read_obj_from_addr < T : DataInit > ( & self , guest_addr : GuestAddress ) -> Result < T > {
251
257
self . do_in_region ( guest_addr, mem:: size_of :: < T > ( ) , |mapping, offset| {
@@ -265,13 +271,13 @@ impl GuestMemory {
265
271
/// * Write a u64 at guest address 0x1100.
266
272
///
267
273
/// ```
268
- /// # use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
269
- /// # fn test_write_u64() -> Result<(), ()> {
270
- /// # let start_addr = GuestAddress(0x1000);
271
- /// # let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
274
+ /// use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
275
+ /// fn test_write_u64() -> Result<(), ()> {
276
+ /// let start_addr = GuestAddress(0x1000);
277
+ /// let mut gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
272
278
/// gm.write_obj_at_addr(55u64, GuestAddress(0x1100))
273
279
/// .map_err(|_| ())
274
- /// # }
280
+ /// }
275
281
/// ```
276
282
pub fn write_obj_at_addr < T : DataInit > ( & self , val : T , guest_addr : GuestAddress ) -> Result < ( ) > {
277
283
self . do_in_region ( guest_addr, mem:: size_of :: < T > ( ) , move |mapping, offset| {
@@ -293,19 +299,19 @@ impl GuestMemory {
293
299
/// * Read bytes from /dev/urandom
294
300
///
295
301
/// ```
296
- /// # use memory_model::{Address, GuestAddress, GuestMemory, MemoryMapping};
297
- /// # use std::fs::File;
298
- /// # use std::path::Path;
299
- /// # fn test_read_random() -> Result<u32, ()> {
300
- /// # let start_addr = GuestAddress(0x1000);
301
- /// # let gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
302
- /// let mut file = File::open(Path::new("/dev/urandom")).map_err(|_| ())?;
303
- /// let addr = GuestAddress(0x1010);
304
- /// gm.read_to_memory(addr, &mut file, 128).map_err(|_| ())?;
305
- /// let read_addr = addr.checked_add(8).ok_or(())?;
306
- /// let rand_val: u32 = gm.read_obj_from_addr(read_addr).map_err(|_| ())?;
307
- /// # Ok(rand_val)
308
- /// # }
302
+ /// use memory_model::{Address, GuestAddress, GuestMemory, MemoryMapping};
303
+ /// use std::fs::File;
304
+ /// use std::path::Path;
305
+ /// fn test_read_random() -> Result<u32, ()> {
306
+ /// let start_addr = GuestAddress(0x1000);
307
+ /// let gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
308
+ /// let mut file = File::open(Path::new("/dev/urandom")).map_err(|_| ())?;
309
+ /// let addr = GuestAddress(0x1010);
310
+ /// gm.read_to_memory(addr, &mut file, 128).map_err(|_| ())?;
311
+ /// let read_addr = addr.checked_add(8).ok_or(())?;
312
+ /// let rand_val: u32 = gm.read_obj_from_addr(read_addr).map_err(|_| ())?;
313
+ /// Ok(rand_val)
314
+ /// }
309
315
/// ```
310
316
pub fn read_to_memory < F > (
311
317
& self ,
@@ -335,17 +341,17 @@ impl GuestMemory {
335
341
/// * Write 128 bytes to /dev/null
336
342
///
337
343
/// ```
338
- /// # use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
339
- /// # use std::fs::File;
340
- /// # use std::path::Path;
341
- /// # fn test_write_null() -> Result<(), ()> {
342
- /// # let start_addr = GuestAddress(0x1000);
343
- /// # let gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
344
- /// let mut file = File::open(Path::new("/dev/null")).map_err(|_| ())?;
345
- /// let addr = GuestAddress(0x1010);
346
- /// gm.write_from_memory(addr, &mut file, 128).map_err(|_| ())?;
347
- /// # Ok(())
348
- /// # }
344
+ /// use memory_model::{GuestAddress, GuestMemory, MemoryMapping};
345
+ /// use std::fs::File;
346
+ /// use std::path::Path;
347
+ /// fn test_write_null() -> Result<(), ()> {
348
+ /// let start_addr = GuestAddress(0x1000);
349
+ /// let gm = GuestMemory::new(&vec![(start_addr, 0x400)]).map_err(|_| ())?;
350
+ /// let mut file = File::open(Path::new("/dev/null")).map_err(|_| ())?;
351
+ /// let addr = GuestAddress(0x1010);
352
+ /// gm.write_from_memory(addr, &mut file, 128).map_err(|_| ())?;
353
+ /// Ok(())
354
+ /// }
349
355
/// ```
350
356
pub fn write_from_memory < F > (
351
357
& self ,
@@ -374,14 +380,14 @@ impl GuestMemory {
374
380
/// # Examples
375
381
///
376
382
/// ```
377
- /// # use memory_model::{GuestAddress, GuestMemory};
378
- /// # fn test_host_addr() -> Result<(), ()> {
383
+ /// use memory_model::{GuestAddress, GuestMemory};
384
+ /// fn test_host_addr() -> Result<(), ()> {
379
385
/// let start_addr = GuestAddress(0x1000);
380
386
/// let mut gm = GuestMemory::new(&vec![(start_addr, 0x500)]).map_err(|_| ())?;
381
387
/// let addr = gm.get_host_address(GuestAddress(0x1200)).unwrap();
382
388
/// println!("Host address is {:p}", addr);
383
389
/// Ok(())
384
- /// # }
390
+ /// }
385
391
/// ```
386
392
pub fn get_host_address ( & self , guest_addr : GuestAddress ) -> Result < * const u8 > {
387
393
self . do_in_region ( guest_addr, 1 , |mapping, offset| {
@@ -408,19 +414,19 @@ impl GuestMemory {
408
414
/// and dividing their sizes to 1024, then summing up the values in an accumulator.
409
415
///
410
416
/// ```
411
- /// # use memory_model::{GuestAddress, GuestMemory};
412
- /// # fn test_map_fold() -> Result<(), ()> {
417
+ /// use memory_model::{GuestAddress, GuestMemory};
418
+ /// fn test_map_fold() -> Result<(), ()> {
413
419
/// let start_addr1 = GuestAddress(0x0);
414
420
/// let start_addr2 = GuestAddress(0x400);
415
421
/// let mem = GuestMemory::new(&vec![(start_addr1, 1024), (start_addr2, 2048)]).unwrap();
416
422
/// let total_size = mem.map_and_fold(
417
423
/// 0,
418
424
/// |(_, region)| region.size() / 1024,
419
- /// |acc, size| acc + size
425
+ /// |acc, size| acc + size,
420
426
/// );
421
427
/// println!("Total memory size = {} KB", total_size);
422
428
/// Ok(())
423
- /// # }
429
+ /// }
424
430
/// ```
425
431
pub fn map_and_fold < F , G , T > ( & self , init : T , mapf : F , foldf : G ) -> T
426
432
where
0 commit comments