diff options
author | Keir Fraser <keir@xensource.com> | 2007-03-31 16:35:02 +0100 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-03-31 16:35:02 +0100 |
commit | 2746bed0cd7f4091b1a2a706765c64f849f77d1c (patch) | |
tree | 251611db45d58c221b8826b5ce139bff3d7b6315 /xen/common/symbols.c | |
parent | 6fb7ede8478411bf53270ccbb9d7050cc6e59ca5 (diff) | |
download | xen-2746bed0cd7f4091b1a2a706765c64f849f77d1c.tar.gz xen-2746bed0cd7f4091b1a2a706765c64f849f77d1c.tar.bz2 xen-2746bed0cd7f4091b1a2a706765c64f849f77d1c.zip |
xen x86: Fix double-fault handler stack overflow.
1. Shrink stack frame for __print_symbol() by introducing a lock and
making the big arrays static.
2. Double the size of the double-fault stack.
Also fix the show_stack_overflow function.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/common/symbols.c')
-rw-r--r-- | xen/common/symbols.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/xen/common/symbols.c b/xen/common/symbols.c index f4134b7ed5..60f3c335a6 100644 --- a/xen/common/symbols.c +++ b/xen/common/symbols.c @@ -16,6 +16,7 @@ #include <xen/init.h> #include <xen/lib.h> #include <xen/string.h> +#include <xen/spinlock.h> extern unsigned long symbols_addresses[]; extern unsigned long symbols_num_syms; @@ -140,12 +141,15 @@ const char *symbols_lookup(unsigned long addr, void __print_symbol(const char *fmt, unsigned long address) { const char *name; - unsigned long offset, size; - char namebuf[KSYM_NAME_LEN+1]; + unsigned long offset, size, flags; + static DEFINE_SPINLOCK(lock); + static char namebuf[KSYM_NAME_LEN+1]; #define BUFFER_SIZE sizeof("%s+%#lx/%#lx [%s]") + KSYM_NAME_LEN + \ 2*(BITS_PER_LONG*3/10) + 1 - char buffer[BUFFER_SIZE]; + static char buffer[BUFFER_SIZE]; + + spin_lock_irqsave(&lock, flags); name = symbols_lookup(address, &size, &offset, namebuf); @@ -155,4 +159,6 @@ void __print_symbol(const char *fmt, unsigned long address) snprintf(buffer, BUFFER_SIZE, "%s+%#lx/%#lx", name, offset, size); printk(fmt, buffer); + + spin_unlock_irqrestore(&lock, flags); } |