hyperv: Check for required features during VMBus probing
Some hypervisors claim to implement/advertise Hyper-V i.e. Xen and VirtualBox. Check for all required features when probing to prevent loading on hypervisors that do not fully comply with Hyper-V specifications. Change-Id: I7c1188a433cad5eff91dcffe9520a55926d0f4b5 Reviewed-on: https://review.haiku-os.org/c/haiku/+/10400 Reviewed-by: Jérôme Duval <[email protected]> Tested-by: Commit checker robot <[email protected]>
This commit is contained in:
@@ -37,6 +37,17 @@ vmbus_detect_hyperv()
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for required Hyper-V features
|
||||||
|
// Some hypervisors claim to be Hyper-V, but may not actually implement all features
|
||||||
|
get_cpuid(&cpuInfo, IA32_CPUID_LEAF_HV_FEAT_ID, 0);
|
||||||
|
TRACE("Hyper-V features: %08" B_PRIX32 ":%08" B_PRIX32 ":%08" B_PRIX32 ":%08" B_PRIX32 "\n",
|
||||||
|
cpuInfo.regs.eax, cpuInfo.regs.ebx, cpuInfo.regs.ecx, cpuInfo.regs.edx);
|
||||||
|
if ((cpuInfo.regs.eax & HV_CPUID_EAX_REQUIRED_FEATURES) == 0
|
||||||
|
|| (cpuInfo.regs.ebx & HV_CPUID_EBX_REQUIRED_FEATURES) == 0) {
|
||||||
|
TRACE("Missing required Hyper-V features\n");
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TRACE_HYPERV
|
#ifdef TRACE_HYPERV
|
||||||
get_cpuid(&cpuInfo, IA32_CPUID_LEAF_HV_SYS_ID, 0);
|
get_cpuid(&cpuInfo, IA32_CPUID_LEAF_HV_SYS_ID, 0);
|
||||||
TRACE("Hyper-V version: %d.%d.%d [SP%d]\n", cpuInfo.regs.ebx >> 16, cpuInfo.regs.ebx & 0xFFFF,
|
TRACE("Hyper-V version: %d.%d.%d [SP%d]\n", cpuInfo.regs.ebx >> 16, cpuInfo.regs.ebx & 0xFFFF,
|
||||||
|
|||||||
@@ -18,6 +18,32 @@
|
|||||||
// Hyper-V signature "Hv#1"
|
// Hyper-V signature "Hv#1"
|
||||||
#define HV_CPUID_INTERFACE_ID 0x31237648
|
#define HV_CPUID_INTERFACE_ID 0x31237648
|
||||||
|
|
||||||
|
// Hyper-V x86 features from feature CPUID leaf, eax register
|
||||||
|
// https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/datatypes/hv_partition_privilege_mask
|
||||||
|
#define HV_CPUID_FEATURE_VP_RUNTIME (1 << 0)
|
||||||
|
#define HV_CPUID_FEATURE_TIME_REF_COUNTER (1 << 1)
|
||||||
|
#define HV_CPUID_FEATURE_SYNIC (1 << 2)
|
||||||
|
#define HV_CPUID_FEATURE_SYNTIMER (1 << 3)
|
||||||
|
#define HV_CPUID_FEATURE_APIC (1 << 4)
|
||||||
|
#define HV_CPUID_FEATURE_HYPERCALL (1 << 5)
|
||||||
|
#define HV_CPUID_FEATURE_VP_INDEX (1 << 6)
|
||||||
|
#define HV_CPUID_FEATURE_RESET (1 << 7)
|
||||||
|
#define HV_CPUID_FEATURE_STATS (1 << 8)
|
||||||
|
#define HV_CPUID_FEATURE_REFERENCE_TSC (1 << 9)
|
||||||
|
#define HV_CPUID_FEATURE_GUEST_IDLE (1 << 10)
|
||||||
|
#define HV_CPUID_FEATURE_FREQUENCY (1 << 11)
|
||||||
|
#define HV_CPUID_FEATURE_REENLIGHTMENT (1 << 13)
|
||||||
|
|
||||||
|
// Hyper-V x86 features from feature CPUID leaf, ebx register
|
||||||
|
#define HV_CPUID_FEATURE_HYPERCALL_POST_MESSAGE (1 << 4)
|
||||||
|
#define HV_CPUID_FEATURE_HYPERCALL_SIGNAL_EVENT (1 << 5)
|
||||||
|
|
||||||
|
// Required feature bits for VMBus operation
|
||||||
|
#define HV_CPUID_EAX_REQUIRED_FEATURES (HV_CPUID_FEATURE_SYNIC | HV_CPUID_FEATURE_SYNTIMER \
|
||||||
|
| HV_CPUID_FEATURE_HYPERCALL)
|
||||||
|
#define HV_CPUID_EBX_REQUIRED_FEATURES (HV_CPUID_FEATURE_HYPERCALL_POST_MESSAGE \
|
||||||
|
| HV_CPUID_FEATURE_HYPERCALL_SIGNAL_EVENT)
|
||||||
|
|
||||||
// MSR registers
|
// MSR registers
|
||||||
#define IA32_MSR_HV_GUEST_OS_ID 0x40000000
|
#define IA32_MSR_HV_GUEST_OS_ID 0x40000000
|
||||||
#define IA32_MSR_HV_HYPERCALL 0x40000001
|
#define IA32_MSR_HV_HYPERCALL 0x40000001
|
||||||
|
|||||||
Reference in New Issue
Block a user