[coreboot] New patch to review for coreboot: 67ced73 Initialize the VMX MSR

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Wed Nov 7 03:56:07 CET 2012


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1794

-gerrit

commit 67ced73ab60f11289281984f3b812a675f517db1
Author: Marc Jones <marc.jones at se-eng.com>
Date:   Thu Oct 25 14:01:37 2012 -0600

    Initialize the VMX MSR
    
    The VMX MSR may come up with random values and needs to be
    initialized to zero. This was done incorrectly in finalize_smm.
    It must be done on a per core basis in the general CPU init.
    This touches all Sandybridge and Ivybridge configs.
    
    Change-Id: I015352d0f8e2ebe55ac0a5e9c5bbff83bd2ff86b
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
---
 src/cpu/intel/model_206ax/finalize.c         |  1 -
 src/cpu/intel/model_206ax/model_206ax_init.c | 26 ++++++++++++++------------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/cpu/intel/model_206ax/finalize.c b/src/cpu/intel/model_206ax/finalize.c
index ca7048d..4ed5d1e 100644
--- a/src/cpu/intel/model_206ax/finalize.c
+++ b/src/cpu/intel/model_206ax/finalize.c
@@ -43,7 +43,6 @@ static void msr_set_bit(unsigned reg, unsigned bit)
 
 void intel_model_206ax_finalize_smm(void)
 {
-	msr_set_bit(IA32_FEATURE_CONTROL, 0);
 	msr_set_bit(MSR_PMG_CST_CONFIG_CONTROL, 15);
 
 	/* Lock AES-NI only if supported */
diff --git a/src/cpu/intel/model_206ax/model_206ax_init.c b/src/cpu/intel/model_206ax/model_206ax_init.c
index 58593c8..f34c589 100644
--- a/src/cpu/intel/model_206ax/model_206ax_init.c
+++ b/src/cpu/intel/model_206ax/model_206ax_init.c
@@ -122,30 +122,32 @@ static void enable_vmx(void)
 	msr_t msr;
 	int enable = CONFIG_ENABLE_VMX;
 
+	regs = cpuid(1);
+	/* Check that the VMX is supported before reading or writing the MSR. */
+	if (!((regs.ecx & CPUID_VMX) || (regs.ecx & CPUID_SMX)))
+		return;
+
 	msr = rdmsr(IA32_FEATURE_CONTROL);
 
 	if (msr.lo & (1 << 0)) {
-		printk(BIOS_ERR, "VMX is locked, so enable_vmx will do nothing\n");
+		printk(BIOS_ERR, "VMX is locked, so %s will do nothing\n", __func__);
 		/* VMX locked. If we set it again we get an illegal
 		 * instruction
 		 */
 		return;
 	}
 
-	regs = cpuid(1);
+	/* The IA32_FEATURE_CONTROL MSR may initialize with random values.
+	 * It must be cleared regardless of VMX config setting.
+	 */
+	msr.hi = msr.lo = 0;
+
 	printk(BIOS_DEBUG, "%s VMX\n", enable ? "Enabling" : "Disabling");
-	if (regs.ecx & CPUID_VMX) {
-		if (enable)
-			msr.lo |= (1 << 2);
-		else
-			msr.lo &= ~(1 << 2);
 
-		if (regs.ecx & CPUID_SMX) {
-			if (enable)
+	if (enable) {
+			msr.lo |= (1 << 2);
+			if (regs.ecx & CPUID_SMX)
 				msr.lo |= (1 << 1);
-			else
-				msr.lo &= ~(1 << 1);
-		}
 	}
 
 	wrmsr(IA32_FEATURE_CONTROL, msr);




More information about the coreboot mailing list