|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [Patch v3 2/4] x86/stack: Adjust boundary conditions for printed stacks.
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>
CC: 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 |