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 <sergey.dya...@citrix.com> --- 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); +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 Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel