aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-06-14 23:18:21 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2020-07-08 22:07:38 +0100
commitf29d157882a756e562d224dd128eea1bbe3e3813 (patch)
treeea15001cb9c18d3c2359f1838f552168e0fc2500
parent6a81bad3b973e54ce68496d22750d643741afb32 (diff)
downloadopenocd-jz4730-f29d157882a756e562d224dd128eea1bbe3e3813.tar.gz
target/arm926ejs: fix memory leaks
The memory leaks detected and fixed are: - arm register cache; - EmbeddedICE register cache; - arm_jtag_reset_callback internal data; - struct arm926ejs_common. Issue identified with valgrind. Tested on SPEAr320 based on arm926ejs. Change-Id: If2bed02c516051ce4d0eb29b204a3f3337fe5d6a Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5698 Tested-by: jenkins
-rw-r--r--src/target/arm7_9_common.c9
-rw-r--r--src/target/arm7_9_common.h1
-rw-r--r--src/target/arm926ejs.c11
-rw-r--r--src/target/arm_jtag.c5
-rw-r--r--src/target/arm_jtag.h1
-rw-r--r--src/target/embeddedice.c16
-rw-r--r--src/target/embeddedice.h1
7 files changed, 44 insertions, 0 deletions
diff --git a/src/target/arm7_9_common.c b/src/target/arm7_9_common.c
index 6a7bf9da5..28fefc5aa 100644
--- a/src/target/arm7_9_common.c
+++ b/src/target/arm7_9_common.c
@@ -2682,6 +2682,15 @@ int arm7_9_examine(struct target *target)
return retval;
}
+void arm7_9_deinit(struct target *target)
+{
+ struct arm7_9_common *arm7_9 = target_to_arm7_9(target);
+
+ if (target_was_examined(target))
+ embeddedice_free_reg_cache(arm7_9->eice_cache);
+
+ arm_jtag_close_connection(&arm7_9->jtag_info);
+}
int arm7_9_check_reset(struct target *target)
{
diff --git a/src/target/arm7_9_common.h b/src/target/arm7_9_common.h
index 811f9c593..4961212bb 100644
--- a/src/target/arm7_9_common.h
+++ b/src/target/arm7_9_common.h
@@ -186,6 +186,7 @@ int arm7_9_execute_sys_speed(struct target *target);
int arm7_9_init_arch_info(struct target *target, struct arm7_9_common *arm7_9);
int arm7_9_examine(struct target *target);
+void arm7_9_deinit(struct target *target);
int arm7_9_check_reset(struct target *target);
int arm7_9_endianness_callback(jtag_callback_data_t pu8_in,
diff --git a/src/target/arm926ejs.c b/src/target/arm926ejs.c
index ac30485b8..95a4f7ca0 100644
--- a/src/target/arm926ejs.c
+++ b/src/target/arm926ejs.c
@@ -723,6 +723,16 @@ static int arm926ejs_target_create(struct target *target, Jim_Interp *interp)
return arm926ejs_init_arch_info(target, arm926ejs, target->tap);
}
+void arm926ejs_deinit_target(struct target *target)
+{
+ struct arm *arm = target_to_arm(target);
+ struct arm926ejs_common *arm926ejs = target_to_arm926(target);
+
+ arm7_9_deinit(target);
+ arm_free_reg_cache(arm);
+ free(arm926ejs);
+}
+
COMMAND_HANDLER(arm926ejs_handle_cache_info_command)
{
int retval;
@@ -823,6 +833,7 @@ struct target_type arm926ejs_target = {
.commands = arm926ejs_command_handlers,
.target_create = arm926ejs_target_create,
.init_target = arm9tdmi_init_target,
+ .deinit_target = arm926ejs_deinit_target,
.examine = arm7_9_examine,
.check_reset = arm7_9_check_reset,
.virt2phys = arm926ejs_virt2phys,
diff --git a/src/target/arm_jtag.c b/src/target/arm_jtag.c
index 49aca3487..f9605acb1 100644
--- a/src/target/arm_jtag.c
+++ b/src/target/arm_jtag.c
@@ -92,3 +92,8 @@ int arm_jtag_setup_connection(struct arm_jtag *jtag_info)
return jtag_register_event_callback(arm_jtag_reset_callback, jtag_info);
}
+
+int arm_jtag_close_connection(struct arm_jtag *jtag_info)
+{
+ return jtag_unregister_event_callback(arm_jtag_reset_callback, jtag_info);
+}
diff --git a/src/target/arm_jtag.h b/src/target/arm_jtag.h
index bb92abb84..bf5b83748 100644
--- a/src/target/arm_jtag.h
+++ b/src/target/arm_jtag.h
@@ -61,6 +61,7 @@ static inline int arm_jtag_scann(struct arm_jtag *jtag_info, uint32_t new_scan_c
}
int arm_jtag_setup_connection(struct arm_jtag *jtag_info);
+int arm_jtag_close_connection(struct arm_jtag *jtag_info);
/* use this as a static so we can inline it in -O3 and refer to it via a pointer */
static inline void arm7flip32(jtag_callback_data_t arg)
diff --git a/src/target/embeddedice.c b/src/target/embeddedice.c
index 61ee8bbd9..7c53c45c5 100644
--- a/src/target/embeddedice.c
+++ b/src/target/embeddedice.c
@@ -304,6 +304,22 @@ struct reg_cache *embeddedice_build_reg_cache(struct target *target,
}
/**
+ * Free all memory allocated for EmbeddedICE register cache
+ */
+void embeddedice_free_reg_cache(struct reg_cache *reg_cache)
+{
+ if (!reg_cache)
+ return;
+
+ for (unsigned int i = 0; i < reg_cache->num_regs; i++)
+ free(reg_cache->reg_list[i].value);
+
+ free(reg_cache->reg_list[0].arch_info);
+ free(reg_cache->reg_list);
+ free(reg_cache);
+}
+
+/**
* Initialize EmbeddedICE module, if needed.
*/
int embeddedice_setup(struct target *target)
diff --git a/src/target/embeddedice.h b/src/target/embeddedice.h
index 39902fb3e..4b5c816a6 100644
--- a/src/target/embeddedice.h
+++ b/src/target/embeddedice.h
@@ -88,6 +88,7 @@ struct embeddedice_reg {
struct reg_cache *embeddedice_build_reg_cache(struct target *target,
struct arm7_9_common *arm7_9);
+void embeddedice_free_reg_cache(struct reg_cache *reg_cache);
int embeddedice_setup(struct target *target);