@@ -170,6 +170,24 @@ impl<B: Bitmap> GuestRegionMmap<B> {
170
170
}
171
171
}
172
172
173
+ impl < B : NewBitmap > GuestRegionMmap < B > {
174
+ /// Create a new memory-mapped memory region from guest's physical memory, size and file.
175
+ pub fn from_range (
176
+ addr : GuestAddress ,
177
+ size : usize ,
178
+ file : Option < FileOffset > ,
179
+ ) -> result:: Result < Self , Error > {
180
+ let region = if let Some ( ref f_off) = file {
181
+ MmapRegion :: from_file ( f_off. clone ( ) , size)
182
+ } else {
183
+ MmapRegion :: new ( size)
184
+ }
185
+ . map_err ( Error :: MmapRegion ) ?;
186
+
187
+ Self :: new ( region, addr)
188
+ }
189
+ }
190
+
173
191
impl < B : Bitmap > Bytes < MemoryRegionAddress > for GuestRegionMmap < B > {
174
192
type E = guest_memory:: Error ;
175
193
@@ -529,16 +547,7 @@ impl<B: NewBitmap> GuestMemoryMmap<B> {
529
547
ranges
530
548
. into_iter ( )
531
549
. map ( |x| {
532
- let guest_base = x. borrow ( ) . 0 ;
533
- let size = x. borrow ( ) . 1 ;
534
-
535
- if let Some ( ref f_off) = x. borrow ( ) . 2 {
536
- MmapRegion :: from_file ( f_off. clone ( ) , size)
537
- } else {
538
- MmapRegion :: new ( size)
539
- }
540
- . map_err ( Error :: MmapRegion )
541
- . and_then ( |r| GuestRegionMmap :: new ( r, guest_base) )
550
+ GuestRegionMmap :: from_range ( x. borrow ( ) . 0 , x. borrow ( ) . 1 , x. borrow ( ) . 2 . clone ( ) )
542
551
} )
543
552
. collect :: < result:: Result < Vec < _ > , Error > > ( ) ?,
544
553
)
@@ -734,8 +743,7 @@ mod tests {
734
743
regions_summary
735
744
. iter ( )
736
745
. map ( |( region_addr, region_size) | {
737
- GuestRegionMmap :: new ( MmapRegion :: new ( * region_size) . unwrap ( ) , * region_addr)
738
- . unwrap ( )
746
+ GuestRegionMmap :: from_range ( * region_addr, * region_size, None ) . unwrap ( )
739
747
} )
740
748
. collect ( ) ,
741
749
)
@@ -748,10 +756,7 @@ mod tests {
748
756
regions_summary
749
757
. iter ( )
750
758
. map ( |( region_addr, region_size) | {
751
- Arc :: new (
752
- GuestRegionMmap :: new ( MmapRegion :: new ( * region_size) . unwrap ( ) , * region_addr)
753
- . unwrap ( ) ,
754
- )
759
+ Arc :: new ( GuestRegionMmap :: from_range ( * region_addr, * region_size, None ) . unwrap ( ) )
755
760
} )
756
761
. collect ( ) ,
757
762
)
@@ -929,7 +934,7 @@ mod tests {
929
934
930
935
#[ test]
931
936
fn slice_addr ( ) {
932
- let m = GuestRegionMmap :: new ( MmapRegion :: new ( 5 ) . unwrap ( ) , GuestAddress ( 0 ) ) . unwrap ( ) ;
937
+ let m = GuestRegionMmap :: from_range ( GuestAddress ( 0 ) , 5 , None ) . unwrap ( ) ;
933
938
let s = m. get_slice ( MemoryRegionAddress ( 2 ) , 3 ) . unwrap ( ) ;
934
939
assert_eq ! ( s. as_ptr( ) , unsafe { m. as_ptr( ) . offset( 2 ) } ) ;
935
940
}
@@ -940,8 +945,8 @@ mod tests {
940
945
let sample_buf = & [ 1 , 2 , 3 , 4 , 5 ] ;
941
946
assert ! ( f. write_all( sample_buf) . is_ok( ) ) ;
942
947
943
- let region = MmapRegion :: from_file ( FileOffset :: new ( f, 0 ) , sample_buf . len ( ) ) . unwrap ( ) ;
944
- let mem_map = GuestRegionMmap :: new ( region , GuestAddress ( 0 ) ) . unwrap ( ) ;
948
+ let file = Some ( FileOffset :: new ( f, 0 ) ) ;
949
+ let mem_map = GuestRegionMmap :: from_range ( GuestAddress ( 0 ) , sample_buf . len ( ) , file ) . unwrap ( ) ;
945
950
let buf = & mut [ 0u8 ; 16 ] ;
946
951
assert_eq ! (
947
952
mem_map. as_volatile_slice( ) . unwrap( ) . read( buf, 0 ) . unwrap( ) ,
@@ -1365,21 +1370,17 @@ mod tests {
1365
1370
let mem_orig = gm. memory ( ) ;
1366
1371
assert_eq ! ( mem_orig. num_regions( ) , 2 ) ;
1367
1372
1368
- let mmap = Arc :: new (
1369
- GuestRegionMmap :: new ( MmapRegion :: new ( 0x1000 ) . unwrap ( ) , GuestAddress ( 0x8000 ) ) . unwrap ( ) ,
1370
- ) ;
1373
+ let mmap =
1374
+ Arc :: new ( GuestRegionMmap :: from_range ( GuestAddress ( 0x8000 ) , 0x1000 , None ) . unwrap ( ) ) ;
1371
1375
let gm = gm. insert_region ( mmap) . unwrap ( ) ;
1372
- let mmap = Arc :: new (
1373
- GuestRegionMmap :: new ( MmapRegion :: new ( 0x1000 ) . unwrap ( ) , GuestAddress ( 0x4000 ) ) . unwrap ( ) ,
1374
- ) ;
1376
+ let mmap =
1377
+ Arc :: new ( GuestRegionMmap :: from_range ( GuestAddress ( 0x4000 ) , 0x1000 , None ) . unwrap ( ) ) ;
1375
1378
let gm = gm. insert_region ( mmap) . unwrap ( ) ;
1376
- let mmap = Arc :: new (
1377
- GuestRegionMmap :: new ( MmapRegion :: new ( 0x1000 ) . unwrap ( ) , GuestAddress ( 0xc000 ) ) . unwrap ( ) ,
1378
- ) ;
1379
+ let mmap =
1380
+ Arc :: new ( GuestRegionMmap :: from_range ( GuestAddress ( 0xc000 ) , 0x1000 , None ) . unwrap ( ) ) ;
1379
1381
let gm = gm. insert_region ( mmap) . unwrap ( ) ;
1380
- let mmap = Arc :: new (
1381
- GuestRegionMmap :: new ( MmapRegion :: new ( 0x1000 ) . unwrap ( ) , GuestAddress ( 0xc000 ) ) . unwrap ( ) ,
1382
- ) ;
1382
+ let mmap =
1383
+ Arc :: new ( GuestRegionMmap :: from_range ( GuestAddress ( 0xc000 ) , 0x1000 , None ) . unwrap ( ) ) ;
1383
1384
gm. insert_region ( mmap) . unwrap_err ( ) ;
1384
1385
1385
1386
assert_eq ! ( mem_orig. num_regions( ) , 2 ) ;
@@ -1416,10 +1417,7 @@ mod tests {
1416
1417
1417
1418
#[ test]
1418
1419
fn test_guest_memory_mmap_get_slice ( ) {
1419
- let region_addr = GuestAddress ( 0 ) ;
1420
- let region_size = 0x400 ;
1421
- let region =
1422
- GuestRegionMmap :: new ( MmapRegion :: new ( region_size) . unwrap ( ) , region_addr) . unwrap ( ) ;
1420
+ let region = GuestRegionMmap :: from_range ( GuestAddress ( 0 ) , 0x400 , None ) . unwrap ( ) ;
1423
1421
1424
1422
// Normal case.
1425
1423
let slice_addr = MemoryRegionAddress ( 0x100 ) ;
@@ -1441,10 +1439,8 @@ mod tests {
1441
1439
1442
1440
#[ test]
1443
1441
fn test_guest_memory_mmap_as_volatile_slice ( ) {
1444
- let region_addr = GuestAddress ( 0 ) ;
1445
1442
let region_size = 0x400 ;
1446
- let region =
1447
- GuestRegionMmap :: new ( MmapRegion :: new ( region_size) . unwrap ( ) , region_addr) . unwrap ( ) ;
1443
+ let region = GuestRegionMmap :: from_range ( GuestAddress ( 0 ) , region_size, None ) . unwrap ( ) ;
1448
1444
1449
1445
// Test slice length.
1450
1446
let slice = region. as_volatile_slice ( ) . unwrap ( ) ;
@@ -1548,8 +1544,7 @@ mod tests {
1548
1544
1549
1545
#[ test]
1550
1546
fn test_atomic_accesses ( ) {
1551
- let region =
1552
- GuestRegionMmap :: new ( MmapRegion :: new ( 0x1000 ) . unwrap ( ) , GuestAddress ( 0 ) ) . unwrap ( ) ;
1547
+ let region = GuestRegionMmap :: from_range ( GuestAddress ( 0 ) , 0x1000 , None ) . unwrap ( ) ;
1553
1548
1554
1549
crate :: bytes:: tests:: check_atomic_accesses (
1555
1550
region,
0 commit comments