added 2.6.29.6 aldebaran kernel
[nao-ulib.git] / kernel / 2.6.29.6-aldebaran-rt / arch / arm / kernel / return_address.c
blobbfb9b52fdf6dfbccbd84426f9978fe67f3690235
1 #include <linux/module.h>
2 #include <linux/sched.h>
4 #include "stacktrace.h"
6 struct return_address_data {
7 unsigned int level;
8 void *addr;
9 };
11 static int save_return_addr(struct stackframe *frame, void *d)
13 struct return_address_data *data = d;
15 if (!data->level) {
16 data->addr = (void *)frame->lr;
18 return 1;
19 } else {
20 --data->level;
21 return 0;
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);
37 if (!data.level)
38 return data.addr;
39 else
40 return NULL;
42 EXPORT_SYMBOL_GPL(return_address);