lkml.org 
[lkml]   [2022]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 185/201] x86/amd: Use IBPB for firmware calls
    Date
    From: Peter Zijlstra <peterz@infradead.org>

    commit 28a99e95f55c61855983d36a88c05c178d966bb7 upstream.

    On AMD IBRS does not prevent Retbleed; as such use IBPB before a
    firmware call to flush the branch history state.

    And because in order to do an EFI call, the kernel maps a whole lot of
    the kernel page table into the EFI page table, do an IBPB just in case
    in order to prevent the scenario of poisoning the BTB and causing an EFI
    call using the unprotected RET there.

    [ bp: Massage. ]

    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Link: https://lore.kernel.org/r/20220715194550.793957-1-cascardo@canonical.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/include/asm/cpufeatures.h | 1 +
    arch/x86/include/asm/nospec-branch.h | 2 ++
    arch/x86/kernel/cpu/bugs.c | 11 ++++++++++-
    3 files changed, 13 insertions(+), 1 deletion(-)

    --- a/arch/x86/include/asm/cpufeatures.h
    +++ b/arch/x86/include/asm/cpufeatures.h
    @@ -300,6 +300,7 @@
    #define X86_FEATURE_RETPOLINE_LFENCE (11*32+13) /* "" Use LFENCE for Spectre variant 2 */
    #define X86_FEATURE_RETHUNK (11*32+14) /* "" Use REturn THUNK */
    #define X86_FEATURE_UNRET (11*32+15) /* "" AMD BTB untrain return */
    +#define X86_FEATURE_USE_IBPB_FW (11*32+16) /* "" Use IBPB during runtime firmware calls */

    /* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
    #define X86_FEATURE_AVX_VNNI (12*32+ 4) /* AVX VNNI instructions */
    --- a/arch/x86/include/asm/nospec-branch.h
    +++ b/arch/x86/include/asm/nospec-branch.h
    @@ -298,6 +298,8 @@ do { \
    alternative_msr_write(MSR_IA32_SPEC_CTRL, \
    spec_ctrl_current() | SPEC_CTRL_IBRS, \
    X86_FEATURE_USE_IBRS_FW); \
    + alternative_msr_write(MSR_IA32_PRED_CMD, PRED_CMD_IBPB, \
    + X86_FEATURE_USE_IBPB_FW); \
    } while (0)

    #define firmware_restrict_branch_speculation_end() \
    --- a/arch/x86/kernel/cpu/bugs.c
    +++ b/arch/x86/kernel/cpu/bugs.c
    @@ -1512,7 +1512,16 @@ static void __init spectre_v2_select_mit
    * the CPU supports Enhanced IBRS, kernel might un-intentionally not
    * enable IBRS around firmware calls.
    */
    - if (boot_cpu_has(X86_FEATURE_IBRS) && !spectre_v2_in_ibrs_mode(mode)) {
    + if (boot_cpu_has_bug(X86_BUG_RETBLEED) &&
    + (boot_cpu_data.x86_vendor == X86_VENDOR_AMD ||
    + boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)) {
    +
    + if (retbleed_cmd != RETBLEED_CMD_IBPB) {
    + setup_force_cpu_cap(X86_FEATURE_USE_IBPB_FW);
    + pr_info("Enabling Speculation Barrier for firmware calls\n");
    + }
    +
    + } else if (boot_cpu_has(X86_FEATURE_IBRS) && !spectre_v2_in_ibrs_mode(mode)) {
    setup_force_cpu_cap(X86_FEATURE_USE_IBRS_FW);
    pr_info("Enabling Restricted Speculation for firmware calls\n");
    }

    \
     
     \ /
      Last update: 2022-07-27 19:23    [W:4.104 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site