X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmx_lowlevel.h;h=11409ce10efdb2796c2f981f07d843b4990f32b0;hb=f1d8183ae8c4390dfc74cb2780dd2058c569fc57;hp=6817ccc6a548c258b246470468a2f975daebb945;hpb=3ee591b788b6933bc8553b5d67ff11db8c78bdf9;p=palacios.git diff --git a/palacios/include/palacios/vmx_lowlevel.h b/palacios/include/palacios/vmx_lowlevel.h index 6817ccc..11409ce 100644 --- a/palacios/include/palacios/vmx_lowlevel.h +++ b/palacios/include/palacios/vmx_lowlevel.h @@ -37,7 +37,7 @@ /* Opcode definitions for all the VM instructions */ -#define VMCLEAR_OPCODE ".byte 0x66,0xf,0x67;" /* reg=/6 */ +#define VMCLEAR_OPCODE ".byte 0x66,0xf,0xc7;" /* reg=/6 */ #define VMRESUME_OPCODE ".byte 0x0f,0x01,0xc3;" #define VMPTRLD_OPCODE ".byte 0x0f,0xc7;" /* reg=/6 */ #define VMPTRST_OPCODE ".byte 0x0f,0xc7;" /* reg=/7 */ @@ -56,7 +56,7 @@ -static inline int v3_enable_vmx(struct vmcs_data * vmxon_ptr) { +static inline int v3_enable_vmx(addr_t vmxon_ptr) { uint64_t vmxon_ptr_64 __attribute__((aligned(8))) = (uint64_t)vmxon_ptr; uint8_t ret_invalid = 0; @@ -75,10 +75,8 @@ static inline int v3_enable_vmx(struct vmcs_data * vmxon_ptr) { } } -// No vmcall necessary - is only executed by the guest - -static inline int vmcs_clear(struct vmcs_data* vmcs_ptr) { - uint64_t vmcs_ptr_64 = (uint64_t)vmcs_ptr; +static inline int vmcs_clear(addr_t vmcs_ptr) { + uint64_t vmcs_ptr_64 __attribute__ ((aligned(8))) = (uint64_t)vmcs_ptr; uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -96,26 +94,7 @@ static inline int vmcs_clear(struct vmcs_data* vmcs_ptr) { return VMX_SUCCESS; } - -static inline int vmcs_resume() { - uint8_t ret_valid = 0; - uint8_t ret_invalid = 0; - - __asm__ __volatile__ ( - VMRESUME_OPCODE - "seteb %0;" - "setnaeb %1;" - : "=q"(ret_valid), "=q"(ret_invalid) - : "0"(ret_valid), "1"(ret_invalid) - : "memory"); - - CHECK_VMXFAIL(ret_valid, ret_invalid); - - return VMX_SUCCESS; -} - - -static inline int vmcs_load(struct vmcs_data* vmcs_ptr) { +static inline int vmcs_load(addr_t vmcs_ptr) { uint64_t vmcs_ptr_64 = (uint64_t)vmcs_ptr; uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -134,7 +113,7 @@ static inline int vmcs_load(struct vmcs_data* vmcs_ptr) { return VMX_SUCCESS; } -static inline int vmcs_store(struct vmcs_data* vmcs_ptr) { +static inline int vmcs_store(addr_t vmcs_ptr) { uint64_t vmcs_ptr_64 = (uint64_t)vmcs_ptr; __asm__ __volatile__ ( @@ -147,7 +126,7 @@ static inline int vmcs_store(struct vmcs_data* vmcs_ptr) { return VMX_SUCCESS; } -static inline int vmcs_read(addr_t vmcs_index, void * dst, int len) { +static inline int vmcs_read(vmcs_field_t vmcs_field, void * dst, int len) { uint64_t val = 0; uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -158,13 +137,12 @@ static inline int vmcs_read(addr_t vmcs_index, void * dst, int len) { "seteb %0;" // fail valid "setnaeb %1;" // fail invalid : "=q"(ret_valid), "=q"(ret_invalid), "=c"(val) // Use ECX - : "a" (vmcs_index), "0"(ret_valid), "1"(ret_invalid) + : "a" (vmcs_field), "0"(ret_valid), "1"(ret_invalid) : "memory" ); CHECK_VMXFAIL(ret_valid, ret_invalid); - // TODO: Fix this, will have to do a cast because dst will be variable length switch(len) { case 2: @@ -182,7 +160,7 @@ static inline int vmcs_read(addr_t vmcs_index, void * dst, int len) { return VMX_SUCCESS; } -static inline int vmcs_write(addr_t vmcs_index, addr_t value) { +static inline int vmcs_write(vmcs_field_t vmcs_field, addr_t value) { uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -192,7 +170,7 @@ static inline int vmcs_write(addr_t vmcs_index, addr_t value) { "seteb %0;" // fail valid (ZF=1) "setnaeb %1;" // fail invalid (CF=1) : "=q" (ret_valid), "=q" (ret_invalid) - : "a" (vmcs_index), "c"(value), "0"(ret_valid), "1"(ret_invalid) + : "a" (vmcs_field), "c"(value), "0"(ret_valid), "1"(ret_invalid) : "memory"); CHECK_VMXFAIL(ret_valid, ret_invalid);