diff options
author | Helge Deller <deller@gmx.de> | 2009-10-25 21:48:36 +0000 |
---|---|---|
committer | Kyle McMartin <kyle@mcmartin.ca> | 2009-12-16 03:48:54 +0000 |
commit | 11e178091f6a9c5ca479f8a276b9dd0dfacf8fc4 (patch) | |
tree | 5f110fc33fd34debd0a072dff7e767143e1ed7db /arch/parisc/kernel | |
parent | b29f90379eb5def21ca3fdf576079c285b815e6a (diff) | |
download | op-kernel-dev-11e178091f6a9c5ca479f8a276b9dd0dfacf8fc4.zip op-kernel-dev-11e178091f6a9c5ca479f8a276b9dd0dfacf8fc4.tar.gz |
parisc: add CALLER_ADDR{0-6} macros
Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
Diffstat (limited to 'arch/parisc/kernel')
-rw-r--r-- | arch/parisc/kernel/unwind.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index a36799e..f03f6fb 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c @@ -417,3 +417,30 @@ int unwind_to_user(struct unwind_frame_info *info) return ret; } + +unsigned long return_address(unsigned int level) +{ + struct unwind_frame_info info; + struct pt_regs r; + unsigned long sp; + + /* initialize unwind info */ + asm volatile ("copy %%r30, %0" : "=r"(sp)); + memset(&r, 0, sizeof(struct pt_regs)); + r.iaoq[0] = (unsigned long) current_text_addr(); + r.gr[2] = (unsigned long) __builtin_return_address(0); + r.gr[30] = sp; + unwind_frame_init(&info, current, &r); + + /* unwind stack */ + ++level; + do { + if (unwind_once(&info) < 0 || info.ip == 0) + return 0; + if (!__kernel_text_address(info.ip)) { + return 0; + } + } while (info.ip && level--); + + return info.ip; +} |