@@ -611,6 +611,26 @@ impl<B: Bitmap> GuestMemoryMmap<B> {
611
611
612
612
Err ( Error :: InvalidGuestRegion )
613
613
}
614
+
615
+ /// Find the region containing the specified address.
616
+ pub fn find_arc_region ( & self , addr : GuestAddress ) -> Option < Arc < GuestRegionMmap < B > > > {
617
+ let index = match self . regions . binary_search_by_key ( & addr, |x| x. start_addr ( ) ) {
618
+ Ok ( x) => Some ( x) ,
619
+ // Within the closest region with starting address < addr
620
+ Err ( x) if ( x > 0 && addr <= self . regions [ x - 1 ] . last_addr ( ) ) => Some ( x - 1 ) ,
621
+ _ => None ,
622
+ } ;
623
+ index. map ( |x| self . regions [ x] . clone ( ) )
624
+ }
625
+ }
626
+
627
+ impl < B > IntoIterator for GuestMemoryMmap < B > {
628
+ type Item = Arc < GuestRegionMmap < B > > ;
629
+ type IntoIter = std:: vec:: IntoIter < Self :: Item > ;
630
+
631
+ fn into_iter ( self ) -> Self :: IntoIter {
632
+ self . regions . into_iter ( )
633
+ }
614
634
}
615
635
616
636
/// An iterator over the elements of `GuestMemoryMmap`.
@@ -704,6 +724,7 @@ mod tests {
704
724
assert_eq ! ( region_size, & mmap. mapping. size( ) ) ;
705
725
706
726
assert ! ( guest_mem. find_region( * region_addr) . is_some( ) ) ;
727
+ assert ! ( guest_mem. find_arc_region( * region_addr) . is_some( ) ) ;
707
728
}
708
729
}
709
730
@@ -951,7 +972,7 @@ mod tests {
951
972
] )
952
973
. unwrap ( ) ;
953
974
954
- let guest_mem_list = vec ! [ guest_mem, guest_mem_backed_by_file] ;
975
+ let guest_mem_list = [ guest_mem, guest_mem_backed_by_file] ;
955
976
for guest_mem in guest_mem_list. iter ( ) {
956
977
assert ! ( guest_mem. address_in_range( GuestAddress ( 0x200 ) ) ) ;
957
978
assert ! ( !guest_mem. address_in_range( GuestAddress ( 0x600 ) ) ) ;
@@ -977,7 +998,7 @@ mod tests {
977
998
] )
978
999
. unwrap ( ) ;
979
1000
980
- let guest_mem_list = vec ! [ guest_mem, guest_mem_backed_by_file] ;
1001
+ let guest_mem_list = [ guest_mem, guest_mem_backed_by_file] ;
981
1002
for guest_mem in guest_mem_list. iter ( ) {
982
1003
assert_eq ! (
983
1004
guest_mem. check_address( GuestAddress ( 0x200 ) ) ,
@@ -1009,7 +1030,7 @@ mod tests {
1009
1030
] )
1010
1031
. unwrap ( ) ;
1011
1032
1012
- let guest_mem_list = vec ! [ guest_mem, guest_mem_backed_by_file] ;
1033
+ let guest_mem_list = [ guest_mem, guest_mem_backed_by_file] ;
1013
1034
for guest_mem in guest_mem_list. iter ( ) {
1014
1035
assert ! ( guest_mem. to_region_addr( GuestAddress ( 0x600 ) ) . is_none( ) ) ;
1015
1036
let ( r0, addr0) = guest_mem. to_region_addr ( GuestAddress ( 0x800 ) ) . unwrap ( ) ;
@@ -1037,7 +1058,7 @@ mod tests {
1037
1058
] )
1038
1059
. unwrap ( ) ;
1039
1060
1040
- let guest_mem_list = vec ! [ guest_mem, guest_mem_backed_by_file] ;
1061
+ let guest_mem_list = [ guest_mem, guest_mem_backed_by_file] ;
1041
1062
for guest_mem in guest_mem_list. iter ( ) {
1042
1063
assert ! ( guest_mem. get_host_address( GuestAddress ( 0x600 ) ) . is_err( ) ) ;
1043
1064
let ptr0 = guest_mem. get_host_address ( GuestAddress ( 0x800 ) ) . unwrap ( ) ;
@@ -1046,6 +1067,13 @@ mod tests {
1046
1067
ptr0,
1047
1068
guest_mem. find_region( GuestAddress ( 0x800 ) ) . unwrap( ) . as_ptr( )
1048
1069
) ;
1070
+ assert_eq ! (
1071
+ ptr0,
1072
+ guest_mem
1073
+ . find_arc_region( GuestAddress ( 0x800 ) )
1074
+ . unwrap( )
1075
+ . as_ptr( )
1076
+ ) ;
1049
1077
assert_eq ! ( unsafe { ptr0. offset( 0x200 ) } , ptr1) ;
1050
1078
}
1051
1079
}
@@ -1064,7 +1092,7 @@ mod tests {
1064
1092
) ] )
1065
1093
. unwrap ( ) ;
1066
1094
1067
- let guest_mem_list = vec ! [ guest_mem, guest_mem_backed_by_file] ;
1095
+ let guest_mem_list = [ guest_mem, guest_mem_backed_by_file] ;
1068
1096
for guest_mem in guest_mem_list. iter ( ) {
1069
1097
let sample_buf = & [ 1 , 2 , 3 , 4 , 5 ] ;
1070
1098
@@ -1102,7 +1130,7 @@ mod tests {
1102
1130
] )
1103
1131
. unwrap ( ) ;
1104
1132
1105
- let gm_list = vec ! [ gm, gm_backed_by_file] ;
1133
+ let gm_list = [ gm, gm_backed_by_file] ;
1106
1134
for gm in gm_list. iter ( ) {
1107
1135
let val1: u64 = 0xaa55_aa55_aa55_aa55 ;
1108
1136
let val2: u64 = 0x55aa_55aa_55aa_55aa ;
@@ -1142,7 +1170,7 @@ mod tests {
1142
1170
) ] )
1143
1171
. unwrap ( ) ;
1144
1172
1145
- let gm_list = vec ! [ gm, gm_backed_by_file] ;
1173
+ let gm_list = [ gm, gm_backed_by_file] ;
1146
1174
for gm in gm_list. iter ( ) {
1147
1175
let sample_buf = & [ 1 , 2 , 3 , 4 , 5 ] ;
1148
1176
@@ -1173,7 +1201,7 @@ mod tests {
1173
1201
) ] )
1174
1202
. unwrap ( ) ;
1175
1203
1176
- let gm_list = vec ! [ gm, gm_backed_by_file] ;
1204
+ let gm_list = [ gm, gm_backed_by_file] ;
1177
1205
for gm in gm_list. iter ( ) {
1178
1206
let addr = GuestAddress ( 0x1010 ) ;
1179
1207
let mut file = if cfg ! ( unix) {
@@ -1257,6 +1285,11 @@ mod tests {
1257
1285
1258
1286
assert_eq ! ( gm. regions[ 0 ] . guest_base, regions[ 0 ] . 0 ) ;
1259
1287
assert_eq ! ( gm. regions[ 1 ] . guest_base, regions[ 1 ] . 0 ) ;
1288
+ GuestMemoryMmap :: from_ranges ( & regions)
1289
+ . unwrap ( )
1290
+ . into_iter ( )
1291
+ . zip ( iterated_regions)
1292
+ . all ( |( x, y) | x. guest_base == y. 0 ) ;
1260
1293
}
1261
1294
1262
1295
#[ test]
@@ -1276,7 +1309,7 @@ mod tests {
1276
1309
] )
1277
1310
. unwrap ( ) ;
1278
1311
1279
- let gm_list = vec ! [ gm, gm_backed_by_file] ;
1312
+ let gm_list = [ gm, gm_backed_by_file] ;
1280
1313
for gm in gm_list. iter ( ) {
1281
1314
let sample_buf = & [ 1 , 2 , 3 , 4 , 5 ] ;
1282
1315
assert_eq ! ( gm. write( sample_buf, GuestAddress ( 0xffc ) ) . unwrap( ) , 5 ) ;
0 commit comments