@@ -14,16 +14,31 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
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+
1727use std:: ops:: Range ;
1828
1929use bitflags:: bitflags;
2030#[ cfg( mshv) ]
2131use hyperlight_common:: mem:: PAGE_SHIFT ;
2232use hyperlight_common:: mem:: PAGE_SIZE_USIZE ;
2333#[ 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) ]
2440use 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 ,
2742} ;
2843#[ cfg( target_os = "windows" ) ]
2944use windows:: Win32 :: System :: Hypervisor :: { self , WHV_MEMORY_ACCESS_TYPE } ;
@@ -227,22 +242,45 @@ impl From<MemoryRegion> for mshv_user_mem_region {
227242 let guest_pfn = region. guest_region . start as u64 >> PAGE_SHIFT ;
228243 let userspace_addr = region. host_region . start as u64 ;
229244
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+ }
246284 }
247285 }
248286}
0 commit comments