----- "Mika Westerberg" <ext-mika.1.westerberg(a)nokia.com> wrote:
 Enhance backtracing code to print out userspace registers in case we
 are at syscall entry. Other architectures supported by crash are
 already doing this.
 
 Signed-off-by: Mika Westerberg <ext-mika.1.westerberg(a)nokia.com>
 ---
 I tested this with both unwind tables and framepointers enabled on
 my test vmcores, and also on live system. 
Works well on my sample dumpfiles -- queued for the next release.
Thanks,
  Dave
 
  arm.c |   31 ++++++++++++++++++++++++++++++-
  1 files changed, 30 insertions(+), 1 deletions(-)
 
 diff --git a/arm.c b/arm.c
 index 985f78e..a8a34b9 100644
 --- a/arm.c
 +++ b/arm.c
 @@ -31,6 +31,7 @@ static int arm_verify_symbol(const char *, ulong,
 char);
  static int arm_is_module_addr(ulong);
  static int arm_is_kvaddr(ulong);
  static int arm_in_exception_text(ulong);
 +static int arm_in_ret_from_syscall(ulong);
  static void arm_back_trace(struct bt_info *);
  static void arm_back_trace_cmd(struct bt_info *);
  static ulong arm_processor_speed(void);
 @@ -668,6 +669,16 @@ arm_in_exception_text(ulong pc)
  }
  
  /*
 + * Returns TRUE if given pc points to a return from syscall
 entrypoint.
 + */
 +static int
 +arm_in_ret_from_syscall(ulong pc)
 +{
 +	return (pc == symbol_value("ret_fast_syscall") ||
 +		pc == symbol_value("ret_slow_syscall"));
 +}
 +
 +/*
   *  Unroll the kernel stack using a minimal amount of gdb services.
   */
  static void
 @@ -1188,8 +1199,26 @@ arm_dump_backtrace_entry(struct bt_info *bt,
 int level, ulong from, ulong sp)
  			fprintf(fp, "    %s\n", buf);
  	}
  
 -	if (arm_in_exception_text(bt->instptr))
 +	if (arm_in_exception_text(bt->instptr)) {
  		arm_dump_exception_stack(sp, sp + sizeof(struct arm_pt_regs));
 +	} else if (arm_in_ret_from_syscall(from)) {
 +		/*
 +		 * When we are returning from the syscall, here is
 +		 * what the stack frame looks like:
 +		 *
 +		 * SP + 0	{r4, r5}
 +		 * SP + 8	user pt_regs
 +		 *
 +		 * The asm syscall handler pushes fifth and sixth
 +		 * registers onto the stack before calling the
 +		 * actual syscall handler.
 +		 *
 +		 * So in order to print out the user registers when
 +		 * the syscall was made, we need to adjust sp for 8.
 +		 */
 +		arm_dump_exception_stack(sp + 8,
 +					 sp + 8 + sizeof(struct arm_pt_regs));
 +	}
  
  	if (bt->flags & BT_FULL) {
  		if (kt->flags & DWARF_UNWIND) {
 -- 
 1.7.3.2
 
 --
 Crash-utility mailing list
 Crash-utility(a)redhat.com
 
https://www.redhat.com/mailman/listinfo/crash-utility