target algo: do not write reg_param if direction is PARAM_IN
authorTomas Vanek <vanekt@fbl.cz>
Tue, 18 Dec 2018 16:17:33 +0000 (17:17 +0100)
committerMatthias Welwarsky <matthias@welwarsky.de>
Thu, 7 Feb 2019 07:51:50 +0000 (07:51 +0000)
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>
src/flash/nor/kinetis.c
src/target/armv4_5.c
src/target/armv7m.c
src/target/dsp563xx.c
src/target/mips32.c
src/target/riscv/riscv.c
src/target/stm8.c

index 86fad7215c5402c87666df8b774daed0a90ee6c2..eca74a8b89052f2cbec23c92aabad9178a2e9e0f 100644 (file)
@@ -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.core_mode = ARM_MODE_THREAD;
 
-               init_reg_param(&reg_params[0], "r0", 32, PARAM_IN);
+               init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
                buf_set_u32(reg_params[0].value, 0, 32, wdog_base);
 
                retval = target_run_algorithm(target, 0, NULL, 1, reg_params,
index b3bee8d8871e1921f14312e847714557f7a05a3e..6c30acc46605fa9287dee0c8dd1546a04f8c8d23 100644 (file)
@@ -1362,6 +1362,9 @@ int armv4_5_run_algorithm_inner(struct target *target,
        }
 
        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);
                if (!reg) {
                        LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
index a1962fefc8cc12b4248ea32a9c9195346a8dffcb..ecca0e752466e1f143be0da7bb3b59542e61cd12 100644 (file)
@@ -388,6 +388,9 @@ int armv7m_start_algorithm(struct target *target,
        }
 
        for (int i = 0; i < num_reg_params; i++) {
+               if (reg_params[i].direction == PARAM_IN)
+                       continue;
+
                struct reg *reg =
                        register_get_by_name(armv7m->arm.core_cache, reg_params[i].reg_name, 0);
 /*             uint32_t regvalue; */
index 1d728dff863a2662af050d773caca41811a42721..e7306d2e4e84f9fc73dbf27b0a8d8ac52eadce68 100644 (file)
@@ -1394,6 +1394,9 @@ static int dsp563xx_run_algorithm(struct target *target,
        }
 
        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,
                                reg_params[i].reg_name,
                                0);
index b5dbea312c2c53ec80b57c2461680ad9cc09d904..abb42559617cff9423b533b3e0e492f37ad21ac4 100644 (file)
@@ -468,6 +468,9 @@ int mips32_run_algorithm(struct target *target, int num_mem_params,
        }
 
        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);
 
                if (!reg) {
index 8d76c4aa4d393e5811273eb7f51e5f0d08b38f66..02ba380553fb7057508a5c36da04126b07305d53 100644 (file)
@@ -853,6 +853,9 @@ static int riscv_run_algorithm(struct target *target, int num_mem_params,
 
        uint64_t saved_regs[32];
        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);
                struct reg *r = register_get_by_name(target->reg_cache, reg_params[i].reg_name, 0);
                if (!r) {
index 39fbb50599959288d6341db0f6e8bca9df997d58..f5df2481a3a3e3ba9add19b51a52be2de157f20b 100644 (file)
@@ -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++) {
+               if (reg_params[i].direction == PARAM_IN)
+                       continue;
+
                struct reg *reg = register_get_by_name(stm8->core_cache,
                                reg_params[i].reg_name, 0);