On Thu, Sep 22, 2011 at 01:13:01PM +0100, Jon Medhurst (Tixy) wrote: > On Thu, 2011-09-22 at 12:57 +0100, Catalin Marinas wrote: > > On Thu, Sep 22, 2011 at 12:06:46PM +0100, Jon Medhurst (Tixy) wrote: > > > On Thu, 2011-09-22 at 10:48 +0100, Catalin Marinas wrote: > > > > We could improve things a bit in the unwinder and assume > > > > that if the fault address is the same as the .fnstart address, the > > > > return value is always in LR and the SP not affected (that's unwinding > > > > bytecode 0xb0). For a few instructions into the function prologue we > > > > can't reliably get the unwinding information. > > > > > > That would help make it possible to unwind out of kprobes handlers to > > > the probed function. The kprobes code itself would need work as well, > > > and possibly the undef handler. Do we think it is worthwhile to do > > > this? > > > > Does kprobes need to trace beyond the probed function? If not, you get > > the address of the probed function via pt_regs anyway, so no need for > > unwinding beyond that. > > To be honest, I'm not very sure how kprobes get used in the real world. > Though, if stack unwinding from their handlers currently doesn't work > and people had a usecase for it, we would expect them to complain. The unwinding fix should be simple (I haven't tested it yet): 8<----------------------------- ARM: Ignore the unwinding information for the first instruction in a function From: Catalin Marinas <catalin.marinas@xxxxxxx> When backtracing from the first instruction of a function, the prologue has not been executed and the unwinding information is not valid. This patch checks for this case and just assumes that the return address is in LR. Signed-off-by: Catalin Marinas <catalin.marinas@xxxxxxx> --- arch/arm/kernel/unwind.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c index d2cb0b3..946face 100644 --- a/arch/arm/kernel/unwind.c +++ b/arch/arm/kernel/unwind.c @@ -293,6 +293,16 @@ int unwind_frame(struct stackframe *frame) return -URC_FAILURE; } + /* + * Check for backtrace on the first instruction of a function. The + * prologue has not been executed yet and the unwinding information is + * not valid. Assume that the return address is in LR. + */ + if (idx.addr == frame->pc) { + frame->pc = frame->lr; + return URC_OK; + } + ctrl.vrs[FP] = frame->fp; ctrl.vrs[SP] = frame->sp; ctrl.vrs[LR] = frame->lr; -- Catalin -- To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html