• Jean-Philippe Brucker's avatar
    arm64: Don't insert a BTI instruction at inner labels · 2d21889f
    Jean-Philippe Brucker authored
    Some ftrace features are broken since commit 714a8d02 ("arm64: asm:
    Override SYM_FUNC_START when building the kernel with BTI"). For example
    the function_graph tracer:
    
    $ echo function_graph > /sys/kernel/debug/tracing/current_tracer
    [   36.107016] WARNING: CPU: 0 PID: 115 at kernel/trace/ftrace.c:2691 ftrace_modify_all_code+0xc8/0x14c
    
    When ftrace_modify_graph_caller() attempts to write a branch at
    ftrace_graph_call, it finds the "BTI J" instruction inserted by
    SYM_INNER_LABEL() instead of a NOP, and aborts.
    
    It turns out we don't currently need the BTI landing pads inserted by
    SYM_INNER_LABEL:
    
    * ftrace_call and ftrace_graph_call are only used for runtime patching
      of the active tracer. The patched code is not reached from a branch.
    * install_el2_stub is reached from a CBZ instruction, which doesn't
      change PSTATE.BTYPE.
    * __guest_exit is reached from B instructions in the hyp-entry vectors,
      which aren't subject to BTI checks either.
    
    Remove the BTI annotation from SYM_INNER_LABEL.
    
    Fixes: 714a8d02 ("arm64: asm: Override SYM_FUNC_START when building the kernel with BTI")
    Signed-off-by: default avatarJean-Philippe Brucker <jean-philippe@linaro.org>
    Reviewed-by: default avatarMark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20200624112253.1602786-1-jean-philippe@linaro.orgSigned-off-by: default avatarWill Deacon <will@kernel.org>
    2d21889f
linkage.h 1.5 KB