[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86 hvm: Fix #UD interception.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1246456711 -3600 # Node ID 479f1fa084d6af8611b0973be0fb6d642db1f9f9 # Parent 945232b8e226893da8010c9523ae0a1678db5961 x86 hvm: Fix #UD interception. * Interception should be standard part of HVM_TRAP_MASK * Failed intercept should quietly forward #UD to the guest Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/arch/x86/hvm/svm/svm.c | 20 +++++------------ xen/arch/x86/hvm/svm/vmcb.c | 3 -- xen/arch/x86/hvm/vmx/vmcs.c | 3 -- xen/arch/x86/hvm/vmx/vmx.c | 48 +++++++++++++++++------------------------- xen/include/asm-x86/hvm/hvm.h | 2 - 5 files changed, 29 insertions(+), 47 deletions(-) diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Wed Jul 01 10:54:25 2009 +0100 +++ b/xen/arch/x86/hvm/svm/svm.c Wed Jul 01 14:58:31 2009 +0100 @@ -1226,24 +1226,16 @@ static void svm_vmexit_ud_intercept(stru switch ( rc ) { case X86EMUL_UNHANDLEABLE: - gdprintk(XENLOG_WARNING, - "instruction emulation failed @ %04x:%lx: " - "%02x %02x %02x %02x %02x %02x\n", - hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel, - ctxt.insn_buf_eip, - ctxt.insn_buf[0], ctxt.insn_buf[1], - ctxt.insn_buf[2], ctxt.insn_buf[3], - ctxt.insn_buf[4], ctxt.insn_buf[5]); - return; + svm_inject_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE, 0); + break; case X86EMUL_EXCEPTION: if ( ctxt.exn_pending ) hvm_inject_exception(ctxt.exn_vector, ctxt.exn_error_code, 0); - break; + /* fall through */ default: - break; - } - - hvm_emulate_writeback(&ctxt); + hvm_emulate_writeback(&ctxt); + break; + } } static void wbinvd_ipi(void *info) diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/svm/vmcb.c --- a/xen/arch/x86/hvm/svm/vmcb.c Wed Jul 01 10:54:25 2009 +0100 +++ b/xen/arch/x86/hvm/svm/vmcb.c Wed Jul 01 14:58:31 2009 +0100 @@ -227,8 +227,7 @@ static int construct_vmcb(struct vcpu *v vmcb->exception_intercepts = HVM_TRAP_MASK - | (1U << TRAP_no_device) - | (1U << TRAP_invalid_op); + | (1U << TRAP_no_device); if ( paging_mode_hap(v->domain) ) { diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/vmx/vmcs.c --- a/xen/arch/x86/hvm/vmx/vmcs.c Wed Jul 01 10:54:25 2009 +0100 +++ b/xen/arch/x86/hvm/vmx/vmcs.c Wed Jul 01 14:58:31 2009 +0100 @@ -679,8 +679,7 @@ static int construct_vmcs(struct vcpu *v __vmwrite(EXCEPTION_BITMAP, HVM_TRAP_MASK | (paging_mode_hap(d) ? 0 : (1U << TRAP_page_fault)) - | (1U << TRAP_no_device) - | (1U << TRAP_invalid_op)); + | (1U << TRAP_no_device)); v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET; hvm_update_guest_cr(v, 0); diff -r 945232b8e226 -r 479f1fa084d6 xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Wed Jul 01 10:54:25 2009 +0100 +++ b/xen/arch/x86/hvm/vmx/vmx.c Wed Jul 01 14:58:31 2009 +0100 @@ -2258,34 +2258,26 @@ asmlinkage void vmx_enter_realmode(struc static void vmx_vmexit_ud_intercept(struct cpu_user_regs *regs) { - struct hvm_emulate_ctxt ctxt; - int rc; - - hvm_emulate_prepare(&ctxt, regs); - - rc = hvm_emulate_one(&ctxt); - - switch ( rc ) - { - case X86EMUL_UNHANDLEABLE: - gdprintk(XENLOG_WARNING, - "instruction emulation failed @ %04x:%lx: " - "%02x %02x %02x %02x %02x %02x\n", - hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel, - ctxt.insn_buf_eip, - ctxt.insn_buf[0], ctxt.insn_buf[1], - ctxt.insn_buf[2], ctxt.insn_buf[3], - ctxt.insn_buf[4], ctxt.insn_buf[5]); - return; - case X86EMUL_EXCEPTION: - if ( ctxt.exn_pending ) - hvm_inject_exception(ctxt.exn_vector, ctxt.exn_error_code, 0); - break; - default: - break; - } - - hvm_emulate_writeback(&ctxt); + struct hvm_emulate_ctxt ctxt; + int rc; + + hvm_emulate_prepare(&ctxt, regs); + + rc = hvm_emulate_one(&ctxt); + + switch ( rc ) + { + case X86EMUL_UNHANDLEABLE: + vmx_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + break; + case X86EMUL_EXCEPTION: + if ( ctxt.exn_pending ) + hvm_inject_exception(ctxt.exn_vector, ctxt.exn_error_code, 0); + /* fall through */ + default: + hvm_emulate_writeback(&ctxt); + break; + } } asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) diff -r 945232b8e226 -r 479f1fa084d6 xen/include/asm-x86/hvm/hvm.h --- a/xen/include/asm-x86/hvm/hvm.h Wed Jul 01 10:54:25 2009 +0100 +++ b/xen/include/asm-x86/hvm/hvm.h Wed Jul 01 14:58:31 2009 +0100 @@ -268,7 +268,7 @@ static inline int hvm_do_pmu_interrupt(s X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT))) /* These exceptions must always be intercepted. */ -#define HVM_TRAP_MASK (1U << TRAP_machine_check) +#define HVM_TRAP_MASK ((1U << TRAP_machine_check) | (1U << TRAP_invalid_op)) /* * x86 event types. This enumeration is valid for: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |