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