> From: Sergey Dyasli [mailto:[email protected]]
> Sent: Friday, October 12, 2018 11:28 PM
>
> And make nvmx_handle_vmclear() return the new errno in case the
> provided
> address is the same as vmxon region address.
>
> While at it, correct the return value for not-4KB-aligned case and for
> invalid physaddr.
>
> Signed-off-by: Sergey Dyasli <[email protected]>
> ---
> xen/arch/x86/hvm/vmx/vvmx.c | 23 ++++++++++++++++++-----
> xen/include/asm-x86/hvm/vmx/vmcs.h | 1 +
> 2 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/vmx/vvmx.c
> b/xen/arch/x86/hvm/vmx/vvmx.c
> index 4caa5811a1..8b691bfc04 100644
> --- a/xen/arch/x86/hvm/vmx/vvmx.c
> +++ b/xen/arch/x86/hvm/vmx/vvmx.c
> @@ -1804,9 +1804,20 @@ int nvmx_handle_vmclear(struct cpu_user_regs
> *regs)
> return rc;
>
> BUILD_BUG_ON(X86EMUL_OKAY != VMSUCCEED); /* rc = VMSUCCEED;
> */
> +
> + if ( gpa == vcpu_2_nvmx(v).vmxon_region_pa )
> + {
> + vmfail(regs, VMX_INSN_VMCLEAR_WITH_VMXON_PTR);
> + goto out;
> + }
> +
> if ( gpa & 0xfff )
> - rc = VMFAIL_INVALID;
> - else if ( gpa == nvcpu->nv_vvmcxaddr )
> + {
> + vmfail(regs, VMX_INSN_VMCLEAR_INVALID_PHYADDR);
> + goto out;
> + }
> +
> + if ( gpa == nvcpu->nv_vvmcxaddr )
> {
> if ( cpu_has_vmx_vmcs_shadowing )
> nvmx_clear_vmcs_pointer(v, nvcpu->nv_vvmcx);
> @@ -1820,7 +1831,10 @@ int nvmx_handle_vmclear(struct cpu_user_regs
> *regs)
> bool_t writable;
>
> vvmcs = hvm_map_guest_frame_rw(paddr_to_pfn(gpa), 0, &writable);
> - if ( vvmcs )
> +
> + if ( !vvmcs )
> + rc = VMFAIL_VALID;
> + else
> {
> if ( writable )
> clear_vvmcs_launched(&nvmx->launched_list,
> @@ -1835,9 +1849,8 @@ int nvmx_handle_vmclear(struct cpu_user_regs
> *regs)
> vmsucceed(regs);
> else if ( rc == VMFAIL_VALID )
> vmfail(regs, VMX_INSN_VMCLEAR_INVALID_PHYADDR);
> - else
> - vmfail_invalid(regs);
>
there is only one place poking rc now. clearer to replace rc with direct
vmfail too. then above rc checks can be removed.
> +out:
> return X86EMUL_OKAY;
> }
>
> diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-
> x86/hvm/vmx/vmcs.h
> index cae1861610..e84d2e482b 100644
> --- a/xen/include/asm-x86/hvm/vmx/vmcs.h
> +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
> @@ -529,6 +529,7 @@ enum vmx_insn_errno
> {
> VMX_INSN_SUCCEED = 0,
> VMX_INSN_VMCLEAR_INVALID_PHYADDR = 2,
> + VMX_INSN_VMCLEAR_WITH_VMXON_PTR = 3,
> VMX_INSN_VMLAUNCH_NONCLEAR_VMCS = 4,
> VMX_INSN_VMRESUME_NONLAUNCHED_VMCS = 5,
> VMX_INSN_INVALID_CONTROL_STATE = 7,
> --
> 2.17.1
_______________________________________________
Xen-devel mailing list
[email protected]
https://lists.xenproject.org/mailman/listinfo/xen-devel