Re: [PATCH] ARM: dump also userspace registers when backtracing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



----- "Mika Westerberg" <ext-mika.1.westerberg@xxxxxxxxx> 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@xxxxxxxxx>
> ---
> 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@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/crash-utility

--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/crash-utility


[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux