| From bfc3211b9f9611b864a2f227fae89a1942fd873c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 10 Dec 2019 13:50:23 +0100 |
| Subject: s390/ftrace: save traced function caller |
| |
| From: Vasily Gorbik <gor@linux.ibm.com> |
| |
| [ Upstream commit b4adfe55915d8363e244e42386d69567db1719b9 ] |
| |
| A typical backtrace acquired from ftraced function currently looks like |
| the following (e.g. for "path_openat"): |
| |
| arch_stack_walk+0x15c/0x2d8 |
| stack_trace_save+0x50/0x68 |
| stack_trace_call+0x15a/0x3b8 |
| ftrace_graph_caller+0x0/0x1c |
| 0x3e0007e3c98 <- ftraced function caller (should be do_filp_open+0x7c/0xe8) |
| do_open_execat+0x70/0x1b8 |
| __do_execve_file.isra.0+0x7d8/0x860 |
| __s390x_sys_execve+0x56/0x68 |
| system_call+0xdc/0x2d8 |
| |
| Note random "0x3e0007e3c98" stack value as ftraced function caller. This |
| value causes either imprecise unwinder result or unwinding failure. |
| That "0x3e0007e3c98" comes from r14 of ftraced function stack frame, which |
| it haven't had a chance to initialize since the very first instruction |
| calls ftrace code ("ftrace_caller"). (ftraced function might never |
| save r14 as well). Nevertheless according to s390 ABI any function |
| is called with stack frame allocated for it and r14 contains return |
| address. "ftrace_caller" itself is called with "brasl %r0,ftrace_caller". |
| So, to fix this issue simply always save traced function caller onto |
| ftraced function stack frame. |
| |
| Reported-by: Sven Schnelle <svens@linux.ibm.com> |
| Signed-off-by: Vasily Gorbik <gor@linux.ibm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/s390/kernel/mcount.S | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S |
| index 3431b2d5e334..f942341429b1 100644 |
| --- a/arch/s390/kernel/mcount.S |
| +++ b/arch/s390/kernel/mcount.S |
| @@ -41,6 +41,7 @@ EXPORT_SYMBOL(_mcount) |
| ENTRY(ftrace_caller) |
| .globl ftrace_regs_caller |
| .set ftrace_regs_caller,ftrace_caller |
| + stg %r14,(__SF_GPRS+8*8)(%r15) # save traced function caller |
| lgr %r1,%r15 |
| #if !(defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT)) |
| aghi %r0,MCOUNT_RETURN_FIXUP |
| -- |
| 2.25.1 |
| |