| From 1eaafe91a0df4157521b6417b3dd8430bf5f52f0 Mon Sep 17 00:00:00 2001 |
| From: Jim Mattson <jmattson@google.com> |
| Date: Wed, 9 May 2018 14:29:35 -0700 |
| Subject: kvm: x86: IA32_ARCH_CAPABILITIES is always supported |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Jim Mattson <jmattson@google.com> |
| |
| 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 <jmattson@google.com> |
| Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Fixes: 28c1c9fabf48 ("KVM/VMX: Emulate MSR_IA32_ARCH_CAPABILITIES") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kvm/cpuid.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| --- a/arch/x86/kvm/cpuid.c |
| +++ b/arch/x86/kvm/cpuid.c |
| @@ -468,6 +468,11 @@ static inline int __do_cpuid_ent(struct |
| entry->ecx &= ~F(PKU); |
| entry->edx &= kvm_cpuid_7_0_edx_x86_features; |
| cpuid_mask(&entry->edx, CPUID_7_EDX); |
| + /* |
| + * We emulate ARCH_CAPABILITIES in software even |
| + * if the host doesn't support it. |
| + */ |
| + entry->edx |= F(ARCH_CAPABILITIES); |
| } else { |
| entry->ebx = 0; |
| entry->ecx = 0; |