svn commit: r322761 - in stable/11/sys/arm64: arm64 include
John Baldwin
jhb at FreeBSD.org
Mon Aug 21 17:35:06 UTC 2017
Author: jhb
Date: Mon Aug 21 17:35:04 2017
New Revision: 322761
URL: https://svnweb.freebsd.org/changeset/base/322761
Log:
MFC 322437: Reliably enable debug exceptions on all CPUs.
Previously, debug exceptions were only enabled on the boot CPU if
DDB was enabled in the dbg_monitor_init() function. APs also called
this function, but since mp_machdep.c doesn't include opt_ddb.h, the
APs ended up calling an empty stub defined in <machine/debug_monitor.h>
instead of the real function. Also, if DDB was not enabled in the kernel,
the boot CPU would not enable debug exceptions.
Fix this by adding a new dbg_init() function that always clears the OS
lock to enable debug exceptions which the boot CPU and the APs call.
This function also calls dbg_monitor_init() to enable hardware breakpoints
from DDB on all CPUs if DDB is enabled. Eventually base support for
hardware breakpoints/watchpoints will need to move out of the DDB-only
debug_monitor.c for use by userland debuggers.
Modified:
stable/11/sys/arm64/arm64/debug_monitor.c
stable/11/sys/arm64/arm64/machdep.c
stable/11/sys/arm64/arm64/mp_machdep.c
stable/11/sys/arm64/include/machdep.h
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/arm64/arm64/debug_monitor.c
==============================================================================
--- stable/11/sys/arm64/arm64/debug_monitor.c Mon Aug 21 17:29:37 2017 (r322760)
+++ stable/11/sys/arm64/arm64/debug_monitor.c Mon Aug 21 17:35:04 2017 (r322761)
@@ -453,15 +453,12 @@ dbg_monitor_init(void)
{
u_int i;
- /* Clear OS lock */
- WRITE_SPECIALREG(OSLAR_EL1, 0);
-
/* Find out many breakpoints and watchpoints we can use */
dbg_watchpoint_num = ((READ_SPECIALREG(ID_AA64DFR0_EL1) >> 20) & 0xf) + 1;
dbg_breakpoint_num = ((READ_SPECIALREG(ID_AA64DFR0_EL1) >> 12) & 0xf) + 1;
if (bootverbose && PCPU_GET(cpuid) == 0) {
- db_printf("%d watchpoints and %d breakpoints supported\n",
+ printf("%d watchpoints and %d breakpoints supported\n",
dbg_watchpoint_num, dbg_breakpoint_num);
}
Modified: stable/11/sys/arm64/arm64/machdep.c
==============================================================================
--- stable/11/sys/arm64/arm64/machdep.c Mon Aug 21 17:29:37 2017 (r322760)
+++ stable/11/sys/arm64/arm64/machdep.c Mon Aug 21 17:35:04 2017 (r322761)
@@ -970,11 +970,24 @@ initarm(struct arm64_bootparams *abp)
mutex_init();
init_param2(physmem);
- dbg_monitor_init();
+ dbg_init();
kdb_init();
pan_enable();
early_boot = 0;
+}
+
+void
+dbg_init(void)
+{
+
+ /* Clear OS lock */
+ WRITE_SPECIALREG(OSLAR_EL1, 0);
+
+ /* This permits DDB to use debug registers for watchpoints. */
+ dbg_monitor_init();
+
+ /* TODO: Eventually will need to initialize debug registers here. */
}
#ifdef DDB
Modified: stable/11/sys/arm64/arm64/mp_machdep.c
==============================================================================
--- stable/11/sys/arm64/arm64/mp_machdep.c Mon Aug 21 17:29:37 2017 (r322760)
+++ stable/11/sys/arm64/arm64/mp_machdep.c Mon Aug 21 17:35:04 2017 (r322761)
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_extern.h>
#include <vm/vm_kern.h>
-#include <machine/debug_monitor.h>
#include <machine/intr.h>
#include <machine/smp.h>
#ifdef VFP
@@ -277,7 +276,7 @@ init_secondary(uint64_t cpu)
vfp_init();
#endif
- dbg_monitor_init();
+ dbg_init();
pan_enable();
/* Enable interrupts */
Modified: stable/11/sys/arm64/include/machdep.h
==============================================================================
--- stable/11/sys/arm64/include/machdep.h Mon Aug 21 17:29:37 2017 (r322760)
+++ stable/11/sys/arm64/include/machdep.h Mon Aug 21 17:35:04 2017 (r322761)
@@ -40,6 +40,7 @@ struct arm64_bootparams {
extern vm_paddr_t physmap[];
extern u_int physmap_idx;
+void dbg_init(void);
void initarm(struct arm64_bootparams *);
extern void (*pagezero)(void *);
More information about the svn-src-stable-11
mailing list