This is an automated email from Gerrit.

Antonio Borneo ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/5981

-- gerrit

commit d09cc1bd75cf8bed534c66c212adb7bc7182045c
Author: Antonio Borneo <[email protected]>
Date:   Sat Dec 19 15:44:41 2020 +0100

    rtos/hwthread: fix register list for armv7a
    
    The targets armv7a in file cortex_a.c inherit the register list
    from file armv4_5.c thus, depending on the core status, some
    register get marked as not existing.
    For HW threads other than current target, the registers in the
    list are not checked for existence and are all forwarded to GDB
    that in turns complains for too many data:
          Remote 'g' packet reply is too long (expected 68 bytes, got 104 bytes)
    
    Check all the attributes of the registers and pass to GDB only the
    valid registers.
    
    To test it, use a SMP cortex-a target (2 cores are enough) and add
        -rtos hwthread
    to all the cores. Connect GDB to OpenOCD and issue the GDB command
        info threads
    
    Change-Id: Ie66119fe83a3c8d53e9d18dda39e60fd97769669
    Signed-off-by: Antonio Borneo <[email protected]>

diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c
index 850b932..e2d1ccf 100644
--- a/src/rtos/hwthread.c
+++ b/src/rtos/hwthread.c
@@ -237,23 +237,35 @@ static int hwthread_get_thread_reg_list(struct rtos 
*rtos, int64_t thread_id,
        if (!target_was_examined(curr))
                return ERROR_FAIL;
 
+       int reg_list_size;
        struct reg **reg_list;
-       int retval = target_get_gdb_reg_list(curr, &reg_list, 
rtos_reg_list_size,
+       int retval = target_get_gdb_reg_list(curr, &reg_list, &reg_list_size,
                        REG_CLASS_GENERAL);
        if (retval != ERROR_OK)
                return retval;
 
+       int j = 0;
+       for (int i = 0; i < reg_list_size; i++) {
+               if (reg_list[i] == NULL || reg_list[i]->exist == false || 
reg_list[i]->hidden)
+                       continue;
+               j++;
+       }
+       *rtos_reg_list_size = j;
        *rtos_reg_list = calloc(*rtos_reg_list_size, sizeof(struct rtos_reg));
        if (*rtos_reg_list == NULL) {
                free(reg_list);
                return ERROR_FAIL;
        }
 
-       for (int i = 0; i < *rtos_reg_list_size; i++) {
-               (*rtos_reg_list)[i].number = (*reg_list)[i].number;
-               (*rtos_reg_list)[i].size = (*reg_list)[i].size;
-               memcpy((*rtos_reg_list)[i].value, (*reg_list)[i].value,
+       j = 0;
+       for (int i = 0; i < reg_list_size; i++) {
+               if (reg_list[i] == NULL || reg_list[i]->exist == false || 
reg_list[i]->hidden)
+                       continue;
+               (*rtos_reg_list)[j].number = (*reg_list)[i].number;
+               (*rtos_reg_list)[j].size = (*reg_list)[i].size;
+               memcpy((*rtos_reg_list)[j].value, (*reg_list)[i].value,
                                ((*reg_list)[i].size + 7) / 8);
+               j++;
        }
        free(reg_list);
 

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to