Commit 078dde5e authored by Leonid Yegoshin's avatar Leonid Yegoshin Committed by Ralf Baechle

MIPS: traps: Set correct address limit for breakpoints and traps

When a breakpoint or trap happens when operating in kernel mode but
on users behalf (eg syscall) it is necessary to change the address
limit to KERNEL_DS so any address checking can be bypassed and print
the correct stack trace.
Signed-off-by: default avatarLeonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Signed-off-by: default avatarMarkos Chandras <markos.chandras@imgtec.com>
parent b08a9c95
...@@ -865,6 +865,11 @@ asmlinkage void do_bp(struct pt_regs *regs) ...@@ -865,6 +865,11 @@ asmlinkage void do_bp(struct pt_regs *regs)
enum ctx_state prev_state; enum ctx_state prev_state;
unsigned long epc; unsigned long epc;
u16 instr[2]; u16 instr[2];
mm_segment_t seg;
seg = get_fs();
if (!user_mode(regs))
set_fs(KERNEL_DS);
prev_state = exception_enter(); prev_state = exception_enter();
if (get_isa16_mode(regs->cp0_epc)) { if (get_isa16_mode(regs->cp0_epc)) {
...@@ -924,6 +929,7 @@ asmlinkage void do_bp(struct pt_regs *regs) ...@@ -924,6 +929,7 @@ asmlinkage void do_bp(struct pt_regs *regs)
do_trap_or_bp(regs, bcode, "Break"); do_trap_or_bp(regs, bcode, "Break");
out: out:
set_fs(seg);
exception_exit(prev_state); exception_exit(prev_state);
return; return;
...@@ -937,8 +943,13 @@ asmlinkage void do_tr(struct pt_regs *regs) ...@@ -937,8 +943,13 @@ asmlinkage void do_tr(struct pt_regs *regs)
u32 opcode, tcode = 0; u32 opcode, tcode = 0;
enum ctx_state prev_state; enum ctx_state prev_state;
u16 instr[2]; u16 instr[2];
mm_segment_t seg;
unsigned long epc = msk_isa16_mode(exception_epc(regs)); unsigned long epc = msk_isa16_mode(exception_epc(regs));
seg = get_fs();
if (!user_mode(regs))
set_fs(get_ds());
prev_state = exception_enter(); prev_state = exception_enter();
if (get_isa16_mode(regs->cp0_epc)) { if (get_isa16_mode(regs->cp0_epc)) {
if (__get_user(instr[0], (u16 __user *)(epc + 0)) || if (__get_user(instr[0], (u16 __user *)(epc + 0)) ||
...@@ -959,6 +970,7 @@ asmlinkage void do_tr(struct pt_regs *regs) ...@@ -959,6 +970,7 @@ asmlinkage void do_tr(struct pt_regs *regs)
do_trap_or_bp(regs, tcode, "Trap"); do_trap_or_bp(regs, tcode, "Trap");
out: out:
set_fs(seg);
exception_exit(prev_state); exception_exit(prev_state);
return; return;
......
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