summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/intel/common/Kconfig5
-rw-r--r--src/cpu/intel/common/common.h4
-rw-r--r--src/cpu/intel/common/common_init.c37
-rw-r--r--src/cpu/intel/fsp_model_406dx/model_406dx_init.c2
-rw-r--r--src/cpu/intel/haswell/haswell_init.c2
-rw-r--r--src/cpu/intel/model_1067x/model_1067x_init.c2
-rw-r--r--src/cpu/intel/model_106cx/model_106cx_init.c2
-rw-r--r--src/cpu/intel/model_2065x/model_2065x_init.c2
-rw-r--r--src/cpu/intel/model_206ax/model_206ax_init.c2
-rw-r--r--src/cpu/intel/model_6ex/model_6ex_init.c2
-rw-r--r--src/cpu/intel/model_6fx/model_6fx_init.c2
11 files changed, 43 insertions, 19 deletions
diff --git a/src/cpu/intel/common/Kconfig b/src/cpu/intel/common/Kconfig
index 739333e4aa..56bed22a1a 100644
--- a/src/cpu/intel/common/Kconfig
+++ b/src/cpu/intel/common/Kconfig
@@ -7,9 +7,8 @@ config ENABLE_VMX
bool "Enable VMX for virtualization"
default y
-config SET_VMX_LOCK_BIT
- bool "Set lock bit after configuring VMX"
- depends on ENABLE_VMX
+config SET_IA32_FC_LOCK_BIT
+ bool "Set IA32_FEATURE_CONTROL lock bit"
default y
help
Although the Intel manual says you must set the lock bit in addition
diff --git a/src/cpu/intel/common/common.h b/src/cpu/intel/common/common.h
index 81c9f16d19..b9ac0566c6 100644
--- a/src/cpu/intel/common/common.h
+++ b/src/cpu/intel/common/common.h
@@ -15,7 +15,9 @@
#ifndef _CPU_INTEL_COMMON_H
#define _CPU_INTEL_COMMON_H
-void set_vmx(void);
+void set_vmx_and_lock(void);
+void set_feature_ctrl_vmx(void);
+void set_feature_ctrl_lock(void);
/*
* Init CPPC block with MSRs for Intel Enhanced Speed Step Technology.
diff --git a/src/cpu/intel/common/common_init.c b/src/cpu/intel/common/common_init.c
index 7dbbfda2e8..9c0fcbb122 100644
--- a/src/cpu/intel/common/common_init.c
+++ b/src/cpu/intel/common/common_init.c
@@ -21,12 +21,17 @@
#include <cpu/x86/msr.h>
#include "common.h"
-void set_vmx(void)
+void set_vmx_and_lock(void)
+{
+ set_feature_ctrl_vmx();
+ set_feature_ctrl_lock();
+}
+
+void set_feature_ctrl_vmx(void)
{
msr_t msr;
uint32_t feature_flag;
int enable = IS_ENABLED(CONFIG_ENABLE_VMX);
- int lock = IS_ENABLED(CONFIG_SET_VMX_LOCK_BIT);
feature_flag = cpu_get_feature_flags_ecx();
/* Check that the VMX is supported before reading or writing the MSR. */
@@ -38,10 +43,10 @@ void set_vmx(void)
msr = rdmsr(IA32_FEATURE_CONTROL);
if (msr.lo & (1 << 0)) {
- printk(BIOS_ERR, "VMX is locked, so %s will do nothing\n",
+ printk(BIOS_ERR, "IA32_FEATURE_CONTROL is locked, so %s will do nothing\n",
__func__);
- /* VMX locked. If we set it again we get an illegal
- * instruction
+ /* IA32_FEATURE_CONTROL locked. If we set it again we get an
+ * illegal instruction
*/
return;
}
@@ -59,14 +64,32 @@ void set_vmx(void)
wrmsr(IA32_FEATURE_CONTROL, msr);
+ printk(BIOS_DEBUG, "VMX status: %s\n",
+ enable ? "enabled" : "disabled");
+}
+void set_feature_ctrl_lock(void)
+{
+ msr_t msr;
+ int lock = IS_ENABLED(CONFIG_SET_IA32_FC_LOCK_BIT);
+
+ msr = rdmsr(IA32_FEATURE_CONTROL);
+
+ if (msr.lo & (1 << 0)) {
+ printk(BIOS_ERR, "IA32_FEATURE_CONTROL is locked, so %s will do nothing\n",
+ __func__);
+ /* IA32_FEATURE_CONTROL locked. If we set it again we get an
+ * illegal instruction
+ */
+ return;
+ }
+
if (lock) {
/* Set lock bit */
msr.lo |= (1 << 0);
wrmsr(IA32_FEATURE_CONTROL, msr);
}
- printk(BIOS_DEBUG, "VMX status: %s, %s\n",
- enable ? "enabled" : "disabled",
+ printk(BIOS_DEBUG, "IA32_FEATURE_CONTROL status: %s\n",
lock ? "locked" : "unlocked");
}
diff --git a/src/cpu/intel/fsp_model_406dx/model_406dx_init.c b/src/cpu/intel/fsp_model_406dx/model_406dx_init.c
index 289305fcd3..7994f0bb2c 100644
--- a/src/cpu/intel/fsp_model_406dx/model_406dx_init.c
+++ b/src/cpu/intel/fsp_model_406dx/model_406dx_init.c
@@ -148,7 +148,7 @@ static void model_406dx_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure Enhanced SpeedStep and Thermal Sensors */
configure_misc();
diff --git a/src/cpu/intel/haswell/haswell_init.c b/src/cpu/intel/haswell/haswell_init.c
index 9d859605a3..aa77964f68 100644
--- a/src/cpu/intel/haswell/haswell_init.c
+++ b/src/cpu/intel/haswell/haswell_init.c
@@ -686,7 +686,7 @@ static void haswell_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure C States */
configure_c_states();
diff --git a/src/cpu/intel/model_1067x/model_1067x_init.c b/src/cpu/intel/model_1067x/model_1067x_init.c
index 7eb121effd..dbb9631ad8 100644
--- a/src/cpu/intel/model_1067x/model_1067x_init.c
+++ b/src/cpu/intel/model_1067x/model_1067x_init.c
@@ -296,7 +296,7 @@ static void model_1067x_init(struct device *cpu)
init_timer();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure C States */
configure_c_states(quad);
diff --git a/src/cpu/intel/model_106cx/model_106cx_init.c b/src/cpu/intel/model_106cx/model_106cx_init.c
index 56598fae82..a609aed550 100644
--- a/src/cpu/intel/model_106cx/model_106cx_init.c
+++ b/src/cpu/intel/model_106cx/model_106cx_init.c
@@ -99,7 +99,7 @@ static void model_106cx_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure C States */
configure_c_states();
diff --git a/src/cpu/intel/model_2065x/model_2065x_init.c b/src/cpu/intel/model_2065x/model_2065x_init.c
index 7ce516bd19..240bf50737 100644
--- a/src/cpu/intel/model_2065x/model_2065x_init.c
+++ b/src/cpu/intel/model_2065x/model_2065x_init.c
@@ -333,7 +333,7 @@ static void model_2065x_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure Enhanced SpeedStep and Thermal Sensors */
configure_misc();
diff --git a/src/cpu/intel/model_206ax/model_206ax_init.c b/src/cpu/intel/model_206ax/model_206ax_init.c
index 27f56be67d..58aabdb198 100644
--- a/src/cpu/intel/model_206ax/model_206ax_init.c
+++ b/src/cpu/intel/model_206ax/model_206ax_init.c
@@ -556,7 +556,7 @@ static void model_206ax_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure C States */
configure_c_states();
diff --git a/src/cpu/intel/model_6ex/model_6ex_init.c b/src/cpu/intel/model_6ex/model_6ex_init.c
index 5041dcd51d..78ece74d66 100644
--- a/src/cpu/intel/model_6ex/model_6ex_init.c
+++ b/src/cpu/intel/model_6ex/model_6ex_init.c
@@ -136,7 +136,7 @@ static void model_6ex_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure C States */
configure_c_states();
diff --git a/src/cpu/intel/model_6fx/model_6fx_init.c b/src/cpu/intel/model_6fx/model_6fx_init.c
index c5659f381f..9d11478dee 100644
--- a/src/cpu/intel/model_6fx/model_6fx_init.c
+++ b/src/cpu/intel/model_6fx/model_6fx_init.c
@@ -150,7 +150,7 @@ static void model_6fx_init(struct device *cpu)
setup_lapic();
/* Set virtualization based on Kconfig option */
- set_vmx();
+ set_vmx_and_lock();
/* Configure C States */
configure_c_states();