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
This commit is contained in:
parent
6a81bad3b9
commit
f29d157882
|
@ -2682,6 +2682,15 @@ int arm7_9_examine(struct target *target)
|
||||||
return retval;
|
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)
|
int arm7_9_check_reset(struct target *target)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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_init_arch_info(struct target *target, struct arm7_9_common *arm7_9);
|
||||||
int arm7_9_examine(struct target *target);
|
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_check_reset(struct target *target);
|
||||||
|
|
||||||
int arm7_9_endianness_callback(jtag_callback_data_t pu8_in,
|
int arm7_9_endianness_callback(jtag_callback_data_t pu8_in,
|
||||||
|
|
|
@ -723,6 +723,16 @@ static int arm926ejs_target_create(struct target *target, Jim_Interp *interp)
|
||||||
return arm926ejs_init_arch_info(target, arm926ejs, target->tap);
|
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)
|
COMMAND_HANDLER(arm926ejs_handle_cache_info_command)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
@ -823,6 +833,7 @@ struct target_type arm926ejs_target = {
|
||||||
.commands = arm926ejs_command_handlers,
|
.commands = arm926ejs_command_handlers,
|
||||||
.target_create = arm926ejs_target_create,
|
.target_create = arm926ejs_target_create,
|
||||||
.init_target = arm9tdmi_init_target,
|
.init_target = arm9tdmi_init_target,
|
||||||
|
.deinit_target = arm926ejs_deinit_target,
|
||||||
.examine = arm7_9_examine,
|
.examine = arm7_9_examine,
|
||||||
.check_reset = arm7_9_check_reset,
|
.check_reset = arm7_9_check_reset,
|
||||||
.virt2phys = arm926ejs_virt2phys,
|
.virt2phys = arm926ejs_virt2phys,
|
||||||
|
|
|
@ -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);
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -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_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 */
|
/* 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)
|
static inline void arm7flip32(jtag_callback_data_t arg)
|
||||||
|
|
|
@ -303,6 +303,22 @@ struct reg_cache *embeddedice_build_reg_cache(struct target *target,
|
||||||
return reg_cache;
|
return reg_cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
* Initialize EmbeddedICE module, if needed.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -88,6 +88,7 @@ struct embeddedice_reg {
|
||||||
|
|
||||||
struct reg_cache *embeddedice_build_reg_cache(struct target *target,
|
struct reg_cache *embeddedice_build_reg_cache(struct target *target,
|
||||||
struct arm7_9_common *arm7_9);
|
struct arm7_9_common *arm7_9);
|
||||||
|
void embeddedice_free_reg_cache(struct reg_cache *reg_cache);
|
||||||
|
|
||||||
int embeddedice_setup(struct target *target);
|
int embeddedice_setup(struct target *target);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue