lkml.org 
[lkml]   [2018]   [Jan]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 00/24] objtool: retpoline and asm-goto validation
    On Tue, Jan 23, 2018 at 04:25:39PM +0100, Peter Zijlstra wrote:
    > This series adds two features to objtool:
    >
    > - retpoline validation; it verifies no indirect jumps/calls are left in
    > CONFIG_RETPOLINE=y builds.
    >
    > includes fixups for kvm and others
    >
    > - asm-goto validation; allows asserting that a block of code is not reachable
    > through a dynamic branch.
    >
    > After this it forces an asm-goto capable compiler to build arch/x86 and removes
    > the fallback code for static_cpu_has(). After which we can use static_cpu_has()
    > to guarantee a lack of dynamic branches, which is a requested feature for
    > various spectre related things.

    x86_64-allmodconfig -KCOV -KASAN +patch gives:

    drivers/infiniband/hw/bnxt_re/.tmp_qplib_fp.o: warning: objtool: bnxt_qplib_poll_cq()+0xf8: sibling call from callable instruction with modified stack frame
    drivers/watchdog/.tmp_hpwdt.o: warning: objtool: .text+0x24: indirect call found in RETPOLINE build


    ---
    Subject: jump_label: Add static assertion to every static_branch
    From: Peter Zijlstra <peterz@infradead.org>
    Date: Tue Jan 16 15:27:36 CET 2018

    For testing only.. can't use in general because people do:

    static_branch() || more-cond

    which confuses the living daylight out of objtool validation and
    really isn't fixable.

    DO NOT MERGE

    Not-signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    ---
    arch/x86/include/asm/jump_label.h | 1 +
    include/linux/cgroup.h | 2 +-
    include/linux/jump_label.h | 15 +++++++++++++--
    3 files changed, 15 insertions(+), 3 deletions(-)

    --- a/arch/x86/include/asm/jump_label.h
    +++ b/arch/x86/include/asm/jump_label.h
    @@ -76,6 +76,7 @@ static __always_inline bool arch_static_
    *
    * Also works with static_cpu_has().
    */
    +#define arch_static_assert arch_static_assert
    static __always_inline void arch_static_assert(void)
    {
    asm volatile ("1:\n\t"
    --- a/include/linux/cgroup.h
    +++ b/include/linux/cgroup.h
    @@ -88,7 +88,7 @@ extern struct css_set init_css_set;
    * @ss: subsystem in question
    */
    #define cgroup_subsys_on_dfl(ss) \
    - static_branch_likely(&ss ## _on_dfl_key)
    + __static_branch_likely(&ss ## _on_dfl_key)

    bool css_has_online_children(struct cgroup_subsys_state *css);
    struct cgroup_subsys_state *css_from_id(int id, struct cgroup_subsys *ss);
    --- a/include/linux/jump_label.h
    +++ b/include/linux/jump_label.h
    @@ -323,6 +323,10 @@ extern bool ____wrong_branch_error(void)

    #ifdef HAVE_JUMP_LABEL

    +#ifndef arch_static_assert
    +#define arch_static_assert (void)
    +#endif
    +
    /*
    * Combine the right initial value (type) with the right branch order
    * to generate the desired result.
    @@ -379,7 +383,7 @@ extern bool ____wrong_branch_error(void)
    * See jump_label_type() / jump_label_init_type().
    */

    -#define static_branch_likely(x) \
    +#define __static_branch_likely(x) \
    ({ \
    bool branch; \
    if (__builtin_types_compatible_p(typeof(*x), struct static_key_true)) \
    @@ -391,7 +395,9 @@ extern bool ____wrong_branch_error(void)
    likely(branch); \
    })

    -#define static_branch_unlikely(x) \
    +#define static_branch_likely(x) (__static_branch_likely(x) && (arch_static_assert(), true))
    +
    +#define __static_branch_unlikely(x) \
    ({ \
    bool branch; \
    if (__builtin_types_compatible_p(typeof(*x), struct static_key_true)) \
    @@ -403,11 +409,16 @@ extern bool ____wrong_branch_error(void)
    unlikely(branch); \
    })

    +#define static_branch_unlikely(x) (__static_branch_unlikely(x) && (arch_static_assert(), true))
    +
    #else /* !HAVE_JUMP_LABEL */

    #define static_branch_likely(x) likely(static_key_enabled(&(x)->key))
    #define static_branch_unlikely(x) unlikely(static_key_enabled(&(x)->key))

    +#define __static_branch_likely(x) likely(static_key_enabled(&(x)->key))
    +#define __static_branch_unlikely(x) unlikely(static_key_enabled(&(x)->key))
    +
    #endif /* HAVE_JUMP_LABEL */

    /*
    \
     
     \ /
      Last update: 2018-01-23 16:44    [W:3.636 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site