⬢ DragonFlyBSD Kernel Audit
DF-5345 / fix.diff
← back to finding ↓ download raw
--- a/sys/platform/pc64/x86_64/identcpu.c
+++ b/sys/platform/pc64/x86_64/identcpu.c
@@ -1273,10 +1273,12 @@ static void
 print_svm_info(void)
 {
 	u_int features, regs[4];
 	uint64_t msr;
 
 	kprintf("\n  SVM: ");
+	if (cpu_exthigh < 0x8000000A)
+		return;
 	do_cpuid(0x8000000A, regs);
 	features = regs[3];
 
-	msr = rdmsr(MSR_AMD_VM_CR);
-	if ((msr & VM_CR_SVMDIS) && (msr & VM_CR_LOCK))
+	if (rdmsr_safe(MSR_AMD_VM_CR, &msr) == 0 &&
+	    (msr & VM_CR_SVMDIS) && (msr & VM_CR_LOCK))
 		kprintf("(disabled in BIOS) ");
@@ -1324,12 +1326,12 @@ static u_int
 vmx_settable(uint64_t basic, int msr, int true_msr)
 {
 	uint64_t val;
 
-	if (basic & (1ULL << 55))
-		val = rdmsr(true_msr);
-	else
-		val = rdmsr(msr);
+	if (rdmsr_safe((basic & (1ULL << 55)) ? true_msr : msr, &val) != 0)
+		return (0);
 
 	/* Just report the controls that can be set to 1. */
 	return (u_int)(val >> 32);
 }
@@ -1341,9 +1343,10 @@ static void
 print_vmx_info(void)
 {
 	uint64_t basic, msr;
 	u_int entry_ctls, exit_ctls, pin_ctls, proc_ctls, proc2_ctls;
 
 	kprintf("\n  VT-x: ");
-	msr = rdmsr(MSR_IA32_FEATURE_CONTROL);
+	if (rdmsr_safe(MSR_IA32_FEATURE_CONTROL, &msr) != 0)
+		msr = 0;
 	if ((msr & IA32_FEATURE_CONTROL_LOCK) != 0 &&
 	    (msr & IA32_FEATURE_CONTROL_OUT_SMX) == 0)
 		kprintf("(disabled in BIOS) ");
 
-	basic = rdmsr(MSR_VMX_BASIC);
+	if (rdmsr_safe(MSR_VMX_BASIC, &basic) != 0)
+		return;
 	pin_ctls = vmx_settable(basic, MSR_VMX_PINBASED_CTLS,