• Mark Rutland's avatar
    ftrace: selftest: remove broken trace_direct_tramp · fee86a4e
    Mark Rutland authored
    The ftrace selftest code has a trace_direct_tramp() function which it
    uses as a direct call trampoline. This happens to work on x86, since the
    direct call's return address is in the usual place, and can be returned
    to via a RET, but in general the calling convention for direct calls is
    different from regular function calls, and requires a trampoline written
    in assembly.
    
    On s390, regular function calls place the return address in %r14, and an
    ftrace patch-site in an instrumented function places the trampoline's
    return address (which is within the instrumented function) in %r0,
    preserving the original %r14 value in-place. As a regular C function
    will return to the address in %r14, using a C function as the trampoline
    results in the trampoline returning to the caller of the instrumented
    function, skipping the body of the instrumented function.
    
    Note that the s390 issue is not detcted by the ftrace selftest code, as
    the instrumented function is trivial, and returning back into the caller
    happens to be equivalent.
    
    On arm64, regular function calls place the return address in x30, and
    an ftrace patch-site in an instrumented function saves this into r9
    and places the trampoline's return address (within the instrumented
    function) in x30. A regular C function will return to the address in
    x30, but will not restore x9 into x30. Consequently, using a C function
    as the trampoline results in returning to the trampoline's return
    address having corrupted x30, such that when the instrumented function
    returns, it will return back into itself.
    
    To avoid future issues in this area, remove the trace_direct_tramp()
    function, and require that each architecture with direct calls provides
    a stub trampoline, named ftrace_stub_direct_tramp. This can be written
    to handle the architecture's trampoline calling convention, and in
    future could be used elsewhere (e.g. in the ftrace ops sample, to
    measure the overhead of direct calls), so we may as well always build it
    in.
    
    Link: https://lkml.kernel.org/r/20230321140424.345218-8-revest@chromium.orgSigned-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Li Huafei <lihuafei1@huawei.com>
    Cc: Xu Kuohai <xukuohai@huawei.com>
    Signed-off-by: default avatarFlorent Revest <revest@chromium.org>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    fee86a4e
trace_selftest.c 28.4 KB