@@ -24,13 +24,12 @@ macro_rules! call {
2424 } } ;
2525}
2626
27- /// The type of system capabilities.
28- #[ repr( u32 ) ]
29- #[ non_exhaustive]
30- #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
31- pub enum Capability {
32- VCpuMax = sys:: HV_CAP_VCPUMAX ,
33- AddrSpaceMax = sys:: HV_CAP_ADDRSPACEMAX ,
27+ bitflags:: bitflags! {
28+ /// The type of system capabilities.
29+ pub struct Capability : u32 {
30+ const VCPU_MAX = sys:: HV_CAP_VCPUMAX ;
31+ const ADDR_SPAC_EMAX = sys:: HV_CAP_ADDRSPACEMAX ;
32+ }
3433}
3534
3635/// Type of a user virtual address.
@@ -44,25 +43,42 @@ pub type Space = sys::hv_vm_space_t;
4443
4544pub const VM_SPACE_DEFAULT : Space = sys:: HV_VM_SPACE_DEFAULT ;
4645
47- /// Guest physical memory region permissions.
48- #[ repr( u32 ) ]
49- #[ non_exhaustive]
50- #[ derive( Debug , Copy , Clone , Eq , PartialEq ) ]
51- pub enum Memory {
52- Read = sys:: HV_MEMORY_READ ,
53- Write = sys:: HV_MEMORY_WRITE ,
54- Exec = sys:: HV_MEMORY_EXEC ,
46+ bitflags:: bitflags! {
47+ /// Guest physical memory region permissions.
48+ pub struct Memory : u32 {
49+ const READ = sys:: HV_MEMORY_READ ;
50+ const WRITE = sys:: HV_MEMORY_WRITE ;
51+ const EXEC = sys:: HV_MEMORY_EXEC ;
52+ }
53+ }
54+
55+ bitflags:: bitflags! {
56+ pub struct VmOptions : u64 {
57+ const DEFAULT = sys:: HV_VM_DEFAULT as _;
58+ const SPECIFY_MITIGATIONS = sys:: HV_VM_SPECIFY_MITIGATIONS as _;
59+ const MITIGATION_A_ENABLE = sys:: HV_VM_MITIGATION_A_ENABLE as _;
60+ const MITIGATION_B_ENABLE = sys:: HV_VM_MITIGATION_B_ENABLE as _;
61+ const MITIGATION_C_ENABLE = sys:: HV_VM_MITIGATION_C_ENABLE as _;
62+ const MITIGATION_D_ENABLE = sys:: HV_VM_MITIGATION_D_ENABLE as _;
63+ const MITIGATION_E_ENABLE = sys:: HV_VM_MITIGATION_E_ENABLE as _;
64+ }
65+ }
66+
67+ impl Default for VmOptions {
68+ fn default ( ) -> Self {
69+ VmOptions :: DEFAULT
70+ }
5571}
5672
5773/// Creates a VM instance for the current process.
58- pub fn vm_create ( ) -> Result < ( ) , Error > {
59- call ! ( sys:: hv_vm_create( 0 ) )
74+ pub fn vm_create ( options : VmOptions ) -> Result < ( ) , Error > {
75+ call ! ( sys:: hv_vm_create( options . bits ) )
6076}
6177
6278/// Gets the value of capabilities of the system.
6379pub fn capability ( cap : Capability ) -> Result < u64 , Error > {
6480 let mut out = 0_u64 ;
65- call ! ( sys:: hv_capability( cap as sys :: hv_capability_t , & mut out) ) ?;
81+ call ! ( sys:: hv_capability( cap. bits as u64 , & mut out) ) ?;
6682 Ok ( out)
6783}
6884
@@ -92,12 +108,7 @@ pub fn vm_space_destroy(asid: Space) -> Result<(), Error> {
92108/// * `size` - Size in bytes of the region to be mapped.
93109/// * `flags` - READ, WRITE and EXECUTE permissions of the region
94110pub fn vm_map ( uva : UVAddr , gpa : GPAddr , size : u64 , flags : Memory ) -> Result < ( ) , Error > {
95- call ! ( sys:: hv_vm_map(
96- uva,
97- gpa,
98- size,
99- flags as sys:: hv_memory_flags_t
100- ) )
111+ call ! ( sys:: hv_vm_map( uva, gpa, size, flags. bits. into( ) ) )
101112}
102113
103114/// Unmaps a region in the guest physical address space of the VM
@@ -116,11 +127,7 @@ pub fn vm_unmap(gpa: GPAddr, size: u64) -> Result<(), Error> {
116127/// * `size` - Size in bytes of the region to be modified.
117128/// * `flags` - New READ, WRITE and EXECUTE permissions of the region.
118129pub fn vm_protect ( gpa : GPAddr , size : u64 , flags : Memory ) -> Result < ( ) , Error > {
119- call ! ( sys:: hv_vm_protect(
120- gpa,
121- size,
122- flags as sys:: hv_memory_flags_t
123- ) )
130+ call ! ( sys:: hv_vm_protect( gpa, size, flags. bits. into( ) ) )
124131}
125132
126133/// Maps a region in the virtual address space of the current task
@@ -145,7 +152,7 @@ pub fn vm_map_space(
145152 uva,
146153 gpa,
147154 size,
148- flags as sys :: hv_memory_flags_t
155+ flags. bits . into ( )
149156 ) )
150157}
151158
@@ -169,12 +176,7 @@ pub fn vm_unmap_space(asid: Space, gpa: GPAddr, size: u64) -> Result<(), Error>
169176/// * `flags` - New READ, WRITE and EXECUTE permissions of the region.
170177#[ cfg( feature = "hv_10_15" ) ]
171178pub fn vm_protect_space ( asid : Space , gpa : GPAddr , size : u64 , flags : Memory ) -> Result < ( ) , Error > {
172- call ! ( sys:: hv_vm_protect_space(
173- asid,
174- gpa,
175- size,
176- flags as sys:: hv_memory_flags_t
177- ) )
179+ call ! ( sys:: hv_vm_protect_space( asid, gpa, size, flags. bits. into( ) ) )
178180}
179181
180182/// Synchronizes guest TSC across all vCPUs.
0 commit comments