@@ -14,16 +14,31 @@ See the License for the specific language governing permissions and
14
14
limitations under the License.
15
15
*/
16
16
17
+ #[ cfg( mshv2) ]
18
+ extern crate mshv_bindings2 as mshv_bindings;
19
+ #[ cfg( mshv2) ]
20
+ extern crate mshv_ioctls2 as mshv_ioctls;
21
+
22
+ #[ cfg( mshv3) ]
23
+ extern crate mshv_bindings3 as mshv_bindings;
24
+ #[ cfg( mshv3) ]
25
+ extern crate mshv_ioctls3 as mshv_ioctls;
26
+
17
27
use std:: ops:: Range ;
18
28
19
29
use bitflags:: bitflags;
20
30
#[ cfg( mshv) ]
21
31
use hyperlight_common:: mem:: PAGE_SHIFT ;
22
32
use hyperlight_common:: mem:: PAGE_SIZE_USIZE ;
23
33
#[ cfg( mshv) ]
34
+ use mshv_bindings:: { hv_x64_memory_intercept_message, mshv_user_mem_region} ;
35
+ #[ cfg( mshv2) ]
36
+ use mshv_bindings:: {
37
+ HV_MAP_GPA_EXECUTABLE , HV_MAP_GPA_PERMISSIONS_NONE , HV_MAP_GPA_READABLE , HV_MAP_GPA_WRITABLE ,
38
+ } ;
39
+ #[ cfg( mshv3) ]
24
40
use mshv_bindings:: {
25
- hv_x64_memory_intercept_message, mshv_user_mem_region, HV_MAP_GPA_EXECUTABLE ,
26
- HV_MAP_GPA_PERMISSIONS_NONE , HV_MAP_GPA_READABLE , HV_MAP_GPA_WRITABLE ,
41
+ MSHV_SET_MEM_BIT_EXECUTABLE , MSHV_SET_MEM_BIT_UNMAP , MSHV_SET_MEM_BIT_WRITABLE ,
27
42
} ;
28
43
#[ cfg( target_os = "windows" ) ]
29
44
use windows:: Win32 :: System :: Hypervisor :: { self , WHV_MEMORY_ACCESS_TYPE } ;
@@ -227,22 +242,45 @@ impl From<MemoryRegion> for mshv_user_mem_region {
227
242
let guest_pfn = region. guest_region . start as u64 >> PAGE_SHIFT ;
228
243
let userspace_addr = region. host_region . start as u64 ;
229
244
230
- let flags = region. flags . iter ( ) . fold ( 0 , |acc, flag| {
231
- let flag_value = match flag {
232
- MemoryRegionFlags :: NONE => HV_MAP_GPA_PERMISSIONS_NONE ,
233
- MemoryRegionFlags :: READ => HV_MAP_GPA_READABLE ,
234
- MemoryRegionFlags :: WRITE => HV_MAP_GPA_WRITABLE ,
235
- MemoryRegionFlags :: EXECUTE => HV_MAP_GPA_EXECUTABLE ,
236
- _ => 0 , // ignore any unknown flags
237
- } ;
238
- acc | flag_value
239
- } ) ;
240
-
241
- mshv_user_mem_region {
242
- guest_pfn,
243
- size,
244
- userspace_addr,
245
- flags,
245
+ #[ cfg( mshv2) ]
246
+ {
247
+ let flags = region. flags . iter ( ) . fold ( 0 , |acc, flag| {
248
+ let flag_value = match flag {
249
+ MemoryRegionFlags :: NONE => HV_MAP_GPA_PERMISSIONS_NONE ,
250
+ MemoryRegionFlags :: READ => HV_MAP_GPA_READABLE ,
251
+ MemoryRegionFlags :: WRITE => HV_MAP_GPA_WRITABLE ,
252
+ MemoryRegionFlags :: EXECUTE => HV_MAP_GPA_EXECUTABLE ,
253
+ _ => 0 , // ignore any unknown flags
254
+ } ;
255
+ acc | flag_value
256
+ } ) ;
257
+ mshv_user_mem_region {
258
+ guest_pfn,
259
+ size,
260
+ userspace_addr,
261
+ flags,
262
+ }
263
+ }
264
+ #[ cfg( mshv3) ]
265
+ {
266
+ let flags: u8 = region. flags . iter ( ) . fold ( 0 , |acc, flag| {
267
+ let flag_value = match flag {
268
+ MemoryRegionFlags :: NONE => 1 << MSHV_SET_MEM_BIT_UNMAP ,
269
+ MemoryRegionFlags :: READ => 0 ,
270
+ MemoryRegionFlags :: WRITE => 1 << MSHV_SET_MEM_BIT_WRITABLE ,
271
+ MemoryRegionFlags :: EXECUTE => 1 << MSHV_SET_MEM_BIT_EXECUTABLE ,
272
+ _ => 0 , // ignore any unknown flags
273
+ } ;
274
+ acc | flag_value
275
+ } ) ;
276
+
277
+ mshv_user_mem_region {
278
+ guest_pfn,
279
+ size,
280
+ userspace_addr,
281
+ flags,
282
+ ..Default :: default ( )
283
+ }
246
284
}
247
285
}
248
286
}
0 commit comments