diff options
author | Antonio Borneo <borneo.antonio@gmail.com> | 2020-05-25 12:04:17 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2020-08-02 10:48:52 +0100 |
commit | 7c66df13ef5e45c085786206ef061047b522c18e (patch) | |
tree | 27c5ff250818f7a555d52ab39fb5ef4aeff988ef /src/target | |
parent | 768502403ee0513d0e289c22b27c7296300fe39d (diff) | |
download | riscv-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.c | 9 | ||||
-rw-r--r-- | src/target/arm11_dbgtap.c | 10 | ||||
-rw-r--r-- | src/target/arm11_dbgtap.h | 1 |
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 */ |