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

Re: [Xen-devel] [Patch v3 3/4] x86/stack: Change show_stack_overflow() to use frame pointers if available



>>> On 18.11.13 at 20:34, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote:
> Pass a full set of cpu_user_regs, and defer the hand-coded stack printing to
> __show_trace(), which will correctly use frame pointers if available.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Keir Fraser <keir@xxxxxxx>

Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>

> CC: Tim Deegan <tim@xxxxxxx>
> ---
>  xen/arch/x86/traps.c            |   14 ++++----------
>  xen/arch/x86/x86_64/traps.c     |    2 +-
>  xen/include/asm-x86/processor.h |    2 +-
>  3 files changed, 6 insertions(+), 12 deletions(-)
> 
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index d68f93c..67be3c4 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -316,11 +316,11 @@ void show_stack(struct cpu_user_regs *regs)
>      show_trace(regs);
>  }
>  
> -void show_stack_overflow(unsigned int cpu, unsigned long esp)
> +void show_stack_overflow(unsigned int cpu, const struct cpu_user_regs 
> *regs)
>  {
>  #ifdef MEMORY_GUARD
> +    unsigned long esp = regs->rsp;
>      unsigned long esp_top, esp_bottom;
> -    unsigned long *stack, addr;
>  
>      esp_bottom = (esp | (STACK_SIZE - 1)) + 1;
>      esp_top    = esp_bottom - PRIMARY_STACK_SIZE;
> @@ -340,16 +340,10 @@ void show_stack_overflow(unsigned int cpu, unsigned 
> long esp)
>      if ( esp < esp_top )
>          esp = esp_top;
>  
> -    printk("Xen stack overflow (dumping trace %p-%p):\n   ",
> +    printk("Xen stack overflow (dumping trace %p-%p):\n",
>             (void *)esp, (void *)esp_bottom);
>  
> -    stack = (unsigned long *)esp;
> -    while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
> -    {
> -        addr = *stack++;
> -        if ( is_active_kernel_text(addr) )
> -            printk("%p: [<%p>] %pS\n", stack, _p(addr), _p(addr));
> -    }
> +    __show_trace(esp, regs->rbp);
>  
>      printk("\n");
>  #endif
> diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c
> index 8e6a7c1..bcf72b6 100644
> --- a/xen/arch/x86/x86_64/traps.c
> +++ b/xen/arch/x86/x86_64/traps.c
> @@ -248,7 +248,7 @@ void do_double_fault(struct cpu_user_regs *regs)
>  
>      printk("CPU:    %d\n", cpu);
>      _show_registers(regs, crs, CTXT_hypervisor, NULL);
> -    show_stack_overflow(cpu, regs->rsp);
> +    show_stack_overflow(cpu, regs);
>  
>      panic("DOUBLE FAULT -- system shutdown\n");
>  }
> diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h
> index 73a3202..c120460 100644
> --- a/xen/include/asm-x86/processor.h
> +++ b/xen/include/asm-x86/processor.h
> @@ -509,7 +509,7 @@ extern always_inline void prefetchw(const void *x)
>  #endif
>  
>  void show_stack(struct cpu_user_regs *regs);
> -void show_stack_overflow(unsigned int cpu, unsigned long esp);
> +void show_stack_overflow(unsigned int cpu, const struct cpu_user_regs 
> *regs);
>  void show_registers(struct cpu_user_regs *regs);
>  void show_execution_state(struct cpu_user_regs *regs);
>  #define dump_execution_state() 
> run_in_exception_handler(show_execution_state)
> -- 
> 1.7.10.4




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.