This is an automated email from Gerrit.

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

-- gerrit

commit a0c6f5d1d440fbd157a0eae6447e577d6baffa3f
Author: Peter Mamonov <[email protected]>
Date:   Thu Aug 22 20:30:35 2019 +0300

    rtos/hwthread: get_thread_reg_list: fix endianness of registers values
    
    It was dicovered that registers values of secondary cores have wrong
    endianness when passed to GDB  in case of big endian target. Yet registers
    values of the primary core have correct endianness when passed to GDB. The
    difference is due to the fact that the registers values of the primary core
    are dumped by `gdb_str_to_target()` using target byte order, while
    `rtos_put_gdb_reg_list()` dumps secondary cores registers using host byte
    order. The patch fixes this behaviour by adding relevant endianness
    conversion to the `hwthread_get_thread_reg_list()` function.
    
    Change-Id: I3241450e485d61be28dac81f320fa96df7c53e62
    Signed-off-by: Peter Mamonov <[email protected]>

diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c
index 2d9e42f..80fef47 100644
--- a/src/rtos/hwthread.c
+++ b/src/rtos/hwthread.c
@@ -249,10 +249,34 @@ static int hwthread_get_thread_reg_list(struct rtos 
*rtos, int64_t thread_id,
        }
 
        for (int i = 0; i < *num_regs; i++) {
+               void *rtos_reg_val_p = (*rtos_reg_list)[i].value;
+
                (*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,
-                      ((*reg_list)[i].size + 7) / 8);
+               switch ((*reg_list)[i].size) {
+               case 64:
+                       target_buffer_get_u64_array(target,
+                               (*reg_list)[i].value, 1,
+                               rtos_reg_val_p);
+                       break;
+               case 32:
+                       target_buffer_get_u32_array(target,
+                               (*reg_list)[i].value, 1,
+                               rtos_reg_val_p);
+                       break;
+               case 16:
+                       target_buffer_get_u16_array(target,
+                               (*reg_list)[i].value, 1,
+                               rtos_reg_val_p);
+                       break;
+               case 8:
+                       memcpy((*rtos_reg_list)[i].value,
+                               (*reg_list)[i].value, 1);
+                       break;
+               default:
+                       free(reg_list);
+                       return ERROR_FAIL;
+               }
        }
 
        free(reg_list);

-- 


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

Reply via email to