rtos :introduce possible overload by rtos of gdb_thread_packet
authorMichel JAOUEN <michel.jaouen@stericsson.com>
Tue, 3 Jan 2012 14:41:53 +0000 (15:41 +0100)
committerØyvind Harboe <oyvindharboe@gmail.com>
Sun, 15 Jan 2012 22:08:42 +0000 (22:08 +0000)
Change-Id: I17381b581556fa75098a84699dbbf69423fe20eb
Signed-off-by: Michel JAOUEN <michel.jaouen@stericsson.com>
Reviewed-on: http://openocd.zylin.com/342
Tested-by: jenkins
Reviewed-by: Evan Hunter <evan@ozhiker.com>
Reviewed-by: Øyvind Harboe <oyvindharboe@gmail.com>
src/rtos/rtos.c
src/rtos/rtos.h

index 8a5db11c07fc96213d8c9081d1f92e611ea6f7f1..f7d948660ca768d57c1b0af45057fe1d934c9c15 100644 (file)
@@ -48,6 +48,8 @@ static struct rtos_type *rtos_types[] =
        NULL
 };
 
+int rtos_thread_packet(struct connection *connection, char *packet, int packet_size);
+
 
 int rtos_create(Jim_GetOptInfo *goi, struct target * target)
 {
@@ -116,6 +118,8 @@ int rtos_create(Jim_GetOptInfo *goi, struct target * target)
        target->rtos->current_thread = 0;
        target->rtos->symbols = NULL;
        target->rtos->target = target;
+       /* put default thread handler in linux usecase it is overloaded*/
+       target->rtos->gdb_thread_packet = rtos_thread_packet;
 
        if ( 0 != strcmp( cp, "auto") )
        {
@@ -125,10 +129,18 @@ int rtos_create(Jim_GetOptInfo *goi, struct target * target)
        return JIM_OK;
 }
 
+int gdb_thread_packet(struct connection *connection, char *packet, int packet_size)
+{
+       struct target *target = get_target_from_connection(connection);
+       if (target->rtos == NULL)
+               return rtos_thread_packet(connection, packet, packet_size); /* thread not found*/
+       return target->rtos->gdb_thread_packet(connection, packet, packet_size);
+}
 
 
 
-int gdb_thread_packet(struct connection *connection, char *packet, int packet_size)
+
+int rtos_thread_packet(struct connection *connection, char *packet, int packet_size)
 {
        struct target *target = get_target_from_connection(connection);
 
@@ -413,10 +425,8 @@ int gdb_thread_packet(struct connection *connection, char *packet, int packet_si
        }
        else if ( packet[0] == 'H') // Set current thread ( 'c' for step and continue, 'g' for all other operations )
        {
-               if (packet[1] == 'g')
-               {
+               if ((packet[1] == 'g') && (target->rtos != NULL))
                        sscanf(packet, "Hg%16" SCNx64, &current_threadid);
-               }
                gdb_put_packet(connection, "OK", 2);
                return ERROR_OK;
        }
index 4f190e9329dd1fbd0e3622bea4ae145915847a0b..93a980e239e46d2c25254cb9b54739e7d23effe8 100644 (file)
@@ -61,9 +61,10 @@ struct rtos
        threadid_t current_thread;
        struct thread_detail* thread_details;
        int thread_count;
-
+       int (*gdb_thread_packet)(struct connection *connection, char *packet, int packet_size);
        void * rtos_specific_params;
 
+
 };