[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5/9] x86/vvmx: Replace direct calls to reg_read() with operand_read()
Use operand_read() to read register operands in the following functions: * nvmx_handle_vmread() * nvmx_handle_vmwrite() * nvmx_handle_invept() Direct reading of memory operands will be replaced in a separate patch. Signed-off-by: Euan Harris <euan.harris@xxxxxxxxxx> --- xen/arch/x86/hvm/vmx/vvmx.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index 32c07eca3d..7cda37b136 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -1877,6 +1877,7 @@ int nvmx_handle_vmread(struct cpu_user_regs *regs) pagefault_info_t pfinfo; u64 value = 0; int rc; + unsigned long vmcs_encoding = 0; rc = decode_vmx_inst(regs, &decode, NULL, 0); if ( rc != X86EMUL_OKAY ) @@ -1888,7 +1889,11 @@ int nvmx_handle_vmread(struct cpu_user_regs *regs) return X86EMUL_OKAY; } - rc = get_vvmcs_safe(v, reg_read(regs, decode.op[1].reg_idx), &value); + rc = operand_read(&vmcs_encoding, &decode.op[1], regs, decode.op[1].len); + if ( rc != X86EMUL_OKAY ) + return rc; + + rc = get_vvmcs_safe(v, vmcs_encoding, &value); if ( rc != VMX_INSN_SUCCEED ) { vmfail(regs, rc); @@ -1918,9 +1923,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs) struct vcpu *v = current; struct vmx_inst_decoded decode; unsigned long operand; - u64 vmcs_encoding; + unsigned long vmcs_encoding = 0; bool_t okay = 1; enum vmx_insn_errno err; + int rc; if ( decode_vmx_inst(regs, &decode, &operand, 0) != X86EMUL_OKAY ) @@ -1932,7 +1938,10 @@ int nvmx_handle_vmwrite(struct cpu_user_regs *regs) return X86EMUL_OKAY; } - vmcs_encoding = reg_read(regs, decode.op[1].reg_idx); + rc = operand_read(&vmcs_encoding, &decode.op[1], regs, decode.op[1].len); + if ( rc != X86EMUL_OKAY ) + return rc; + err = set_vvmcs_safe(v, vmcs_encoding, operand); if ( err != VMX_INSN_SUCCEED ) { @@ -1965,12 +1974,17 @@ int nvmx_handle_invept(struct cpu_user_regs *regs) { struct vmx_inst_decoded decode; unsigned long eptp; + unsigned long invept_type = 0; int ret; if ( (ret = decode_vmx_inst(regs, &decode, &eptp, 0)) != X86EMUL_OKAY ) return ret; - switch ( reg_read(regs, decode.op[1].reg_idx) ) + ret = operand_read(&invept_type, &decode.op[1], regs, decode.op[1].len); + if ( ret != X86EMUL_OKAY ) + return ret; + + switch ( invept_type ) { case INVEPT_SINGLE_CONTEXT: { @@ -1992,12 +2006,17 @@ int nvmx_handle_invept(struct cpu_user_regs *regs) int nvmx_handle_invvpid(struct cpu_user_regs *regs) { struct vmx_inst_decoded decode; + unsigned long invvpid_type = 0; int ret; if ( (ret = decode_vmx_inst(regs, &decode, NULL, 0)) != X86EMUL_OKAY ) return ret; - switch ( reg_read(regs, decode.op[1].reg_idx) ) + ret = operand_read(&invvpid_type, &decode.op[1], regs, decode.op[1].len); + if ( ret != X86EMUL_OKAY ) + return ret; + + switch ( invvpid_type ) { /* Just invalidate all tlb entries for all types! */ case INVVPID_INDIVIDUAL_ADDR: -- 2.13.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |