This is an automated email from Gerrit.

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

-- gerrit

commit 57aaeeb750e34abe9e21859bb03ae8bb79b84132
Author: Matthias Welwarsky <[email protected]>
Date:   Fri Feb 17 14:45:00 2017 +0100

    rtos: facilitate RTOS SMP handling
    
    The RTOS handlers present OS threads to gdb but the openocd
    target layer only knows about CPU cores (hardware threads).
    This patch allows closing this gap inside the RTOS handler.
    
    The default implementation just returns the current core, but
    a RTOS handler can provide its own function that associates a
    an OS thread with a core.
    
    Change-Id: I12cafe50b38a38b28057bc5d3a708aa20bf60515
    Signed-off-by: Matthias Welwarsky <[email protected]>

diff --git a/src/rtos/rtos.c b/src/rtos/rtos.c
index 84ee498..4552a87 100644
--- a/src/rtos/rtos.c
+++ b/src/rtos/rtos.c
@@ -57,6 +57,15 @@ int rtos_smp_init(struct target *target)
        return ERROR_TARGET_INIT_FAILED;
 }
 
+static int rtos_target_for_threadid(struct connection *connection, int64_t 
threadid, struct target **t)
+{
+       struct target *curr = get_target_from_connection(connection);
+       if (t)
+               *t = curr;
+
+       return ERROR_OK;
+}
+
 static int os_alloc(struct target *target, struct rtos_type *ostype)
 {
        struct rtos *os = target->rtos = calloc(1, sizeof(struct rtos));
@@ -72,6 +81,7 @@ static int os_alloc(struct target *target, struct rtos_type 
*ostype)
 
        /* RTOS drivers can override the packet handler in _create(). */
        os->gdb_thread_packet = rtos_thread_packet;
+       os->gdb_target_for_threadid = rtos_target_for_threadid;
 
        return JIM_OK;
 }
diff --git a/src/rtos/rtos.h b/src/rtos/rtos.h
index 70c1193..3dd376e 100644
--- a/src/rtos/rtos.h
+++ b/src/rtos/rtos.h
@@ -54,6 +54,7 @@ struct rtos {
        struct thread_detail *thread_details;
        int thread_count;
        int (*gdb_thread_packet)(struct connection *connection, char const 
*packet, int packet_size);
+       int (*gdb_target_for_threadid)(struct connection *connection, int64_t 
thread_id, struct target **p_target);
        void *rtos_specific_params;
 };
 
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 483e551..da44e1c 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -760,8 +760,12 @@ static void gdb_signal_reply(struct target *target, struct 
connection *connectio
 
                current_thread[0] = '\0';
                if (target->rtos != NULL) {
-                       snprintf(current_thread, sizeof(current_thread), 
"thread:%016" PRIx64 ";", target->rtos->current_thread);
+                       struct target *ct;
+                       snprintf(current_thread, sizeof(current_thread), 
"thread:%016" PRIx64 ";",
+                                       target->rtos->current_thread);
                        target->rtos->current_threadid = 
target->rtos->current_thread;
+                       target->rtos->gdb_target_for_threadid(connection, 
target->rtos->current_threadid, &ct);
+                       signal_var = gdb_last_signal(ct);
                }
 
                sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), 
"T%2.2x%s%s",
@@ -2998,7 +3002,10 @@ static int gdb_input_inner(struct connection *connection)
 
                if (gdb_con->ctrl_c) {
                        if (target->state == TARGET_RUNNING) {
-                               retval = target_halt(target);
+                               struct target *t = target;
+                               if (target->rtos)
+                                       
target->rtos->gdb_target_for_threadid(connection, 
target->rtos->current_threadid, &t);
+                               retval = target_halt(t);
                                if (retval != ERROR_OK)
                                        target_call_event_callbacks(target, 
TARGET_EVENT_GDB_HALT);
                                gdb_con->ctrl_c = 0;

-- 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to