ETM: simplify ETM initialization code paths
authorDavid Brownell <dbrownell@users.sourceforge.net>
Sat, 14 Nov 2009 00:26:39 +0000 (16:26 -0800)
committerDavid Brownell <dbrownell@users.sourceforge.net>
Sat, 14 Nov 2009 00:26:39 +0000 (16:26 -0800)
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>
src/target/arm7tdmi.c
src/target/arm9tdmi.c
src/target/etm.c

index 029dce1c3db6259f372f6ef9f98340bf4cf1d282..c7bbd776274a091494480758cc58818a109dec41 100644 (file)
@@ -664,12 +664,10 @@ int arm7tdmi_examine(struct target *target)
                arm7_9->eice_cache = (*cache_p);
 
                if (arm7_9->armv4_5_common.etm)
-               {
-                       struct arm_jtag *jtag_info = &arm7_9->jtag_info;
                        (*cache_p)->next = etm_build_reg_cache(target,
-                                       jtag_info, arm7_9->armv4_5_common.etm);
-                       arm7_9->armv4_5_common.etm->reg_cache = (*cache_p)->next;
-               }
+                                       &arm7_9->jtag_info,
+                                       arm7_9->armv4_5_common.etm);
+
                target_set_examined(target);
        }
        if ((retval = embeddedice_setup(target)) != ERROR_OK)
index 147c0903e02d0363235ef96b31b22ec5ad89cb2a..fc110733e015451e1b58df987234d66dbf253ab9 100644 (file)
@@ -759,12 +759,10 @@ int arm9tdmi_examine(struct target *target)
                arm7_9->eice_cache = (*cache_p);
 
                if (arm7_9->armv4_5_common.etm)
-               {
-                       struct arm_jtag *jtag_info = &arm7_9->jtag_info;
                        (*cache_p)->next = etm_build_reg_cache(target,
-                                       jtag_info, arm7_9->armv4_5_common.etm);
-                       arm7_9->armv4_5_common.etm->reg_cache = (*cache_p)->next;
-               }
+                                       &arm7_9->jtag_info,
+                                       arm7_9->armv4_5_common.etm);
+
                target_set_examined(target);
        }
        if ((retval = embeddedice_setup(target)) != ERROR_OK)
index 43158b5667cffdb06913ff3d86497c839154b77b..4c94e6bf051117c356a0109a94a9252ed384dd44 100644 (file)
@@ -349,10 +349,7 @@ struct reg_cache *etm_build_reg_cache(struct target *target,
                        break;
                default:
                        LOG_WARNING("Bad ETMv1 protocol %d", config >> 28);
-                       free(reg_cache);
-                       free(reg_list);
-                       free(arch_info);
-                       return ERROR_OK;
+                       goto fail;
                }
        }
        etm_ctx->bcd_vers = bcd_vers;
@@ -396,10 +393,7 @@ struct reg_cache *etm_build_reg_cache(struct target *target,
                if (!etb)
                {
                        LOG_ERROR("etb selected as etm capture driver, but no ETB configured");
-                       free(reg_cache);
-                       free(reg_list);
-                       free(arch_info);
-                       return ERROR_OK;
+                       goto fail;
                }
 
                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;
        return reg_cache;
+
+fail:
+       free(reg_cache);
+       free(reg_list);
+       free(arch_info);
+       return NULL;
 }
 
 static int etm_read_reg(struct reg *reg)