|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 08/14] xen: arm: support dumping 64-bit guest stack
On Tue, 12 Mar 2013, Ian Campbell wrote:
> From: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
it would be nice to support more guest modes but this is undoubtedly an
improvement.
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> xen/arch/arm/traps.c | 80
> +++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 76 insertions(+), 4 deletions(-)
>
> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
> index 2f4e157..2671eba 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -523,9 +523,81 @@ void vcpu_show_registers(const struct vcpu *v)
> _show_registers(&v->arch.cpu_info->guest_cpu_user_regs, &ctxt, 1, v);
> }
>
> -static void show_guest_stack(struct cpu_user_regs *regs)
> +static void show_guest_stack(struct vcpu *v, struct cpu_user_regs *regs)
> {
> - printk("GUEST STACK GOES HERE\n");
> + int i;
> + vaddr_t sp;
> + paddr_t stack_phys;
> + void *mapped;
> + unsigned long *stack, addr;
> +
> + switch ( regs->cpsr & PSR_MODE_MASK )
> + {
> + case PSR_MODE_USR:
> + case PSR_MODE_SYS:
> +#ifdef CONFIG_ARM_64
> + case PSR_MODE_EL0t:
> +#endif
> + printk("No stack trace for guest user-mode\n");
> + return;
> +
> + case PSR_MODE_FIQ:
> + case PSR_MODE_IRQ:
> + case PSR_MODE_SVC:
> + case PSR_MODE_ABT:
> + case PSR_MODE_UND:
> + printk("No stack trace for 32-bit guest kernel-mode\n");
> + return;
> +
> +#ifdef CONFIG_ARM_64
> + case PSR_MODE_EL1t:
> + sp = regs->sp_el0;
> + break;
> + case PSR_MODE_EL1h:
> + sp = regs->sp_el1;
> + break;
> +#endif
> +
> + case PSR_MODE_HYP:
> + case PSR_MODE_MON:
> +#ifdef CONFIG_ARM_64
> + case PSR_MODE_EL3h:
> + case PSR_MODE_EL3t:
> + case PSR_MODE_EL2h:
> + case PSR_MODE_EL2t:
> +#endif
> + default:
> + BUG();
> + return;
> + }
> +
> + printk("Guest stack trace from sp=%"PRIvaddr":\n ", sp);
> +
> + if ( gvirt_to_maddr(sp, &stack_phys) )
> + {
> + printk("Failed to convert stack to physical address\n");
> + return;
> + }
> +
> + mapped = map_domain_page(stack_phys >> PAGE_SHIFT);
> +
> + stack = mapped + (sp & ~PAGE_MASK);
> +
> + for ( i = 0; i < (debug_stack_lines*stack_words_per_line); i++ )
> + {
> + if ( (((long)stack - 1) ^ ((long)(stack + 1) - 1)) & PAGE_SIZE )
> + break;
> + addr = *stack;
> + if ( (i != 0) && ((i % stack_words_per_line) == 0) )
> + printk("\n ");
> + printk(" %p", _p(addr));
> + stack++;
> + }
> + if ( i == 0 )
> + printk("Stack empty.");
> + printk("\n");
> + unmap_domain_page(mapped);
> +
> }
>
> #define STACK_BEFORE_EXCEPTION(regs) ((register_t*)(regs)->sp)
> @@ -589,7 +661,7 @@ void show_stack(struct cpu_user_regs *regs)
> int i;
>
> if ( guest_mode(regs) )
> - return show_guest_stack(regs);
> + return show_guest_stack(current, regs);
>
> printk("Xen stack trace from sp=%p:\n ", stack);
>
> @@ -631,7 +703,7 @@ void vcpu_show_execution_state(struct vcpu *v)
>
> vcpu_show_registers(v);
> if ( !usr_mode(&v->arch.cpu_info->guest_cpu_user_regs) )
> - show_guest_stack(&v->arch.cpu_info->guest_cpu_user_regs);
> + show_guest_stack(v, &v->arch.cpu_info->guest_cpu_user_regs);
>
> vcpu_unpause(v);
> }
> --
> 1.7.10.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |