kvm: x86: IA32_ARCH_CAPABILITIES is always supported [Linux 3.16.72]

This Linux kernel change "kvm: x86: IA32_ARCH_CAPABILITIES is always supported" is included in the Linux 3.16.72 release. This change is authored by Jim Mattson <jmattson [at] google.com> on Wed May 9 14:29:35 2018 -0700. The commit for this change in Linux stable tree is 0824675 (patch) which is from upstream commit 1eaafe9. The same Linux upstream change may have been applied to various maintained Linux releases and you can find all Linux releases containing changes from upstream 1eaafe9.

kvm: x86: IA32_ARCH_CAPABILITIES is always supported

commit 1eaafe91a0df4157521b6417b3dd8430bf5f52f0 upstream.

If there is a possibility that a VM may migrate to a Skylake host,
then the hypervisor should report IA32_ARCH_CAPABILITIES.RSBA[bit 2]
as being set (future work, of course). This implies that
CPUID.(EAX=7,ECX=0):EDX.ARCH_CAPABILITIES[bit 29] should be
set. Therefore, kvm should report this CPUID bit as being supported
whether or not the host supports it.  Userspace is still free to clear
the bit if it chooses.

For more information on RSBA, see Intel's white paper, "Retpoline: A
Branch Target Injection Mitigation" (Document Number 337131-001),
currently available at https://bugzilla.kernel.org/show_bug.cgi?id=199511.

Since the IA32_ARCH_CAPABILITIES MSR is emulated in kvm, there is no
dependency on hardware support for this feature.

Signed-off-by: Jim Mattson <[email protected]>
Reviewed-by: Konrad Rzeszutek Wilk <[email protected]>
Fixes: 28c1c9fabf48 ("KVM/VMX: Emulate MSR_IA32_ARCH_CAPABILITIES")
Signed-off-by: Radim Krčmář <[email protected]>
[bwh: Backported to 3.16: adjust context]
Signed-off-by: Ben Hutchings <[email protected]>

There are 5 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/x86/kvm/cpuid.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 95cd58c..6531ffc 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -395,6 +395,11 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
            entry->ebx |= F(TSC_ADJUST);
            entry->edx &= kvm_cpuid_7_0_edx_x86_features;
            cpuid_mask(&entry->edx, 10);
+           /*
+            * We emulate ARCH_CAPABILITIES in software even
+            * if the host doesn't support it.
+            */
+           entry->edx |= F(ARCH_CAPABILITIES);
        } else {
            entry->ebx = 0;
            entry->edx = 0;

Leave a Reply

Your email address will not be published. Required fields are marked *