Skip to content

Commit 6b8de9c

Browse files
committed
Update memoy region mapping to support mshv3
Signed-off-by: Simon Davies <simongdavies@users.noreply.github.com>
1 parent 3da95b9 commit 6b8de9c

File tree

1 file changed

+56
-18
lines changed

1 file changed

+56
-18
lines changed

src/hyperlight_host/src/mem/memory_region.rs

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,31 @@ See the License for the specific language governing permissions and
1414
limitations 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+
1727
use std::ops::Range;
1828

1929
use bitflags::bitflags;
2030
#[cfg(mshv)]
2131
use hyperlight_common::mem::PAGE_SHIFT;
2232
use 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)]
2440
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,
2742
};
2843
#[cfg(target_os = "windows")]
2944
use 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

Comments
 (0)