|
@@ -192,6 +192,7 @@ static void show_stacktrace(struct task_struct *task,
|
|
|
void show_stack(struct task_struct *task, unsigned long *sp)
|
|
|
{
|
|
|
struct pt_regs regs;
|
|
|
+ mm_segment_t old_fs = get_fs();
|
|
|
if (sp) {
|
|
|
regs.regs[29] = (unsigned long)sp;
|
|
|
regs.regs[31] = 0;
|
|
@@ -210,7 +211,13 @@ void show_stack(struct task_struct *task, unsigned long *sp)
|
|
|
prepare_frametrace(®s);
|
|
|
}
|
|
|
}
|
|
|
+ /*
|
|
|
+ * show_stack() deals exclusively with kernel mode, so be sure to access
|
|
|
+ * the stack in the kernel (not user) address space.
|
|
|
+ */
|
|
|
+ set_fs(KERNEL_DS);
|
|
|
show_stacktrace(task, ®s);
|
|
|
+ set_fs(old_fs);
|
|
|
}
|
|
|
|
|
|
static void show_code(unsigned int __user *pc)
|
|
@@ -1519,6 +1526,7 @@ asmlinkage void do_mcheck(struct pt_regs *regs)
|
|
|
const int field = 2 * sizeof(unsigned long);
|
|
|
int multi_match = regs->cp0_status & ST0_TS;
|
|
|
enum ctx_state prev_state;
|
|
|
+ mm_segment_t old_fs = get_fs();
|
|
|
|
|
|
prev_state = exception_enter();
|
|
|
show_regs(regs);
|
|
@@ -1540,8 +1548,13 @@ asmlinkage void do_mcheck(struct pt_regs *regs)
|
|
|
dump_tlb_all();
|
|
|
}
|
|
|
|
|
|
+ if (!user_mode(regs))
|
|
|
+ set_fs(KERNEL_DS);
|
|
|
+
|
|
|
show_code((unsigned int __user *) regs->cp0_epc);
|
|
|
|
|
|
+ set_fs(old_fs);
|
|
|
+
|
|
|
/*
|
|
|
* Some chips may have other causes of machine check (e.g. SB1
|
|
|
* graduation timer)
|