s390/stacktrace: Skip first user stack frame
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 29 Apr 2024 12:28:45 +0000 (14:28 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 14 May 2024 11:37:06 +0000 (13:37 +0200)
When walking user stack frames the first stack frame (where the stack
pointer points to) should be skipped: the return address of the current
function is saved in the previous stack frame, not the current stack frame,
which is allocated for to be called functions.

Fixes: aa44433ac4ee ("s390: add USER_STACKTRACE support")
Reviewed-by: Jens Remus <jremus@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
arch/s390/kernel/stacktrace.c

index e580d4cd2729afa0f53c8cace5fc844f17d5e2d6..1c9e3b7739a22b3cc2b54d48b8bb4a6278e36542 100644 (file)
@@ -95,6 +95,10 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo
        while (1) {
                if (__get_user(sp, &sf->back_chain))
                        break;
+               /* Sanity check: ABI requires SP to be 8 byte aligned. */
+               if (!sp || sp & 0x7)
+                       break;
+               sf = (void __user *)sp;
                if (__get_user(ip, &sf->gprs[8]))
                        break;
                if (ip & 0x1) {
@@ -110,10 +114,6 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo
                }
                if (!store_ip(consume_entry, cookie, entry, perf, ip))
                        return;
-               /* Sanity check: ABI requires SP to be aligned 8 bytes. */
-               if (!sp || sp & 0x7)
-                       break;
-               sf = (void __user *)sp;
                first = false;
        }
        pagefault_enable();