Skip to content

Commit d66e266

Browse files
jsmattsonjrsean-jc
authored andcommitted
KVM: x86: AMD's IBPB is not equivalent to Intel's IBPB
From Intel's documentation [1], "CPUID.(EAX=07H,ECX=0):EDX[26] enumerates support for indirect branch restricted speculation (IBRS) and the indirect branch predictor barrier (IBPB)." Further, from [2], "Software that executed before the IBPB command cannot control the predicted targets of indirect branches (4) executed after the command on the same logical processor," where footnote 4 reads, "Note that indirect branches include near call indirect, near jump indirect and near return instructions. Because it includes near returns, it follows that **RSB entries created before an IBPB command cannot control the predicted targets of returns executed after the command on the same logical processor.**" [emphasis mine] On the other hand, AMD's IBPB "may not prevent return branch predictions from being specified by pre-IBPB branch targets" [3]. However, some AMD processors have an "enhanced IBPB" [terminology mine] which does clear the return address predictor. This feature is enumerated by CPUID.80000008:EDX.IBPB_RET[bit 30] [4]. Adjust the cross-vendor features enumerated by KVM_GET_SUPPORTED_CPUID accordingly. [1] https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/cpuid-enumeration-and-architectural-msrs.html [2] https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/technical-documentation/speculative-execution-side-channel-mitigations.html#Footnotes [3] https://www.amd.com/en/resources/product-security/bulletin/amd-sb-1040.html [4] https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24594.pdf Fixes: 0c54914 ("KVM: x86: use Intel speculation bugs and features as derived in generic x86 code") Suggested-by: Venkatesh Srinivas <venkateshs@chromium.org> Signed-off-by: Jim Mattson <jmattson@google.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Link: https://lore.kernel.org/r/20241011214353.1625057-5-jmattson@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent df9328b commit d66e266

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

arch/x86/kvm/cpuid.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -690,7 +690,9 @@ void kvm_set_cpu_caps(void)
690690
kvm_cpu_cap_set(X86_FEATURE_TSC_ADJUST);
691691
kvm_cpu_cap_set(X86_FEATURE_ARCH_CAPABILITIES);
692692

693-
if (boot_cpu_has(X86_FEATURE_IBPB) && boot_cpu_has(X86_FEATURE_IBRS))
693+
if (boot_cpu_has(X86_FEATURE_AMD_IBPB_RET) &&
694+
boot_cpu_has(X86_FEATURE_AMD_IBPB) &&
695+
boot_cpu_has(X86_FEATURE_AMD_IBRS))
694696
kvm_cpu_cap_set(X86_FEATURE_SPEC_CTRL);
695697
if (boot_cpu_has(X86_FEATURE_STIBP))
696698
kvm_cpu_cap_set(X86_FEATURE_INTEL_STIBP);
@@ -763,8 +765,12 @@ void kvm_set_cpu_caps(void)
763765
* arch/x86/kernel/cpu/bugs.c is kind enough to
764766
* record that in cpufeatures so use them.
765767
*/
766-
if (boot_cpu_has(X86_FEATURE_IBPB))
768+
if (boot_cpu_has(X86_FEATURE_IBPB)) {
767769
kvm_cpu_cap_set(X86_FEATURE_AMD_IBPB);
770+
if (boot_cpu_has(X86_FEATURE_SPEC_CTRL) &&
771+
!boot_cpu_has_bug(X86_BUG_EIBRS_PBRSB))
772+
kvm_cpu_cap_set(X86_FEATURE_AMD_IBPB_RET);
773+
}
768774
if (boot_cpu_has(X86_FEATURE_IBRS))
769775
kvm_cpu_cap_set(X86_FEATURE_AMD_IBRS);
770776
if (boot_cpu_has(X86_FEATURE_STIBP))

0 commit comments

Comments
 (0)