]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/hyperv: Reserve 3 interrupt vectors used exclusively by MSHV
authorMukesh Rathor <mrathor@linux.microsoft.com>
Tue, 17 Feb 2026 23:11:58 +0000 (15:11 -0800)
committerWei Liu <wei.liu@kernel.org>
Wed, 18 Feb 2026 23:18:30 +0000 (23:18 +0000)
MSVC compiler, used to compile the Microsoft 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 <mrathor@linux.microsoft.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
arch/x86/kernel/cpu/mshyperv.c

index 579fb2c64cfd46c08c59a2fae40815e8ff147ff5..89a2eb8a07221d18d184f996aa4c6003d7c6132b 100644 (file)
@@ -478,6 +478,28 @@ int hv_get_hypervisor_version(union hv_hypervisor_version_info *info)
 }
 EXPORT_SYMBOL_GPL(hv_get_hypervisor_version);
 
+/*
+ * Reserved 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,9 @@ static void __init ms_hyperv_init_platform(void)
 
        hv_identify_partition_type();
 
+       if (hv_root_partition())
+               hv_reserve_irq_vectors();
+
        if (cc_platform_has(CC_ATTR_SNP_SECURE_AVIC))
                ms_hyperv.hints |= HV_DEPRECATING_AEOI_RECOMMENDED;