[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v2 02/12] x86: don't use hypervisor stack size for dumping guest stacks
show_guest_stack() and compat_show_guest_stack() stop dumping the stack of the guest whenever its virtual address reaches the same alignment which is used for the hypervisor stacks. Remove this arbitrary limit and try to dump a fixed number of lines instead. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- xen/arch/x86/traps.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index a3e8f0c9b9..1115b69050 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -191,7 +191,8 @@ static void compat_show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs, int debug_stack_lines) { - unsigned int i, *stack, addr, mask = STACK_SIZE; + unsigned int i, *stack, addr; + unsigned long last_addr = -1L; stack = (unsigned int *)(unsigned long)regs->esp; printk("Guest stack trace from esp=%08lx:\n ", (unsigned long)stack); @@ -220,13 +221,13 @@ static void compat_show_guest_stack(struct vcpu *v, printk("Inaccessible guest memory.\n"); return; } - mask = PAGE_SIZE; + last_addr = round_pgup((unsigned long)stack); } } for ( i = 0; i < debug_stack_lines * 8; i++ ) { - if ( (((long)stack - 1) ^ ((long)(stack + 1) - 1)) & mask ) + if ( (unsigned long)stack >= last_addr ) break; if ( __get_user(addr, stack) ) { @@ -241,11 +242,9 @@ static void compat_show_guest_stack(struct vcpu *v, printk(" %08x", addr); stack++; } - if ( mask == PAGE_SIZE ) - { - BUILD_BUG_ON(PAGE_SIZE == STACK_SIZE); + if ( last_addr != -1L ) unmap_domain_page(stack); - } + if ( i == 0 ) printk("Stack empty."); printk("\n"); @@ -254,8 +253,7 @@ static void compat_show_guest_stack(struct vcpu *v, static void show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs) { int i; - unsigned long *stack, addr; - unsigned long mask = STACK_SIZE; + unsigned long *stack, addr, last_addr = -1L; /* Avoid HVM as we don't know what the stack looks like. */ if ( is_hvm_vcpu(v) ) @@ -290,13 +288,13 @@ static void show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs) printk("Inaccessible guest memory.\n"); return; } - mask = PAGE_SIZE; + last_addr = round_pgup((unsigned long)stack); } } for ( i = 0; i < (debug_stack_lines*stack_words_per_line); i++ ) { - if ( (((long)stack - 1) ^ ((long)(stack + 1) - 1)) & mask ) + if ( (unsigned long)stack >= last_addr ) break; if ( __get_user(addr, stack) ) { @@ -311,11 +309,9 @@ static void show_guest_stack(struct vcpu *v, const struct cpu_user_regs *regs) printk(" %p", _p(addr)); stack++; } - if ( mask == PAGE_SIZE ) - { - BUILD_BUG_ON(PAGE_SIZE == STACK_SIZE); + if ( last_addr != -1L ) unmap_domain_page(stack); - } + if ( i == 0 ) printk("Stack empty."); printk("\n"); -- 2.13.6 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |