From: Andrew Cooper Date: Mon, 19 Dec 2016 12:05:20 +0000 (+0000) Subject: x86/hvm: Don't emulate all instructions hitting the #UD intercept X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~3100 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8867a48e058ab04bd269cab12ef4de5ee8ad5b7b;p=xen.git x86/hvm: Don't emulate all instructions hitting the #UD intercept Having the instruction emulator fill in all #UDs when using FEP is unhelpful when trying to test emulation behaviour against hardware. Restrict emulation from the #UD intercept to the cross-vendor case, and when a postive Forced Emulation Prefix has been identified. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 73d24dfa5b..12a6f466a6 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4002,13 +4002,15 @@ gp_fault: void hvm_ud_intercept(struct cpu_user_regs *regs) { + struct vcpu *cur = current; + bool should_emulate = + cur->domain->arch.x86_vendor != boot_cpu_data.x86_vendor; struct hvm_emulate_ctxt ctxt; hvm_emulate_init_once(&ctxt, regs); if ( opt_hvm_fep ) { - struct vcpu *cur = current; const struct segment_register *cs = &ctxt.seg_reg[x86_seg_cs]; uint32_t walk = (ctxt.seg_reg[x86_seg_ss].attr.fields.dpl == 3) ? PFEC_user_mode : 0; @@ -4032,9 +4034,17 @@ void hvm_ud_intercept(struct cpu_user_regs *regs) regs->eip = regs->_eip; add_taint(TAINT_HVM_FEP); + + should_emulate = true; } } + if ( !should_emulate ) + { + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); + return; + } + switch ( hvm_emulate_one(&ctxt) ) { case X86EMUL_UNHANDLEABLE: