This is an automated email from Gerrit.

Paul Fertser (fercer...@gmail.com) just uploaded a new patch set to Gerrit, 
which you can find at http://openocd.zylin.com/1920

-- gerrit

commit 8f87bb1b22b74e3e663c0238381dbb311492c365
Author: Paul Fertser <fercer...@gmail.com>
Date:   Mon Feb 3 01:19:00 2014 +0400

    arm_adi_v5: make dap_lookup_cs_component() traverse subtables and handle 
multicore
    
    When looking for a debug base address of a core, one should search
    through all the ROM tables, not just the top-level one.
    
    This code also assumes that the first found entry (in a depth-first
    search) will correspond to core 0, the second to core 1 etc.
    
    Compile-tested only.
    
    The patch is supposed to be an alternative implementation of
    http://openocd.zylin.com/#/c/1313/.
    
    Change-Id: Ifc88971a02fe3d9c00d9bf72a822ade5804d4e09
    Signed-off-by: Paul Fertser <fercer...@gmail.com>

diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c
index f748960..8377039 100644
--- a/src/target/arm_adi_v5.c
+++ b/src/target/arm_adi_v5.c
@@ -984,15 +984,16 @@ int dap_get_debugbase(struct adiv5_dap *dap, int ap,
 }
 
 int dap_lookup_cs_component(struct adiv5_dap *dap, int ap,
-                       uint32_t dbgbase, uint8_t type, uint32_t *addr)
+                           uint32_t dbgbase, uint8_t type, uint32_t *addr, 
int32_t *idx)
 {
        uint32_t ap_old;
        uint32_t romentry, entry_offset = 0, component_base, devtype;
-       int retval = ERROR_FAIL;
+       int retval;
 
        if (ap >= 256)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
+       *addr = 0;
        ap_old = dap->ap_current;
        dap_ap_select(dap, ap);
 
@@ -1006,15 +1007,32 @@ int dap_lookup_cs_component(struct adiv5_dap *dap, int 
ap,
                        + (romentry & 0xFFFFF000);
 
                if (romentry & 0x1) {
+                       uint32_t c_cid1;
+                       retval = mem_ap_read_atomic_u32(dap, component_base | 
0xff4, &c_cid1);
+                       if (retval != ERROR_OK) {
+                               LOG_ERROR("Can't read component with base 
address 0x%" PRIx32
+                                         ", the corresponding core might be 
turned off", component_base);
+                               return retval;
+                       }
+                       if (((c_cid1 >> 4) & 0x0f) == 1) {
+                               retval = dap_lookup_cs_component(dap, ap, 
dbgbase, type, addr, idx);
+                               if (retval == ERROR_OK)
+                                       break;
+                               if (retval != 
ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
+                                       return retval;
+                       }
+
                        retval = mem_ap_read_atomic_u32(dap,
                                        (component_base & 0xfffff000) | 0xfcc,
                                        &devtype);
                        if (retval != ERROR_OK)
                                return retval;
                        if ((devtype & 0xff) == type) {
-                               *addr = component_base;
-                               retval = ERROR_OK;
-                               break;
+                               if (!*idx) {
+                                       *addr = component_base;
+                                       break;
+                               } else
+                                       (*idx)--;
                        }
                }
                entry_offset += 4;
@@ -1022,7 +1040,10 @@ int dap_lookup_cs_component(struct adiv5_dap *dap, int 
ap,
 
        dap_ap_select(dap, ap_old);
 
-       return retval;
+       if (!*addr)
+               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+
+       return ERROR_OK;
 }
 
 static int dap_rom_display(struct command_context *cmd_ctx,
diff --git a/src/target/arm_adi_v5.h b/src/target/arm_adi_v5.h
index cdcf928..085c7c4 100644
--- a/src/target/arm_adi_v5.h
+++ b/src/target/arm_adi_v5.h
@@ -448,7 +448,7 @@ int dap_find_ap(struct adiv5_dap *dap,
 
 /* Lookup CoreSight component */
 int dap_lookup_cs_component(struct adiv5_dap *dap, int ap,
-                       uint32_t dbgbase, uint8_t type, uint32_t *addr);
+                           uint32_t dbgbase, uint8_t type, uint32_t *addr, 
int32_t *idx);
 
 struct target;
 
diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c
index 13b8ca5..004be3e 100644
--- a/src/target/cortex_a.c
+++ b/src/target/cortex_a.c
@@ -2387,12 +2387,13 @@ static int cortex_a8_examine_first(struct target 
*target)
                uint32_t dbgbase;
                /* Get ROM Table base */
                uint32_t apid;
+               int32_t coreidx = target->coreid;
                retval = dap_get_debugbase(swjdp, 1, &dbgbase, &apid);
                if (retval != ERROR_OK)
                        return retval;
                /* Lookup 0x15 -- Processor DAP */
                retval = dap_lookup_cs_component(swjdp, 1, dbgbase, 0x15,
-                               &armv7a->debug_base);
+                                                &armv7a->debug_base, &coreidx);
                if (retval != ERROR_OK)
                        return retval;
        } else

-- 

------------------------------------------------------------------------------
WatchGuard Dimension instantly turns raw network data into actionable 
security intelligence. It gives you real-time visual feedback on key
security issues and trends.  Skip the complicated setup - simply import
a virtual appliance and go from zero to informed in seconds.
http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk
_______________________________________________
OpenOCD-devel mailing list
OpenOCD-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to