From 580b8f5da015f49b5ca939ed4fd928b8d941944e Mon Sep 17 00:00:00 2001 From: Antonio Borneo Date: Mon, 25 May 2020 11:28:22 +0200 Subject: [PATCH] target: fix memory leaks on targets based on arm9tdmi Similarly to the fix for arm926ejs (also base on arm9tdmi), fix the other targets based on arm9tdmi. The fix for arm926ejs is tested on SPEAr320 target. This fix is proposed separately because is not tested on a correct target device, but tested on SPEAr320 by hacking the target type and pretending it is the correct one, e.g.: sed -i s/arm926ejs/arm920t/ tcl/target/spear3xx.cfg The memory leaks detected and fixed are: - arm register cache; - EmbeddedICE register cache; - arm_jtag_reset_callback internal data; - struct _common. Change-Id: I565f9a5bf144a9df78474434d86a64127ef0fbe5 Signed-off-by: Antonio Borneo Reviewed-on: http://openocd.zylin.com/5699 Tested-by: jenkins --- src/target/arm920t.c | 11 +++++++++++ src/target/arm946e.c | 11 +++++++++++ src/target/arm966e.c | 11 +++++++++++ src/target/arm9tdmi.c | 11 +++++++++++ src/target/arm9tdmi.h | 1 + src/target/fa526.c | 11 +++++++++++ src/target/feroceon.c | 6 ++++++ 7 files changed, 62 insertions(+) diff --git a/src/target/arm920t.c b/src/target/arm920t.c index 3ddd198883..c96975a77c 100644 --- a/src/target/arm920t.c +++ b/src/target/arm920t.c @@ -852,6 +852,16 @@ static int arm920t_target_create(struct target *target, Jim_Interp *interp) return arm920t_init_arch_info(target, arm920t, target->tap); } +static void arm920t_deinit_target(struct target *target) +{ + struct arm *arm = target_to_arm(target); + struct arm920t_common *arm920t = target_to_arm920(target); + + arm7_9_deinit(target); + arm_free_reg_cache(arm); + free(arm920t); +} + COMMAND_HANDLER(arm920t_handle_read_cache_command) { int retval = ERROR_OK; @@ -1716,6 +1726,7 @@ struct target_type arm920t_target = { .commands = arm920t_command_handlers, .target_create = arm920t_target_create, .init_target = arm9tdmi_init_target, + .deinit_target = arm920t_deinit_target, .examine = arm7_9_examine, .check_reset = arm7_9_check_reset, }; diff --git a/src/target/arm946e.c b/src/target/arm946e.c index 4ef167a9d3..6b187f3ffe 100644 --- a/src/target/arm946e.c +++ b/src/target/arm946e.c @@ -99,6 +99,16 @@ static int arm946e_target_create(struct target *target, Jim_Interp *interp) return ERROR_OK; } +static void arm946e_deinit_target(struct target *target) +{ + struct arm *arm = target_to_arm(target); + struct arm946e_common *arm946e = target_to_arm946(target); + + arm7_9_deinit(target); + arm_free_reg_cache(arm); + free(arm946e); +} + static int arm946e_verify_pointer(struct command_invocation *cmd, struct arm946e_common *arm946e) { @@ -776,6 +786,7 @@ struct target_type arm946e_target = { .commands = arm946e_command_handlers, .target_create = arm946e_target_create, .init_target = arm9tdmi_init_target, + .deinit_target = arm946e_deinit_target, .examine = arm7_9_examine, .check_reset = arm7_9_check_reset, }; diff --git a/src/target/arm966e.c b/src/target/arm966e.c index 8462f546e6..8ddcb3c794 100644 --- a/src/target/arm966e.c +++ b/src/target/arm966e.c @@ -56,6 +56,16 @@ static int arm966e_target_create(struct target *target, Jim_Interp *interp) return arm966e_init_arch_info(target, arm966e, target->tap); } +static void arm966e_deinit_target(struct target *target) +{ + struct arm *arm = target_to_arm(target); + struct arm966e_common *arm966e = target_to_arm966(target); + + arm7_9_deinit(target); + arm_free_reg_cache(arm); + free(arm966e); +} + static int arm966e_verify_pointer(struct command_invocation *cmd, struct arm966e_common *arm966e) { @@ -278,6 +288,7 @@ struct target_type arm966e_target = { .commands = arm966e_command_handlers, .target_create = arm966e_target_create, .init_target = arm9tdmi_init_target, + .deinit_target = arm966e_deinit_target, .examine = arm7_9_examine, .check_reset = arm7_9_check_reset, }; diff --git a/src/target/arm9tdmi.c b/src/target/arm9tdmi.c index 6ab06edf94..4810c2b162 100644 --- a/src/target/arm9tdmi.c +++ b/src/target/arm9tdmi.c @@ -786,6 +786,16 @@ static int arm9tdmi_target_create(struct target *target, Jim_Interp *interp) return ERROR_OK; } +void arm9tdmi_deinit_target(struct target *target) +{ + struct arm *arm = target_to_arm(target); + struct arm7_9_common *arm7_9 = target_to_arm7_9(target); + + arm7_9_deinit(target); + arm_free_reg_cache(arm); + free(arm7_9); +} + COMMAND_HANDLER(handle_arm9tdmi_catch_vectors_command) { struct target *target = get_current_target(CMD_CTX); @@ -921,6 +931,7 @@ struct target_type arm9tdmi_target = { .commands = arm9tdmi_command_handlers, .target_create = arm9tdmi_target_create, .init_target = arm9tdmi_init_target, + .deinit_target = arm9tdmi_deinit_target, .examine = arm7_9_examine, .check_reset = arm7_9_check_reset, }; diff --git a/src/target/arm9tdmi.h b/src/target/arm9tdmi.h index c6f0ccf0f2..56946f78af 100644 --- a/src/target/arm9tdmi.h +++ b/src/target/arm9tdmi.h @@ -26,6 +26,7 @@ int arm9tdmi_init_target(struct command_context *cmd_ctx, struct target *target); +void arm9tdmi_deinit_target(struct target *target); int arm9tdmi_init_arch_info(struct target *target, struct arm7_9_common *arm7_9, struct jtag_tap *tap); extern const struct command_registration arm9tdmi_command_handlers[]; diff --git a/src/target/fa526.c b/src/target/fa526.c index bb9f7353af..aa9e450430 100644 --- a/src/target/fa526.c +++ b/src/target/fa526.c @@ -347,6 +347,16 @@ static int fa526_target_create(struct target *target, Jim_Interp *interp) return fa526_init_arch_info(target, arm920t, target->tap); } +static void fa526_deinit_target(struct target *target) +{ + struct arm *arm = target_to_arm(target); + struct arm920t_common *arm920t = target_to_arm920(target); + + arm7_9_deinit(target); + arm_free_reg_cache(arm); + free(arm920t); +} + /** Holds methods for FA526 targets. */ struct target_type fa526_target = { .name = "fa526", @@ -383,6 +393,7 @@ struct target_type fa526_target = { .commands = arm920t_command_handlers, .target_create = fa526_target_create, .init_target = arm9tdmi_init_target, + .deinit_target = fa526_deinit_target, .examine = arm7_9_examine, .check_reset = arm7_9_check_reset, }; diff --git a/src/target/feroceon.c b/src/target/feroceon.c index 4a6c6dcf0b..d2b707d441 100644 --- a/src/target/feroceon.c +++ b/src/target/feroceon.c @@ -593,6 +593,11 @@ static int feroceon_init_target(struct command_context *cmd_ctx, return ERROR_OK; } +static void feroceon_deinit_target(struct target *target) +{ + arm9tdmi_deinit_target(target); +} + static void feroceon_common_setup(struct target *target) { struct arm *arm = target->arch_info; @@ -729,6 +734,7 @@ struct target_type feroceon_target = { .commands = arm926ejs_command_handlers, .target_create = feroceon_target_create, .init_target = feroceon_init_target, + .deinit_target = feroceon_deinit_target, .examine = feroceon_examine, }; -- 2.30.2