diff mbox series

[SRU,jammy,v3,5/5] s390/unwind: fix fgraph return address recovery

Message ID 20230406151233.405626-6-john.cabaj@canonical.com
State New
Headers show
Series [SRU,jammy,v3,1/5] kprobes: treewide: Remove trampoline_address from kretprobe_trampoline_handler() | expand

Commit Message

John Cabaj April 6, 2023, 3:12 p.m. UTC
From: Sumanth Korikkar <sumanthk@linux.ibm.com>

BugLink: https://bugs.launchpad.net/bugs/2013603 (Kernel livepatch ftrace graph fix)

When HAVE_FUNCTION_GRAPH_RET_ADDR_PTR is defined, the return
address to the fgraph caller is recovered by tagging it along with the
stack pointer of ftrace stack. This makes the stack unwinding more
reliable.

When the fgraph return address is modified to return_to_handler,
ftrace_graph_ret_addr tries to restore it to the original
value using tagged stack pointer.

Fix this by passing tagged sp to ftrace_graph_ret_addr.

Fixes: d81675b60d09 ("s390/unwind: recover kretprobe modified return address in stacktrace")
Cc: <stable@vger.kernel.org> # 5.18
Reviewed-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
(cherry picked from commit ded466e1806686794b403ebf031133bbaca76bb2)
Signed-off-by: John Cabaj <john.cabaj@canonical.com>
---
 arch/s390/include/asm/unwind.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/arch/s390/include/asm/unwind.h b/arch/s390/include/asm/unwind.h
index 0bf06f1682d8..02462e7100c1 100644
--- a/arch/s390/include/asm/unwind.h
+++ b/arch/s390/include/asm/unwind.h
@@ -47,7 +47,7 @@  struct unwind_state {
 static inline unsigned long unwind_recover_ret_addr(struct unwind_state *state,
 						    unsigned long ip)
 {
-	ip = ftrace_graph_ret_addr(state->task, &state->graph_idx, ip, NULL);
+	ip = ftrace_graph_ret_addr(state->task, &state->graph_idx, ip, (void *)state->sp);
 	if (is_kretprobe_trampoline(ip))
 		ip = kretprobe_find_ret_addr(state->task, (void *)state->sp, &state->kr_cur);
 	return ip;