target algo: do not write reg_param if direction is PARAM_IN
Without this change xxx_start_algorithm() writes all register parameters no matter of their direction. It usually results in writing of uninitialized reg_params[].value - possibly reported by valgrind. While on it fix the wrong parameter direction in kinetis_disable_wdog_algo(). This bug did not have any impact because of unconditional write of reg_params. Change-Id: Ia9c6a7b37f77d5eb6e5f5463012dddd50471742b Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/4813 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>log_output
parent
0d48104e03
commit
7a3eec2b4d
|
@ -1035,7 +1035,7 @@ static int kinetis_disable_wdog_algo(struct target *target, size_t code_size, co
|
||||||
armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
|
armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
|
||||||
armv7m_info.core_mode = ARM_MODE_THREAD;
|
armv7m_info.core_mode = ARM_MODE_THREAD;
|
||||||
|
|
||||||
init_reg_param(®_params[0], "r0", 32, PARAM_IN);
|
init_reg_param(®_params[0], "r0", 32, PARAM_OUT);
|
||||||
buf_set_u32(reg_params[0].value, 0, 32, wdog_base);
|
buf_set_u32(reg_params[0].value, 0, 32, wdog_base);
|
||||||
|
|
||||||
retval = target_run_algorithm(target, 0, NULL, 1, reg_params,
|
retval = target_run_algorithm(target, 0, NULL, 1, reg_params,
|
||||||
|
|
|
@ -1362,6 +1362,9 @@ int armv4_5_run_algorithm_inner(struct target *target,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_reg_params; i++) {
|
for (i = 0; i < num_reg_params; i++) {
|
||||||
|
if (reg_params[i].direction == PARAM_IN)
|
||||||
|
continue;
|
||||||
|
|
||||||
struct reg *reg = register_get_by_name(arm->core_cache, reg_params[i].reg_name, 0);
|
struct reg *reg = register_get_by_name(arm->core_cache, reg_params[i].reg_name, 0);
|
||||||
if (!reg) {
|
if (!reg) {
|
||||||
LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
|
LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
|
||||||
|
|
|
@ -388,6 +388,9 @@ int armv7m_start_algorithm(struct target *target,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < num_reg_params; i++) {
|
for (int i = 0; i < num_reg_params; i++) {
|
||||||
|
if (reg_params[i].direction == PARAM_IN)
|
||||||
|
continue;
|
||||||
|
|
||||||
struct reg *reg =
|
struct reg *reg =
|
||||||
register_get_by_name(armv7m->arm.core_cache, reg_params[i].reg_name, 0);
|
register_get_by_name(armv7m->arm.core_cache, reg_params[i].reg_name, 0);
|
||||||
/* uint32_t regvalue; */
|
/* uint32_t regvalue; */
|
||||||
|
|
|
@ -1394,6 +1394,9 @@ static int dsp563xx_run_algorithm(struct target *target,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_reg_params; i++) {
|
for (i = 0; i < num_reg_params; i++) {
|
||||||
|
if (reg_params[i].direction == PARAM_IN)
|
||||||
|
continue;
|
||||||
|
|
||||||
struct reg *reg = register_get_by_name(dsp563xx->core_cache,
|
struct reg *reg = register_get_by_name(dsp563xx->core_cache,
|
||||||
reg_params[i].reg_name,
|
reg_params[i].reg_name,
|
||||||
0);
|
0);
|
||||||
|
|
|
@ -468,6 +468,9 @@ int mips32_run_algorithm(struct target *target, int num_mem_params,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < num_reg_params; i++) {
|
for (int i = 0; i < num_reg_params; i++) {
|
||||||
|
if (reg_params[i].direction == PARAM_IN)
|
||||||
|
continue;
|
||||||
|
|
||||||
struct reg *reg = register_get_by_name(mips32->core_cache, reg_params[i].reg_name, 0);
|
struct reg *reg = register_get_by_name(mips32->core_cache, reg_params[i].reg_name, 0);
|
||||||
|
|
||||||
if (!reg) {
|
if (!reg) {
|
||||||
|
|
|
@ -853,6 +853,9 @@ static int riscv_run_algorithm(struct target *target, int num_mem_params,
|
||||||
|
|
||||||
uint64_t saved_regs[32];
|
uint64_t saved_regs[32];
|
||||||
for (int i = 0; i < num_reg_params; i++) {
|
for (int i = 0; i < num_reg_params; i++) {
|
||||||
|
if (mem_params[i].direction == PARAM_IN)
|
||||||
|
continue;
|
||||||
|
|
||||||
LOG_DEBUG("save %s", reg_params[i].reg_name);
|
LOG_DEBUG("save %s", reg_params[i].reg_name);
|
||||||
struct reg *r = register_get_by_name(target->reg_cache, reg_params[i].reg_name, 0);
|
struct reg *r = register_get_by_name(target->reg_cache, reg_params[i].reg_name, 0);
|
||||||
if (!r) {
|
if (!r) {
|
||||||
|
|
|
@ -1897,6 +1897,9 @@ static int stm8_run_algorithm(struct target *target, int num_mem_params,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < num_reg_params; i++) {
|
for (int i = 0; i < num_reg_params; i++) {
|
||||||
|
if (reg_params[i].direction == PARAM_IN)
|
||||||
|
continue;
|
||||||
|
|
||||||
struct reg *reg = register_get_by_name(stm8->core_cache,
|
struct reg *reg = register_get_by_name(stm8->core_cache,
|
||||||
reg_params[i].reg_name, 0);
|
reg_params[i].reg_name, 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue