svn commit: r273175 - projects/bhyve_svm/sys/amd64/vmm
Neel Natu
neel at FreeBSD.org
Thu Oct 16 18:13:11 UTC 2014
Author: neel
Date: Thu Oct 16 18:13:10 2014
New Revision: 273175
URL: https://svnweb.freebsd.org/changeset/base/273175
Log:
Fix topology enumeration issues exposed by AMD Bulldozer Family 15h processor.
Initialize CPUID.80000008H:ECX[7:0] with the number of logical processors in
the package. This fixes a panic during early boot in NetBSD 7.0 BETA.
Clear the Topology Extension feature bit from CPUID.80000001H:ECX since we
don't emulate leaves 0x8000001D and 0x8000001E. This fixes a divide by zero
panic in early boot in Centos 6.4.
Tested on an "AMD Opteron 6320" courtesy of Ben Perrault.
Reviewed by: grehan
Modified:
projects/bhyve_svm/sys/amd64/vmm/x86.c
Modified: projects/bhyve_svm/sys/amd64/vmm/x86.c
==============================================================================
--- projects/bhyve_svm/sys/amd64/vmm/x86.c Thu Oct 16 18:04:43 2014 (r273174)
+++ projects/bhyve_svm/sys/amd64/vmm/x86.c Thu Oct 16 18:13:10 2014 (r273175)
@@ -44,6 +44,8 @@ __FBSDID("$FreeBSD$");
#include <machine/vmm.h>
#include "vmm_host.h"
+#include "vmm_ktr.h"
+#include "vmm_util.h"
#include "x86.h"
SYSCTL_DECL(_hw_vmm);
@@ -54,6 +56,8 @@ static SYSCTL_NODE(_hw_vmm, OID_AUTO, to
static const char bhyve_id[12] = "bhyve bhyve ";
static uint64_t bhyve_xcpuids;
+SYSCTL_ULONG(_hw_vmm, OID_AUTO, bhyve_xcpuids, CTLFLAG_RW, &bhyve_xcpuids, 0,
+ "Number of times an unknown cpuid leaf was accessed");
/*
* The default CPU topology is a single thread per package.
@@ -91,6 +95,8 @@ x86_emulate_cpuid(struct vm *vm, int vcp
unsigned int func, regs[4], logical_cpus;
enum x2apic_state x2apic_state;
+ VCPU_CTR2(vm, vcpu_id, "cpuid %#x,%#x", *eax, *ecx);
+
/*
* Requests for invalid CPUID levels should map to the highest
* available level instead.
@@ -124,17 +130,33 @@ x86_emulate_cpuid(struct vm *vm, int vcp
case CPUID_8000_0003:
case CPUID_8000_0004:
case CPUID_8000_0006:
+ cpuid_count(*eax, *ecx, regs);
+ break;
case CPUID_8000_0008:
cpuid_count(*eax, *ecx, regs);
+ if (vmm_is_amd()) {
+ /*
+ * XXX this might appear silly because AMD
+ * cpus don't have threads.
+ *
+ * However this matches the logical cpus as
+ * advertised by leaf 0x1 and will work even
+ * if the 'threads_per_core' tunable is set
+ * incorrectly on an AMD host.
+ */
+ logical_cpus = threads_per_core *
+ cores_per_package;
+ regs[2] = logical_cpus - 1;
+ }
break;
case CPUID_8000_0001:
cpuid_count(*eax, *ecx, regs);
/*
- * Hide SVM capability from guest.
+ * Hide SVM and Topology Extension features from guest.
*/
- regs[2] &= ~AMDID2_SVM;
+ regs[2] &= ~(AMDID2_SVM | AMDID2_TOPOLOGY);
/*
* Hide rdtscp/ia32_tsc_aux until we know how
More information about the svn-src-projects
mailing list