[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/4] x86/vvmx: Unconditionally initialise vmxon_region_pa during vcpu construction
This is a stopgap solution until the toolstack side of initialisation can be sorted out, but it does result in the nvmx_vcpu_in_vmx() predicate working correctly even when nested virt hasn't been enabled for the domain. Update nvmx_handle_vmx_insn() to include the in-vmx mode check (for all instructions other than VMXON) to complete the set of #UD checks. In addition, sanity check that the nested vmexit handler has worked correctly, and that we are only providing emulation of the VT-x instructions to L1 guests. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Sergey Dyasli <sergey.dyasli@xxxxxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> CC: Jun Nakajima <jun.nakajima@xxxxxxxxx> CC: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/arch/x86/hvm/vmx/vmx.c | 2 ++ xen/arch/x86/hvm/vmx/vvmx.c | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 7a49075..00a7014 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -429,6 +429,8 @@ static int vmx_vcpu_initialise(struct vcpu *v) INIT_LIST_HEAD(&v->arch.hvm.vmx.pi_blocking.list); + vcpu_2_nvmx(v).vmxon_region_pa = INVALID_PADDR; + if ( (rc = vmx_create_vmcs(v)) != 0 ) { dprintk(XENLOG_WARNING, diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index aa202e0..09e105e 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -1987,7 +1987,8 @@ int nvmx_handle_vmx_insn(struct cpu_user_regs *regs, unsigned int exit_reason) if ( !(curr->arch.hvm.guest_cr[4] & X86_CR4_VMXE) || !nestedhvm_enabled(curr->domain) || - (vmx_guest_x86_mode(curr) < (hvm_long_mode_active(curr) ? 8 : 2)) ) + (vmx_guest_x86_mode(curr) < (hvm_long_mode_active(curr) ? 8 : 2)) || + (exit_reason != EXIT_REASON_VMXON && !nvmx_vcpu_in_vmx(curr)) ) { hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); return X86EMUL_EXCEPTION; @@ -1999,6 +2000,14 @@ int nvmx_handle_vmx_insn(struct cpu_user_regs *regs, unsigned int exit_reason) return X86EMUL_EXCEPTION; } + if ( nestedhvm_vcpu_in_guestmode(curr) ) + { + /* Should have been handled by nvmx_n2_vmexit_handler()... */ + ASSERT_UNREACHABLE(); + domain_crash(curr->domain); + return X86EMUL_UNHANDLEABLE; + } + switch ( exit_reason ) { case EXIT_REASON_VMXOFF: -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |