aboutsummaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-05-25 12:04:17 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2020-08-02 10:48:52 +0100
commit7c66df13ef5e45c085786206ef061047b522c18e (patch)
tree27c5ff250818f7a555d52ab39fb5ef4aeff988ef /src/target
parent768502403ee0513d0e289c22b27c7296300fe39d (diff)
downloadriscv-openocd-7c66df13ef5e45c085786206ef061047b522c18e.zip
riscv-openocd-7c66df13ef5e45c085786206ef061047b522c18e.tar.gz
riscv-openocd-7c66df13ef5e45c085786206ef061047b522c18e.tar.bz2
target/arm11: fix memory leaks, including register cache
There is no deinit_target method, so few memory allocations leak at openocd exit. Issue identified by tracking all calls to arm_dpm_setup(). Implement the method arm11_dpm_deinit() to free all the memory allocated in arm11_dpm_init() and call it in the new arm11_deinit_target(). NOT TESTED on real HW. Change-Id: Icab86e290fc2db14f70eb84c8286357aadb02a35 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5694 Tested-by: jenkins
Diffstat (limited to 'src/target')
-rw-r--r--src/target/arm11.c9
-rw-r--r--src/target/arm11_dbgtap.c10
-rw-r--r--src/target/arm11_dbgtap.h1
3 files changed, 20 insertions, 0 deletions
diff --git a/src/target/arm11.c b/src/target/arm11.c
index 10a1d6d..68d4e18 100644
--- a/src/target/arm11.c
+++ b/src/target/arm11.c
@@ -1131,6 +1131,14 @@ static int arm11_init_target(struct command_context *cmd_ctx,
return ERROR_OK;
}
+static void arm11_deinit_target(struct target *target)
+{
+ struct arm11_common *arm11 = target_to_arm11(target);
+
+ arm11_dpm_deinit(arm11);
+ free(arm11);
+}
+
/* talk to the target and set things up */
static int arm11_examine(struct target *target)
{
@@ -1379,5 +1387,6 @@ struct target_type arm11_target = {
.commands = arm11_command_handlers,
.target_create = arm11_target_create,
.init_target = arm11_init_target,
+ .deinit_target = arm11_deinit_target,
.examine = arm11_examine,
};
diff --git a/src/target/arm11_dbgtap.c b/src/target/arm11_dbgtap.c
index a758db5..60be009 100644
--- a/src/target/arm11_dbgtap.c
+++ b/src/target/arm11_dbgtap.c
@@ -1193,3 +1193,13 @@ int arm11_dpm_init(struct arm11_common *arm11, uint32_t didr)
return arm11_bpwp_flush(arm11);
}
+
+void arm11_dpm_deinit(struct arm11_common *arm11)
+{
+ struct arm_dpm *dpm = &arm11->dpm;
+
+ free(arm11->bpwp_actions);
+ arm_free_reg_cache(dpm->arm);
+ free(dpm->dbp);
+ free(dpm->dwp);
+}
diff --git a/src/target/arm11_dbgtap.h b/src/target/arm11_dbgtap.h
index 541434e..be02484 100644
--- a/src/target/arm11_dbgtap.h
+++ b/src/target/arm11_dbgtap.h
@@ -78,6 +78,7 @@ int arm11_read_memory_word(struct arm11_common *arm11,
uint32_t address, uint32_t *result);
int arm11_dpm_init(struct arm11_common *arm11, uint32_t didr);
+void arm11_dpm_deinit(struct arm11_common *arm11);
int arm11_bpwp_flush(struct arm11_common *arm11);
#endif /* OPENOCD_TARGET_ARM11_DBGTAP_H */