Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -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)
	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)
	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)
	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;