diff options
author | Antonio Borneo <borneo.antonio@gmail.com> | 2020-05-25 10:43:53 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2020-07-26 20:12:34 +0100 |
commit | df1dcc27eeb3a42d3dd9708c9518a2230242f746 (patch) | |
tree | 22999fb15ced0d45cfabf1fdb77b1bd6eef971d6 /src | |
parent | 580b8f5da015f49b5ca939ed4fd928b8d941944e (diff) | |
download | riscv-openocd-df1dcc27eeb3a42d3dd9708c9518a2230242f746.zip riscv-openocd-df1dcc27eeb3a42d3dd9708c9518a2230242f746.tar.gz riscv-openocd-df1dcc27eeb3a42d3dd9708c9518a2230242f746.tar.bz2 |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/target/xscale.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/target/xscale.c b/src/target/xscale.c index edab4f9..1bca96d 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -2903,6 +2903,21 @@ static void xscale_build_reg_cache(struct target *target) 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, struct target *target) { @@ -2910,6 +2925,14 @@ static int xscale_init_target(struct command_context *cmd_ctx, 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, struct xscale_common *xscale, struct jtag_tap *tap) { @@ -3725,6 +3748,7 @@ struct target_type xscale_target = { .commands = xscale_command_handlers, .target_create = xscale_target_create, .init_target = xscale_init_target, + .deinit_target = xscale_deinit_target, .virt2phys = xscale_virt2phys, .mmu = xscale_mmu |