diff --git a/README.md b/README.md index 167c52b..21d205d 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,7 @@ `hypervisor` is a Rust library that taps into functionality that enables hardware-accelerated execution of virtual machines on OS X. -It binds to the [Hypervisor](https://developer.apple.com/library/mac/documentation/Hypervisor/Reference/Hypervisor_Reference/index.html#//apple_ref/doc/uid/TP40016756) framework on OS X, and exposes a safe Rust -interface through the `hypervisor` module, and an unsafe foreign function -interface through the `hypervisor::ffi` module. +It binds to the [Hypervisor](https://developer.apple.com/documentation/hypervisor) framework on OS X, and exposes a safe Rust interface through the `hypervisor` module, and an unsafe foreign function interface through the `hypervisor::ffi` module. [Documentation](https://saurvs.github.io/hypervisor-rs/) diff --git a/src/consts/irq.rs b/src/consts/irq.rs index 07e8346..533d743 100644 --- a/src/consts/irq.rs +++ b/src/consts/irq.rs @@ -22,13 +22,11 @@ THE SOFTWARE. //! Interrupt Request (IRQ) Codes -use libc::*; - -pub const IRQ_INFO_EXT_IRQ : uint32_t = 0 << 8; -pub const IRQ_INFO_NMI : uint32_t = 2 << 8; -pub const IRQ_INFO_HARD_EXC : uint32_t = 3 << 8; -pub const IRQ_INFO_SOFT_IRQ : uint32_t = 4 << 8; -pub const IRQ_INFO_PRIV_SOFT_EXC : uint32_t = 5 << 8; -pub const IRQ_INFO_SOFT_EXC : uint32_t = 6 << 8; -pub const IRQ_INFO_ERROR_VALID : uint32_t = 1 << 11; -pub const IRQ_INFO_VALID : uint32_t = 1 << 31; +pub const IRQ_INFO_EXT_IRQ : u32 = 0 << 8; +pub const IRQ_INFO_NMI : u32 = 2 << 8; +pub const IRQ_INFO_HARD_EXC : u32 = 3 << 8; +pub const IRQ_INFO_SOFT_IRQ : u32 = 4 << 8; +pub const IRQ_INFO_PRIV_SOFT_EXC : u32 = 5 << 8; +pub const IRQ_INFO_SOFT_EXC : u32 = 6 << 8; +pub const IRQ_INFO_ERROR_VALID : u32 = 1 << 11; +pub const IRQ_INFO_VALID : u32 = 1 << 31; diff --git a/src/consts/mod.rs b/src/consts/mod.rs index 7ca433d..7ab0673 100644 --- a/src/consts/mod.rs +++ b/src/consts/mod.rs @@ -27,6 +27,4 @@ pub mod vmx_cap; pub mod vmx_exit; pub mod irq; -use libc::*; - -pub const VMX_BASIC_TRUE_CTLS: uint64_t = 1 << 55; +pub const VMX_BASIC_TRUE_CTLS: u64= 1 << 55; diff --git a/src/consts/vmcs.rs b/src/consts/vmcs.rs index 72016ea..92a5998 100644 --- a/src/consts/vmcs.rs +++ b/src/consts/vmcs.rs @@ -22,156 +22,154 @@ THE SOFTWARE. //! Virtual Machine Control Structure (VMCS) field IDs -use libc::*; - -pub const VMCS_VPID : uint32_t = 0x00000000; -pub const VMCS_CTRL_POSTED_INT_N_VECTOR : uint32_t = 0x00000002; -pub const VMCS_CTRL_EPTP_INDEX : uint32_t = 0x00000004; -pub const VMCS_GUEST_ES : uint32_t = 0x00000800; -pub const VMCS_GUEST_CS : uint32_t = 0x00000802; -pub const VMCS_GUEST_SS : uint32_t = 0x00000804; -pub const VMCS_GUEST_DS : uint32_t = 0x00000806; -pub const VMCS_GUEST_FS : uint32_t = 0x00000808; -pub const VMCS_GUEST_GS : uint32_t = 0x0000080a; -pub const VMCS_GUEST_LDTR : uint32_t = 0x0000080c; -pub const VMCS_GUEST_TR : uint32_t = 0x0000080e; -pub const VMCS_GUEST_INT_STATUS : uint32_t = 0x00000810; -pub const VMCS_HOST_ES : uint32_t = 0x00000c00; -pub const VMCS_HOST_CS : uint32_t = 0x00000c02; -pub const VMCS_HOST_SS : uint32_t = 0x00000c04; -pub const VMCS_HOST_DS : uint32_t = 0x00000c06; -pub const VMCS_HOST_FS : uint32_t = 0x00000c08; -pub const VMCS_HOST_GS : uint32_t = 0x00000c0a; -pub const VMCS_HOST_TR : uint32_t = 0x00000c0c; -pub const VMCS_CTRL_IO_BITMAP_A : uint32_t = 0x00002000; -pub const VMCS_CTRL_IO_BITMAP_B : uint32_t = 0x00002002; -pub const VMCS_CTRL_MSR_BITMAPS : uint32_t = 0x00002004; -pub const VMCS_CTRL_VMEXIT_MSR_STORE_ADDR : uint32_t = 0x00002006; -pub const VMCS_CTRL_VMEXIT_MSR_LOAD_ADDR : uint32_t = 0x00002008; -pub const VMCS_CTRL_VMENTRY_MSR_LOAD_ADDR : uint32_t = 0x0000200a; -pub const VMCS_CTRL_EXECUTIVE_VMCS_PTR : uint32_t = 0x0000200c; -pub const VMCS_CTRL_TSC_OFFSET : uint32_t = 0x00002010; -pub const VMCS_CTRL_VIRTUAL_APIC : uint32_t = 0x00002012; -pub const VMCS_CTRL_APIC_ACCESS : uint32_t = 0x00002014; -pub const VMCS_CTRL_POSTED_INT_DESC_ADDR : uint32_t = 0x00002016; -pub const VMCS_CTRL_VMFUNC_CTRL : uint32_t = 0x00002018; -pub const VMCS_CTRL_EPTP : uint32_t = 0x0000201a; -pub const VMCS_CTRL_EOI_EXIT_BITMAP_0 : uint32_t = 0x0000201c; -pub const VMCS_CTRL_EOI_EXIT_BITMAP_1 : uint32_t = 0x0000201e; -pub const VMCS_CTRL_EOI_EXIT_BITMAP_2 : uint32_t = 0x00002020; -pub const VMCS_CTRL_EOI_EXIT_BITMAP_3 : uint32_t = 0x00002022; -pub const VMCS_CTRL_EPTP_LIST_ADDR : uint32_t = 0x00002024; -pub const VMCS_CTRL_VMREAD_BITMAP_ADDR : uint32_t = 0x00002026; -pub const VMCS_CTRL_VMWRITE_BITMAP_ADDR : uint32_t = 0x00002028; -pub const VMCS_CTRL_VIRT_EXC_INFO_ADDR : uint32_t = 0x0000202a; -pub const VMCS_CTRL_XSS_EXITING_BITMAP : uint32_t = 0x0000202c; -pub const VMCS_GUEST_PHYSICAL_ADDRESS : uint32_t = 0x00002400; -pub const VMCS_GUEST_LINK_POINTER : uint32_t = 0x00002800; -pub const VMCS_GUEST_IA32_DEBUGCTL : uint32_t = 0x00002802; -pub const VMCS_GUEST_IA32_PAT : uint32_t = 0x00002804; -pub const VMCS_GUEST_IA32_EFER : uint32_t = 0x00002806; -pub const VMCS_GUEST_IA32_PERF_GLOBAL_CTRL : uint32_t = 0x00002808; -pub const VMCS_GUEST_PDPTE0 : uint32_t = 0x0000280a; -pub const VMCS_GUEST_PDPTE1 : uint32_t = 0x0000280c; -pub const VMCS_GUEST_PDPTE2 : uint32_t = 0x0000280e; -pub const VMCS_GUEST_PDPTE3 : uint32_t = 0x00002810; -pub const VMCS_HOST_IA32_PAT : uint32_t = 0x00002c00; -pub const VMCS_HOST_IA32_EFER : uint32_t = 0x00002c02; -pub const VMCS_HOST_IA32_PERF_GLOBAL_CTRL : uint32_t = 0x00002c04; -pub const VMCS_CTRL_PIN_BASED : uint32_t = 0x00004000; -pub const VMCS_CTRL_CPU_BASED : uint32_t = 0x00004002; -pub const VMCS_CTRL_EXC_BITMAP : uint32_t = 0x00004004; -pub const VMCS_CTRL_PF_ERROR_MASK : uint32_t = 0x00004006; -pub const VMCS_CTRL_PF_ERROR_MATCH : uint32_t = 0x00004008; -pub const VMCS_CTRL_CR3_COUNT : uint32_t = 0x0000400a; -pub const VMCS_CTRL_VMEXIT_CONTROLS : uint32_t = 0x0000400c; -pub const VMCS_CTRL_VMEXIT_MSR_STORE_COUNT : uint32_t = 0x0000400e; -pub const VMCS_CTRL_VMEXIT_MSR_LOAD_COUNT : uint32_t = 0x00004010; -pub const VMCS_CTRL_VMENTRY_CONTROLS : uint32_t = 0x00004012; -pub const VMCS_CTRL_VMENTRY_MSR_LOAD_COUNT : uint32_t = 0x00004014; -pub const VMCS_CTRL_VMENTRY_IRQ_INFO : uint32_t = 0x00004016; -pub const VMCS_CTRL_VMENTRY_EXC_ERROR : uint32_t = 0x00004018; -pub const VMCS_CTRL_VMENTRY_INSTR_LEN : uint32_t = 0x0000401a; -pub const VMCS_CTRL_TPR_THRESHOLD : uint32_t = 0x0000401c; -pub const VMCS_CTRL_CPU_BASED2 : uint32_t = 0x0000401e; -pub const VMCS_CTRL_PLE_GAP : uint32_t = 0x00004020; -pub const VMCS_CTRL_PLE_WINDOW : uint32_t = 0x00004022; -pub const VMCS_RO_INSTR_ERROR : uint32_t = 0x00004400; -pub const VMCS_RO_EXIT_REASON : uint32_t = 0x00004402; -pub const VMCS_RO_VMEXIT_IRQ_INFO : uint32_t = 0x00004404; -pub const VMCS_RO_VMEXIT_IRQ_ERROR : uint32_t = 0x00004406; -pub const VMCS_RO_IDT_VECTOR_INFO : uint32_t = 0x00004408; -pub const VMCS_RO_IDT_VECTOR_ERROR : uint32_t = 0x0000440a; -pub const VMCS_RO_VMEXIT_INSTR_LEN : uint32_t = 0x0000440c; -pub const VMCS_RO_VMX_INSTR_INFO : uint32_t = 0x0000440e; -pub const VMCS_GUEST_ES_LIMIT : uint32_t = 0x00004800; -pub const VMCS_GUEST_CS_LIMIT : uint32_t = 0x00004802; -pub const VMCS_GUEST_SS_LIMIT : uint32_t = 0x00004804; -pub const VMCS_GUEST_DS_LIMIT : uint32_t = 0x00004806; -pub const VMCS_GUEST_FS_LIMIT : uint32_t = 0x00004808; -pub const VMCS_GUEST_GS_LIMIT : uint32_t = 0x0000480a; -pub const VMCS_GUEST_LDTR_LIMIT : uint32_t = 0x0000480c; -pub const VMCS_GUEST_TR_LIMIT : uint32_t = 0x0000480e; -pub const VMCS_GUEST_GDTR_LIMIT : uint32_t = 0x00004810; -pub const VMCS_GUEST_IDTR_LIMIT : uint32_t = 0x00004812; -pub const VMCS_GUEST_ES_AR : uint32_t = 0x00004814; -pub const VMCS_GUEST_CS_AR : uint32_t = 0x00004816; -pub const VMCS_GUEST_SS_AR : uint32_t = 0x00004818; -pub const VMCS_GUEST_DS_AR : uint32_t = 0x0000481a; -pub const VMCS_GUEST_FS_AR : uint32_t = 0x0000481c; -pub const VMCS_GUEST_GS_AR : uint32_t = 0x0000481e; -pub const VMCS_GUEST_LDTR_AR : uint32_t = 0x00004820; -pub const VMCS_GUEST_TR_AR : uint32_t = 0x00004822; -pub const VMCS_GUEST_IGNORE_IRQ : uint32_t = 0x00004824; -pub const VMCS_GUEST_ACTIVITY_STATE : uint32_t = 0x00004826; -pub const VMCS_GUEST_SMBASE : uint32_t = 0x00004828; -pub const VMCS_GUEST_IA32_SYSENTER_CS : uint32_t = 0x0000482a; -pub const VMCS_GUEST_VMX_TIMER_VALUE : uint32_t = 0x0000482e; -pub const VMCS_HOST_IA32_SYSENTER_CS : uint32_t = 0x00004c00; -pub const VMCS_CTRL_CR0_MASK : uint32_t = 0x00006000; -pub const VMCS_CTRL_CR4_MASK : uint32_t = 0x00006002; -pub const VMCS_CTRL_CR0_SHADOW : uint32_t = 0x00006004; -pub const VMCS_CTRL_CR4_SHADOW : uint32_t = 0x00006006; -pub const VMCS_CTRL_CR3_VALUE0 : uint32_t = 0x00006008; -pub const VMCS_CTRL_CR3_VALUE1 : uint32_t = 0x0000600a; -pub const VMCS_CTRL_CR3_VALUE2 : uint32_t = 0x0000600c; -pub const VMCS_CTRL_CR3_VALUE3 : uint32_t = 0x0000600e; -pub const VMCS_RO_EXIT_QUALIFIC : uint32_t = 0x00006400; -pub const VMCS_RO_IO_RCX : uint32_t = 0x00006402; -pub const VMCS_RO_IO_RSI : uint32_t = 0x00006404; -pub const VMCS_RO_IO_RDI : uint32_t = 0x00006406; -pub const VMCS_RO_IO_RIP : uint32_t = 0x00006408; -pub const VMCS_RO_GUEST_LIN_ADDR : uint32_t = 0x0000640a; -pub const VMCS_GUEST_CR0 : uint32_t = 0x00006800; -pub const VMCS_GUEST_CR3 : uint32_t = 0x00006802; -pub const VMCS_GUEST_CR4 : uint32_t = 0x00006804; -pub const VMCS_GUEST_ES_BASE : uint32_t = 0x00006806; -pub const VMCS_GUEST_CS_BASE : uint32_t = 0x00006808; -pub const VMCS_GUEST_SS_BASE : uint32_t = 0x0000680a; -pub const VMCS_GUEST_DS_BASE : uint32_t = 0x0000680c; -pub const VMCS_GUEST_FS_BASE : uint32_t = 0x0000680e; -pub const VMCS_GUEST_GS_BASE : uint32_t = 0x00006810; -pub const VMCS_GUEST_LDTR_BASE : uint32_t = 0x00006812; -pub const VMCS_GUEST_TR_BASE : uint32_t = 0x00006814; -pub const VMCS_GUEST_GDTR_BASE : uint32_t = 0x00006816; -pub const VMCS_GUEST_IDTR_BASE : uint32_t = 0x00006818; -pub const VMCS_GUEST_DR7 : uint32_t = 0x0000681a; -pub const VMCS_GUEST_RSP : uint32_t = 0x0000681c; -pub const VMCS_GUEST_RIP : uint32_t = 0x0000681e; -pub const VMCS_GUEST_RFLAGS : uint32_t = 0x00006820; -pub const VMCS_GUEST_DEBUG_EXC : uint32_t = 0x00006822; -pub const VMCS_GUEST_SYSENTER_ESP : uint32_t = 0x00006824; -pub const VMCS_GUEST_SYSENTER_EIP : uint32_t = 0x00006826; -pub const VMCS_HOST_CR0 : uint32_t = 0x00006c00; -pub const VMCS_HOST_CR3 : uint32_t = 0x00006c02; -pub const VMCS_HOST_CR4 : uint32_t = 0x00006c04; -pub const VMCS_HOST_FS_BASE : uint32_t = 0x00006c06; -pub const VMCS_HOST_GS_BASE : uint32_t = 0x00006c08; -pub const VMCS_HOST_TR_BASE : uint32_t = 0x00006c0a; -pub const VMCS_HOST_GDTR_BASE : uint32_t = 0x00006c0c; -pub const VMCS_HOST_IDTR_BASE : uint32_t = 0x00006c0e; -pub const VMCS_HOST_IA32_SYSENTER_ESP : uint32_t = 0x00006c10; -pub const VMCS_HOST_IA32_SYSENTER_EIP : uint32_t = 0x00006c12; -pub const VMCS_HOST_RSP : uint32_t = 0x00006c14; -pub const VMCS_HOST_RIP : uint32_t = 0x00006c16; -pub const VMCS_MAX : uint32_t = 0x00006c18; +pub const VMCS_VPID : u32 = 0x00000000; +pub const VMCS_CTRL_POSTED_INT_N_VECTOR : u32 = 0x00000002; +pub const VMCS_CTRL_EPTP_INDEX : u32 = 0x00000004; +pub const VMCS_GUEST_ES : u32 = 0x00000800; +pub const VMCS_GUEST_CS : u32 = 0x00000802; +pub const VMCS_GUEST_SS : u32 = 0x00000804; +pub const VMCS_GUEST_DS : u32 = 0x00000806; +pub const VMCS_GUEST_FS : u32 = 0x00000808; +pub const VMCS_GUEST_GS : u32 = 0x0000080a; +pub const VMCS_GUEST_LDTR : u32 = 0x0000080c; +pub const VMCS_GUEST_TR : u32 = 0x0000080e; +pub const VMCS_GUEST_INT_STATUS : u32 = 0x00000810; +pub const VMCS_HOST_ES : u32 = 0x00000c00; +pub const VMCS_HOST_CS : u32 = 0x00000c02; +pub const VMCS_HOST_SS : u32 = 0x00000c04; +pub const VMCS_HOST_DS : u32 = 0x00000c06; +pub const VMCS_HOST_FS : u32 = 0x00000c08; +pub const VMCS_HOST_GS : u32 = 0x00000c0a; +pub const VMCS_HOST_TR : u32 = 0x00000c0c; +pub const VMCS_CTRL_IO_BITMAP_A : u32 = 0x00002000; +pub const VMCS_CTRL_IO_BITMAP_B : u32 = 0x00002002; +pub const VMCS_CTRL_MSR_BITMAPS : u32 = 0x00002004; +pub const VMCS_CTRL_VMEXIT_MSR_STORE_ADDR : u32 = 0x00002006; +pub const VMCS_CTRL_VMEXIT_MSR_LOAD_ADDR : u32 = 0x00002008; +pub const VMCS_CTRL_VMENTRY_MSR_LOAD_ADDR : u32 = 0x0000200a; +pub const VMCS_CTRL_EXECUTIVE_VMCS_PTR : u32 = 0x0000200c; +pub const VMCS_CTRL_TSC_OFFSET : u32 = 0x00002010; +pub const VMCS_CTRL_VIRTUAL_APIC : u32 = 0x00002012; +pub const VMCS_CTRL_APIC_ACCESS : u32 = 0x00002014; +pub const VMCS_CTRL_POSTED_INT_DESC_ADDR : u32 = 0x00002016; +pub const VMCS_CTRL_VMFUNC_CTRL : u32 = 0x00002018; +pub const VMCS_CTRL_EPTP : u32 = 0x0000201a; +pub const VMCS_CTRL_EOI_EXIT_BITMAP_0 : u32 = 0x0000201c; +pub const VMCS_CTRL_EOI_EXIT_BITMAP_1 : u32 = 0x0000201e; +pub const VMCS_CTRL_EOI_EXIT_BITMAP_2 : u32 = 0x00002020; +pub const VMCS_CTRL_EOI_EXIT_BITMAP_3 : u32 = 0x00002022; +pub const VMCS_CTRL_EPTP_LIST_ADDR : u32 = 0x00002024; +pub const VMCS_CTRL_VMREAD_BITMAP_ADDR : u32 = 0x00002026; +pub const VMCS_CTRL_VMWRITE_BITMAP_ADDR : u32 = 0x00002028; +pub const VMCS_CTRL_VIRT_EXC_INFO_ADDR : u32 = 0x0000202a; +pub const VMCS_CTRL_XSS_EXITING_BITMAP : u32 = 0x0000202c; +pub const VMCS_GUEST_PHYSICAL_ADDRESS : u32 = 0x00002400; +pub const VMCS_GUEST_LINK_POINTER : u32 = 0x00002800; +pub const VMCS_GUEST_IA32_DEBUGCTL : u32 = 0x00002802; +pub const VMCS_GUEST_IA32_PAT : u32 = 0x00002804; +pub const VMCS_GUEST_IA32_EFER : u32 = 0x00002806; +pub const VMCS_GUEST_IA32_PERF_GLOBAL_CTRL : u32 = 0x00002808; +pub const VMCS_GUEST_PDPTE0 : u32 = 0x0000280a; +pub const VMCS_GUEST_PDPTE1 : u32 = 0x0000280c; +pub const VMCS_GUEST_PDPTE2 : u32 = 0x0000280e; +pub const VMCS_GUEST_PDPTE3 : u32 = 0x00002810; +pub const VMCS_HOST_IA32_PAT : u32 = 0x00002c00; +pub const VMCS_HOST_IA32_EFER : u32 = 0x00002c02; +pub const VMCS_HOST_IA32_PERF_GLOBAL_CTRL : u32 = 0x00002c04; +pub const VMCS_CTRL_PIN_BASED : u32 = 0x00004000; +pub const VMCS_CTRL_CPU_BASED : u32 = 0x00004002; +pub const VMCS_CTRL_EXC_BITMAP : u32 = 0x00004004; +pub const VMCS_CTRL_PF_ERROR_MASK : u32 = 0x00004006; +pub const VMCS_CTRL_PF_ERROR_MATCH : u32 = 0x00004008; +pub const VMCS_CTRL_CR3_COUNT : u32 = 0x0000400a; +pub const VMCS_CTRL_VMEXIT_CONTROLS : u32 = 0x0000400c; +pub const VMCS_CTRL_VMEXIT_MSR_STORE_COUNT : u32 = 0x0000400e; +pub const VMCS_CTRL_VMEXIT_MSR_LOAD_COUNT : u32 = 0x00004010; +pub const VMCS_CTRL_VMENTRY_CONTROLS : u32 = 0x00004012; +pub const VMCS_CTRL_VMENTRY_MSR_LOAD_COUNT : u32 = 0x00004014; +pub const VMCS_CTRL_VMENTRY_IRQ_INFO : u32 = 0x00004016; +pub const VMCS_CTRL_VMENTRY_EXC_ERROR : u32 = 0x00004018; +pub const VMCS_CTRL_VMENTRY_INSTR_LEN : u32 = 0x0000401a; +pub const VMCS_CTRL_TPR_THRESHOLD : u32 = 0x0000401c; +pub const VMCS_CTRL_CPU_BASED2 : u32 = 0x0000401e; +pub const VMCS_CTRL_PLE_GAP : u32 = 0x00004020; +pub const VMCS_CTRL_PLE_WINDOW : u32 = 0x00004022; +pub const VMCS_RO_INSTR_ERROR : u32 = 0x00004400; +pub const VMCS_RO_EXIT_REASON : u32 = 0x00004402; +pub const VMCS_RO_VMEXIT_IRQ_INFO : u32 = 0x00004404; +pub const VMCS_RO_VMEXIT_IRQ_ERROR : u32 = 0x00004406; +pub const VMCS_RO_IDT_VECTOR_INFO : u32 = 0x00004408; +pub const VMCS_RO_IDT_VECTOR_ERROR : u32 = 0x0000440a; +pub const VMCS_RO_VMEXIT_INSTR_LEN : u32 = 0x0000440c; +pub const VMCS_RO_VMX_INSTR_INFO : u32 = 0x0000440e; +pub const VMCS_GUEST_ES_LIMIT : u32 = 0x00004800; +pub const VMCS_GUEST_CS_LIMIT : u32 = 0x00004802; +pub const VMCS_GUEST_SS_LIMIT : u32 = 0x00004804; +pub const VMCS_GUEST_DS_LIMIT : u32 = 0x00004806; +pub const VMCS_GUEST_FS_LIMIT : u32 = 0x00004808; +pub const VMCS_GUEST_GS_LIMIT : u32 = 0x0000480a; +pub const VMCS_GUEST_LDTR_LIMIT : u32 = 0x0000480c; +pub const VMCS_GUEST_TR_LIMIT : u32 = 0x0000480e; +pub const VMCS_GUEST_GDTR_LIMIT : u32 = 0x00004810; +pub const VMCS_GUEST_IDTR_LIMIT : u32 = 0x00004812; +pub const VMCS_GUEST_ES_AR : u32 = 0x00004814; +pub const VMCS_GUEST_CS_AR : u32 = 0x00004816; +pub const VMCS_GUEST_SS_AR : u32 = 0x00004818; +pub const VMCS_GUEST_DS_AR : u32 = 0x0000481a; +pub const VMCS_GUEST_FS_AR : u32 = 0x0000481c; +pub const VMCS_GUEST_GS_AR : u32 = 0x0000481e; +pub const VMCS_GUEST_LDTR_AR : u32 = 0x00004820; +pub const VMCS_GUEST_TR_AR : u32 = 0x00004822; +pub const VMCS_GUEST_IGNORE_IRQ : u32 = 0x00004824; +pub const VMCS_GUEST_ACTIVITY_STATE : u32 = 0x00004826; +pub const VMCS_GUEST_SMBASE : u32 = 0x00004828; +pub const VMCS_GUEST_IA32_SYSENTER_CS : u32 = 0x0000482a; +pub const VMCS_GUEST_VMX_TIMER_VALUE : u32 = 0x0000482e; +pub const VMCS_HOST_IA32_SYSENTER_CS : u32 = 0x00004c00; +pub const VMCS_CTRL_CR0_MASK : u32 = 0x00006000; +pub const VMCS_CTRL_CR4_MASK : u32 = 0x00006002; +pub const VMCS_CTRL_CR0_SHADOW : u32 = 0x00006004; +pub const VMCS_CTRL_CR4_SHADOW : u32 = 0x00006006; +pub const VMCS_CTRL_CR3_VALUE0 : u32 = 0x00006008; +pub const VMCS_CTRL_CR3_VALUE1 : u32 = 0x0000600a; +pub const VMCS_CTRL_CR3_VALUE2 : u32 = 0x0000600c; +pub const VMCS_CTRL_CR3_VALUE3 : u32 = 0x0000600e; +pub const VMCS_RO_EXIT_QUALIFIC : u32 = 0x00006400; +pub const VMCS_RO_IO_RCX : u32 = 0x00006402; +pub const VMCS_RO_IO_RSI : u32 = 0x00006404; +pub const VMCS_RO_IO_RDI : u32 = 0x00006406; +pub const VMCS_RO_IO_RIP : u32 = 0x00006408; +pub const VMCS_RO_GUEST_LIN_ADDR : u32 = 0x0000640a; +pub const VMCS_GUEST_CR0 : u32 = 0x00006800; +pub const VMCS_GUEST_CR3 : u32 = 0x00006802; +pub const VMCS_GUEST_CR4 : u32 = 0x00006804; +pub const VMCS_GUEST_ES_BASE : u32 = 0x00006806; +pub const VMCS_GUEST_CS_BASE : u32 = 0x00006808; +pub const VMCS_GUEST_SS_BASE : u32 = 0x0000680a; +pub const VMCS_GUEST_DS_BASE : u32 = 0x0000680c; +pub const VMCS_GUEST_FS_BASE : u32 = 0x0000680e; +pub const VMCS_GUEST_GS_BASE : u32 = 0x00006810; +pub const VMCS_GUEST_LDTR_BASE : u32 = 0x00006812; +pub const VMCS_GUEST_TR_BASE : u32 = 0x00006814; +pub const VMCS_GUEST_GDTR_BASE : u32 = 0x00006816; +pub const VMCS_GUEST_IDTR_BASE : u32 = 0x00006818; +pub const VMCS_GUEST_DR7 : u32 = 0x0000681a; +pub const VMCS_GUEST_RSP : u32 = 0x0000681c; +pub const VMCS_GUEST_RIP : u32 = 0x0000681e; +pub const VMCS_GUEST_RFLAGS : u32 = 0x00006820; +pub const VMCS_GUEST_DEBUG_EXC : u32 = 0x00006822; +pub const VMCS_GUEST_SYSENTER_ESP : u32 = 0x00006824; +pub const VMCS_GUEST_SYSENTER_EIP : u32 = 0x00006826; +pub const VMCS_HOST_CR0 : u32 = 0x00006c00; +pub const VMCS_HOST_CR3 : u32 = 0x00006c02; +pub const VMCS_HOST_CR4 : u32 = 0x00006c04; +pub const VMCS_HOST_FS_BASE : u32 = 0x00006c06; +pub const VMCS_HOST_GS_BASE : u32 = 0x00006c08; +pub const VMCS_HOST_TR_BASE : u32 = 0x00006c0a; +pub const VMCS_HOST_GDTR_BASE : u32 = 0x00006c0c; +pub const VMCS_HOST_IDTR_BASE : u32 = 0x00006c0e; +pub const VMCS_HOST_IA32_SYSENTER_ESP : u32 = 0x00006c10; +pub const VMCS_HOST_IA32_SYSENTER_EIP : u32 = 0x00006c12; +pub const VMCS_HOST_RSP : u32 = 0x00006c14; +pub const VMCS_HOST_RIP : u32 = 0x00006c16; +pub const VMCS_MAX : u32 = 0x00006c18; diff --git a/src/consts/vmx_cap.rs b/src/consts/vmx_cap.rs index c3b10c0..cbeb931 100644 --- a/src/consts/vmx_cap.rs +++ b/src/consts/vmx_cap.rs @@ -22,72 +22,70 @@ THE SOFTWARE. //! VMX capability field values -use libc::*; +pub const PIN_BASED_INTR : u64 = 1 << 0; +pub const PIN_BASED_NMI : u64 = 1 << 3; +pub const PIN_BASED_VIRTUAL_NMI : u64 = 1 << 5; +pub const PIN_BASED_PREEMPTION_TIMER : u64 = 1 << 6; +pub const PIN_BASED_POSTED_INTR : u64 = 1 << 7; -pub const PIN_BASED_INTR : uint64_t = 1 << 0; -pub const PIN_BASED_NMI : uint64_t = 1 << 3; -pub const PIN_BASED_VIRTUAL_NMI : uint64_t = 1 << 5; -pub const PIN_BASED_PREEMPTION_TIMER : uint64_t = 1 << 6; -pub const PIN_BASED_POSTED_INTR : uint64_t = 1 << 7; +pub const CPU_BASED_IRQ_WND : u64 = 1 << 2; +pub const CPU_BASED_TSC_OFFSET : u64 = 1 << 3; +pub const CPU_BASED_HLT : u64 = 1 << 7; +pub const CPU_BASED_INVLPG : u64 = 1 << 9; +pub const CPU_BASED_MWAIT : u64 = 1 << 10; +pub const CPU_BASED_RDPMC : u64 = 1 << 11; +pub const CPU_BASED_RDTSC : u64 = 1 << 12; +pub const CPU_BASED_CR3_LOAD : u64 = 1 << 15; +pub const CPU_BASED_CR3_STORE : u64 = 1 << 16; +pub const CPU_BASED_CR8_LOAD : u64 = 1 << 19; +pub const CPU_BASED_CR8_STORE : u64 = 1 << 20; +pub const CPU_BASED_TPR_SHADOW : u64 = 1 << 21; +pub const CPU_BASED_VIRTUAL_NMI_WND : u64 = 1 << 22; +pub const CPU_BASED_MOV_DR : u64 = 1 << 23; +pub const CPU_BASED_UNCOND_IO : u64 = 1 << 24; +pub const CPU_BASED_IO_BITMAPS : u64 = 1 << 25; +pub const CPU_BASED_MTF : u64 = 1 << 27; +pub const CPU_BASED_MSR_BITMAPS : u64 = 1 << 28; +pub const CPU_BASED_MONITOR : u64 = 1 << 29; +pub const CPU_BASED_PAUSE : u64 = 1 << 30; +pub const CPU_BASED_SECONDARY_CTLS : u64 = 1 << 31; -pub const CPU_BASED_IRQ_WND : uint64_t = 1 << 2; -pub const CPU_BASED_TSC_OFFSET : uint64_t = 1 << 3; -pub const CPU_BASED_HLT : uint64_t = 1 << 7; -pub const CPU_BASED_INVLPG : uint64_t = 1 << 9; -pub const CPU_BASED_MWAIT : uint64_t = 1 << 10; -pub const CPU_BASED_RDPMC : uint64_t = 1 << 11; -pub const CPU_BASED_RDTSC : uint64_t = 1 << 12; -pub const CPU_BASED_CR3_LOAD : uint64_t = 1 << 15; -pub const CPU_BASED_CR3_STORE : uint64_t = 1 << 16; -pub const CPU_BASED_CR8_LOAD : uint64_t = 1 << 19; -pub const CPU_BASED_CR8_STORE : uint64_t = 1 << 20; -pub const CPU_BASED_TPR_SHADOW : uint64_t = 1 << 21; -pub const CPU_BASED_VIRTUAL_NMI_WND : uint64_t = 1 << 22; -pub const CPU_BASED_MOV_DR : uint64_t = 1 << 23; -pub const CPU_BASED_UNCOND_IO : uint64_t = 1 << 24; -pub const CPU_BASED_IO_BITMAPS : uint64_t = 1 << 25; -pub const CPU_BASED_MTF : uint64_t = 1 << 27; -pub const CPU_BASED_MSR_BITMAPS : uint64_t = 1 << 28; -pub const CPU_BASED_MONITOR : uint64_t = 1 << 29; -pub const CPU_BASED_PAUSE : uint64_t = 1 << 30; -pub const CPU_BASED_SECONDARY_CTLS : uint64_t = 1 << 31; +pub const CPU_BASED2_VIRTUAL_APIC : u64 = 1 << 0; +pub const CPU_BASED2_EPT : u64 = 1 << 1; +pub const CPU_BASED2_DESC_TABLE : u64 = 1 << 2; +pub const CPU_BASED2_RDTSCP : u64 = 1 << 3; +pub const CPU_BASED2_X2APIC : u64 = 1 << 4; +pub const CPU_BASED2_VPID : u64 = 1 << 5; +pub const CPU_BASED2_WBINVD : u64 = 1 << 6; +pub const CPU_BASED2_UNRESTRICTED : u64 = 1 << 7; +pub const CPU_BASED2_APIC_REG_VIRT : u64 = 1 << 8; +pub const CPU_BASED2_VIRT_INTR_DELIVERY : u64 = 1 << 9; +pub const CPU_BASED2_PAUSE_LOOP : u64 = 1 << 10; +pub const CPU_BASED2_RDRAND : u64 = 1 << 11; +pub const CPU_BASED2_INVPCID : u64 = 1 << 12; +pub const CPU_BASED2_VMFUNC : u64 = 1 << 13; +pub const CPU_BASED2_VMCS_SHADOW : u64 = 1 << 14; +pub const CPU_BASED2_RDSEED : u64 = 1 << 16; +pub const CPU_BASED2_EPT_VE : u64 = 1 << 18; +pub const CPU_BASED2_XSAVES_XRSTORS : u64 = 1 << 20; -pub const CPU_BASED2_VIRTUAL_APIC : uint64_t = 1 << 0; -pub const CPU_BASED2_EPT : uint64_t = 1 << 1; -pub const CPU_BASED2_DESC_TABLE : uint64_t = 1 << 2; -pub const CPU_BASED2_RDTSCP : uint64_t = 1 << 3; -pub const CPU_BASED2_X2APIC : uint64_t = 1 << 4; -pub const CPU_BASED2_VPID : uint64_t = 1 << 5; -pub const CPU_BASED2_WBINVD : uint64_t = 1 << 6; -pub const CPU_BASED2_UNRESTRICTED : uint64_t = 1 << 7; -pub const CPU_BASED2_APIC_REG_VIRT : uint64_t = 1 << 8; -pub const CPU_BASED2_VIRT_INTR_DELIVERY : uint64_t = 1 << 9; -pub const CPU_BASED2_PAUSE_LOOP : uint64_t = 1 << 10; -pub const CPU_BASED2_RDRAND : uint64_t = 1 << 11; -pub const CPU_BASED2_INVPCID : uint64_t = 1 << 12; -pub const CPU_BASED2_VMFUNC : uint64_t = 1 << 13; -pub const CPU_BASED2_VMCS_SHADOW : uint64_t = 1 << 14; -pub const CPU_BASED2_RDSEED : uint64_t = 1 << 16; -pub const CPU_BASED2_EPT_VE : uint64_t = 1 << 18; -pub const CPU_BASED2_XSAVES_XRSTORS : uint64_t = 1 << 20; +pub const VMX_EPT_VPID_SUPPORT_AD : u64 = 1 << 21; +pub const VMX_EPT_VPID_SUPPORT_EXONLY : u64 = 1 << 0; -pub const VMX_EPT_VPID_SUPPORT_AD : uint64_t = 1 << 21; -pub const VMX_EPT_VPID_SUPPORT_EXONLY : uint64_t = 1 << 0; +pub const VMEXIT_SAVE_DBG_CONTROLS : u64 = 1 << 2; +pub const VMEXIT_HOST_IA32E : u64 = 1 << 9; +pub const VMEXIT_LOAD_IA32_PERF_GLOBAL_CTRL : u64 = 1 << 12; +pub const VMEXIT_ACK_INTR : u64 = 1 << 15; +pub const VMEXIT_SAVE_IA32_PAT : u64 = 1 << 18; +pub const VMEXIT_LOAD_IA32_PAT : u64 = 1 << 19; +pub const VMEXIT_SAVE_EFER : u64 = 1 << 20; +pub const VMEXIT_LOAD_EFER : u64 = 1 << 21; +pub const VMEXIT_SAVE_VMX_TIMER : u64 = 1 << 22; -pub const VMEXIT_SAVE_DBG_CONTROLS : uint64_t = 1 << 2; -pub const VMEXIT_HOST_IA32E : uint64_t = 1 << 9; -pub const VMEXIT_LOAD_IA32_PERF_GLOBAL_CTRL : uint64_t = 1 << 12; -pub const VMEXIT_ACK_INTR : uint64_t = 1 << 15; -pub const VMEXIT_SAVE_IA32_PAT : uint64_t = 1 << 18; -pub const VMEXIT_LOAD_IA32_PAT : uint64_t = 1 << 19; -pub const VMEXIT_SAVE_EFER : uint64_t = 1 << 20; -pub const VMEXIT_LOAD_EFER : uint64_t = 1 << 21; -pub const VMEXIT_SAVE_VMX_TIMER : uint64_t = 1 << 22; - -pub const VMENTRY_LOAD_DBG_CONTROLS : uint64_t = 1 << 2; -pub const VMENTRY_GUEST_IA32E : uint64_t = 1 << 9; -pub const VMENTRY_SMM : uint64_t = 1 << 10; -pub const VMENTRY_DEACTIVATE_DUAL_MONITOR : uint64_t = 1 << 11; -pub const VMENTRY_LOAD_IA32_PERF_GLOBAL_CTRL : uint64_t = 1 << 13; -pub const VMENTRY_LOAD_IA32_PAT : uint64_t = 1 << 14; -pub const VMENTRY_LOAD_EFER : uint64_t = 1 << 15; +pub const VMENTRY_LOAD_DBG_CONTROLS : u64 = 1 << 2; +pub const VMENTRY_GUEST_IA32E : u64 = 1 << 9; +pub const VMENTRY_SMM : u64 = 1 << 10; +pub const VMENTRY_DEACTIVATE_DUAL_MONITOR : u64 = 1 << 11; +pub const VMENTRY_LOAD_IA32_PERF_GLOBAL_CTRL : u64 = 1 << 13; +pub const VMENTRY_LOAD_IA32_PAT : u64 = 1 << 14; +pub const VMENTRY_LOAD_EFER : u64 = 1 << 15; diff --git a/src/consts/vmx_exit.rs b/src/consts/vmx_exit.rs index f8c11de..ac956b1 100644 --- a/src/consts/vmx_exit.rs +++ b/src/consts/vmx_exit.rs @@ -22,65 +22,63 @@ THE SOFTWARE. //! VMX exit reasons -use libc::*; - -pub const VMX_REASON_EXC_NMI : uint64_t = 0; -pub const VMX_REASON_IRQ : uint64_t = 1; -pub const VMX_REASON_TRIPLE_FAULT : uint64_t = 2; -pub const VMX_REASON_INIT : uint64_t = 3; -pub const VMX_REASON_SIPI : uint64_t = 4; -pub const VMX_REASON_IO_SMI : uint64_t = 5; -pub const VMX_REASON_OTHER_SMI : uint64_t = 6; -pub const VMX_REASON_IRQ_WND : uint64_t = 7; -pub const VMX_REASON_VIRTUAL_NMI_WND : uint64_t = 8; -pub const VMX_REASON_TASK : uint64_t = 9; -pub const VMX_REASON_CPUID : uint64_t = 10; -pub const VMX_REASON_GETSEC : uint64_t = 11; -pub const VMX_REASON_HLT : uint64_t = 12; -pub const VMX_REASON_INVD : uint64_t = 13; -pub const VMX_REASON_INVLPG : uint64_t = 14; -pub const VMX_REASON_RDPMC : uint64_t = 15; -pub const VMX_REASON_RDTSC : uint64_t = 16; -pub const VMX_REASON_RSM : uint64_t = 17; -pub const VMX_REASON_VMCALL : uint64_t = 18; -pub const VMX_REASON_VMCLEAR : uint64_t = 19; -pub const VMX_REASON_VMLAUNCH : uint64_t = 20; -pub const VMX_REASON_VMPTRLD : uint64_t = 21; -pub const VMX_REASON_VMPTRST : uint64_t = 22; -pub const VMX_REASON_VMREAD : uint64_t = 23; -pub const VMX_REASON_VMRESUME : uint64_t = 24; -pub const VMX_REASON_VMWRITE : uint64_t = 25; -pub const VMX_REASON_VMOFF : uint64_t = 26; -pub const VMX_REASON_VMON : uint64_t = 27; -pub const VMX_REASON_MOV_CR : uint64_t = 28; -pub const VMX_REASON_MOV_DR : uint64_t = 29; -pub const VMX_REASON_IO : uint64_t = 30; -pub const VMX_REASON_RDMSR : uint64_t = 31; -pub const VMX_REASON_WRMSR : uint64_t = 32; -pub const VMX_REASON_VMENTRY_GUEST : uint64_t = 33; -pub const VMX_REASON_VMENTRY_MSR : uint64_t = 34; -pub const VMX_REASON_MWAIT : uint64_t = 36; -pub const VMX_REASON_MTF : uint64_t = 37; -pub const VMX_REASON_MONITOR : uint64_t = 39; -pub const VMX_REASON_PAUSE : uint64_t = 40; -pub const VMX_REASON_VMENTRY_MC : uint64_t = 41; -pub const VMX_REASON_TPR_THRESHOLD : uint64_t = 43; -pub const VMX_REASON_APIC_ACCESS : uint64_t = 44; -pub const VMX_REASON_VIRTUALIZED_EOI : uint64_t = 45; -pub const VMX_REASON_GDTR_IDTR : uint64_t = 46; -pub const VMX_REASON_LDTR_TR : uint64_t = 47; -pub const VMX_REASON_EPT_VIOLATION : uint64_t = 48; -pub const VMX_REASON_EPT_MISCONFIG : uint64_t = 49; -pub const VMX_REASON_EPT_INVEPT : uint64_t = 50; -pub const VMX_REASON_RDTSCP : uint64_t = 51; -pub const VMX_REASON_VMX_TIMER_EXPIRED : uint64_t = 52; -pub const VMX_REASON_INVVPID : uint64_t = 53; -pub const VMX_REASON_WBINVD : uint64_t = 54; -pub const VMX_REASON_XSETBV : uint64_t = 55; -pub const VMX_REASON_APIC_WRITE : uint64_t = 56; -pub const VMX_REASON_RDRAND : uint64_t = 57; -pub const VMX_REASON_INVPCID : uint64_t = 58; -pub const VMX_REASON_VMFUNC : uint64_t = 59; -pub const VMX_REASON_RDSEED : uint64_t = 61; -pub const VMX_REASON_XSAVES : uint64_t = 63; -pub const VMX_REASON_XRSTORS : uint64_t = 64; +pub const VMX_REASON_EXC_NMI : u64 = 0; +pub const VMX_REASON_IRQ : u64 = 1; +pub const VMX_REASON_TRIPLE_FAULT : u64 = 2; +pub const VMX_REASON_INIT : u64 = 3; +pub const VMX_REASON_SIPI : u64 = 4; +pub const VMX_REASON_IO_SMI : u64 = 5; +pub const VMX_REASON_OTHER_SMI : u64 = 6; +pub const VMX_REASON_IRQ_WND : u64 = 7; +pub const VMX_REASON_VIRTUAL_NMI_WND : u64 = 8; +pub const VMX_REASON_TASK : u64 = 9; +pub const VMX_REASON_CPUID : u64 = 10; +pub const VMX_REASON_GETSEC : u64 = 11; +pub const VMX_REASON_HLT : u64 = 12; +pub const VMX_REASON_INVD : u64 = 13; +pub const VMX_REASON_INVLPG : u64 = 14; +pub const VMX_REASON_RDPMC : u64 = 15; +pub const VMX_REASON_RDTSC : u64 = 16; +pub const VMX_REASON_RSM : u64 = 17; +pub const VMX_REASON_VMCALL : u64 = 18; +pub const VMX_REASON_VMCLEAR : u64 = 19; +pub const VMX_REASON_VMLAUNCH : u64 = 20; +pub const VMX_REASON_VMPTRLD : u64 = 21; +pub const VMX_REASON_VMPTRST : u64 = 22; +pub const VMX_REASON_VMREAD : u64 = 23; +pub const VMX_REASON_VMRESUME : u64 = 24; +pub const VMX_REASON_VMWRITE : u64 = 25; +pub const VMX_REASON_VMOFF : u64 = 26; +pub const VMX_REASON_VMON : u64 = 27; +pub const VMX_REASON_MOV_CR : u64 = 28; +pub const VMX_REASON_MOV_DR : u64 = 29; +pub const VMX_REASON_IO : u64 = 30; +pub const VMX_REASON_RDMSR : u64 = 31; +pub const VMX_REASON_WRMSR : u64 = 32; +pub const VMX_REASON_VMENTRY_GUEST : u64 = 33; +pub const VMX_REASON_VMENTRY_MSR : u64 = 34; +pub const VMX_REASON_MWAIT : u64 = 36; +pub const VMX_REASON_MTF : u64 = 37; +pub const VMX_REASON_MONITOR : u64 = 39; +pub const VMX_REASON_PAUSE : u64 = 40; +pub const VMX_REASON_VMENTRY_MC : u64 = 41; +pub const VMX_REASON_TPR_THRESHOLD : u64 = 43; +pub const VMX_REASON_APIC_ACCESS : u64 = 44; +pub const VMX_REASON_VIRTUALIZED_EOI : u64 = 45; +pub const VMX_REASON_GDTR_IDTR : u64 = 46; +pub const VMX_REASON_LDTR_TR : u64 = 47; +pub const VMX_REASON_EPT_VIOLATION : u64 = 48; +pub const VMX_REASON_EPT_MISCONFIG : u64 = 49; +pub const VMX_REASON_EPT_INVEPT : u64 = 50; +pub const VMX_REASON_RDTSCP : u64 = 51; +pub const VMX_REASON_VMX_TIMER_EXPIRED : u64 = 52; +pub const VMX_REASON_INVVPID : u64 = 53; +pub const VMX_REASON_WBINVD : u64 = 54; +pub const VMX_REASON_XSETBV : u64 = 55; +pub const VMX_REASON_APIC_WRITE : u64 = 56; +pub const VMX_REASON_RDRAND : u64 = 57; +pub const VMX_REASON_INVPCID : u64 = 58; +pub const VMX_REASON_VMFUNC : u64 = 59; +pub const VMX_REASON_RDSEED : u64 = 61; +pub const VMX_REASON_XSAVES : u64 = 63; +pub const VMX_REASON_XRSTORS : u64 = 64; diff --git a/src/ffi.rs b/src/ffi.rs index 536e963..160e5ec 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -25,7 +25,7 @@ THE SOFTWARE. use libc::*; /// Hypervisor Framework return code -pub type hv_return_t = uint32_t; +pub type hv_return_t = u32; // Hypervisor Framework return codes pub const HV_SUCCESS : hv_return_t = 0; @@ -37,7 +37,7 @@ pub const HV_NO_DEVICE : hv_return_t = 0xfae94006; pub const HV_UNSUPPORTED : hv_return_t = 0xfae9400f; /// Options for hv_vcpu_create() -pub type hv_vm_options_t = uint64_t; +pub type hv_vm_options_t = u64; pub const HV_VM_DEFAULT: hv_vm_options_t = 0 << 0; // Creating and Destroying VM Instances @@ -53,7 +53,7 @@ extern { pub type hv_vcpuid_t = c_uint; // Option for hv_vcpu_create() -pub const HV_VCPU_DEFAULT: uint64_t = 0; +pub const HV_VCPU_DEFAULT: u64 = 0; // Creating and Managing vCPU Instances extern { @@ -67,7 +67,7 @@ extern { pub fn hv_vcpu_interrupt(vcpu: *const hv_vcpuid_t, vcpu_count: c_uint) -> hv_return_t; /// Returns the cumulative execution time of a vCPU in nanoseconds - pub fn hv_vcpu_get_exec_time(vcpu: hv_vcpuid_t, time: *mut uint64_t) -> hv_return_t; + pub fn hv_vcpu_get_exec_time(vcpu: hv_vcpuid_t, time: *mut u64) -> hv_return_t; /// Forces flushing of cached vCPU state pub fn hv_vcpu_flush(vcpu: hv_vcpuid_t) -> hv_return_t; @@ -83,10 +83,10 @@ extern { extern { /// Returns the current value of an architectural x86 register /// of a vCPU - pub fn hv_vcpu_read_register(vcpu: hv_vcpuid_t, reg: super::x86Reg, value: *mut uint64_t) -> hv_return_t; + pub fn hv_vcpu_read_register(vcpu: hv_vcpuid_t, reg: super::x86Reg, value: *mut u64) -> hv_return_t; /// Sets the value of an architectural x86 register of a vCPU - pub fn hv_vcpu_write_register(vcpu: hv_vcpuid_t, reg: super::x86Reg, value: uint64_t) -> hv_return_t; + pub fn hv_vcpu_write_register(vcpu: hv_vcpuid_t, reg: super::x86Reg, value: u64) -> hv_return_t; } // Accessing Floating Point (FP) State @@ -103,19 +103,19 @@ extern { // Accessing Machine Specific Registers (MSRs) extern { /// Enables an MSR to be used natively by the VM - pub fn hv_vcpu_enable_native_msr(vcpu: hv_vcpuid_t, msr: uint32_t, enable: bool) -> hv_return_t; + pub fn hv_vcpu_enable_native_msr(vcpu: hv_vcpuid_t, msr: u32, enable: bool) -> hv_return_t; /// Returns the current value of an MSR of a vCPU - pub fn hv_vcpu_read_msr(vcpu: hv_vcpuid_t, msr: uint32_t, value: *mut uint64_t) -> hv_return_t; + pub fn hv_vcpu_read_msr(vcpu: hv_vcpuid_t, msr: u32, value: *mut u64) -> hv_return_t; /// Set the value of an MSR of a vCPU - pub fn hv_vcpu_write_msr(vcpu: hv_vcpuid_t, msr: uint32_t, value: *const uint64_t) -> hv_return_t; + pub fn hv_vcpu_write_msr(vcpu: hv_vcpuid_t, msr: u32, value: *const u64) -> hv_return_t; } // Managing Timestamp-Counters (TSC) extern { /// Synchronizes guest Timestamp-Counters (TSC) across all vCPUs - pub fn hv_vm_sync_tsc(tsc: uint64_t) -> hv_return_t; + pub fn hv_vm_sync_tsc(tsc: u64) -> hv_return_t; } /// Type of a user virtual address @@ -123,10 +123,10 @@ pub type hv_uvaddr_t = *const c_void; /// Guest physical memory region permissions for hv_vm_map() /// and hv_vm_protect() -pub type hv_memory_flags_t = uint64_t; +pub type hv_memory_flags_t = u64; /// Type of a guest physical address -pub type hv_gpaddr_t = uint64_t; +pub type hv_gpaddr_t = u64; // Guest physical memory region permissions for hv_vm_map() and hv_vm_protect() pub const HV_MEMORY_READ : hv_memory_flags_t = 1 << 0; @@ -150,13 +150,13 @@ extern { // Managing Virtual Machine Control Structure (VMCS) extern { /// Returns the current value of a VMCS field of a vCPU - pub fn hv_vmx_vcpu_read_vmcs(vcpu: hv_vcpuid_t, field: uint32_t, value: *mut uint64_t) -> hv_return_t; + pub fn hv_vmx_vcpu_read_vmcs(vcpu: hv_vcpuid_t, field: u32, value: *mut u64) -> hv_return_t; /// Sets the value of a VMCS field of a vCPU - pub fn hv_vmx_vcpu_write_vmcs(vcpu: hv_vcpuid_t, field: uint32_t, value: uint64_t) -> hv_return_t; + pub fn hv_vmx_vcpu_write_vmcs(vcpu: hv_vcpuid_t, field: u32, value: u64) -> hv_return_t; /// Returns the VMX capabilities of the host processor - pub fn hv_vmx_read_capability(field: super::VMXCap, value: *mut uint64_t) -> hv_return_t; + pub fn hv_vmx_read_capability(field: super::VMXCap, value: *mut u64) -> hv_return_t; /// Sets the address of the guest APIC for a vCPU in the /// guest physical address space of the VM diff --git a/src/lib.rs b/src/lib.rs index df9b27a..10b3046 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -55,6 +55,7 @@ use libc::*; use self::ffi::*; /// Error returned after every call +#[derive(Clone)] pub enum Error { /// Success Success, @@ -87,27 +88,27 @@ impl fmt::Debug for Error { } // Returns an Error for a hv_return_t -fn match_error_code(code: hv_return_t) -> Error { +fn match_error_code(code: hv_return_t) -> Result<(),Error> { match code { - HV_SUCCESS => Error::Success, - HV_BUSY => Error::Busy, - HV_BAD_ARGUMENT => Error::BadArg, - HV_NO_RESOURCES => Error::NoRes, - HV_NO_DEVICE => Error::NoDev, - HV_UNSUPPORTED => Error::Unsupp, - _ => Error::Error + HV_SUCCESS => Ok(()), + HV_BUSY => Err(Error::Busy), + HV_BAD_ARGUMENT => Err(Error::BadArg), + HV_NO_RESOURCES => Err(Error::NoRes), + HV_NO_DEVICE => Err(Error::NoDev), + HV_UNSUPPORTED => Err(Error::Unsupp), + _ => Err(Error::Error) } } /// Creates a VM instance for the current Mach task -pub fn create_vm() -> Error { +pub fn create_vm() -> Result<(),Error> { match_error_code(unsafe { hv_vm_create(HV_VM_DEFAULT) }) } /// Destroys the VM instance associated with the current Mach task -pub fn destroy_vm() -> Error { +pub fn destroy_vm() -> Result<(),Error> { match_error_code(unsafe { hv_vm_destroy() }) @@ -129,7 +130,7 @@ pub enum MemPerm { #[allow(non_snake_case)] #[inline(always)] -fn match_MemPerm(mem_perm: &MemPerm) -> uint64_t { +fn match_MemPerm(mem_perm: &MemPerm) -> u64 { match mem_perm { &MemPerm::Read => HV_MEMORY_READ, &MemPerm::Write => HV_MEMORY_WRITE | HV_MEMORY_READ, @@ -141,7 +142,7 @@ fn match_MemPerm(mem_perm: &MemPerm) -> uint64_t { /// Maps a region in the virtual address space of the current Mach task into the guest physical /// address space of the virutal machine -pub fn map_mem(mem: &[u8], gpa: u64, mem_perm: &MemPerm) -> Error { +pub fn map_mem(mem: &[u8], gpa: u64, mem_perm: &MemPerm) -> Result<(),Error> { match_error_code(unsafe { hv_vm_map( mem.as_ptr() as *const c_void, gpa as hv_gpaddr_t, mem.len() as size_t, @@ -151,7 +152,7 @@ pub fn map_mem(mem: &[u8], gpa: u64, mem_perm: &MemPerm) -> Error { } /// Unmaps a region in the guest physical address space of the virutal machine -pub fn unmap_mem(gpa: u64, size: usize) -> Error { +pub fn unmap_mem(gpa: u64, size: usize) -> Result<(),Error> { match_error_code(unsafe { hv_vm_unmap(gpa as hv_gpaddr_t, size as size_t) }) @@ -159,7 +160,7 @@ pub fn unmap_mem(gpa: u64, size: usize) -> Error { /// Modifies the permissions of a region in the guest physical address space of the virtual /// machine -pub fn protect_mem(gpa: u64, size: usize, mem_perm: &MemPerm) -> Error { +pub fn protect_mem(gpa: u64, size: usize, mem_perm: &MemPerm) -> Result<(),Error> { match_error_code(unsafe { hv_vm_protect(gpa as hv_gpaddr_t, size as size_t, match_MemPerm(mem_perm)) }) @@ -168,16 +169,16 @@ pub fn protect_mem(gpa: u64, size: usize, mem_perm: &MemPerm) -> Error { /// Synchronizes the guest Timestamp-Counters (TSC) across all vCPUs /// /// * `tsc` Guest TSC value -pub fn sync_tsc(tsc: u64) -> Error { +pub fn sync_tsc(tsc: u64) -> Result<(),Error> { match_error_code(unsafe { - hv_vm_sync_tsc(tsc as uint64_t) + hv_vm_sync_tsc(tsc as u64) }) } /// Forces an immediate VMEXIT of a set of vCPUs /// /// * `vcpu_ids` Array of vCPU IDs -pub fn interrupt_vcpus(vcpu_ids: &[u32]) -> Error { +pub fn interrupt_vcpus(vcpu_ids: &[u32]) -> Result<(),Error> { match_error_code(unsafe { hv_vcpu_interrupt(vcpu_ids.as_ptr(), vcpu_ids.len() as c_uint) }) @@ -255,34 +256,31 @@ impl vCPU { pub fn new() -> Result { let mut vcpuid: hv_vcpuid_t = 0; - let error = match_error_code(unsafe { + match_error_code(unsafe { hv_vcpu_create(&mut vcpuid, HV_VCPU_DEFAULT) - }); + })?; - match error { - Error::Success => Ok(vCPU { - id: vcpuid as u32 - }), - _ => Err(error) - } + Ok(vCPU { + id: vcpuid as u32 + }) } /// Destroys the vCPU instance associated with the current thread - pub fn destroy(&self) -> Error { + pub fn destroy(&self) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_destroy(self.id as hv_vcpuid_t) }) } /// Executes the vCPU - pub fn run(&self) -> Error { + pub fn run(&self) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_run(self.id as hv_vcpuid_t) }) } /// Forces an immediate VMEXIT of the vCPU - pub fn interrupt(&self) -> Error { + pub fn interrupt(&self) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_interrupt(&(self.id), 1 as c_uint) }) @@ -290,113 +288,101 @@ impl vCPU { /// Returns the cumulative execution time of the vCPU in nanoseconds pub fn exec_time(&self) -> Result { - let mut exec_time: uint64_t = 0; + let mut exec_time: u64 = 0; - let error = match_error_code(unsafe { + let _error = match_error_code(unsafe { hv_vcpu_get_exec_time(self.id, &mut exec_time) - }); + })?; - match error { - Error::Success => Ok(exec_time as u64), - _ => Err(error) - } + Ok(exec_time as u64) } /// Forces flushing of cached vCPU state - pub fn flush(&self) -> Error { + pub fn flush(&self) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_flush(self.id as hv_vcpuid_t) }) } /// Invalidates the translation lookaside buffer (TLB) of the vCPU - pub fn invalidate_tlb(&self) -> Error { + pub fn invalidate_tlb(&self) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_invalidate_tlb(self.id as hv_vcpuid_t) }) } /// Enables an MSR to be used natively by the VM - pub fn enable_native_msr(&self, msr: u32, enable: bool) -> Error { + pub fn enable_native_msr(&self, msr: u32, enable: bool) -> Result<(), Error> { match_error_code(unsafe { - hv_vcpu_enable_native_msr(self.id as hv_vcpuid_t, msr as uint32_t, enable) + hv_vcpu_enable_native_msr(self.id as hv_vcpuid_t, msr as u32, enable) }) } /// Returns the current value of an MSR of the vCPU pub fn read_msr(&self, msr: u32) -> Result { - let mut value: uint64_t = 0; + let mut value: u64 = 0; - let error = match_error_code(unsafe { - hv_vcpu_read_msr(self.id as hv_vcpuid_t, msr as uint32_t, &mut value) - }); + let _error = match_error_code(unsafe { + hv_vcpu_read_msr(self.id as hv_vcpuid_t, msr as u32, &mut value) + })?; - match error { - Error::Success => Ok(value as u64), - _ => Err(error) - } + Ok(value as u64) } /// Set the value of an MSR of the vCPU - pub fn write_msr(&self, msr: u32, value: u64) -> Error { + pub fn write_msr(&self, msr: u32, value: u64) -> Result<(),Error> { match_error_code(unsafe { - hv_vcpu_write_msr(self.id as hv_vcpuid_t, msr as uint32_t, &(value as uint64_t)) + hv_vcpu_write_msr(self.id as hv_vcpuid_t, msr as u32, &(value as u64)) }) } /// Returns the current value of an architectural x86 register /// of the vCPU pub fn read_register(&self, reg: &x86Reg) -> Result { - let mut value: uint64_t = 0; + let mut value: u64 = 0; - let error = match_error_code(unsafe { + match_error_code(unsafe { hv_vcpu_read_register(self.id as hv_vcpuid_t, (*reg).clone(), &mut value) - }); + })?; - match error { - Error::Success => Ok(value as u64), - _ => Err(error) - } + Ok(value as u64) } /// Sets the value of an architectural x86 register of the vCPU - pub fn write_register(&self, reg: &x86Reg, value: u64) -> Error { + pub fn write_register(&self, reg: &x86Reg, value: u64) -> Result<(), Error> { match_error_code(unsafe { - hv_vcpu_write_register(self.id as hv_vcpuid_t, (*reg).clone(), value as uint64_t) + hv_vcpu_write_register(self.id as hv_vcpuid_t, (*reg).clone(), value as u64) }) } /// Returns the current value of a VMCS field of the vCPU pub fn read_vmcs(&self, field: u32) -> Result { - let mut value: uint64_t = 0; + let mut value: u64 = 0; - let error = match_error_code(unsafe { - hv_vmx_vcpu_read_vmcs(self.id as hv_vcpuid_t, field as uint32_t, &mut value) - }); + match_error_code(unsafe { + hv_vmx_vcpu_read_vmcs(self.id as hv_vcpuid_t, field as u32, &mut value) + })?; - match error { - Error::Success => Ok(value as u64), - _ => Err(error) - } + Ok(value as u64) } /// Sets the value of a VMCS field of the vCPU - pub fn write_vmcs(&self, field: u32, value: u64) -> Error { + pub fn write_vmcs(&self, field: u32, value: u64) -> Result<(), Error> { match_error_code(unsafe { - hv_vmx_vcpu_write_vmcs(self.id as hv_vcpuid_t, field as uint32_t, value as uint64_t) + hv_vmx_vcpu_write_vmcs(self.id as hv_vcpuid_t, field as u32, value as u64) }) } /// Sets the address of the guest APIC for the vCPU in the /// guest physical address space of the VM - pub fn set_apic_addr(&self, gpa: u64) -> Error { + pub fn set_apic_addr(&self, gpa: u64) -> Result<(), Error> { match_error_code(unsafe { - hv_vmx_vcpu_set_apic_address(self.id as hv_vcpuid_t, gpa as uint64_t) + hv_vmx_vcpu_set_apic_address(self.id as hv_vcpuid_t, gpa as u64) }) } /// Reads the current architectural x86 floating point and SIMD state of the vCPU - pub fn read_fpstate(&self, buffer: &mut [u8]) -> Error { + pub fn read_fpstate(&self, buffer: &mut [u8]) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_read_fpstate(self.id as hv_vcpuid_t, buffer.as_mut_ptr() as *mut c_void, buffer.len() as size_t) @@ -404,7 +390,7 @@ impl vCPU { } /// Sets the architectural x86 floating point and SIMD state of the vCPU - pub fn write_fpstate(&self, buffer: &[u8]) -> Error { + pub fn write_fpstate(&self, buffer: &[u8]) -> Result<(), Error> { match_error_code(unsafe { hv_vcpu_write_fpstate(self.id as hv_vcpuid_t, buffer.as_ptr() as *const c_void, buffer.len() as size_t) @@ -421,7 +407,7 @@ impl fmt::Debug for vCPU { /// VMX cabability #[allow(non_camel_case_types)] -#[derive(Clone)] +#[derive(Clone, Debug)] #[repr(C)] pub enum VMXCap { /// Pin-based VMX capabilities @@ -440,14 +426,24 @@ pub enum VMXCap { /// Reads a VMX capability of the host processor pub fn read_vmx_cap(vmx_cap: &VMXCap) -> Result { - let mut value: uint64_t = 0; + let mut value: u64 = 0; - let error = match_error_code(unsafe { + match_error_code(unsafe { hv_vmx_read_capability((*vmx_cap).clone(), &mut value) - }); + })?; - match error { - Error::Success => Ok(value as u64), - _ => Err(error) - } + Ok(value as u64) +} + +impl fmt::Display for VMXCap { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + VMXCap::PINBASED => write!(f, "Pin-based VMX capabilities"), + VMXCap::PROCBASED => write!(f, "Primary proc-based VMX capabilities"), + VMXCap::PROCBASED2 => write!(f, "Secondary proc-based VMX capabilities"), + VMXCap::ENTRY => write!(f, "VM-entry VMX capabilities"), + VMXCap::EXIT => write!(f, "VM-exit VMX capabilities"), + VMXCap::PREEMPTION_TIMER => write!(f, "VMX preemption timer frequency") + } + } }