Changeset View
Changeset View
Standalone View
Standalone View
sys/arm64/arm64/debug_monitor.c
Show First 20 Lines • Show All 208 Lines • ▼ Show 20 Lines | if ((kernel_monitor.dbg_flags & DBGMON_ENABLED) != 0) { | ||||
if ((kernel_monitor.dbg_flags & DBGMON_KERNEL) != 0) { | if ((kernel_monitor.dbg_flags & DBGMON_KERNEL) != 0) { | ||||
WRITE_SPECIALREG(mdscr_el1, | WRITE_SPECIALREG(mdscr_el1, | ||||
READ_SPECIALREG(mdscr_el1) | DBG_MDSCR_KDE); | READ_SPECIALREG(mdscr_el1) | DBG_MDSCR_KDE); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void | |||||
dbg_show_breakpoint(void) | |||||
{ | |||||
uint32_t bcr, len, type; | |||||
uint64_t addr; | |||||
int i; | |||||
db_printf("\nhardware breakpoints:\n"); | |||||
db_printf(" break status address symbol\n"); | |||||
db_printf(" ----- -------- ------------------ ------------------\n"); | |||||
for (i = 0; i < dbg_breakpoint_num; i++) { | |||||
bcr = dbg_wb_read_reg(DBG_REG_BASE_BCR, i); | |||||
if ((bcr & DBG_WB_CTRL_E) != 0) { | |||||
type = DBG_WATCH_CTRL_ACCESS_MASK(bcr); | |||||
len = DBG_WATCH_CTRL_LEN_MASK(bcr); | |||||
addr = dbg_wb_read_reg(DBG_REG_BASE_BVR, i); | |||||
db_printf(" %-5d %-8s 0x%16lx ", | |||||
i, "enabled", addr); | |||||
db_printsym((db_addr_t)addr, DB_STGY_ANY); | |||||
db_printf("\n"); | |||||
} else { | |||||
db_printf(" %-5d disabled\n", i); | |||||
} | |||||
} | |||||
} | |||||
static const char * | static const char * | ||||
dbg_watchtype_str(uint32_t type) | dbg_watchtype_str(uint32_t type) | ||||
{ | { | ||||
switch (type) { | switch (type) { | ||||
case DBG_WATCH_CTRL_EXEC: | case DBG_WATCH_CTRL_EXEC: | ||||
return ("execute"); | return ("execute"); | ||||
case DBG_WATCH_CTRL_STORE: | case DBG_WATCH_CTRL_STORE: | ||||
return ("write"); | return ("write"); | ||||
▲ Show 20 Lines • Show All 104 Lines • ▼ Show 20 Lines | dbg_find_slot(struct debug_monitor_state *monitor, enum dbg_t type, | ||||
for (i = 0; i < max; i++) { | for (i = 0; i < max; i++) { | ||||
if (reg_addr[i] == addr && | if (reg_addr[i] == addr && | ||||
(reg_ctrl[i] & DBG_WB_CTRL_E) != 0) | (reg_ctrl[i] & DBG_WB_CTRL_E) != 0) | ||||
return (i); | return (i); | ||||
} | } | ||||
return (-1); | return (-1); | ||||
} | |||||
int | |||||
dbg_setup_breakpoint(vm_offset_t addr, vm_size_t size) | |||||
{ | |||||
struct debug_monitor_state *monitor; | |||||
uint64_t bcr_priv; | |||||
u_int i; | |||||
if (size != 1) { | |||||
printf("Can only set one hardware breakpoint at a time\n"); | |||||
return (-1); | |||||
} | |||||
monitor = &kernel_monitor; | |||||
i = dbg_find_free_slot(monitor, DBG_TYPE_BREAKPOINT); | |||||
if (i == -1) { | |||||
printf("Can not find slot for breakpoint, max %d" | |||||
" breakpoints supported\n", dbg_breakpoint_num); | |||||
return (i); | |||||
} | |||||
if ((monitor->dbg_flags & DBGMON_KERNEL) == 0) | |||||
bcr_priv = DBG_WB_CTRL_EL0; | |||||
else | |||||
bcr_priv = DBG_WB_CTRL_EL1; | |||||
monitor->dbg_bvr[i] = addr; | |||||
monitor->dbg_bcr[i] = (0xf << 5) | bcr_priv | DBG_WB_CTRL_E; | |||||
monitor->dbg_enable_count++; | |||||
monitor->dbg_flags |= DBGMON_ENABLED; | |||||
dbg_register_sync(monitor); | |||||
return (0); | |||||
} | |||||
int | |||||
dbg_remove_breakpoint(vm_offset_t addr, vm_size_t size) | |||||
{ | |||||
struct debug_monitor_state *monitor; | |||||
u_int i; | |||||
monitor = &kernel_monitor; | |||||
i = dbg_find_slot(monitor, DBG_TYPE_BREAKPOINT, addr); | |||||
if (i == -1) { | |||||
printf("Can not find breakpoint for address 0%lx\n", addr); | |||||
return (i); | |||||
} | |||||
monitor->dbg_bvr[i] = 0; | |||||
monitor->dbg_bcr[i] = 0; | |||||
monitor->dbg_enable_count--; | |||||
if (monitor->dbg_enable_count == 0) | |||||
monitor->dbg_flags &= ~DBGMON_ENABLED; | |||||
dbg_register_sync(monitor); | |||||
return (0); | |||||
} | } | ||||
int | int | ||||
dbg_setup_watchpoint(struct debug_monitor_state *monitor, vm_offset_t addr, | dbg_setup_watchpoint(struct debug_monitor_state *monitor, vm_offset_t addr, | ||||
vm_size_t size, enum dbg_access_t access) | vm_size_t size, enum dbg_access_t access) | ||||
{ | { | ||||
uint64_t wcr_size, wcr_priv, wcr_access; | uint64_t wcr_size, wcr_priv, wcr_access; | ||||
u_int i; | u_int i; | ||||
▲ Show 20 Lines • Show All 155 Lines • Show Last 20 Lines |