X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmx_lowlevel.h;h=81872e022a62e61801442f8a931c8c1b5aef8dc4;hb=61597ea2c5ccace036d8a65e429e32b8f8a7ed4a;hp=0a6ac3e17b4ec485ec5cf21244002bee288ed768;hpb=a1d3e2f36e9ef64ca62c611c4f0aa050726e186b;p=palacios.git diff --git a/palacios/include/palacios/vmx_lowlevel.h b/palacios/include/palacios/vmx_lowlevel.h index 0a6ac3e..81872e0 100644 --- a/palacios/include/palacios/vmx_lowlevel.h +++ b/palacios/include/palacios/vmx_lowlevel.h @@ -22,6 +22,7 @@ #ifdef __V3VEE__ +#include #define VMX_SUCCESS 0 #define VMX_FAIL_INVALID 1 @@ -37,7 +38,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 */ @@ -75,10 +76,8 @@ static inline int v3_enable_vmx(addr_t vmxon_ptr) { } } -// No vmcall necessary - is only executed by the guest - static inline int vmcs_clear(addr_t vmcs_ptr) { - uint64_t vmcs_ptr_64 = (uint64_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,25 +95,6 @@ static inline int vmcs_clear(addr_t 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(addr_t vmcs_ptr) { uint64_t vmcs_ptr_64 = (uint64_t)vmcs_ptr; uint8_t ret_valid = 0; @@ -147,7 +127,7 @@ static inline int vmcs_store(addr_t vmcs_ptr) { return VMX_SUCCESS; } -static inline int vmcs_read(vmcs_field_t vmcs_field, void * dst, int len) { +static inline int vmcs_read(vmcs_field_t vmcs_field, void * dst) { uint64_t val = 0; uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -155,16 +135,16 @@ static inline int vmcs_read(vmcs_field_t vmcs_field, void * dst, int len) { __asm__ __volatile__ ( VMREAD_OPCODE EAX_ECX_MODRM - "seteb %0;" // fail valid - "setnaeb %1;" // fail invalid - : "=q"(ret_valid), "=q"(ret_invalid), "=c"(val) // Use ECX - : "a" (vmcs_field), "0"(ret_valid), "1"(ret_invalid) + "seteb %1;" // fail valid + "setnaeb %2;" // fail invalid + : "=&c"(val), "=q"(ret_valid), "=q"(ret_invalid) // Use ECX + : "a" (vmcs_field), "1"(ret_valid), "2"(ret_invalid) : "memory" ); CHECK_VMXFAIL(ret_valid, ret_invalid); - switch(len) + switch(v3_vmcs_get_field_len(vmcs_field)) { case 2: *((uint16_t*)dst) = (uint16_t)val;