@@ -51,8 +51,9 @@ int show_unhandled_signals = 1;
/*
* Dump out the contents of some memory nicely...
*/
+
static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
- unsigned long top)
+ unsigned long top, unsigned int width)
{
unsigned long first;
mm_segment_t fs;
@@ -70,18 +71,27 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
for (first = bottom & ~31; first < top; first += 32) {
unsigned long p;
- char str[sizeof(" 12345678") * 8 + 1];
+ char str[sizeof(" 1234567812345678") * 8 + 1];
memset(str, ' ', sizeof(str));
str[sizeof(str) - 1] = '\0';
- for (p = first, i = 0; i < 8 && p < top; i++, p += 4) {
+ for (p = first, i = 0; i < (width > 4 ? width-4 : width+4)
+ && p < top; i++, p += width) {
if (p >= bottom && p < top) {
- unsigned int val;
- if (__get_user(val, (unsigned int *)p) == 0)
- sprintf(str + i * 9, " %08x", val);
- else
- sprintf(str + i * 9, " ????????");
+ unsigned long val;
+
+ if (width == 8) {
+ if (__get_user(val, (unsigned long *)p) == 0)
+ sprintf(str + i * 17, " %016lx", val);
+ else
+ sprintf(str + i * 17, " ????????????????");
+ } else {
+ if (__get_user(val, (unsigned int *)p) == 0)
+ sprintf(str + i * 9, " %08x", (unsigned int)val);
+ else
+ sprintf(str + i * 9, " ????????");
+ }
}
}
printk("%s%04lx:%s\n", lvl, first & 0xffff, str);
@@ -95,7 +105,7 @@ static void dump_backtrace_entry(unsigned long where, unsigned long stack)
print_ip_sym(where);
if (in_exception_text(where))
dump_mem("", "Exception stack", stack,
- stack + sizeof(struct pt_regs));
+ stack + sizeof(struct pt_regs), 8);
}
static void dump_instr(const char *lvl, struct pt_regs *regs)
@@ -191,6 +201,7 @@ static int __die(const char *str, int err, struct thread_info *thread,
struct task_struct *tsk = thread->task;
static int die_counter;
int ret;
+ unsigned int width = 8;
pr_emerg("Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n",
str, err, ++die_counter);
@@ -206,8 +217,19 @@ static int __die(const char *str, int err, struct thread_info *thread,
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), thread + 1);
if (!user_mode(regs) || in_interrupt()) {
- dump_mem(KERN_EMERG, "Stack: ", regs->sp,
- THREAD_SIZE + (unsigned long)task_stack_page(tsk));
+
+ if (regs->sp > (unsigned long)task_stack_page(tsk)) {
+ dump_mem(KERN_EMERG, "Stack: ", regs->sp,
+ THREAD_SIZE +
+ (unsigned long)task_stack_page(tsk), width);
+ } else {
+ if (compat_user_mode(regs))
+ width = 4;
+ dump_mem(KERN_EMERG, "Stack: ",
+ (unsigned long)task_stack_page(tsk),
+ THREAD_SIZE +
+ (unsigned long)task_stack_page(tsk), width);
+ }
dump_backtrace(regs, tsk);
dump_instr(KERN_EMERG, regs);
}