aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarc Schink <openocd-dev@marcschink.de>2019-04-01 13:47:17 +0200
committerTomas Vanek <vanekt@fbl.cz>2019-04-10 16:37:21 +0100
commitd5936dc688bedf54848a29b7c171ef47deb2bf91 (patch)
treefba2727f9d1c98d7d757fdd59b1ee32e6b489ef1 /src
parent6aae614cc2072e0d45bc32213595286ccbd32248 (diff)
downloadriscv-openocd-d5936dc688bedf54848a29b7c171ef47deb2bf91.zip
riscv-openocd-d5936dc688bedf54848a29b7c171ef47deb2bf91.tar.gz
riscv-openocd-d5936dc688bedf54848a29b7c171ef47deb2bf91.tar.bz2
target/riscv: Free registers to avoid memory leak
Tested with SiFive HiFive1 development board. Change-Id: I96a9a528057fcf9fc54d3da46a672d2cd54c3d5f Signed-off-by: Marc Schink <openocd-dev@marcschink.de> Reviewed-on: http://openocd.zylin.com/4885 Tested-by: jenkins Reviewed-by: Tim Newsome <tim@sifive.com> Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src')
-rw-r--r--src/target/riscv/riscv.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/target/riscv/riscv.c b/src/target/riscv/riscv.c
index 3b88e33..44da5a9 100644
--- a/src/target/riscv/riscv.c
+++ b/src/target/riscv/riscv.c
@@ -271,16 +271,8 @@ static int riscv_init_target(struct command_context *cmd_ctx,
return ERROR_OK;
}
-static void riscv_deinit_target(struct target *target)
+static void riscv_free_registers(struct target *target)
{
- LOG_DEBUG("riscv_deinit_target()");
- struct target_type *tt = get_target_type(target);
- if (tt) {
- tt->deinit_target(target);
- riscv_info_t *info = (riscv_info_t *) target->arch_info;
- free(info->reg_names);
- free(info);
- }
/* Free the shared structure use for most registers. */
if (target->reg_cache) {
if (target->reg_cache->reg_list) {
@@ -293,6 +285,21 @@ static void riscv_deinit_target(struct target *target)
}
free(target->reg_cache);
}
+}
+
+static void riscv_deinit_target(struct target *target)
+{
+ LOG_DEBUG("riscv_deinit_target()");
+ struct target_type *tt = get_target_type(target);
+ if (tt) {
+ tt->deinit_target(target);
+ riscv_info_t *info = (riscv_info_t *) target->arch_info;
+ free(info->reg_names);
+ free(info);
+ }
+
+ riscv_free_registers(target);
+
target->arch_info = NULL;
}
@@ -2503,11 +2510,7 @@ int riscv_init_registers(struct target *target)
{
RISCV_INFO(info);
- if (target->reg_cache) {
- if (target->reg_cache->reg_list)
- free(target->reg_cache->reg_list);
- free(target->reg_cache);
- }
+ riscv_free_registers(target);
target->reg_cache = calloc(1, sizeof(*target->reg_cache));
target->reg_cache->name = "RISC-V Registers";