aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2021-03-04 00:14:42 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2021-03-29 15:05:44 +0000
commit5a2933d0bf9fb0018349b67a39fa85cbb3740779 (patch)
treeeffb008fdd503cc6269dbcdb612b90d964850889
parent3ef68bc62c1e3ca9c452177f5cb9fd4de0df590d (diff)
downloadsrc-5a2933d0bf9fb0018349b67a39fa85cbb3740779.tar.gz
src-5a2933d0bf9fb0018349b67a39fa85cbb3740779.zip
arm: implement kdb watchpoint functions
Implement wrappers around the existing debug_monitor interface, to be consumed by MI kernel debugger code. For now, the various db_printf() calls in this code remain. In the future, they could be converted to printf() or removed altogether, to properly decouple the DDB and GDB options. Reviewed by: jhb, kib, markj MFC after: 3 weeks Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D29155
-rw-r--r--sys/arm/arm/debug_monitor.c37
-rw-r--r--sys/arm/include/kdb.h2
2 files changed, 36 insertions, 3 deletions
diff --git a/sys/arm/arm/debug_monitor.c b/sys/arm/arm/debug_monitor.c
index ddf3e8e67b25..55b5f70b2397 100644
--- a/sys/arm/arm/debug_monitor.c
+++ b/sys/arm/arm/debug_monitor.c
@@ -327,6 +327,35 @@ kdb_cpu_clear_singlestep(void)
}
int
+kdb_cpu_set_watchpoint(vm_offset_t addr, size_t size, int access)
+{
+ enum dbg_access_t dbg_access;
+
+ switch (access) {
+ case KDB_DBG_ACCESS_R:
+ dbg_access = HW_WATCHPOINT_R;
+ break;
+ case KDB_DBG_ACCESS_W:
+ dbg_access = HW_WATCHPOINT_W;
+ break;
+ case KDB_DBG_ACCESS_RW:
+ dbg_access = HW_WATCHPOINT_RW;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ return (dbg_setup_watchpoint(addr, size, (enum dbg_access_t)access));
+}
+
+int
+kdb_cpu_clr_watchpoint(vm_offset_t addr, size_t size)
+{
+
+ return (dbg_remove_watchpoint(addr, size));
+}
+
+int
dbg_setup_watchpoint(db_expr_t addr, db_expr_t size, enum dbg_access_t access)
{
struct dbg_wb_conf conf;
@@ -624,7 +653,7 @@ dbg_setup_xpoint(struct dbg_wb_conf *conf)
if (i == ~0U) {
db_printf("Can not find slot for %s, max %d slots supported\n",
typestr, dbg_watchpoint_num);
- return (ENXIO);
+ return (EBUSY);
}
}
@@ -645,7 +674,8 @@ dbg_setup_xpoint(struct dbg_wb_conf *conf)
cr_size = DBG_WB_CTRL_LEN_8;
break;
default:
- db_printf("Unsupported address size for %s\n", typestr);
+ db_printf("Unsupported address size for %s: %zu\n", typestr,
+ conf->size);
return (EINVAL);
}
@@ -667,7 +697,8 @@ dbg_setup_xpoint(struct dbg_wb_conf *conf)
cr_access = DBG_WB_CTRL_LOAD | DBG_WB_CTRL_STORE;
break;
default:
- db_printf("Unsupported exception level for %s\n", typestr);
+ db_printf("Unsupported access type for %s: %d\n",
+ typestr, conf->access);
return (EINVAL);
}
diff --git a/sys/arm/include/kdb.h b/sys/arm/include/kdb.h
index 42677499ed78..728bf211dc62 100644
--- a/sys/arm/include/kdb.h
+++ b/sys/arm/include/kdb.h
@@ -41,6 +41,8 @@
extern void kdb_cpu_clear_singlestep(void);
extern void kdb_cpu_set_singlestep(void);
boolean_t kdb_cpu_pc_is_singlestep(db_addr_t);
+int kdb_cpu_set_watchpoint(vm_offset_t addr, size_t size, int access);
+int kdb_cpu_clr_watchpoint(vm_offset_t addr, size_t size);
static __inline void
kdb_cpu_sync_icache(unsigned char *addr, size_t size)