[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Nexted VMX: Emulation of guest VMREAD
# HG changeset patch # User Eddie Dong <eddie.dong@xxxxxxxxx> # Date 1307607849 -28800 # Node ID e1633a3071a9d5e4d49f87a6e4f3ec8a529dbb1e # Parent 63136f23e58141eb952005043611c378ddacb854 Nexted VMX: Emulation of guest VMREAD Signed-off-by: Qing He <qing.he@xxxxxxxxx> Signed-off-by: Eddie Dong <eddie.dong@xxxxxxxxx> Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> Committed-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> --- diff -r 63136f23e581 -r e1633a3071a9 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 @@ -2454,6 +2454,11 @@ 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(); @@ -2462,7 +2467,6 @@ 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 63136f23e581 -r e1633a3071a9 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 @@ 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,34 @@ 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); +#ifdef CONFIG_X86_64 + 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); +#endif + default: + break; + } +} + static int vmx_inst_check_privilege(struct cpu_user_regs *regs, int vmxop_check) { struct vcpu *v = current; @@ -548,6 +578,35 @@ 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 63136f23e581 -r e1633a3071a9 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 @@ 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-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |