armv8_dpm: retrieve only necessary registers on halt

to speed up debugging, don't load the complete register context
on a halt event, load only those registers that might be
clobbered during debugging.

Change-Id: I0b58e97aad6f28aefce4a52e870af61e1ef1a44f
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
Reviewed-on: http://openocd.zylin.com/3995
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
This commit is contained in:
Matthias Welwarsky 2017-02-17 16:21:41 +01:00 committed by Paul Fertser
parent 2861ed533b
commit b73628141a
1 changed files with 11 additions and 3 deletions

View File

@ -718,14 +718,22 @@ int armv8_dpm_read_current_registers(struct arm_dpm *dpm)
cache = arm->core_cache; cache = arm->core_cache;
/* read R0 first (it's used for scratch), then CPSR */ /* read R0 first (it's used for scratch), then CPSR */
r = cache->reg_list + 0; r = cache->reg_list + ARMV8_R0;
if (!r->valid) { if (!r->valid) {
retval = dpmv8_read_reg(dpm, r, 0); retval = dpmv8_read_reg(dpm, r, ARMV8_R0);
if (retval != ERROR_OK) if (retval != ERROR_OK)
goto fail; goto fail;
} }
r->dirty = true; r->dirty = true;
/* read R1, too, it will be clobbered during memory access */
r = cache->reg_list + ARMV8_R1;
if (!r->valid) {
retval = dpmv8_read_reg(dpm, r, ARMV8_R1);
if (retval != ERROR_OK)
goto fail;
}
/* read cpsr to r0 and get it back */ /* read cpsr to r0 and get it back */
retval = dpm->instr_read_data_r0(dpm, retval = dpm->instr_read_data_r0(dpm,
armv8_opcode(armv8, READ_REG_DSPSR), &cpsr); armv8_opcode(armv8, READ_REG_DSPSR), &cpsr);
@ -735,7 +743,7 @@ int armv8_dpm_read_current_registers(struct arm_dpm *dpm)
/* update core mode and state */ /* update core mode and state */
armv8_set_cpsr(arm, cpsr); armv8_set_cpsr(arm, cpsr);
for (unsigned int i = 1; i < cache->num_regs ; i++) { for (unsigned int i = ARMV8_PC; i < cache->num_regs ; i++) {
struct arm_reg *arm_reg; struct arm_reg *arm_reg;
r = armv8_reg_current(arm, i); r = armv8_reg_current(arm, i);