lkml.org 
[lkml]   [2022]   [Apr]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 330/343] objtool: Fix SLS validation for kcov tail-call replacement
    Date
    From: Peter Zijlstra <peterz@infradead.org>

    commit 7a53f408902d913cd541b4f8ad7dbcd4961f5b82 upstream.

    Since not all compilers have a function attribute to disable KCOV
    instrumentation, objtool can rewrite KCOV instrumentation in noinstr
    functions as per commit:

    f56dae88a81f ("objtool: Handle __sanitize_cov*() tail calls")

    However, this has subtle interaction with the SLS validation from
    commit:

    1cc1e4c8aab4 ("objtool: Add straight-line-speculation validation")

    In that when a tail-call instrucion is replaced with a RET an
    additional INT3 instruction is also written, but is not represented in
    the decoded instruction stream.

    This then leads to false positive missing INT3 objtool warnings in
    noinstr code.

    Instead of adding additional struct instruction objects, mark the RET
    instruction with retpoline_safe to suppress the warning (since we know
    there really is an INT3).

    Fixes: 1cc1e4c8aab4 ("objtool: Add straight-line-speculation validation")
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20220323230712.GA8939@worktop.programming.kicks-ass.net
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    tools/objtool/check.c | 11 +++++++++++
    1 file changed, 11 insertions(+)

    --- a/tools/objtool/check.c
    +++ b/tools/objtool/check.c
    @@ -1090,6 +1090,17 @@ static void annotate_call_site(struct ob
    : arch_nop_insn(insn->len));

    insn->type = sibling ? INSN_RETURN : INSN_NOP;
    +
    + if (sibling) {
    + /*
    + * We've replaced the tail-call JMP insn by two new
    + * insn: RET; INT3, except we only have a single struct
    + * insn here. Mark it retpoline_safe to avoid the SLS
    + * warning, instead of adding another insn.
    + */
    + insn->retpoline_safe = true;
    + }
    +
    return;
    }


    \
     
     \ /
      Last update: 2022-04-12 11:00    [W:2.690 / U:0.416 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site