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
This commit is contained in:
neel 2014-12-31 22:15:28 +00:00
parent b429a2bfd1
commit 649535f73c

View File

@ -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)