1 #include <linux/module.h>
2 #include <linux/sched.h>
4 #include "stacktrace.h"
6 struct return_address_data
{
11 static int save_return_addr(struct stackframe
*frame
, void *d
)
13 struct return_address_data
*data
= d
;
16 data
->addr
= (void *)frame
->lr
;
25 void *return_address(unsigned int level
)
27 unsigned long fp
, base
;
28 struct return_address_data data
;
30 data
.level
= level
+ 1;
32 base
= (unsigned long)task_stack_page(current
);
33 asm("mov %0, fp" : "=r" (fp
));
35 walk_stackframe(fp
, base
, base
+ THREAD_SIZE
, save_return_addr
, &data
);
42 EXPORT_SYMBOL_GPL(return_address
);