[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 Mon, 2013-04-08 at 18:29 +0100, Stefano Stabellini wrote: > 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. I implemented the one I needed to debug the issue I was facing at the time ;-) Hopefully others will do the same... > > 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 |