From: Paolo Bonzini <pbonzini@redhat.com> Date: Mon, 30 Aug 2010 16:46:37 -0400 Subject: [xen] vmx: simplify event-injection logic Message-id: <1283186802-21009-2-git-send-email-pbonzini@redhat.com> Patchwork-id: 27941 O-Subject: [RHEL5.6 XEN PATCH 1/6] vmx: Simplify event-injection logic. Bugzilla: 625903 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=625903 Upstream status: http://xenbits.xensource.com/xen-unstable.hg/rev/15657 Brew build: https://brewweb.devel.redhat.com/taskinfo?taskID=2719051 This patch removes a bunch of dead code. Since we never intercept guest NMIs, vmx_reflect_exception is never called, and this in turn means the last argument to __vmx_inject_exception is always 0. --- arch/x86/hvm/vmx/vmx.c | 54 ++++------------------------------------- include/asm-x86/hvm/vmx/vmx.h | 22 ++++------------- 2 files changed, 10 insertions(+), 66 deletions(-) Signed-off-by: Jarod Wilson <jarod@redhat.com> diff --git a/arch/x86/hvm/vmx/vmx.c b/arch/x86/hvm/vmx/vmx.c index 9e27dbd..1295d0e 100644 --- a/arch/x86/hvm/vmx/vmx.c +++ b/arch/x86/hvm/vmx/vmx.c @@ -3080,47 +3080,6 @@ static void vmx_do_extint(struct cpu_user_regs *regs) } } -static void vmx_reflect_exception(struct vcpu *v) -{ - int error_code, intr_info, vector; - - intr_info = __vmread(VM_EXIT_INTR_INFO); - vector = intr_info & 0xff; - if ( intr_info & INTR_INFO_DELIVER_CODE_MASK ) - error_code = __vmread(VM_EXIT_INTR_ERROR_CODE); - else - error_code = VMX_DELIVER_NO_ERROR_CODE; - -#ifndef NDEBUG - { - unsigned long rip; - - rip = __vmread(GUEST_RIP); - HVM_DBG_LOG(DBG_LEVEL_1, "rip = %lx, error_code = %x", - rip, error_code); - } -#endif /* NDEBUG */ - - /* - * According to Intel Virtualization Technology Specification for - * the IA-32 Intel Architecture (C97063-002 April 2005), section - * 2.8.3, SW_EXCEPTION should be used for #BP and #OV, and - * HW_EXCEPTION used for everything else. The main difference - * appears to be that for SW_EXCEPTION, the EIP/RIP is incremented - * by VM_ENTER_INSTRUCTION_LEN bytes, whereas for HW_EXCEPTION, - * it is not. - */ - if ( (intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_SW_EXCEPTION ) - { - int ilen = __get_instruction_length(); /* Safe: software exception */ - vmx_inject_sw_exception(v, vector, ilen); - } - else - { - vmx_inject_hw_exception(v, vector, error_code); - } -} - static void ept_handle_violation(unsigned long qualification, paddr_t gpa) { unsigned long gla_validity = qualification & EPT_GLA_VALIDITY_MASK; @@ -3300,14 +3259,11 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) vmx_inject_hw_exception(v, TRAP_page_fault, regs->error_code); break; case TRAP_nmi: - if ( (intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI ) - { - HVMTRACE_0D(NMI, v); - vmx_store_cpu_guest_regs(v, regs, NULL); - do_nmi(regs); /* Real NMI, vector 2: normal processing. */ - } - else - vmx_reflect_exception(v); + if ( (intr_info & INTR_INFO_INTR_TYPE_MASK) != INTR_TYPE_NMI ) + goto exit_and_crash; + HVMTRACE_0D(NMI, v); + vmx_store_cpu_guest_regs(v, regs, NULL); + do_nmi(regs); /* Real NMI, vector 2: normal processing. */ break; case TRAP_machine_check: HVMTRACE_0D(MCE, v); diff --git a/include/asm-x86/hvm/vmx/vmx.h b/include/asm-x86/hvm/vmx/vmx.h index 587e1f3..8669cd4 100644 --- a/include/asm-x86/hvm/vmx/vmx.h +++ b/include/asm-x86/hvm/vmx/vmx.h @@ -358,8 +358,8 @@ static inline void vpid_sync_all(void) } -static inline void __vmx_inject_exception(struct vcpu *v, int trap, int type, - int error_code, int ilen) +static inline void __vmx_inject_exception( + struct vcpu *v, int trap, int type, int error_code) { unsigned long intr_fields; @@ -377,9 +377,6 @@ static inline void __vmx_inject_exception(struct vcpu *v, int trap, int type, intr_fields |= INTR_INFO_DELIVER_CODE_MASK; } - if ( ilen ) - __vmwrite(VM_ENTRY_INSTRUCTION_LEN, ilen); - __vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields); if (trap == TRAP_page_fault) @@ -392,28 +389,19 @@ static inline void vmx_inject_hw_exception( struct vcpu *v, int trap, int error_code) { v->arch.hvm_vmx.vector_injected = 1; - __vmx_inject_exception(v, trap, INTR_TYPE_HW_EXCEPTION, error_code, 0); -} - -static inline void vmx_inject_sw_exception( - struct vcpu *v, int trap, int instruction_len) -{ - v->arch.hvm_vmx.vector_injected = 1; - __vmx_inject_exception(v, trap, INTR_TYPE_SW_EXCEPTION, - VMX_DELIVER_NO_ERROR_CODE, - instruction_len); + __vmx_inject_exception(v, trap, INTR_TYPE_HW_EXCEPTION, error_code); } static inline void vmx_inject_extint(struct vcpu *v, int trap) { __vmx_inject_exception(v, trap, INTR_TYPE_EXT_INTR, - VMX_DELIVER_NO_ERROR_CODE, 0); + VMX_DELIVER_NO_ERROR_CODE); } static inline void vmx_inject_nmi(struct vcpu *v) { __vmx_inject_exception(v, 2, INTR_TYPE_NMI, - VMX_DELIVER_NO_ERROR_CODE, 0); + VMX_DELIVER_NO_ERROR_CODE); } void ept_p2m_init(struct domain *d);