mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-15 15:06:42 +00:00
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. Reviewed by: andrew Differential Revision: https://reviews.freebsd.org/D12001
This commit is contained in:
parent
c9ee3caf19
commit
992029ba10
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=322437
@ -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);
|
||||
}
|
||||
|
||||
|
@ -1051,13 +1051,26 @@ 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
|
||||
#include <ddb/ddb.h>
|
||||
|
||||
|
@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <vm/vm_extern.h>
|
||||
#include <vm/vm_kern.h>
|
||||
|
||||
#include <machine/debug_monitor.h>
|
||||
#include <machine/machdep.h>
|
||||
#include <machine/intr.h>
|
||||
#include <machine/smp.h>
|
||||
@ -272,7 +271,7 @@ init_secondary(uint64_t cpu)
|
||||
vfp_init();
|
||||
#endif
|
||||
|
||||
dbg_monitor_init();
|
||||
dbg_init();
|
||||
pan_enable();
|
||||
|
||||
/* Enable interrupts */
|
||||
|
@ -48,6 +48,7 @@ extern enum arm64_bus arm64_bus_method;
|
||||
extern vm_paddr_t physmap[];
|
||||
extern u_int physmap_idx;
|
||||
|
||||
void dbg_init(void);
|
||||
void initarm(struct arm64_bootparams *);
|
||||
extern void (*pagezero)(void *);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user