• Peter Zijlstra's avatar
    x86,ftrace: Fix ftrace_regs_caller() unwind · 0298739b
    Peter Zijlstra authored
    The ftrace_regs_caller() trampoline does something 'funny' when there
    is a direct-caller present. In that case it stuffs the 'direct-caller'
    address on the return stack and then exits the function. This then
    results in 'returning' to the direct-caller with the exact registers
    we came in with -- an indirect tail-call without using a register.
    
    This however (rightfully) confuses objtool because the function shares
    a few instruction in order to have a single exit path, but the stack
    layout is different for them, depending through which path we came
    there.
    
    This is currently cludged by forcing the stack state to the non-direct
    case, but this generates actively wrong (ORC) unwind information for
    the direct case, leading to potential broken unwinds.
    
    Fix this issue by fully separating the exit paths. This results in
    having to poke a second RET into the trampoline copy, see
    ftrace_regs_caller_ret.
    
    This brings us to a second objtool problem, in order for it to
    perceive the 'jmp ftrace_epilogue' as a function exit, it needs to be
    recognised as a tail call. In order to make that happen,
    ftrace_epilogue needs to be the start of an STT_FUNC, so re-arrange
    code to make this so.
    
    Finally, a third issue is that objtool requires functions to exit with
    the same stack layout they started with, which is obviously violated
    in the direct case, employ the new HINT_RET_OFFSET to tell objtool
    this is an expected exception.
    
    Together, this results in generating correct ORC unwind information
    for the ftrace_regs_caller() function and it's trampoline copies.
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarMiroslav Benes <mbenes@suse.cz>
    Reviewed-by: default avatarAlexandre Chartre <alexandre.chartre@oracle.com>
    Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Link: https://lkml.kernel.org/r/20200416115118.749606694@infradead.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    0298739b
ftrace.c 16.4 KB