[PATCH bpf-next v4 2/6] ftrace: Fix deadloop caused by direct call in ftrace selftest
Steven Rostedt
rostedt at goodmis.org
Wed May 18 12:57:59 PDT 2022
On Tue, 17 May 2022 03:18:34 -0400
Xu Kuohai <xukuohai at huawei.com> wrote:
> After direct call is enabled for arm64, ftrace selftest enters a
> dead loop:
>
> <trace_selftest_dynamic_test_func>:
> 00 bti c
> 01 mov x9, x30 <trace_direct_tramp>:
> 02 bl <trace_direct_tramp> ----------> ret
> |
> lr/x30 is 03, return to 03
> |
> 03 mov w0, #0x0 <-----------------------------|
> | |
> | dead loop! |
> | |
> 04 ret ---- lr/x30 is still 03, go back to 03 ----|
>
> The reason is that when the direct caller trace_direct_tramp() returns
> to the patched function trace_selftest_dynamic_test_func(), lr is still
> the address after the instrumented instruction in the patched function,
> so when the patched function exits, it returns to itself!
>
> To fix this issue, we need to restore lr before trace_direct_tramp()
> exits, so rewrite a dedicated trace_direct_tramp() for arm64.
>
> Reported-by: Li Huafei <lihuafei1 at huawei.com>
> Signed-off-by: Xu Kuohai <xukuohai at huawei.com>
> ---
Acked-by: Steven Rostedt (Google) <rostedt at goodmis.org>
-- Steve
More information about the linux-arm-kernel
mailing list