|
@@ -110,28 +110,31 @@ static int kstack_depth_to_print = 12;
|
|
static int call_trace = 1;
|
|
static int call_trace = 1;
|
|
|
|
|
|
#ifdef CONFIG_KALLSYMS
|
|
#ifdef CONFIG_KALLSYMS
|
|
-#include <linux/kallsyms.h>
|
|
|
|
-int printk_address(unsigned long address)
|
|
|
|
-{
|
|
|
|
|
|
+# include <linux/kallsyms.h>
|
|
|
|
+void printk_address(unsigned long address)
|
|
|
|
+{
|
|
unsigned long offset = 0, symsize;
|
|
unsigned long offset = 0, symsize;
|
|
const char *symname;
|
|
const char *symname;
|
|
char *modname;
|
|
char *modname;
|
|
- char *delim = ":";
|
|
|
|
|
|
+ char *delim = ":";
|
|
char namebuf[128];
|
|
char namebuf[128];
|
|
|
|
|
|
- symname = kallsyms_lookup(address, &symsize, &offset, &modname, namebuf);
|
|
|
|
- if (!symname)
|
|
|
|
- return printk("[<%016lx>]", address);
|
|
|
|
- if (!modname)
|
|
|
|
|
|
+ symname = kallsyms_lookup(address, &symsize, &offset,
|
|
|
|
+ &modname, namebuf);
|
|
|
|
+ if (!symname) {
|
|
|
|
+ printk(" [<%016lx>]\n", address);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (!modname)
|
|
modname = delim = "";
|
|
modname = delim = "";
|
|
- return printk("<%016lx>{%s%s%s%s%+ld}",
|
|
|
|
- address, delim, modname, delim, symname, offset);
|
|
|
|
-}
|
|
|
|
|
|
+ printk(" [<%016lx>] %s%s%s%s+0x%lx/0x%lx\n",
|
|
|
|
+ address, delim, modname, delim, symname, offset, symsize);
|
|
|
|
+}
|
|
#else
|
|
#else
|
|
-int printk_address(unsigned long address)
|
|
|
|
-{
|
|
|
|
- return printk("[<%016lx>]", address);
|
|
|
|
-}
|
|
|
|
|
|
+void printk_address(unsigned long address)
|
|
|
|
+{
|
|
|
|
+ printk(" [<%016lx>]\n", address);
|
|
|
|
+}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
|
static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
|
@@ -193,20 +196,14 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
|
|
|
|
|
static int show_trace_unwind(struct unwind_frame_info *info, void *context)
|
|
static int show_trace_unwind(struct unwind_frame_info *info, void *context)
|
|
{
|
|
{
|
|
- int i = 11, n = 0;
|
|
|
|
|
|
+ int n = 0;
|
|
|
|
|
|
while (unwind(info) == 0 && UNW_PC(info)) {
|
|
while (unwind(info) == 0 && UNW_PC(info)) {
|
|
- ++n;
|
|
|
|
- if (i > 50) {
|
|
|
|
- printk("\n ");
|
|
|
|
- i = 7;
|
|
|
|
- } else
|
|
|
|
- i += printk(" ");
|
|
|
|
- i += printk_address(UNW_PC(info));
|
|
|
|
|
|
+ n++;
|
|
|
|
+ printk_address(UNW_PC(info));
|
|
if (arch_unw_user_mode(info))
|
|
if (arch_unw_user_mode(info))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- printk("\n");
|
|
|
|
return n;
|
|
return n;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -224,7 +221,7 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|
int i = 11;
|
|
int i = 11;
|
|
unsigned used = 0;
|
|
unsigned used = 0;
|
|
|
|
|
|
- printk("\nCall Trace:");
|
|
|
|
|
|
+ printk("\nCall Trace:\n");
|
|
|
|
|
|
if (!tsk)
|
|
if (!tsk)
|
|
tsk = current;
|
|
tsk = current;
|
|
@@ -254,12 +251,6 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|
do while (cond) { \
|
|
do while (cond) { \
|
|
unsigned long addr = *stack++; \
|
|
unsigned long addr = *stack++; \
|
|
if (kernel_text_address(addr)) { \
|
|
if (kernel_text_address(addr)) { \
|
|
- if (i > 50) { \
|
|
|
|
- printk("\n "); \
|
|
|
|
- i = 0; \
|
|
|
|
- } \
|
|
|
|
- else \
|
|
|
|
- i += printk(" "); \
|
|
|
|
/* \
|
|
/* \
|
|
* If the address is either in the text segment of the \
|
|
* If the address is either in the text segment of the \
|
|
* kernel, or in the region which contains vmalloc'ed \
|
|
* kernel, or in the region which contains vmalloc'ed \
|
|
@@ -268,20 +259,20 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|
* down the cause of the crash will be able to figure \
|
|
* down the cause of the crash will be able to figure \
|
|
* out the call path that was taken. \
|
|
* out the call path that was taken. \
|
|
*/ \
|
|
*/ \
|
|
- i += printk_address(addr); \
|
|
|
|
|
|
+ printk_address(addr); \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|
- for(; ; ) {
|
|
|
|
|
|
+ for( ; ; ) {
|
|
const char *id;
|
|
const char *id;
|
|
unsigned long *estack_end;
|
|
unsigned long *estack_end;
|
|
estack_end = in_exception_stack(cpu, (unsigned long)stack,
|
|
estack_end = in_exception_stack(cpu, (unsigned long)stack,
|
|
&used, &id);
|
|
&used, &id);
|
|
|
|
|
|
if (estack_end) {
|
|
if (estack_end) {
|
|
- i += printk(" <%s>", id);
|
|
|
|
|
|
+ printk(" <%s>", id);
|
|
HANDLE_STACK (stack < estack_end);
|
|
HANDLE_STACK (stack < estack_end);
|
|
- i += printk(" <EOE>");
|
|
|
|
|
|
+ printk(" <EOE>");
|
|
stack = (unsigned long *) estack_end[-2];
|
|
stack = (unsigned long *) estack_end[-2];
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -291,11 +282,11 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|
(IRQSTACKSIZE - 64) / sizeof(*irqstack);
|
|
(IRQSTACKSIZE - 64) / sizeof(*irqstack);
|
|
|
|
|
|
if (stack >= irqstack && stack < irqstack_end) {
|
|
if (stack >= irqstack && stack < irqstack_end) {
|
|
- i += printk(" <IRQ>");
|
|
|
|
|
|
+ printk(" <IRQ>");
|
|
HANDLE_STACK (stack < irqstack_end);
|
|
HANDLE_STACK (stack < irqstack_end);
|
|
stack = (unsigned long *) (irqstack_end[-1]);
|
|
stack = (unsigned long *) (irqstack_end[-1]);
|
|
irqstack_end = NULL;
|
|
irqstack_end = NULL;
|
|
- i += printk(" <EOI>");
|
|
|
|
|
|
+ printk(" <EOI>");
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -304,6 +295,7 @@ void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * s
|
|
|
|
|
|
HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
|
|
HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
|
|
#undef HANDLE_STACK
|
|
#undef HANDLE_STACK
|
|
|
|
+
|
|
printk("\n");
|
|
printk("\n");
|
|
}
|
|
}
|
|
|
|
|
|
@@ -337,8 +329,8 @@ static void _show_stack(struct task_struct *tsk, struct pt_regs *regs, unsigned
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
if (i && ((i % 4) == 0))
|
|
if (i && ((i % 4) == 0))
|
|
- printk("\n ");
|
|
|
|
- printk("%016lx ", *stack++);
|
|
|
|
|
|
+ printk("\n");
|
|
|
|
+ printk(" %016lx", *stack++);
|
|
touch_nmi_watchdog();
|
|
touch_nmi_watchdog();
|
|
}
|
|
}
|
|
show_trace(tsk, regs, rsp);
|
|
show_trace(tsk, regs, rsp);
|