Message ID | 1479915538-15282-5-git-send-email-andrew.cooper3@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> -----Original Message----- > From: Andrew Cooper [mailto:andrew.cooper3@citrix.com] > Sent: 23 November 2016 15:39 > To: Xen-devel <xen-devel@lists.xen.org> > Cc: Andrew Cooper <Andrew.Cooper3@citrix.com>; Jan Beulich > <JBeulich@suse.com>; Paul Durrant <Paul.Durrant@citrix.com>; Jun > Nakajima <jun.nakajima@intel.com>; Kevin Tian <kevin.tian@intel.com>; > Boris Ostrovsky <boris.ostrovsky@oracle.com>; Suravee Suthikulpanit > <suravee.suthikulpanit@amd.com> > Subject: [PATCH 04/15] x86/emul: Rename > HVM_DELIVER_NO_ERROR_CODE to X86_EVENT_NO_EC > > and move it to live with the other x86_event infrastructure in > x86_emulate.h. > Switch it and x86_event.error_code to being signed, matching the rest of the > code. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Paul Durrant <paul.durrant@citrix.com> > --- > CC: Jan Beulich <JBeulich@suse.com> > CC: Paul Durrant <paul.durrant@citrix.com> > CC: Jun Nakajima <jun.nakajima@intel.com> > CC: Kevin Tian <kevin.tian@intel.com> > CC: Boris Ostrovsky <boris.ostrovsky@oracle.com> > CC: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> > --- > xen/arch/x86/hvm/emulate.c | 2 +- > xen/arch/x86/hvm/hvm.c | 6 +++--- > xen/arch/x86/hvm/nestedhvm.c | 2 +- > xen/arch/x86/hvm/svm/nestedsvm.c | 6 +++--- > xen/arch/x86/hvm/svm/svm.c | 22 +++++++++++----------- > xen/arch/x86/hvm/vmx/intr.c | 2 +- > xen/arch/x86/hvm/vmx/vmx.c | 23 ++++++++++++----------- > xen/arch/x86/hvm/vmx/vvmx.c | 2 +- > xen/arch/x86/x86_emulate/x86_emulate.h | 3 ++- > xen/include/asm-x86/hvm/support.h | 2 -- > 10 files changed, 35 insertions(+), 35 deletions(-) > > diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c > index d0c3185..790e9c1 100644 > --- a/xen/arch/x86/hvm/emulate.c > +++ b/xen/arch/x86/hvm/emulate.c > @@ -1609,7 +1609,7 @@ static int hvmemul_inject_sw_interrupt( > > hvmemul_ctxt->exn_pending = 1; > hvmemul_ctxt->trap.vector = vector; > - hvmemul_ctxt->trap.error_code = HVM_DELIVER_NO_ERROR_CODE; > + hvmemul_ctxt->trap.error_code = X86_EVENT_NO_EC; > hvmemul_ctxt->trap.insn_len = insn_len; > > return X86EMUL_OKAY; > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c > index 7b434aa..b950842 100644 > --- a/xen/arch/x86/hvm/hvm.c > +++ b/xen/arch/x86/hvm/hvm.c > @@ -502,7 +502,7 @@ void hvm_do_resume(struct vcpu *v) > kind = EMUL_KIND_SET_CONTEXT_INSN; > > hvm_emulate_one_vm_event(kind, TRAP_invalid_op, > - HVM_DELIVER_NO_ERROR_CODE); > + X86_EVENT_NO_EC); > > v->arch.vm_event->emulate_flags = 0; > } > @@ -3054,7 +3054,7 @@ void hvm_task_switch( > } > > if ( (tss.trace & 1) && !exn_raised ) > - hvm_inject_hw_exception(TRAP_debug, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); > > out: > hvm_unmap_entry(optss_desc); > @@ -4073,7 +4073,7 @@ void hvm_ud_intercept(struct cpu_user_regs > *regs) > switch ( hvm_emulate_one(&ctxt) ) > { > case X86EMUL_UNHANDLEABLE: > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > break; > case X86EMUL_EXCEPTION: > if ( ctxt.exn_pending ) > diff --git a/xen/arch/x86/hvm/nestedhvm.c > b/xen/arch/x86/hvm/nestedhvm.c > index caad525..c4671d8 100644 > --- a/xen/arch/x86/hvm/nestedhvm.c > +++ b/xen/arch/x86/hvm/nestedhvm.c > @@ -17,7 +17,7 @@ > */ > > #include <asm/msr.h> > -#include <asm/hvm/support.h> /* for > HVM_DELIVER_NO_ERROR_CODE */ > +#include <asm/hvm/support.h> > #include <asm/hvm/hvm.h> > #include <asm/p2m.h> /* for struct p2m_domain */ > #include <asm/hvm/nestedhvm.h> > diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c > b/xen/arch/x86/hvm/svm/nestedsvm.c > index b6b8526..8c9b073 100644 > --- a/xen/arch/x86/hvm/svm/nestedsvm.c > +++ b/xen/arch/x86/hvm/svm/nestedsvm.c > @@ -756,7 +756,7 @@ nsvm_vcpu_vmrun(struct vcpu *v, struct > cpu_user_regs *regs) > default: > gdprintk(XENLOG_ERR, > "nsvm_vcpu_vmentry failed, injecting #UD\n"); > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > /* Must happen after hvm_inject_hw_exception or it doesn't work > right. */ > nv->nv_vmswitch_in_progress = 0; > return 1; > @@ -1581,7 +1581,7 @@ void svm_vmexit_do_stgi(struct cpu_user_regs > *regs, struct vcpu *v) > unsigned int inst_len; > > if ( !nestedhvm_enabled(v->domain) ) { > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > return; > } > > @@ -1601,7 +1601,7 @@ void svm_vmexit_do_clgi(struct cpu_user_regs > *regs, struct vcpu *v) > vintr_t intr; > > if ( !nestedhvm_enabled(v->domain) ) { > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > return; > } > > diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c > index 66eb30b..fb4fd0b 100644 > --- a/xen/arch/x86/hvm/svm/svm.c > +++ b/xen/arch/x86/hvm/svm/svm.c > @@ -89,7 +89,7 @@ static DEFINE_SPINLOCK(osvw_lock); > static void svm_crash_or_fault(struct vcpu *v) > { > if ( vmcb_get_cpl(v->arch.hvm_svm.vmcb) ) > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > else > domain_crash(v->domain); > } > @@ -116,7 +116,7 @@ void __update_guest_eip(struct cpu_user_regs > *regs, unsigned int inst_len) > curr->arch.hvm_svm.vmcb->interrupt_shadow = 0; > > if ( regs->eflags & X86_EFLAGS_TF ) > - hvm_inject_hw_exception(TRAP_debug, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); > } > > static void svm_cpu_down(void) > @@ -1285,7 +1285,7 @@ static void svm_inject_event(const struct > x86_event *event) > > default: > eventinj.fields.type = X86_EVENTTYPE_HW_EXCEPTION; > - eventinj.fields.ev = (_event.error_code != > HVM_DELIVER_NO_ERROR_CODE); > + eventinj.fields.ev = (_event.error_code != X86_EVENT_NO_EC); > eventinj.fields.errorcode = _event.error_code; > break; > } > @@ -1553,7 +1553,7 @@ static void svm_fpu_dirty_intercept(void) > { > /* Check if l1 guest must make FPU ready for the l2 guest */ > if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS ) > - hvm_inject_hw_exception(TRAP_no_device, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_no_device, X86_EVENT_NO_EC); > else > vmcb_set_cr0(n1vmcb, vmcb_get_cr0(n1vmcb) & ~X86_CR0_TS); > return; > @@ -2022,14 +2022,14 @@ svm_vmexit_do_vmrun(struct cpu_user_regs > *regs, > if ( !nsvm_efer_svm_enabled(v) ) > { > gdprintk(XENLOG_ERR, "VMRUN: nestedhvm disabled, injecting > #UD\n"); > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > return; > } > > if ( !nestedsvm_vmcb_map(v, vmcbaddr) ) > { > gdprintk(XENLOG_ERR, "VMRUN: mapping vmcb failed, injecting > #GP\n"); > - hvm_inject_hw_exception(TRAP_gp_fault, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_gp_fault, X86_EVENT_NO_EC); > return; > } > > @@ -2101,7 +2101,7 @@ svm_vmexit_do_vmload(struct vmcb_struct > *vmcb, > return; > > inject: > - hvm_inject_hw_exception(ret, HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(ret, X86_EVENT_NO_EC); > return; > } > > @@ -2139,7 +2139,7 @@ svm_vmexit_do_vmsave(struct vmcb_struct > *vmcb, > return; > > inject: > - hvm_inject_hw_exception(ret, HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(ret, X86_EVENT_NO_EC); > return; > } > > @@ -2428,7 +2428,7 @@ void svm_vmexit_handler(struct cpu_user_regs > *regs) > > case VMEXIT_EXCEPTION_DB: > if ( !v->domain->debugger_attached ) > - hvm_inject_hw_exception(TRAP_debug, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); > else > domain_pause_for_debugger(); > break; > @@ -2616,7 +2616,7 @@ void svm_vmexit_handler(struct cpu_user_regs > *regs) > > case VMEXIT_MONITOR: > case VMEXIT_MWAIT: > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > break; > > case VMEXIT_VMRUN: > @@ -2635,7 +2635,7 @@ void svm_vmexit_handler(struct cpu_user_regs > *regs) > svm_vmexit_do_clgi(regs, v); > break; > case VMEXIT_SKINIT: > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > break; > > case VMEXIT_XSETBV: > diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c > index 8fca08c..639a705 100644 > --- a/xen/arch/x86/hvm/vmx/intr.c > +++ b/xen/arch/x86/hvm/vmx/intr.c > @@ -302,7 +302,7 @@ void vmx_intr_assist(void) > } > else if ( intack.source == hvm_intsrc_mce ) > { > - hvm_inject_hw_exception(TRAP_machine_check, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_machine_check, > X86_EVENT_NO_EC); > } > else if ( cpu_has_vmx_virtual_intr_delivery && > intack.source != hvm_intsrc_pic && > diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c > index b1d8a0b..eb7c902 100644 > --- a/xen/arch/x86/hvm/vmx/vmx.c > +++ b/xen/arch/x86/hvm/vmx/vmx.c > @@ -1646,7 +1646,8 @@ static void __vmx_inject_exception(int trap, int > type, int error_code) > intr_fields = INTR_INFO_VALID_MASK | > MASK_INSR(type, INTR_INFO_INTR_TYPE_MASK) | > MASK_INSR(trap, INTR_INFO_VECTOR_MASK); > - if ( error_code != HVM_DELIVER_NO_ERROR_CODE ) { > + if ( error_code != X86_EVENT_NO_EC ) > + { > __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); > intr_fields |= INTR_INFO_DELIVER_CODE_MASK; > } > @@ -1671,12 +1672,12 @@ void vmx_inject_extint(int trap, uint8_t source) > INTR_INFO_VALID_MASK | > MASK_INSR(X86_EVENTTYPE_EXT_INTR, > INTR_INFO_INTR_TYPE_MASK) | > MASK_INSR(trap, INTR_INFO_VECTOR_MASK), > - HVM_DELIVER_NO_ERROR_CODE, source); > + X86_EVENT_NO_EC, source); > return; > } > } > __vmx_inject_exception(trap, X86_EVENTTYPE_EXT_INTR, > - HVM_DELIVER_NO_ERROR_CODE); > + X86_EVENT_NO_EC); > } > > void vmx_inject_nmi(void) > @@ -1691,12 +1692,12 @@ void vmx_inject_nmi(void) > INTR_INFO_VALID_MASK | > MASK_INSR(X86_EVENTTYPE_NMI, INTR_INFO_INTR_TYPE_MASK) | > MASK_INSR(TRAP_nmi, INTR_INFO_VECTOR_MASK), > - HVM_DELIVER_NO_ERROR_CODE, hvm_intsrc_nmi); > + X86_EVENT_NO_EC, hvm_intsrc_nmi); > return; > } > } > __vmx_inject_exception(2, X86_EVENTTYPE_NMI, > - HVM_DELIVER_NO_ERROR_CODE); > + X86_EVENT_NO_EC); > } > > /* > @@ -2111,7 +2112,7 @@ static bool_t vmx_vcpu_emulate_ve(struct vcpu > *v) > vmx_vmcs_exit(v); > > hvm_inject_hw_exception(TRAP_virtualisation, > - HVM_DELIVER_NO_ERROR_CODE); > + X86_EVENT_NO_EC); > > out: > hvm_unmap_guest_frame(veinfo, 0); > @@ -2387,7 +2388,7 @@ void update_guest_eip(void) > } > > if ( regs->eflags & X86_EFLAGS_TF ) > - hvm_inject_hw_exception(TRAP_debug, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); > } > > static void vmx_fpu_dirty_intercept(void) > @@ -3213,7 +3214,7 @@ static void vmx_propagate_intr(unsigned long intr) > event.error_code = tmp; > } > else > - event.error_code = HVM_DELIVER_NO_ERROR_CODE; > + event.error_code = X86_EVENT_NO_EC; > > if ( event.type >= X86_EVENTTYPE_SW_INTERRUPT ) > { > @@ -3770,7 +3771,7 @@ void vmx_vmexit_handler(struct cpu_user_regs > *regs) > > case EXIT_REASON_VMFUNC: > if ( vmx_vmfunc_intercept(regs) != X86EMUL_OKAY ) > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > else > update_guest_eip(); > break; > @@ -3784,7 +3785,7 @@ void vmx_vmexit_handler(struct cpu_user_regs > *regs) > * as far as vmexit. > */ > WARN_ON(exit_reason == EXIT_REASON_GETSEC); > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > break; > > case EXIT_REASON_TPR_BELOW_THRESHOLD: > @@ -3909,7 +3910,7 @@ void vmx_vmexit_handler(struct cpu_user_regs > *regs) > vmx_get_segment_register(v, x86_seg_ss, &ss); > if ( ss.attr.fields.dpl ) > hvm_inject_hw_exception(TRAP_invalid_op, > - HVM_DELIVER_NO_ERROR_CODE); > + X86_EVENT_NO_EC); > else > domain_crash(v->domain); > } > diff --git a/xen/arch/x86/hvm/vmx/vvmx.c > b/xen/arch/x86/hvm/vmx/vvmx.c > index b5837d4..efaf54c 100644 > --- a/xen/arch/x86/hvm/vmx/vvmx.c > +++ b/xen/arch/x86/hvm/vmx/vvmx.c > @@ -380,7 +380,7 @@ static int vmx_inst_check_privilege(struct > cpu_user_regs *regs, int vmxop_check) > > invalid_op: > gdprintk(XENLOG_ERR, "vmx_inst_check_privilege: invalid_op\n"); > - hvm_inject_hw_exception(TRAP_invalid_op, > HVM_DELIVER_NO_ERROR_CODE); > + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); > return X86EMUL_EXCEPTION; > > gp_fault: > diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h > b/xen/arch/x86/x86_emulate/x86_emulate.h > index b0d8e6f..9df083e 100644 > --- a/xen/arch/x86/x86_emulate/x86_emulate.h > +++ b/xen/arch/x86/x86_emulate/x86_emulate.h > @@ -80,12 +80,13 @@ enum x86_event_type { > X86_EVENTTYPE_PRI_SW_EXCEPTION, /* ICEBP (F1) */ > X86_EVENTTYPE_SW_EXCEPTION, /* INT3 (CC), INTO (CE) */ > }; > +#define X86_EVENT_NO_EC (-1) /* No error code. */ > > struct x86_event { > int16_t vector; > uint8_t type; /* X86_EVENTTYPE_* */ > uint8_t insn_len; /* Instruction length */ > - uint32_t error_code; /* HVM_DELIVER_NO_ERROR_CODE if n/a */ > + int32_t error_code; /* X86_EVENT_NO_EC if n/a */ > unsigned long cr2; /* Only for TRAP_page_fault h/w exception */ > }; > > diff --git a/xen/include/asm-x86/hvm/support.h b/xen/include/asm- > x86/hvm/support.h > index 2984abc..9938450 100644 > --- a/xen/include/asm-x86/hvm/support.h > +++ b/xen/include/asm-x86/hvm/support.h > @@ -25,8 +25,6 @@ > #include <xen/hvm/save.h> > #include <asm/processor.h> > > -#define HVM_DELIVER_NO_ERROR_CODE (~0U) > - > #ifndef NDEBUG > #define DBG_LEVEL_0 (1 << 0) > #define DBG_LEVEL_1 (1 << 1) > -- > 2.1.4
On 11/23/2016 10:38 AM, Andrew Cooper wrote: > and move it to live with the other x86_event infrastructure in x86_emulate.h. > Switch it and x86_event.error_code to being signed, matching the rest of the > code. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
> From: Andrew Cooper [mailto:andrew.cooper3@citrix.com] > Sent: Wednesday, November 23, 2016 11:39 PM > > and move it to live with the other x86_event infrastructure in x86_emulate.h. > Switch it and x86_event.error_code to being signed, matching the rest of the > code. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com>
>>> On 23.11.16 at 16:38, <andrew.cooper3@citrix.com> wrote: > and move it to live with the other x86_event infrastructure in x86_emulate.h. > Switch it and x86_event.error_code to being signed, matching the rest of the > code. > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Preferrably re-based on top of the SVM patch just sent, Reviewed-by: Jan Beulich <jbeulich@suse.com> Jan
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index d0c3185..790e9c1 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -1609,7 +1609,7 @@ static int hvmemul_inject_sw_interrupt( hvmemul_ctxt->exn_pending = 1; hvmemul_ctxt->trap.vector = vector; - hvmemul_ctxt->trap.error_code = HVM_DELIVER_NO_ERROR_CODE; + hvmemul_ctxt->trap.error_code = X86_EVENT_NO_EC; hvmemul_ctxt->trap.insn_len = insn_len; return X86EMUL_OKAY; diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 7b434aa..b950842 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -502,7 +502,7 @@ void hvm_do_resume(struct vcpu *v) kind = EMUL_KIND_SET_CONTEXT_INSN; hvm_emulate_one_vm_event(kind, TRAP_invalid_op, - HVM_DELIVER_NO_ERROR_CODE); + X86_EVENT_NO_EC); v->arch.vm_event->emulate_flags = 0; } @@ -3054,7 +3054,7 @@ void hvm_task_switch( } if ( (tss.trace & 1) && !exn_raised ) - hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); out: hvm_unmap_entry(optss_desc); @@ -4073,7 +4073,7 @@ void hvm_ud_intercept(struct cpu_user_regs *regs) switch ( hvm_emulate_one(&ctxt) ) { case X86EMUL_UNHANDLEABLE: - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); break; case X86EMUL_EXCEPTION: if ( ctxt.exn_pending ) diff --git a/xen/arch/x86/hvm/nestedhvm.c b/xen/arch/x86/hvm/nestedhvm.c index caad525..c4671d8 100644 --- a/xen/arch/x86/hvm/nestedhvm.c +++ b/xen/arch/x86/hvm/nestedhvm.c @@ -17,7 +17,7 @@ */ #include <asm/msr.h> -#include <asm/hvm/support.h> /* for HVM_DELIVER_NO_ERROR_CODE */ +#include <asm/hvm/support.h> #include <asm/hvm/hvm.h> #include <asm/p2m.h> /* for struct p2m_domain */ #include <asm/hvm/nestedhvm.h> diff --git a/xen/arch/x86/hvm/svm/nestedsvm.c b/xen/arch/x86/hvm/svm/nestedsvm.c index b6b8526..8c9b073 100644 --- a/xen/arch/x86/hvm/svm/nestedsvm.c +++ b/xen/arch/x86/hvm/svm/nestedsvm.c @@ -756,7 +756,7 @@ nsvm_vcpu_vmrun(struct vcpu *v, struct cpu_user_regs *regs) default: gdprintk(XENLOG_ERR, "nsvm_vcpu_vmentry failed, injecting #UD\n"); - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); /* Must happen after hvm_inject_hw_exception or it doesn't work right. */ nv->nv_vmswitch_in_progress = 0; return 1; @@ -1581,7 +1581,7 @@ void svm_vmexit_do_stgi(struct cpu_user_regs *regs, struct vcpu *v) unsigned int inst_len; if ( !nestedhvm_enabled(v->domain) ) { - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); return; } @@ -1601,7 +1601,7 @@ void svm_vmexit_do_clgi(struct cpu_user_regs *regs, struct vcpu *v) vintr_t intr; if ( !nestedhvm_enabled(v->domain) ) { - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); return; } diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 66eb30b..fb4fd0b 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -89,7 +89,7 @@ static DEFINE_SPINLOCK(osvw_lock); static void svm_crash_or_fault(struct vcpu *v) { if ( vmcb_get_cpl(v->arch.hvm_svm.vmcb) ) - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); else domain_crash(v->domain); } @@ -116,7 +116,7 @@ void __update_guest_eip(struct cpu_user_regs *regs, unsigned int inst_len) curr->arch.hvm_svm.vmcb->interrupt_shadow = 0; if ( regs->eflags & X86_EFLAGS_TF ) - hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); } static void svm_cpu_down(void) @@ -1285,7 +1285,7 @@ static void svm_inject_event(const struct x86_event *event) default: eventinj.fields.type = X86_EVENTTYPE_HW_EXCEPTION; - eventinj.fields.ev = (_event.error_code != HVM_DELIVER_NO_ERROR_CODE); + eventinj.fields.ev = (_event.error_code != X86_EVENT_NO_EC); eventinj.fields.errorcode = _event.error_code; break; } @@ -1553,7 +1553,7 @@ static void svm_fpu_dirty_intercept(void) { /* Check if l1 guest must make FPU ready for the l2 guest */ if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS ) - hvm_inject_hw_exception(TRAP_no_device, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_no_device, X86_EVENT_NO_EC); else vmcb_set_cr0(n1vmcb, vmcb_get_cr0(n1vmcb) & ~X86_CR0_TS); return; @@ -2022,14 +2022,14 @@ svm_vmexit_do_vmrun(struct cpu_user_regs *regs, if ( !nsvm_efer_svm_enabled(v) ) { gdprintk(XENLOG_ERR, "VMRUN: nestedhvm disabled, injecting #UD\n"); - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); return; } if ( !nestedsvm_vmcb_map(v, vmcbaddr) ) { gdprintk(XENLOG_ERR, "VMRUN: mapping vmcb failed, injecting #GP\n"); - hvm_inject_hw_exception(TRAP_gp_fault, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_gp_fault, X86_EVENT_NO_EC); return; } @@ -2101,7 +2101,7 @@ svm_vmexit_do_vmload(struct vmcb_struct *vmcb, return; inject: - hvm_inject_hw_exception(ret, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(ret, X86_EVENT_NO_EC); return; } @@ -2139,7 +2139,7 @@ svm_vmexit_do_vmsave(struct vmcb_struct *vmcb, return; inject: - hvm_inject_hw_exception(ret, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(ret, X86_EVENT_NO_EC); return; } @@ -2428,7 +2428,7 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) case VMEXIT_EXCEPTION_DB: if ( !v->domain->debugger_attached ) - hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); else domain_pause_for_debugger(); break; @@ -2616,7 +2616,7 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) case VMEXIT_MONITOR: case VMEXIT_MWAIT: - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); break; case VMEXIT_VMRUN: @@ -2635,7 +2635,7 @@ void svm_vmexit_handler(struct cpu_user_regs *regs) svm_vmexit_do_clgi(regs, v); break; case VMEXIT_SKINIT: - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); break; case VMEXIT_XSETBV: diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c index 8fca08c..639a705 100644 --- a/xen/arch/x86/hvm/vmx/intr.c +++ b/xen/arch/x86/hvm/vmx/intr.c @@ -302,7 +302,7 @@ void vmx_intr_assist(void) } else if ( intack.source == hvm_intsrc_mce ) { - hvm_inject_hw_exception(TRAP_machine_check, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_machine_check, X86_EVENT_NO_EC); } else if ( cpu_has_vmx_virtual_intr_delivery && intack.source != hvm_intsrc_pic && diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index b1d8a0b..eb7c902 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -1646,7 +1646,8 @@ static void __vmx_inject_exception(int trap, int type, int error_code) intr_fields = INTR_INFO_VALID_MASK | MASK_INSR(type, INTR_INFO_INTR_TYPE_MASK) | MASK_INSR(trap, INTR_INFO_VECTOR_MASK); - if ( error_code != HVM_DELIVER_NO_ERROR_CODE ) { + if ( error_code != X86_EVENT_NO_EC ) + { __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); intr_fields |= INTR_INFO_DELIVER_CODE_MASK; } @@ -1671,12 +1672,12 @@ void vmx_inject_extint(int trap, uint8_t source) INTR_INFO_VALID_MASK | MASK_INSR(X86_EVENTTYPE_EXT_INTR, INTR_INFO_INTR_TYPE_MASK) | MASK_INSR(trap, INTR_INFO_VECTOR_MASK), - HVM_DELIVER_NO_ERROR_CODE, source); + X86_EVENT_NO_EC, source); return; } } __vmx_inject_exception(trap, X86_EVENTTYPE_EXT_INTR, - HVM_DELIVER_NO_ERROR_CODE); + X86_EVENT_NO_EC); } void vmx_inject_nmi(void) @@ -1691,12 +1692,12 @@ void vmx_inject_nmi(void) INTR_INFO_VALID_MASK | MASK_INSR(X86_EVENTTYPE_NMI, INTR_INFO_INTR_TYPE_MASK) | MASK_INSR(TRAP_nmi, INTR_INFO_VECTOR_MASK), - HVM_DELIVER_NO_ERROR_CODE, hvm_intsrc_nmi); + X86_EVENT_NO_EC, hvm_intsrc_nmi); return; } } __vmx_inject_exception(2, X86_EVENTTYPE_NMI, - HVM_DELIVER_NO_ERROR_CODE); + X86_EVENT_NO_EC); } /* @@ -2111,7 +2112,7 @@ static bool_t vmx_vcpu_emulate_ve(struct vcpu *v) vmx_vmcs_exit(v); hvm_inject_hw_exception(TRAP_virtualisation, - HVM_DELIVER_NO_ERROR_CODE); + X86_EVENT_NO_EC); out: hvm_unmap_guest_frame(veinfo, 0); @@ -2387,7 +2388,7 @@ void update_guest_eip(void) } if ( regs->eflags & X86_EFLAGS_TF ) - hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_debug, X86_EVENT_NO_EC); } static void vmx_fpu_dirty_intercept(void) @@ -3213,7 +3214,7 @@ static void vmx_propagate_intr(unsigned long intr) event.error_code = tmp; } else - event.error_code = HVM_DELIVER_NO_ERROR_CODE; + event.error_code = X86_EVENT_NO_EC; if ( event.type >= X86_EVENTTYPE_SW_INTERRUPT ) { @@ -3770,7 +3771,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) case EXIT_REASON_VMFUNC: if ( vmx_vmfunc_intercept(regs) != X86EMUL_OKAY ) - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); else update_guest_eip(); break; @@ -3784,7 +3785,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) * as far as vmexit. */ WARN_ON(exit_reason == EXIT_REASON_GETSEC); - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); break; case EXIT_REASON_TPR_BELOW_THRESHOLD: @@ -3909,7 +3910,7 @@ void vmx_vmexit_handler(struct cpu_user_regs *regs) vmx_get_segment_register(v, x86_seg_ss, &ss); if ( ss.attr.fields.dpl ) hvm_inject_hw_exception(TRAP_invalid_op, - HVM_DELIVER_NO_ERROR_CODE); + X86_EVENT_NO_EC); else domain_crash(v->domain); } diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index b5837d4..efaf54c 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -380,7 +380,7 @@ static int vmx_inst_check_privilege(struct cpu_user_regs *regs, int vmxop_check) invalid_op: gdprintk(XENLOG_ERR, "vmx_inst_check_privilege: invalid_op\n"); - hvm_inject_hw_exception(TRAP_invalid_op, HVM_DELIVER_NO_ERROR_CODE); + hvm_inject_hw_exception(TRAP_invalid_op, X86_EVENT_NO_EC); return X86EMUL_EXCEPTION; gp_fault: diff --git a/xen/arch/x86/x86_emulate/x86_emulate.h b/xen/arch/x86/x86_emulate/x86_emulate.h index b0d8e6f..9df083e 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.h +++ b/xen/arch/x86/x86_emulate/x86_emulate.h @@ -80,12 +80,13 @@ enum x86_event_type { X86_EVENTTYPE_PRI_SW_EXCEPTION, /* ICEBP (F1) */ X86_EVENTTYPE_SW_EXCEPTION, /* INT3 (CC), INTO (CE) */ }; +#define X86_EVENT_NO_EC (-1) /* No error code. */ struct x86_event { int16_t vector; uint8_t type; /* X86_EVENTTYPE_* */ uint8_t insn_len; /* Instruction length */ - uint32_t error_code; /* HVM_DELIVER_NO_ERROR_CODE if n/a */ + int32_t error_code; /* X86_EVENT_NO_EC if n/a */ unsigned long cr2; /* Only for TRAP_page_fault h/w exception */ }; diff --git a/xen/include/asm-x86/hvm/support.h b/xen/include/asm-x86/hvm/support.h index 2984abc..9938450 100644 --- a/xen/include/asm-x86/hvm/support.h +++ b/xen/include/asm-x86/hvm/support.h @@ -25,8 +25,6 @@ #include <xen/hvm/save.h> #include <asm/processor.h> -#define HVM_DELIVER_NO_ERROR_CODE (~0U) - #ifndef NDEBUG #define DBG_LEVEL_0 (1 << 0) #define DBG_LEVEL_1 (1 << 1)
and move it to live with the other x86_event infrastructure in x86_emulate.h. Switch it and x86_event.error_code to being signed, matching the rest of the code. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- CC: Jan Beulich <JBeulich@suse.com> CC: Paul Durrant <paul.durrant@citrix.com> CC: Jun Nakajima <jun.nakajima@intel.com> CC: Kevin Tian <kevin.tian@intel.com> CC: Boris Ostrovsky <boris.ostrovsky@oracle.com> CC: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> --- xen/arch/x86/hvm/emulate.c | 2 +- xen/arch/x86/hvm/hvm.c | 6 +++--- xen/arch/x86/hvm/nestedhvm.c | 2 +- xen/arch/x86/hvm/svm/nestedsvm.c | 6 +++--- xen/arch/x86/hvm/svm/svm.c | 22 +++++++++++----------- xen/arch/x86/hvm/vmx/intr.c | 2 +- xen/arch/x86/hvm/vmx/vmx.c | 23 ++++++++++++----------- xen/arch/x86/hvm/vmx/vvmx.c | 2 +- xen/arch/x86/x86_emulate/x86_emulate.h | 3 ++- xen/include/asm-x86/hvm/support.h | 2 -- 10 files changed, 35 insertions(+), 35 deletions(-)