Atsushi Nemoto wrote: > On Tue, 1 Aug 2006 21:38:18 +0200, "Franck Bui-Huu" <vagabon.xyz@xxxxxxxxx> wrote: >> Considering (wrongly) a nested function as a leaf one is not a big >> issue. "ra" reg should _always_ store a valid address (nested or not). >> The only (small) impact would be to skip an entry when showing the >> backtrace. > > The unwind_stack() uses regs->regs[31] for a leaf, and regs->regs[31] > always holds RA value of _top_ of the stack, not at that level. > does something like this on top of this patch make you feel better ? -- >8 -- diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index 4ceddfa..8a9db45 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c @@ -480,7 +480,13 @@ unsigned long unwind_stack(struct task_s return 0; if (leaf) - pc = regs->regs[31]; + /* + * For some extreme cases, get_frame_info() can + * consider wrongly a nested function as a leaf + * one. In that cases avoid to return always the + * same value. + */ + pc = pc != regs->regs[31] ? regs->regs[31] : 0; else pc = (*sp)[info.pc_offset];