ETM: simplify ETM initialization code paths

Return NULL from etm_build_reg_cache() not ERROR_OK; and share
code on that fault path.

Let ETM code handle any tracking of its cache -- not callers.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
David Brownell 2009-11-13 16:26:39 -08:00
parent a7f5cdf999
commit 78c6b922e2
3 changed files with 14 additions and 18 deletions

View File

@ -664,12 +664,10 @@ int arm7tdmi_examine(struct target *target)
arm7_9->eice_cache = (*cache_p); arm7_9->eice_cache = (*cache_p);
if (arm7_9->armv4_5_common.etm) if (arm7_9->armv4_5_common.etm)
{
struct arm_jtag *jtag_info = &arm7_9->jtag_info;
(*cache_p)->next = etm_build_reg_cache(target, (*cache_p)->next = etm_build_reg_cache(target,
jtag_info, arm7_9->armv4_5_common.etm); &arm7_9->jtag_info,
arm7_9->armv4_5_common.etm->reg_cache = (*cache_p)->next; arm7_9->armv4_5_common.etm);
}
target_set_examined(target); target_set_examined(target);
} }
if ((retval = embeddedice_setup(target)) != ERROR_OK) if ((retval = embeddedice_setup(target)) != ERROR_OK)

View File

@ -759,12 +759,10 @@ int arm9tdmi_examine(struct target *target)
arm7_9->eice_cache = (*cache_p); arm7_9->eice_cache = (*cache_p);
if (arm7_9->armv4_5_common.etm) if (arm7_9->armv4_5_common.etm)
{
struct arm_jtag *jtag_info = &arm7_9->jtag_info;
(*cache_p)->next = etm_build_reg_cache(target, (*cache_p)->next = etm_build_reg_cache(target,
jtag_info, arm7_9->armv4_5_common.etm); &arm7_9->jtag_info,
arm7_9->armv4_5_common.etm->reg_cache = (*cache_p)->next; arm7_9->armv4_5_common.etm);
}
target_set_examined(target); target_set_examined(target);
} }
if ((retval = embeddedice_setup(target)) != ERROR_OK) if ((retval = embeddedice_setup(target)) != ERROR_OK)

View File

@ -349,10 +349,7 @@ struct reg_cache *etm_build_reg_cache(struct target *target,
break; break;
default: default:
LOG_WARNING("Bad ETMv1 protocol %d", config >> 28); LOG_WARNING("Bad ETMv1 protocol %d", config >> 28);
free(reg_cache); goto fail;
free(reg_list);
free(arch_info);
return ERROR_OK;
} }
} }
etm_ctx->bcd_vers = bcd_vers; etm_ctx->bcd_vers = bcd_vers;
@ -396,10 +393,7 @@ struct reg_cache *etm_build_reg_cache(struct target *target,
if (!etb) if (!etb)
{ {
LOG_ERROR("etb selected as etm capture driver, but no ETB configured"); LOG_ERROR("etb selected as etm capture driver, but no ETB configured");
free(reg_cache); goto fail;
free(reg_list);
free(arch_info);
return ERROR_OK;
} }
reg_cache->next = etb_build_reg_cache(etb); reg_cache->next = etb_build_reg_cache(etb);
@ -409,6 +403,12 @@ struct reg_cache *etm_build_reg_cache(struct target *target,
etm_ctx->reg_cache = reg_cache; etm_ctx->reg_cache = reg_cache;
return reg_cache; return reg_cache;
fail:
free(reg_cache);
free(reg_list);
free(arch_info);
return NULL;
} }
static int etm_read_reg(struct reg *reg) static int etm_read_reg(struct reg *reg)