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
This commit is contained in:
Antonio Borneo 2020-05-25 12:04:17 +02:00
parent 768502403e
commit 7c66df13ef
3 changed files with 20 additions and 0 deletions

View File

@ -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,
};

View File

@ -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);
}

View File

@ -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 */