| From ada770b1e74a77fff2d5f539bf6c42c25f4784db Mon Sep 17 00:00:00 2001 |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| Date: Thu, 4 Apr 2019 11:08:40 -0700 |
| Subject: xtensa: fix return_address |
| |
| From: Max Filippov <jcmvbkbc@gmail.com> |
| |
| commit ada770b1e74a77fff2d5f539bf6c42c25f4784db upstream. |
| |
| return_address returns the address that is one level higher in the call |
| stack than requested in its argument, because level 0 corresponds to its |
| caller's return address. Use requested level as the number of stack |
| frames to skip. |
| |
| This fixes the address reported by might_sleep and friends. |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Max Filippov <jcmvbkbc@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/xtensa/kernel/stacktrace.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/arch/xtensa/kernel/stacktrace.c |
| +++ b/arch/xtensa/kernel/stacktrace.c |
| @@ -253,10 +253,14 @@ static int return_address_cb(struct stac |
| return 1; |
| } |
| |
| +/* |
| + * level == 0 is for the return address from the caller of this function, |
| + * not from this function itself. |
| + */ |
| unsigned long return_address(unsigned level) |
| { |
| struct return_addr_data r = { |
| - .skip = level + 1, |
| + .skip = level, |
| }; |
| walk_stackframe(stack_pointer(NULL), return_address_cb, &r); |
| return r.addr; |