On Tue, Feb 17, 2026 at 03:11:58PM -0800, Mukesh R wrote: > From: Mukesh Rathor <[email protected]> > > MSVC compiler, used to compile the Microsoft Hyper-V hypervisor currently, > has an assert intrinsic that uses interrupt vector 0x29 to create an > exception. This will cause hypervisor to then crash and collect core. As > such, if this interrupt number is assigned to a device by Linux and the > device generates it, hypervisor will crash. There are two other such > vectors hard coded in the hypervisor, 0x2C and 0x2D for debug purposes. > Fortunately, the three vectors are part of the kernel driver space and > that makes it feasible to reserve them early so they are not assigned > later. > > Signed-off-by: Mukesh Rathor <[email protected]> > --- > > v1: Add ifndef CONFIG_X86_FRED (thanks hpa) > v2: replace ifndef with cpu_feature_enabled() (thanks hpa and tglx) > > arch/x86/kernel/cpu/mshyperv.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c > index 579fb2c64cfd..88ca127dc6d4 100644 > --- a/arch/x86/kernel/cpu/mshyperv.c > +++ b/arch/x86/kernel/cpu/mshyperv.c > @@ -478,6 +478,28 @@ int hv_get_hypervisor_version(union > hv_hypervisor_version_info *info) > } > EXPORT_SYMBOL_GPL(hv_get_hypervisor_version); > > +/* > + * Reserve vectors hard coded in the hypervisor. If used outside, the > hypervisor > + * will either crash or hang or attempt to break into debugger. > + */ > +static void hv_reserve_irq_vectors(void) > +{ > + #define HYPERV_DBG_FASTFAIL_VECTOR 0x29 > + #define HYPERV_DBG_ASSERT_VECTOR 0x2C > + #define HYPERV_DBG_SERVICE_VECTOR 0x2D > + > + if (cpu_feature_enabled(X86_FEATURE_FRED)) > + return; > + > + if (test_and_set_bit(HYPERV_DBG_ASSERT_VECTOR, system_vectors) || > + test_and_set_bit(HYPERV_DBG_SERVICE_VECTOR, system_vectors) || > + test_and_set_bit(HYPERV_DBG_FASTFAIL_VECTOR, system_vectors)) > + BUG(); > + > + pr_info("Hyper-V:reserve vectors: %d %d %d\n", HYPERV_DBG_ASSERT_VECTOR, > + HYPERV_DBG_SERVICE_VECTOR, HYPERV_DBG_FASTFAIL_VECTOR); > +} > + > static void __init ms_hyperv_init_platform(void) > { > int hv_max_functions_eax, eax; > @@ -510,6 +532,11 @@ static void __init ms_hyperv_init_platform(void) > > hv_identify_partition_type(); > > +#ifndef CONFIG_X86_FRED > + if (hv_root_partition()) > + hv_reserve_irq_vectors(); > +#endif /* CONFIG_X86_FRED */ > +
On a CONFIG_X86_FRED=y system, this call is skipped. However, the kernel may not have FRED active, so the vectors should still be reserved. I think the function should always be called. Wei > if (cc_platform_has(CC_ATTR_SNP_SECURE_AVIC)) > ms_hyperv.hints |= HV_DEPRECATING_AEOI_RECOMMENDED; > > -- > 2.51.2.vfs.0.1 > >
