Re: [PATCH bpf-next v4 2/6] ftrace: Fix deadloop caused by direct call in ftrace selftest

From: Steven Rostedt
Date: Wed May 18 2022 - 15:58:13 EST


On Tue, 17 May 2022 03:18:34 -0400
Xu Kuohai <xukuohai@xxxxxxxxxx> 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@xxxxxxxxxx>
> Signed-off-by: Xu Kuohai <xukuohai@xxxxxxxxxx>
> ---

Acked-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>

-- Steve