arm64: kprobes: Record frame pointer with kretprobe instance
authorMasami Hiramatsu <mhiramat@kernel.org>
Thu, 21 Oct 2021 00:54:51 +0000 (09:54 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 22 Oct 2021 16:16:53 +0000 (12:16 -0400)
Record the frame pointer instead of stack address with kretprobe
instance as the identifier on the instance list.
Since arm64 always enable CONFIG_FRAME_POINTER, we can use the
actual frame pointer (x29).

This will allow the stacktrace code to find the original return
address from the FP alone.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Acked-by: Will Deacon <will@kernel.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
arch/arm64/kernel/probes/kprobes.c

index e7ad6da..d9dfa82 100644 (file)
@@ -401,14 +401,14 @@ int __init arch_populate_kprobe_blacklist(void)
 
 void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)
 {
-       return (void *)kretprobe_trampoline_handler(regs, (void *)kernel_stack_pointer(regs));
+       return (void *)kretprobe_trampoline_handler(regs, (void *)regs->regs[29]);
 }
 
 void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
                                      struct pt_regs *regs)
 {
        ri->ret_addr = (kprobe_opcode_t *)regs->regs[30];
-       ri->fp = (void *)kernel_stack_pointer(regs);
+       ri->fp = (void *)regs->regs[29];
 
        /* replace return addr (x30) with trampoline */
        regs->regs[30] = (long)&__kretprobe_trampoline;