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

Re: [Xen-devel] [Patch v3 2/4] x86/stack: Adjust boundary conditions for printed stacks.



>>> On 18.11.13 at 20:34, Andrew Cooper <andrew.cooper3@xxxxxxxxxx> wrote:
> Move the boundary into current.h along with the other stack manipulation 
> code.
> The boundary is now the word adjacent to a struct cpu_info on the stack.
> 
> This also fixes the somewhat spurious bounds for the case with frame 
> pointers.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Keir Fraser <keir@xxxxxxx>

Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>

> CC: Tim Deegan <tim@xxxxxxx>
> 
> ---
> 
> Changes since v1:
>  * Change printable bottom depending on frame pointers
> ---
>  xen/arch/x86/traps.c          |    9 ++++-----
>  xen/include/asm-x86/current.h |    9 +++++++++
>  2 files changed, 13 insertions(+), 5 deletions(-)
> 
> diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
> index 5917291..d68f93c 100644
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -203,8 +203,9 @@ static void show_guest_stack(struct vcpu *v, struct 
> cpu_user_regs *regs)
>  static void __show_trace(unsigned long sp, unsigned long __maybe_unused bp)
>  {
>      unsigned long *stack = (unsigned long *)sp, addr;
> +    unsigned long *bottom = (unsigned long 
> *)get_printable_stack_bottom(sp);
>  
> -    while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
> +    while ( stack <= bottom )
>      {
>          addr = *stack++;
>          if ( is_active_kernel_text(addr) )
> @@ -217,12 +218,10 @@ static void __show_trace(unsigned long sp, unsigned 
> long __maybe_unused bp)
>  /* Stack trace from frames in the stack, using frame pointers */
>  static void __show_trace(unsigned long sp, unsigned long bp)
>  {
> -    unsigned long *frame, next, addr, low, high;
> +    unsigned long *frame, next, addr;
>  
>      /* Bounds for range of valid frame pointer. */
> -    low  = sp - 2*sizeof(unsigned long);
> -    high = (low & ~(STACK_SIZE - 1)) + 
> -        (STACK_SIZE - sizeof(struct cpu_info) - 2*sizeof(unsigned long));
> +    unsigned long low = sp, high = get_printable_stack_bottom(sp);
>  
>      /* The initial frame pointer. */
>      next = bp;
> diff --git a/xen/include/asm-x86/current.h b/xen/include/asm-x86/current.h
> index bec4dbe..c2792ce 100644
> --- a/xen/include/asm-x86/current.h
> +++ b/xen/include/asm-x86/current.h
> @@ -50,6 +50,15 @@ static inline struct cpu_info *get_cpu_info(void)
>  #define get_stack_bottom()                      \
>      ((unsigned long)&get_cpu_info()->guest_cpu_user_regs.es)
>  
> +/*
> + * Get the bottom-of-stack, as useful for printing stack traces.  This is the
> + * highest word on the stack which might be part of a stack trace, and is 
> the
> + * adjacent word to a struct cpu_info on the stack.
> + */
> +#define get_printable_stack_bottom(sp)          \
> +    ((sp & (~(STACK_SIZE-1))) +                 \
> +     (STACK_SIZE - sizeof(struct cpu_info) - sizeof(unsigned long)))
> +
>  #define reset_stack_and_jump(__fn)              \
>      __asm__ __volatile__ (                      \
>          "mov %0,%%"__OP"sp; jmp %c1"            \
> -- 
> 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®.