target/armv7m: prevent saving and restoring non existent regs
armv7m_start_algorithm() saves register values to arch_info->context. armv7m_wait_algorithm() restores register values from arch_info->context. Exclude registers with flag exist = false from both loops. While on it refactor the register restore: introduce 'struct reg' pointer and dereference it instead of numerous accesses by a full path from armv7m pointer. Change-Id: I1600084db84809ee13bcf8e7828b79f8c9ff9077 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: https://review.openocd.org/c/openocd/+/7276 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
parent
1d04ef3e55
commit
6939187853
|
@ -529,6 +529,9 @@ int armv7m_start_algorithm(struct target *target,
|
|||
/* Store all non-debug execution registers to armv7m_algorithm_info context */
|
||||
for (unsigned i = 0; i < armv7m->arm.core_cache->num_regs; i++) {
|
||||
struct reg *reg = &armv7m->arm.core_cache->reg_list[i];
|
||||
if (!reg->exist)
|
||||
continue;
|
||||
|
||||
if (!reg->valid)
|
||||
armv7m_get_core_reg(reg);
|
||||
|
||||
|
@ -688,16 +691,19 @@ int armv7m_wait_algorithm(struct target *target,
|
|||
}
|
||||
|
||||
for (int i = armv7m->arm.core_cache->num_regs - 1; i >= 0; i--) {
|
||||
struct reg *reg = &armv7m->arm.core_cache->reg_list[i];
|
||||
if (!reg->exist)
|
||||
continue;
|
||||
|
||||
uint32_t regvalue;
|
||||
regvalue = buf_get_u32(armv7m->arm.core_cache->reg_list[i].value, 0, 32);
|
||||
regvalue = buf_get_u32(reg->value, 0, 32);
|
||||
if (regvalue != armv7m_algorithm_info->context[i]) {
|
||||
LOG_DEBUG("restoring register %s with value 0x%8.8" PRIx32,
|
||||
armv7m->arm.core_cache->reg_list[i].name,
|
||||
armv7m_algorithm_info->context[i]);
|
||||
buf_set_u32(armv7m->arm.core_cache->reg_list[i].value,
|
||||
reg->name, armv7m_algorithm_info->context[i]);
|
||||
buf_set_u32(reg->value,
|
||||
0, 32, armv7m_algorithm_info->context[i]);
|
||||
armv7m->arm.core_cache->reg_list[i].valid = true;
|
||||
armv7m->arm.core_cache->reg_list[i].dirty = true;
|
||||
reg->valid = true;
|
||||
reg->dirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue