target: fix memory leaks on targets based on arm9tdmi 99/5699/5
authorAntonio Borneo <borneo.antonio@gmail.com>
Mon, 25 May 2020 09:28:22 +0000 (11:28 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sun, 26 Jul 2020 19:12:21 +0000 (20:12 +0100)
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 <target_type>_common.

Change-Id: I565f9a5bf144a9df78474434d86a64127ef0fbe5
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/5699
Tested-by: jenkins
src/target/arm920t.c
src/target/arm946e.c
src/target/arm966e.c
src/target/arm9tdmi.c
src/target/arm9tdmi.h
src/target/fa526.c
src/target/feroceon.c

index 3ddd198883accf7acb252647178a96f527d436d9..c96975a77c380a3f60b927b2a1925137ebda492e 100644 (file)
@@ -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,
 };
index 4ef167a9d331344a858435d62d3be36d802b8012..6b187f3ffec7379250aa3b4d6e3cb1f943a30f11 100644 (file)
@@ -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,
 };
index 8462f546e6ebf3762918a7ea7962390f0c856002..8ddcb3c794528c50c5f5a1972398d9a32fc39ba6 100644 (file)
@@ -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,
 };
index 6ab06edf946757fb11e561ddd99bee20d06595c0..4810c2b1626a63a22695c49196f00b30d7273049 100644 (file)
@@ -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,
 };
index c6f0ccf0f274b969326f5185220f1f83c1e23aa6..56946f78afa2648d7dfb2f2f36fc16972e562614 100644 (file)
@@ -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[];
index bb9f7353af895e2ddf8944993df5fd26253fb3ae..aa9e450430aac4824c55dd85886c9a804b912f5c 100644 (file)
@@ -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,
 };
index 4a6c6dcf0be4fadabcc050290264890e90ead1d3..d2b707d44160a8546143b12aa2d0634afda85aaf 100644 (file)
@@ -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,
 };
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)