diff --git a/sys/dev/hyperv/vmbus/x86/hyperv_reg.h b/sys/dev/hyperv/vmbus/x86/hyperv_reg.h --- a/sys/dev/hyperv/vmbus/x86/hyperv_reg.h +++ b/sys/dev/hyperv/vmbus/x86/hyperv_reg.h @@ -45,4 +45,10 @@ #define CPUID_LEAF_HV_IDENTITY 0x40000002 #define CPUID_LEAF_HV_FEATURES 0x40000003 #define CPUID_LEAF_HV_RECOMMENDS 0x40000004 + +#define CPUID_LEAF_HV_STACK_INTERFACE 0x40000081 +#define HYPERV_STACK_INTERFACE_EAX_SIG 0x31235356 /* "VS#1" */ +#define CPUID_LEAF_HV_STACK_PROPERTIES 0x40000082 +#define HYPERV_PROPERTIES_EXT_DEST_ID 0x00000004 + #endif /* !_HYPERV_REG_H_ */ diff --git a/sys/x86/x86/msi.c b/sys/x86/x86/msi.c --- a/sys/x86/x86/msi.c +++ b/sys/x86/x86/msi.c @@ -62,6 +62,7 @@ #include #include #include +#include /* Fields in address for Intel MSI messages. */ #define MSI_INTEL_ADDR_DEST 0x000ff000 @@ -402,6 +403,15 @@ (regs[0] & XEN_HVM_CPUID_EXT_DEST_ID)) ext_dest_id = 1; break; + case VM_GUEST_HV: + cpuid_count(CPUID_LEAF_HV_STACK_INTERFACE, 0, regs); + if (regs[0] != HYPERV_STACK_INTERFACE_EAX_SIG) + break; + cpuid_count(CPUID_LEAF_HV_STACK_PROPERTIES, 0, regs); + if ((ext_dest_id == -1) && + (regs[0] & HYPERV_PROPERTIES_EXT_DEST_ID)) + ext_dest_id = 1; + break; case VM_GUEST_KVM: kvm_cpuid_get_features(regs); if ((ext_dest_id == -1) &&