[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |