ARM DPM: tweak initialization
Move the initial breakpoint/watchpoint disable calls to arm_dpm_initialize(), and start using that routine. This split helps with arm11 support.
This commit is contained in:
parent
b123fd3cd9
commit
c2af99d471
|
@ -1330,10 +1330,8 @@ static int arm11_examine(struct target *target)
|
||||||
/* Build register cache "late", after target_init(), since we
|
/* Build register cache "late", after target_init(), since we
|
||||||
* want to know if this core supports Secure Monitor mode.
|
* want to know if this core supports Secure Monitor mode.
|
||||||
*/
|
*/
|
||||||
if (!target_was_examined(target)) {
|
if (!target_was_examined(target))
|
||||||
arm11_dpm_init(arm11, didr);
|
retval = arm11_dpm_init(arm11, didr);
|
||||||
retval = arm_dpm_setup(&arm11->dpm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ETM on ARM11 still uses original scanchain 6 access mode */
|
/* ETM on ARM11 still uses original scanchain 6 access mode */
|
||||||
if (arm11->arm.etm && !target_was_examined(target)) {
|
if (arm11->arm.etm && !target_was_examined(target)) {
|
||||||
|
|
|
@ -1022,10 +1022,11 @@ static int arm11_dpm_instr_read_data_r0(struct arm_dpm *dpm,
|
||||||
opcode, data);
|
opcode, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set up high-level debug module utilities */
|
||||||
void arm11_dpm_init(struct arm11_common *arm11, uint32_t didr)
|
int arm11_dpm_init(struct arm11_common *arm11, uint32_t didr)
|
||||||
{
|
{
|
||||||
struct arm_dpm *dpm = &arm11->dpm;
|
struct arm_dpm *dpm = &arm11->dpm;
|
||||||
|
int retval;
|
||||||
|
|
||||||
dpm->arm = &arm11->arm;
|
dpm->arm = &arm11->arm;
|
||||||
|
|
||||||
|
@ -1039,4 +1040,12 @@ void arm11_dpm_init(struct arm11_common *arm11, uint32_t didr)
|
||||||
|
|
||||||
dpm->instr_read_data_dcc = arm11_dpm_instr_read_data_dcc;
|
dpm->instr_read_data_dcc = arm11_dpm_instr_read_data_dcc;
|
||||||
dpm->instr_read_data_r0 = arm11_dpm_instr_read_data_r0;
|
dpm->instr_read_data_r0 = arm11_dpm_instr_read_data_r0;
|
||||||
|
|
||||||
|
retval = arm_dpm_setup(dpm);
|
||||||
|
if (retval != ERROR_OK)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
retval = arm_dpm_initialize(dpm);
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,6 @@ void arm11_sc7_set_vcr(struct arm11_common *arm11, uint32_t value);
|
||||||
int arm11_read_memory_word(struct arm11_common *arm11,
|
int arm11_read_memory_word(struct arm11_common *arm11,
|
||||||
uint32_t address, uint32_t *result);
|
uint32_t address, uint32_t *result);
|
||||||
|
|
||||||
/* Set up high-level debug module utilities */
|
int arm11_dpm_init(struct arm11_common *arm11, uint32_t didr);
|
||||||
void arm11_dpm_init(struct arm11_common *arm11, uint32_t didr);
|
|
||||||
|
|
||||||
#endif // ARM11_DBGTAP_H
|
#endif // ARM11_DBGTAP_H
|
||||||
|
|
|
@ -807,18 +807,6 @@ int arm_dpm_setup(struct arm_dpm *dpm)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable all breakpoints and watchpoints at startup. */
|
|
||||||
if (dpm->bpwp_disable) {
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
for (i = 0; i < dpm->nbp; i++)
|
|
||||||
(void) dpm->bpwp_disable(dpm, i);
|
|
||||||
for (i = 0; i < dpm->nwp; i++)
|
|
||||||
(void) dpm->bpwp_disable(dpm, 16 + i);
|
|
||||||
} else
|
|
||||||
LOG_WARNING("%s: can't disable breakpoints and watchpoints",
|
|
||||||
target_name(target));
|
|
||||||
|
|
||||||
LOG_INFO("%s: hardware has %d breakpoints, %d watchpoints",
|
LOG_INFO("%s: hardware has %d breakpoints, %d watchpoints",
|
||||||
target_name(target), dpm->nbp, dpm->nwp);
|
target_name(target), dpm->nbp, dpm->nwp);
|
||||||
|
|
||||||
|
@ -835,6 +823,17 @@ int arm_dpm_setup(struct arm_dpm *dpm)
|
||||||
*/
|
*/
|
||||||
int arm_dpm_initialize(struct arm_dpm *dpm)
|
int arm_dpm_initialize(struct arm_dpm *dpm)
|
||||||
{
|
{
|
||||||
/* FIXME -- nothing yet */
|
/* Disable all breakpoints and watchpoints at startup. */
|
||||||
|
if (dpm->bpwp_disable) {
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < dpm->nbp; i++)
|
||||||
|
(void) dpm->bpwp_disable(dpm, i);
|
||||||
|
for (i = 0; i < dpm->nwp; i++)
|
||||||
|
(void) dpm->bpwp_disable(dpm, 16 + i);
|
||||||
|
} else
|
||||||
|
LOG_WARNING("%s: can't disable breakpoints and watchpoints",
|
||||||
|
target_name(dpm->arm->target));
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,7 +129,7 @@ struct arm_dpm {
|
||||||
};
|
};
|
||||||
|
|
||||||
int arm_dpm_setup(struct arm_dpm *dpm);
|
int arm_dpm_setup(struct arm_dpm *dpm);
|
||||||
int arm_dpm_reinitialize(struct arm_dpm *dpm);
|
int arm_dpm_initialize(struct arm_dpm *dpm);
|
||||||
|
|
||||||
int arm_dpm_read_current_registers(struct arm_dpm *);
|
int arm_dpm_read_current_registers(struct arm_dpm *);
|
||||||
int arm_dpm_write_dirty_registers(struct arm_dpm *, bool bpwp);
|
int arm_dpm_write_dirty_registers(struct arm_dpm *, bool bpwp);
|
||||||
|
|
|
@ -523,6 +523,7 @@ static int cortex_a8_bpwp_disable(struct arm_dpm *dpm, unsigned index)
|
||||||
static int cortex_a8_dpm_setup(struct cortex_a8_common *a8, uint32_t didr)
|
static int cortex_a8_dpm_setup(struct cortex_a8_common *a8, uint32_t didr)
|
||||||
{
|
{
|
||||||
struct arm_dpm *dpm = &a8->armv7a_common.dpm;
|
struct arm_dpm *dpm = &a8->armv7a_common.dpm;
|
||||||
|
int retval;
|
||||||
|
|
||||||
dpm->arm = &a8->armv7a_common.armv4_5_common;
|
dpm->arm = &a8->armv7a_common.armv4_5_common;
|
||||||
dpm->didr = didr;
|
dpm->didr = didr;
|
||||||
|
@ -540,7 +541,11 @@ static int cortex_a8_dpm_setup(struct cortex_a8_common *a8, uint32_t didr)
|
||||||
dpm->bpwp_enable = cortex_a8_bpwp_enable;
|
dpm->bpwp_enable = cortex_a8_bpwp_enable;
|
||||||
dpm->bpwp_disable = cortex_a8_bpwp_disable;
|
dpm->bpwp_disable = cortex_a8_bpwp_disable;
|
||||||
|
|
||||||
return arm_dpm_setup(dpm);
|
retval = arm_dpm_setup(dpm);
|
||||||
|
if (retval == ERROR_OK)
|
||||||
|
retval = arm_dpm_initialize(dpm);
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue