[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 11 of 20] Emulation of guest VMREAD
# HG changeset patch # User Eddie Dong <eddie.dong@xxxxxxxxx> # Date 1307607849 -28800 # Node ID c9f43a690ed89169aecbf85940bd7fff390e7497 # Parent 746c4af7fb75e7c54d9d610acd0d2be2f27fe4dc Emulation of guest VMREAD Signed-off-by: Qing He <qing.he@xxxxxxxxx> Signed-off-by: Eddie Dong <eddie.dong@xxxxxxxxx> diff -r 746c4af7fb75 -r c9f43a690ed8 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Thu Jun 09 16:24:09 2011 +0800 +++ b/xen/arch/x86/hvm/vmx/vmx.c Thu Jun 09 16:24:09 2011 +0800 @@ -2459,6 +2459,11 @@ asmlinkage void vmx_vmexit_handler(struc update_guest_eip(); break; + case EXIT_REASON_VMREAD: + if ( nvmx_handle_vmread(regs) == X86EMUL_OKAY ) + update_guest_eip(); + break; + case EXIT_REASON_VMWRITE: if ( nvmx_handle_vmwrite(regs) == X86EMUL_OKAY ) update_guest_eip(); @@ -2467,7 +2472,6 @@ asmlinkage void vmx_vmexit_handler(struc case EXIT_REASON_MWAIT_INSTRUCTION: case EXIT_REASON_MONITOR_INSTRUCTION: case EXIT_REASON_VMLAUNCH: - case EXIT_REASON_VMREAD: case EXIT_REASON_VMRESUME: case EXIT_REASON_GETSEC: case EXIT_REASON_INVEPT: diff -r 746c4af7fb75 -r c9f43a690ed8 xen/arch/x86/hvm/vmx/vvmx.c --- a/xen/arch/x86/hvm/vmx/vvmx.c Thu Jun 09 16:24:09 2011 +0800 +++ b/xen/arch/x86/hvm/vmx/vvmx.c Thu Jun 09 16:24:09 2011 +0800 @@ -119,6 +119,8 @@ enum vmx_ops_result { VMFAIL_INVALID, }; +#define CASE_SET_REG(REG, reg) \ + case VMX_REG_ ## REG: regs->reg = value; break #define CASE_GET_REG(REG, reg) \ case VMX_REG_ ## REG: value = regs->reg; break @@ -231,6 +233,32 @@ static unsigned long reg_read(struct cpu return value; } +static void reg_write(struct cpu_user_regs *regs, + enum vmx_regs_enc index, + unsigned long value) +{ + switch ( index ) { + CASE_SET_REG(RAX, eax); + CASE_SET_REG(RCX, ecx); + CASE_SET_REG(RDX, edx); + CASE_SET_REG(RBX, ebx); + CASE_SET_REG(RBP, ebp); + CASE_SET_REG(RSI, esi); + CASE_SET_REG(RDI, edi); + CASE_SET_REG(RSP, esp); + CASE_SET_REG(R8, r8); + CASE_SET_REG(R9, r9); + CASE_SET_REG(R10, r10); + CASE_SET_REG(R11, r11); + CASE_SET_REG(R12, r12); + CASE_SET_REG(R13, r13); + CASE_SET_REG(R14, r14); + CASE_SET_REG(R15, r15); + default: + break; + } +} + static int vmx_inst_check_privilege(struct cpu_user_regs *regs, int vmxop_check) { struct vcpu *v = current; @@ -548,6 +576,35 @@ out: return X86EMUL_OKAY; } +int nvmx_handle_vmread(struct cpu_user_regs *regs) +{ + struct vcpu *v = current; + struct vmx_inst_decoded decode; + struct nestedvcpu *nvcpu = &vcpu_nestedhvm(v); + u64 value = 0; + int rc; + + rc = decode_vmx_inst(regs, &decode, NULL, 0); + if ( rc != X86EMUL_OKAY ) + return rc; + + value = __get_vvmcs(nvcpu->nv_vvmcx, reg_read(regs, decode.reg2)); + + switch ( decode.type ) { + case VMX_INST_MEMREG_TYPE_MEMORY: + rc = hvm_copy_to_guest_virt(decode.mem, &value, decode.len, 0); + if ( rc != HVMCOPY_okay ) + return X86EMUL_EXCEPTION; + break; + case VMX_INST_MEMREG_TYPE_REG: + reg_write(regs, decode.reg1, value); + break; + } + + vmreturn(regs, VMSUCCEED); + return X86EMUL_OKAY; +} + int nvmx_handle_vmwrite(struct cpu_user_regs *regs) { struct vcpu *v = current; diff -r 746c4af7fb75 -r c9f43a690ed8 xen/include/asm-x86/hvm/vmx/vvmx.h --- a/xen/include/asm-x86/hvm/vmx/vvmx.h Thu Jun 09 16:24:09 2011 +0800 +++ b/xen/include/asm-x86/hvm/vmx/vvmx.h Thu Jun 09 16:24:09 2011 +0800 @@ -156,6 +156,7 @@ void nvmx_destroy_vmcs(struct vcpu *v); int nvmx_handle_vmptrld(struct cpu_user_regs *regs); int nvmx_handle_vmptrst(struct cpu_user_regs *regs); int nvmx_handle_vmclear(struct cpu_user_regs *regs); +int nvmx_handle_vmread(struct cpu_user_regs *regs); int nvmx_handle_vmwrite(struct cpu_user_regs *regs); #endif /* __ASM_X86_HVM_VVMX_H__ */ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |