aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/symbols.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-03-31 16:35:02 +0100
committerKeir Fraser <keir@xensource.com>2007-03-31 16:35:02 +0100
commit2746bed0cd7f4091b1a2a706765c64f849f77d1c (patch)
tree251611db45d58c221b8826b5ce139bff3d7b6315 /xen/common/symbols.c
parent6fb7ede8478411bf53270ccbb9d7050cc6e59ca5 (diff)
downloadxen-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.c12
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);
}