x86/intel: Initialize IA32_FEAT_CTL MSR at boot
authorSean Christopherson <sean.j.christopherson@intel.com>
Sat, 21 Dec 2019 04:44:58 +0000 (20:44 -0800)
committerBorislav Petkov <bp@suse.de>
Mon, 13 Jan 2020 16:45:45 +0000 (17:45 +0100)
commit1db2a6e1e29ff994443a9eef7cf3d26104c777a7
tree19e5f1bc114340bf6ecb8bd5eee6e0c6575df2b2
parentf6505c88bff01e41b21a1f125edd1ace5330f164
x86/intel: Initialize IA32_FEAT_CTL MSR at boot

Opportunistically initialize IA32_FEAT_CTL to enable VMX when the MSR is
left unlocked by BIOS.  Configuring feature control at boot time paves
the way for similar enabling of other features, e.g. Software Guard
Extensions (SGX).

Temporarily leave equivalent KVM code in place in order to avoid
introducing a regression on Centaur and Zhaoxin CPUs, e.g. removing
KVM's code would leave the MSR unlocked on those CPUs and would break
existing functionality if people are loading kvm_intel on Centaur and/or
Zhaoxin.  Defer enablement of the boot-time configuration on Centaur and
Zhaoxin to future patches to aid bisection.

Note, Local Machine Check Exceptions (LMCE) are also supported by the
kernel and enabled via feature control, but the kernel currently uses
LMCE if and only if the feature is explicitly enabled by BIOS.  Keep
the current behavior to avoid introducing bugs, future patches can opt
in to opportunistic enabling if it's deemed desirable to do so.

Always lock IA32_FEAT_CTL if it exists, even if the CPU doesn't support
VMX, so that other existing and future kernel code that queries the MSR
can assume it's locked.

Start from a clean slate when constructing the value to write to
IA32_FEAT_CTL, i.e. ignore whatever value BIOS left in the MSR so as not
to enable random features or fault on the WRMSR.

Suggested-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20191221044513.21680-5-sean.j.christopherson@intel.com
arch/x86/Kconfig.cpu
arch/x86/kernel/cpu/Makefile
arch/x86/kernel/cpu/cpu.h
arch/x86/kernel/cpu/feat_ctl.c [new file with mode: 0644]
arch/x86/kernel/cpu/intel.c