Date: Mon, 21 Aug 2017 17:35:04 +0000 (UTC) From: John Baldwin <jhb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: svn commit: r322761 - in stable/11/sys/arm64: arm64 include Message-ID: <201708211735.v7LHZ4UG023562@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201708211735.v7LHZ4UG023562>