static int arm11_dpm_prepare(struct arm_dpm *dpm) { struct arm11_common *arm11 = dpm_to_arm11(dpm); arm11 = container_of(dpm->arm, struct arm11_common, arm); return arm11_run_instr_data_prepare(dpm_to_arm11(dpm)); }
static int arm11_bpwp_disable(struct arm_dpm *dpm, unsigned index) { struct arm11_common *arm11 = dpm_to_arm11(dpm); struct arm11_sc7_action *action; action = arm11->bpwp_actions + arm11->bpwp_n; action[0].write = true; action[0].value = 0; switch (index) { case 0 ... 15: action[0].address = ARM11_SC7_BCR0 + index; break; case 16 ... 32: index -= 16; action[0].address = ARM11_SC7_WCR0 + index; break; default: return ERROR_FAIL; } arm11->bpwp_n += 1; return ERROR_OK; }
/* Because arm11_sc7_run() takes a vector of actions, we batch breakpoint * and watchpoint operations instead of running them right away. Since we * pre-allocated our vector, we don't need to worry about space. */ static int arm11_bpwp_enable(struct arm_dpm *dpm, unsigned index, uint32_t addr, uint32_t control) { struct arm11_common *arm11 = dpm_to_arm11(dpm); struct arm11_sc7_action *action; action = arm11->bpwp_actions + arm11->bpwp_n; /* Invariant: this bp/wp is disabled. * It also happens that the core is halted here, but for * DPM-based cores we don't actually care about that. */ action[0].write = action[1].write = true; action[0].value = addr; action[1].value = control; switch (index) { case 0 ... 15: action[0].address = ARM11_SC7_BVR0 + index; action[1].address = ARM11_SC7_BCR0 + index; break; case 16 ... 32: index -= 16; action[0].address = ARM11_SC7_WVR0 + index; action[1].address = ARM11_SC7_WCR0 + index; break; default: return ERROR_FAIL; } arm11->bpwp_n += 2; return ERROR_OK; }
static int arm11_dpm_instr_read_data_r0(struct arm_dpm *dpm, uint32_t opcode, uint32_t *data) { return arm11_run_instr_data_from_core_via_r0(dpm_to_arm11(dpm), opcode, data); }
static int arm11_dpm_instr_write_data_r0(struct arm_dpm *dpm, uint32_t opcode, uint32_t data) { return arm11_run_instr_data_to_core_via_r0(dpm_to_arm11(dpm), opcode, data); }
static int arm11_dpm_instr_write_data_dcc(struct arm_dpm *dpm, uint32_t opcode, uint32_t data) { return arm11_run_instr_data_to_core(dpm_to_arm11(dpm), opcode, &data, 1); }
static int arm11_dpm_finish(struct arm_dpm *dpm) { return arm11_run_instr_data_finish(dpm_to_arm11(dpm)); }
static int arm11_dpm_prepare(struct arm_dpm *dpm) { return arm11_run_instr_data_prepare(dpm_to_arm11(dpm)); }