Commit 5868caf6 authored by Andrew Morton's avatar Andrew Morton Committed by Christoph Hellwig

[PATCH] add dump_stack(): cross-arch backtrace

From Christoph Hellwig, also present in 2.4.

Create an arch-independent `dump_stack()' function.  So we don't need to do

#ifdef CONFIG_X86
	show_stack(0);		/* No prototype in scope! */
#endif

any more.

The whole dump_stack() implementation is delegated to the architecture.
If it doesn't provide one, there is a default do-nothing library
function.
parent 5045fffe
...@@ -171,6 +171,11 @@ void show_stack(unsigned long *sp) ...@@ -171,6 +171,11 @@ void show_stack(unsigned long *sp)
dik_show_trace(sp); dik_show_trace(sp);
} }
void dump_stack(void)
{
show_stack(NULL);
}
void void
die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15) die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15)
{ {
......
...@@ -230,8 +230,12 @@ watchdog_bite_hook(struct pt_regs *regs) ...@@ -230,8 +230,12 @@ watchdog_bite_hook(struct pt_regs *regs)
#endif #endif
} }
/* This is normally the 'Oops' routine */ void dump_stack(void)
{
show_stack(NULL);
}
/* This is normally the 'Oops' routine */
void void
die_if_kernel(const char * str, struct pt_regs * regs, long err) die_if_kernel(const char * str, struct pt_regs * regs, long err)
{ {
......
...@@ -189,6 +189,14 @@ void show_stack(unsigned long * esp) ...@@ -189,6 +189,14 @@ void show_stack(unsigned long * esp)
show_trace(esp); show_trace(esp);
} }
/*
* The architecture-independent dump_stack generator
*/
void dump_stack(void)
{
show_stack(0);
}
void show_registers(struct pt_regs *regs) void show_registers(struct pt_regs *regs)
{ {
int i; int i;
......
...@@ -61,10 +61,8 @@ void __buffer_error(char *file, int line) ...@@ -61,10 +61,8 @@ void __buffer_error(char *file, int line)
return; return;
enough++; enough++;
printk("buffer layer error at %s:%d\n", file, line); printk("buffer layer error at %s:%d\n", file, line);
#ifdef CONFIG_X86
printk("Pass this trace through ksymoops for reporting\n"); printk("Pass this trace through ksymoops for reporting\n");
show_stack(0); dump_stack();
#endif
} }
EXPORT_SYMBOL(__buffer_error); EXPORT_SYMBOL(__buffer_error);
......
...@@ -96,6 +96,8 @@ extern const char *print_tainted(void); ...@@ -96,6 +96,8 @@ extern const char *print_tainted(void);
#define TAINT_FORCED_MODULE (1<<1) #define TAINT_FORCED_MODULE (1<<1)
#define TAINT_UNSAFE_SMP (1<<2) #define TAINT_UNSAFE_SMP (1<<2)
extern void dump_stack(void);
#if DEBUG #if DEBUG
#define pr_debug(fmt,arg...) \ #define pr_debug(fmt,arg...) \
printk(KERN_DEBUG fmt,##arg) printk(KERN_DEBUG fmt,##arg)
......
...@@ -605,3 +605,6 @@ EXPORT_SYMBOL(pidhash); ...@@ -605,3 +605,6 @@ EXPORT_SYMBOL(pidhash);
#if defined(CONFIG_SMP) && defined(__GENERIC_PER_CPU) #if defined(CONFIG_SMP) && defined(__GENERIC_PER_CPU)
EXPORT_SYMBOL(__per_cpu_offset); EXPORT_SYMBOL(__per_cpu_offset);
#endif #endif
/* debug */
EXPORT_SYMBOL(dump_stack);
...@@ -12,7 +12,7 @@ export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o \ ...@@ -12,7 +12,7 @@ export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o \
crc32.o rbtree.o radix-tree.o crc32.o rbtree.o radix-tree.o
obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \ obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \
bust_spinlocks.o rbtree.o radix-tree.o bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o
obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
......
/*
* Provide a default dump_stack() function for architectures
* which don't implement their own.
*/
#include <linux/kernel.h>
#include <linux/module.h>
void dump_stack(void)
{
printk(KERN_NOTICE
"This architecture does not implement dump_stack()\n");
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment