Author: grehan
Date: Mon Oct 27 22:02:35 2014
New Revision: 273748
URL: https://svnweb.freebsd.org/changeset/base/273748

Log:
  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.
  
  Differential Revision:        https://reviews.freebsd.org/D1008
  Reviewed by:  jhb, neel
  MFC after:    1 week

Modified:
  head/sys/x86/x86/identcpu.c

Modified: head/sys/x86/x86/identcpu.c
==============================================================================
--- head/sys/x86/x86/identcpu.c Mon Oct 27 21:29:42 2014        (r273747)
+++ head/sys/x86/x86/identcpu.c Mon Oct 27 22:02:35 2014        (r273748)
@@ -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)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to