arm64: implement kdb watchpoint functions
Add wrappers around the debug_monitor interface, to be consumed by MI kernel debugger code. Update dbg_setup_watchpoint() and dbg_remove_watchpoint() to return specific error codes, not just -1. Reviewed by: jhb, kib, markj MFC after: 3 weeks Sponsored by: NetApp, Inc. Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D29155
This commit is contained in:
parent
15dc1d4452
commit
3ef68bc62c
@ -226,6 +226,35 @@ kdb_cpu_clear_singlestep(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
kdb_cpu_set_watchpoint(vm_offset_t addr, vm_size_t size, int access)
|
||||||
|
{
|
||||||
|
enum dbg_access_t dbg_access;
|
||||||
|
|
||||||
|
switch (access) {
|
||||||
|
case KDB_DBG_ACCESS_R:
|
||||||
|
dbg_access = HW_BREAKPOINT_R;
|
||||||
|
break;
|
||||||
|
case KDB_DBG_ACCESS_W:
|
||||||
|
dbg_access = HW_BREAKPOINT_W;
|
||||||
|
break;
|
||||||
|
case KDB_DBG_ACCESS_RW:
|
||||||
|
dbg_access = HW_BREAKPOINT_RW;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return (EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (dbg_setup_watchpoint(NULL, addr, size, dbg_access));
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
kdb_cpu_clr_watchpoint(vm_offset_t addr, vm_size_t size)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (dbg_remove_watchpoint(NULL, addr, size));
|
||||||
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
dbg_watchtype_str(uint32_t type)
|
dbg_watchtype_str(uint32_t type)
|
||||||
{
|
{
|
||||||
@ -362,7 +391,7 @@ dbg_setup_watchpoint(struct debug_monitor_state *monitor, vm_offset_t addr,
|
|||||||
if (i == -1) {
|
if (i == -1) {
|
||||||
printf("Can not find slot for watchpoint, max %d"
|
printf("Can not find slot for watchpoint, max %d"
|
||||||
" watchpoints supported\n", dbg_watchpoint_num);
|
" watchpoints supported\n", dbg_watchpoint_num);
|
||||||
return (i);
|
return (EBUSY);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(size) {
|
switch(size) {
|
||||||
@ -379,8 +408,8 @@ dbg_setup_watchpoint(struct debug_monitor_state *monitor, vm_offset_t addr,
|
|||||||
wcr_size = DBG_WATCH_CTRL_LEN_8;
|
wcr_size = DBG_WATCH_CTRL_LEN_8;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Unsupported address size for watchpoint\n");
|
printf("Unsupported address size for watchpoint: %zu\n", size);
|
||||||
return (-1);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((monitor->dbg_flags & DBGMON_KERNEL) == 0)
|
if ((monitor->dbg_flags & DBGMON_KERNEL) == 0)
|
||||||
@ -402,8 +431,8 @@ dbg_setup_watchpoint(struct debug_monitor_state *monitor, vm_offset_t addr,
|
|||||||
wcr_access = DBG_WATCH_CTRL_LOAD | DBG_WATCH_CTRL_STORE;
|
wcr_access = DBG_WATCH_CTRL_LOAD | DBG_WATCH_CTRL_STORE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Unsupported exception level for watchpoint\n");
|
printf("Unsupported access type for watchpoint: %d\n", access);
|
||||||
return (-1);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor->dbg_wvr[i] = addr;
|
monitor->dbg_wvr[i] = addr;
|
||||||
@ -427,7 +456,7 @@ dbg_remove_watchpoint(struct debug_monitor_state *monitor, vm_offset_t addr,
|
|||||||
i = dbg_find_slot(monitor, DBG_TYPE_WATCHPOINT, addr);
|
i = dbg_find_slot(monitor, DBG_TYPE_WATCHPOINT, addr);
|
||||||
if (i == -1) {
|
if (i == -1) {
|
||||||
printf("Can not find watchpoint for address 0%lx\n", addr);
|
printf("Can not find watchpoint for address 0%lx\n", addr);
|
||||||
return (i);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor->dbg_wvr[i] = 0;
|
monitor->dbg_wvr[i] = 0;
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
|
|
||||||
void kdb_cpu_clear_singlestep(void);
|
void kdb_cpu_clear_singlestep(void);
|
||||||
void kdb_cpu_set_singlestep(void);
|
void kdb_cpu_set_singlestep(void);
|
||||||
|
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
|
static __inline void
|
||||||
kdb_cpu_sync_icache(unsigned char *addr, size_t size)
|
kdb_cpu_sync_icache(unsigned char *addr, size_t size)
|
||||||
|
Loading…
Reference in New Issue
Block a user