X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmx_lowlevel.h;h=ce6a440f1ed08dc0a40fd1b48cb6800babd96dd7;hb=d12cdf5b213b2b51d525914a852ceacd2c198b5a;hp=9ea6ffbc5e161cdec5ef8c6a950bca83edefbd5d;hpb=c31f51134ba446530ff67fa0723ce634c70c2812;p=palacios-OLD.git diff --git a/palacios/include/palacios/vmx_lowlevel.h b/palacios/include/palacios/vmx_lowlevel.h index 9ea6ffb..ce6a440 100644 --- a/palacios/include/palacios/vmx_lowlevel.h +++ b/palacios/include/palacios/vmx_lowlevel.h @@ -57,24 +57,7 @@ -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; - __asm__ __volatile__ ( - VMXON_OPCODE - EAX_06_MODRM - "setnaeb %0;" // fail invalid (CF=1) - : "=q"(ret_invalid) - : "a"(&vmxon_ptr_64),"0"(ret_invalid) - : "memory"); - - if (ret_invalid) { - return VMX_FAIL_INVALID; - } else { - return VMX_SUCCESS; - } -} static inline int vmcs_clear(addr_t vmcs_ptr) { uint64_t vmcs_ptr_64 __attribute__ ((aligned(8))) = (uint64_t)vmcs_ptr; @@ -128,7 +111,7 @@ static inline int vmcs_store(addr_t vmcs_ptr) { } static inline int vmcs_read(vmcs_field_t vmcs_field, void * dst) { - uint64_t val = 0; + addr_t val = 0; uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -155,6 +138,8 @@ static inline int vmcs_read(vmcs_field_t vmcs_field, void * dst) { case 8: *((uint64_t*)dst) = (uint64_t)val; break; + default: + return -1; } @@ -170,7 +155,7 @@ static inline int vmcs_write(vmcs_field_t vmcs_field, addr_t value) { EAX_ECX_MODRM "seteb %0;" // fail valid (ZF=1) "setnaeb %1;" // fail invalid (CF=1) - : "=r" (ret_valid), "=r" (ret_invalid) + : "=q" (ret_valid), "=q" (ret_invalid) : "a" (vmcs_field), "c"(value) : "memory"); @@ -179,6 +164,26 @@ static inline int vmcs_write(vmcs_field_t vmcs_field, addr_t value) { return VMX_SUCCESS; } + +static inline int vmx_on(addr_t vmxon_ptr) { + uint64_t vmxon_ptr_64 __attribute__((aligned(8))) = (uint64_t)vmxon_ptr; + uint8_t ret_invalid = 0; + + __asm__ __volatile__ ( + VMXON_OPCODE + EAX_06_MODRM + "setnaeb %0;" // fail invalid (CF=1) + : "=q"(ret_invalid) + : "a"(&vmxon_ptr_64),"0"(ret_invalid) + : "memory"); + + if (ret_invalid) { + return VMX_FAIL_INVALID; + } else { + return VMX_SUCCESS; + } +} + static inline int vmx_off() { uint8_t ret_valid = 0; uint8_t ret_invalid = 0; @@ -196,6 +201,57 @@ static inline int vmx_off() { return VMX_SUCCESS; } + +static inline int enable_vmx() { +#ifdef __V3_64BIT__ + __asm__ __volatile__ ( + "movq %%cr4, %%rbx;" + "orq $0x00002000, %%rbx;" + "movq %%rbx, %%cr4;" + : + : + : "%rbx" + ); + + + __asm__ __volatile__ ( + "movq %%cr0, %%rbx; " + "orq $0x00000020,%%rbx; " + "movq %%rbx, %%cr0;" + : + : + : "%rbx" + ); +#elif __V3_32BIT__ + __asm__ __volatile__ ( + "movl %%cr4, %%ecx;" + "orl $0x00002000, %%ecx;" + "movl %%ecx, %%cr4;" + : + : + : "%ecx" + ); + + + + __asm__ __volatile__ ( + "movl %%cr0, %%ecx; " + "orl $0x00000020,%%ecx; " + "movl %%ecx, %%cr0;" + : + : + : "%ecx" + ); + +#endif + + return 0; +} + + + + + #endif #endif