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

Commit e1368d0c authored by Vaibhav Jain's avatar Vaibhav Jain Committed by Michael Ellerman
Browse files

powerpc/xmon: Setup debugger hooks when first break-point is set



Presently sysrq key for xmon('x') is registered during kernel init
irrespective of the value of kernel param 'xmon'. Thus xmon is enabled
even if 'xmon=off' is passed on the kernel command line. However this
doesn't enable the kernel debugger hooks needed for instruction or
data breakpoints. Thus when a break-point is hit with xmon=off a
kernel oops of the form below is reported:

  Oops: Exception in kernel mode, sig: 5 [#1]
  < snip >
  Trace/breakpoint trap

To fix this the patch checks and enables debugger hooks when an
instruction or data break-point is set via xmon console.

Signed-off-by: default avatarVaibhav Jain <vaibhav@linux.vnet.ibm.com>
Reviewed-by: default avatarBalbir Singh <bsingharora@gmail.com>
[mpe: Just printf directly, no need for static const char[]]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent b395e55b
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -1273,6 +1273,16 @@ static long check_bp_loc(unsigned long addr)
	return 1;
}

/* Force enable xmon if not already enabled */
static inline void force_enable_xmon(void)
{
	/* Enable xmon hooks if needed */
	if (!xmon_on) {
		printf("xmon: Enabling debugger hooks\n");
		xmon_on = 1;
	}
}

static char *breakpoint_help_string =
    "Breakpoint command usage:\n"
    "b                show breakpoints\n"
@@ -1315,6 +1325,8 @@ bpt_cmds(void)
			dabr.address &= ~HW_BRK_TYPE_DABR;
			dabr.enabled = mode | BP_DABR;
		}

		force_enable_xmon();
		break;

	case 'i':	/* bi - hardware instr breakpoint */
@@ -1335,6 +1347,7 @@ bpt_cmds(void)
		if (bp != NULL) {
			bp->enabled |= BP_CIABR;
			iabr = bp;
			force_enable_xmon();
		}
		break;
#endif
@@ -1399,8 +1412,10 @@ bpt_cmds(void)
		if (!check_bp_loc(a))
			break;
		bp = new_breakpoint(a);
		if (bp != NULL)
		if (bp != NULL) {
			bp->enabled |= BP_TRAP;
			force_enable_xmon();
		}
		break;
	}
}