Add a workaround to the hypervisor detection for older versions of KVM.

Originally KVM set %eax to 0 in the cpuid leaf 0x4000000 rather than
to the highest supported leaf in the hypervisor "branch".  Detect this
case and fixup the %eax value so that the hypervisor is still
detected.

Reported by:	jpaetzel
Reviewed by:	kib
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D14810
This commit is contained in:
John Baldwin 2018-03-23 22:36:24 +00:00
parent 05e8899d7d
commit 7091608617
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=331466

View File

@ -1304,6 +1304,18 @@ identify_hypervisor(void)
if (cpu_feature2 & CPUID2_HV) {
vm_guest = VM_GUEST_VM;
do_cpuid(0x40000000, regs);
/*
* KVM from Linux kernels prior to commit
* 57c22e5f35aa4b9b2fe11f73f3e62bbf9ef36190 set %eax
* to 0 rather than a valid hv_high value. Check for
* the KVM signature bytes and fixup %eax to the
* highest supported leaf in that case.
*/
if (regs[0] == 0 && regs[1] == 0x4b4d564b &&
regs[2] == 0x564b4d56 && regs[3] == 0x0000004d)
regs[0] = 0x40000001;
if (regs[0] >= 0x40000000) {
hv_high = regs[0];
((u_int *)&hv_vendor)[0] = regs[1];