target/xscale: fix memory leak of register cache
There is no method to free the register cache, allocated in xscale_build_reg_cache(), so we get a memory leak. Issue identified by tracking all calls to arm_build_reg_cache(). Implement the method xscale_deinit_target() that in turn calls the new xscale_free_reg_cache(). Fix leak of struct xscale. NOT TESTED on a real xscale target. Tested on a arm926ejs (SPEAr320) by hacking the target type and pretending it is a xscale: sed -i s/arm926ejs/xscale/ tcl/target/spear3xx.cfg Change-Id: Ibb2104c42411b76f4bb77c2fa387d1b85a3d2d5d Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5695 Tested-by: jenkins
This commit is contained in:
parent
580b8f5da0
commit
df1dcc27ee
|
@ -2903,6 +2903,21 @@ static void xscale_build_reg_cache(struct target *target)
|
||||||
xscale->reg_cache = (*cache_p);
|
xscale->reg_cache = (*cache_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void xscale_free_reg_cache(struct target *target)
|
||||||
|
{
|
||||||
|
struct xscale_common *xscale = target_to_xscale(target);
|
||||||
|
struct reg_cache *cache = xscale->reg_cache;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < ARRAY_SIZE(xscale_reg_arch_info); i++)
|
||||||
|
free(cache->reg_list[i].value);
|
||||||
|
|
||||||
|
free(cache->reg_list[0].arch_info);
|
||||||
|
free(cache->reg_list);
|
||||||
|
free(cache);
|
||||||
|
|
||||||
|
arm_free_reg_cache(&xscale->arm);
|
||||||
|
}
|
||||||
|
|
||||||
static int xscale_init_target(struct command_context *cmd_ctx,
|
static int xscale_init_target(struct command_context *cmd_ctx,
|
||||||
struct target *target)
|
struct target *target)
|
||||||
{
|
{
|
||||||
|
@ -2910,6 +2925,14 @@ static int xscale_init_target(struct command_context *cmd_ctx,
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void xscale_deinit_target(struct target *target)
|
||||||
|
{
|
||||||
|
struct xscale_common *xscale = target_to_xscale(target);
|
||||||
|
|
||||||
|
xscale_free_reg_cache(target);
|
||||||
|
free(xscale);
|
||||||
|
}
|
||||||
|
|
||||||
static int xscale_init_arch_info(struct target *target,
|
static int xscale_init_arch_info(struct target *target,
|
||||||
struct xscale_common *xscale, struct jtag_tap *tap)
|
struct xscale_common *xscale, struct jtag_tap *tap)
|
||||||
{
|
{
|
||||||
|
@ -3725,6 +3748,7 @@ struct target_type xscale_target = {
|
||||||
.commands = xscale_command_handlers,
|
.commands = xscale_command_handlers,
|
||||||
.target_create = xscale_target_create,
|
.target_create = xscale_target_create,
|
||||||
.init_target = xscale_init_target,
|
.init_target = xscale_init_target,
|
||||||
|
.deinit_target = xscale_deinit_target,
|
||||||
|
|
||||||
.virt2phys = xscale_virt2phys,
|
.virt2phys = xscale_virt2phys,
|
||||||
.mmu = xscale_mmu
|
.mmu = xscale_mmu
|
||||||
|
|
Loading…
Reference in New Issue