Skip to content

Commit

Permalink
s390/dumpstack: implement and use return_address()
Browse files Browse the repository at this point in the history
Implement return_address() and use it instead of __builtin_return_address(n).

__builtin_return_address(n) is not guaranteed to work for n > 0,
therefore implement a private return_address() function which walks
the stack frames and returns the proper return address.

This way we get also rid of a compile warning which gcc 6.1 emits and
look like all other architectures.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed May 4, 2016
1 parent e18eb2d commit 5606330
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
4 changes: 3 additions & 1 deletion arch/s390/include/asm/ftrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

#ifndef __ASSEMBLY__

#define ftrace_return_address(n) __builtin_return_address(n)
unsigned long return_address(int depth);

#define ftrace_return_address(n) return_address(n)

void _mcount(void);
void ftrace_caller(void);
Expand Down
24 changes: 24 additions & 0 deletions arch/s390/kernel/dumpstack.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,30 @@ void dump_trace(dump_trace_func_t func, void *data, struct task_struct *task,
}
EXPORT_SYMBOL_GPL(dump_trace);

struct return_address_data {
unsigned long address;
int depth;
};

static int __return_address(void *data, unsigned long address)
{
struct return_address_data *rd = data;

if (rd->depth--)
return 0;
rd->address = address;
return 1;
}

unsigned long return_address(int depth)
{
struct return_address_data rd = { .depth = depth + 2 };

dump_trace(__return_address, &rd, NULL, current_stack_pointer());
return rd.address;
}
EXPORT_SYMBOL_GPL(return_address);

static int show_address(void *data, unsigned long address)
{
printk("([<%016lx>] %pSR)\n", address, (void *)address);
Expand Down

0 comments on commit 5606330

Please sign in to comment.