On Thu Jan 22, 2026 at 5:49 PM CET, Alejandro Vallejo wrote: > Remove cross-vendor support now that VMs can no longer have a different > vendor than the host, leaving FEP as the sole raison-d'ĂȘtre for #UD > interception. > > Not a functional change. > > Signed-off-by: Alejandro Vallejo <[email protected]> > --- > xen/arch/x86/hvm/hvm.c | 25 ++++--------------------- > xen/arch/x86/hvm/svm/svm.c | 4 ++-- > xen/arch/x86/hvm/vmx/vmx.c | 4 ++-- > 3 files changed, 8 insertions(+), 25 deletions(-) > > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c > index 4d37a93c57..611ff83a60 100644 > --- a/xen/arch/x86/hvm/hvm.c > +++ b/xen/arch/x86/hvm/hvm.c > @@ -3832,28 +3832,13 @@ int hvm_descriptor_access_intercept(uint64_t > exit_info, > return X86EMUL_OKAY; > } > > -static bool cf_check is_cross_vendor( > - const struct x86_emulate_state *state, const struct x86_emulate_ctxt > *ctxt) > -{ > - switch ( ctxt->opcode ) > - { > - case X86EMUL_OPC(0x0f, 0x05): /* syscall */ > - case X86EMUL_OPC(0x0f, 0x34): /* sysenter */ > - case X86EMUL_OPC(0x0f, 0x35): /* sysexit */ > - return true; > - } > - > - return false; > -} > - > +#ifdef CONFIG_HVM_FEP > void hvm_ud_intercept(struct cpu_user_regs *regs) > { > struct vcpu *cur = current; > - bool should_emulate = > - cur->domain->arch.cpuid->x86_vendor != boot_cpu_data.x86_vendor; > struct hvm_emulate_ctxt ctxt; > > - hvm_emulate_init_once(&ctxt, opt_hvm_fep ? NULL : is_cross_vendor, regs); > + hvm_emulate_init_once(&ctxt, NULL, regs); > > if ( opt_hvm_fep ) > { > @@ -3878,12 +3863,9 @@ void hvm_ud_intercept(struct cpu_user_regs *regs) > regs->rip = (uint32_t)regs->rip; > > add_taint(TAINT_HVM_FEP); > - > - should_emulate = true; > } > } > - > - if ( !should_emulate ) > + else
review to self. This is buggy. It allows instruction emulation when HVM_FEP is enabled, but the FEP is absent in the particular instruction that caused the exception. #UD should be re-injected when the instruction doesn't have the prefix. Cheers, Alejandro
