Skip to content

Commit

Permalink
powerpc/xmon: Setup debugger hooks when first break-point is set
Browse files Browse the repository at this point in the history
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: Vaibhav Jain <vaibhav@linux.vnet.ibm.com>
Reviewed-by: Balbir Singh <bsingharora@gmail.com>
[mpe: Just printf directly, no need for static const char[]]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Vaibhav Jain authored and Michael Ellerman committed Mar 13, 2018
1 parent b395e55 commit e1368d0
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion arch/powerpc/xmon/xmon.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 */
Expand All @@ -1335,6 +1347,7 @@ bpt_cmds(void)
if (bp != NULL) {
bp->enabled |= BP_CIABR;
iabr = bp;
force_enable_xmon();
}
break;
#endif
Expand Down Expand Up @@ -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;
}
}
Expand Down

0 comments on commit e1368d0

Please sign in to comment.