summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2014-12-31 22:15:28 +0000
committerneel <neel@FreeBSD.org>2014-12-31 22:15:28 +0000
commit649535f73cbb860495bc6d26c156d95935fcb6fd (patch)
treea52fdd07356b7c7119b1f32fc06a35fef2b016de
parentb429a2bfd1380c777b9d59e54e17886b3855073e (diff)
downloadFreeBSD-src-649535f73cbb860495bc6d26c156d95935fcb6fd.zip
FreeBSD-src-649535f73cbb860495bc6d26c156d95935fcb6fd.tar.gz
MFC r273748
Output a summary of optional SVM features in dmesg similar to CPU features. If bootverbose is enabled, a detailed list is provided; otherwise, a single-line summary is displayed. Requested by: jhb
-rw-r--r--sys/x86/x86/identcpu.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/sys/x86/x86/identcpu.c b/sys/x86/x86/identcpu.c
index 8d4b5d7..87a5664 100644
--- a/sys/x86/x86/identcpu.c
+++ b/sys/x86/x86/identcpu.c
@@ -76,6 +76,7 @@ static u_int find_cpu_vendor_id(void);
static void print_AMD_info(void);
static void print_INTEL_info(void);
static void print_INTEL_TLB(u_int data);
+static void print_svm_info(void);
static void print_via_padlock_info(void);
static void print_vmx_info(void);
@@ -932,6 +933,9 @@ printcpuinfo(void)
if (cpu_feature2 & CPUID2_VMX)
print_vmx_info();
+ if (amd_feature2 & AMDID2_SVM)
+ print_svm_info();
+
if ((cpu_feature & CPUID_HTT) &&
cpu_vendor_id == CPU_VENDOR_AMD)
cpu_feature &= ~CPUID_HTT;
@@ -1735,6 +1739,67 @@ print_INTEL_TLB(u_int data)
}
}
+static void
+print_svm_info(void)
+{
+ u_int features, regs[4];
+ uint64_t msr;
+ int comma;
+
+ printf("\n SVM: ");
+ do_cpuid(0x8000000A, regs);
+ features = regs[3];
+
+ msr = rdmsr(MSR_VM_CR);
+ if ((msr & VM_CR_SVMDIS) == VM_CR_SVMDIS)
+ printf("(disabled in BIOS) ");
+
+ if (!bootverbose) {
+ comma = 0;
+ if (features & (1 << 0)) {
+ printf("%sNP", comma ? "," : "");
+ comma = 1;
+ }
+ if (features & (1 << 3)) {
+ printf("%sNRIP", comma ? "," : "");
+ comma = 1;
+ }
+ if (features & (1 << 5)) {
+ printf("%sVClean", comma ? "," : "");
+ comma = 1;
+ }
+ if (features & (1 << 6)) {
+ printf("%sAFlush", comma ? "," : "");
+ comma = 1;
+ }
+ if (features & (1 << 7)) {
+ printf("%sDAssist", comma ? "," : "");
+ comma = 1;
+ }
+ printf("%sNAsids=%d", comma ? "," : "", regs[1]);
+ return;
+ }
+
+ printf("Features=0x%b", features,
+ "\020"
+ "\001NP" /* Nested paging */
+ "\002LbrVirt" /* LBR virtualization */
+ "\003SVML" /* SVM lock */
+ "\004NRIPS" /* NRIP save */
+ "\005TscRateMsr" /* MSR based TSC rate control */
+ "\006VmcbClean" /* VMCB clean bits */
+ "\007FlushByAsid" /* Flush by ASID */
+ "\010DecodeAssist" /* Decode assist */
+ "\011<b8>"
+ "\012<b9>"
+ "\013PauseFilter" /* PAUSE intercept filter */
+ "\014<b11>"
+ "\015PauseFilterThreshold" /* PAUSE filter threshold */
+ "\016AVIC" /* virtual interrupt controller */
+ );
+ printf("\nRevision=%d, ASIDs=%d", regs[0] & 0xff, regs[1]);
+}
+
#ifdef __i386__
static void
print_transmeta_info(void)
OpenPOWER on IntegriCloud