From: Jack Lange Date: Fri, 26 Jun 2009 21:59:45 +0000 (-0500) Subject: added lowlevel header file for VMX X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=2f761543eabfddd12578ed902d7139edbb37df97 added lowlevel header file for VMX --- diff --git a/palacios/include/palacios/vmx_lowlevel.h b/palacios/include/palacios/vmx_lowlevel.h new file mode 100644 index 0000000..e4a878f --- /dev/null +++ b/palacios/include/palacios/vmx_lowlevel.h @@ -0,0 +1,110 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + +#ifndef __VMX_LOWLEVEL_H__ +#define __VMX_LOWLEVEL_H__ + +#ifdef __V3VEE__ + + +#define VMX_SUCCESS 0 +#define VMX_FAIL_INVALID 1 +#define VMX_FAIL_VALID 2 + + +#define VMWRITE_OP ".byte 0x0f,0x79,0xc1;" /* [eax],[ecx] */ +#define VMREAD_OP ".byte 0x0f,0x78,0xc1;" /* [eax],[ecx] */ + +#define VMXON_OP ".byte 0xf3,0x0f,0xc7,0x30;" /* [eax] */ + + +static int inline v3_enable_vmx(addr_t host_state) { + int ret; + __asm__ __volatile__ ( + VMXON_OP + "setnaeb %0;" + : "=q"(ret) + : "a"(host_state), "0"(ret) + : "memory" + ); + + if (ret) { + return -1; + } + + return 0; +} + + + + + +static int inline vmcs_write(addr_t vmcs_index, addr_t value) { + int ret_valid = 0; + int ret_invalid = 0; + + __asm__ __volatile__ ( + VMWRITE_OP + "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) + : "memory" + ); + + if (ret_valid) { + return VMX_FAIL_VALID; + } else if (ret_invalid) { + return VMX_FAIL_INVALID; + } + + return VMX_SUCCESS; +} + + + +static int inline vmcs_read(addr_t vmcs_index, void * dst, int len) { + addr_t val = 0; + int ret_valid = 0; + int ret_invalid = 0; + + __asm__ __volatile__ ( + VMREAD_OP + "seteb %0;" // fail valid (ZF=1) + "setnaeb %1;" // fail invalid (CF=1) + : "=q"(ret_valid), "=q"(ret_invalid), "=c"(val) + : "a"(vmcs_index), "0"(ret_valid), "1"(ret_invalid) + : "memory" + ); + + if (ret_valid) { + return VMX_FAIL_VALID; + } else if (ret_invalid) { + return VMX_FAIL_INVALID; + } + + return VMX_SUCCESS; +} + + + + +#endif + +#endif