rtos : smp support
authorMichel JAOUEN <michel.jaouen@stericsson.com>
Tue, 3 Jan 2012 15:12:50 +0000 (16:12 +0100)
committerØyvind Harboe <oyvindharboe@gmail.com>
Sun, 15 Jan 2012 22:11:48 +0000 (22:11 +0000)
Change-Id: I583cddf5e62ed77f108786a085569ab8699ad50d
Signed-off-by: Michel JAOUEN <michel.jaouen@stericsson.com>
Reviewed-on: http://openocd.zylin.com/344
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
src/server/gdb_server.c
src/target/target.c

index 78a7e9d2ff6f5e0345e8a53ab9b634f1f8f5a782..815025704df1168d6880027c185a628f5ea3f01b 100644 (file)
@@ -49,6 +49,13 @@ static struct rtos_type *rtos_types[] =
 
 int rtos_thread_packet(struct connection *connection, char *packet, int packet_size);
 
+int rtos_smp_init(struct target *target)
+{
+       if (target->rtos->type->smp_init)
+               return target->rtos->type->smp_init(target);
+       return ERROR_TARGET_INIT_FAILED;
+}
+
 
 int rtos_create(Jim_GetOptInfo *goi, struct target * target)
 {
@@ -437,10 +444,11 @@ int rtos_get_gdb_reg_list(struct connection *connection)
 {
        struct target *target = get_target_from_connection(connection);
        int64_t current_threadid = target->rtos->current_threadid;
-       if ( ( target->rtos != NULL ) &&
-                ( current_threadid != -1 ) &&
-                ( current_threadid != 0 ) &&
-                ( current_threadid != target->rtos->current_thread ) )
+       if ((target->rtos != NULL) &&
+                (current_threadid != -1) &&
+                (current_threadid != 0) &&
+                ((current_threadid != target->rtos->current_thread) ||
+                (target->smp))) /* in smp several current thread are possible */
        {
                char * hex_reg_list;
                target->rtos->type->get_thread_reg_list( target->rtos, current_threadid, &hex_reg_list );
index df0812fc6c1d67332a0271ce1a5187ef16b4bb99..890a99e0e0a8b4a656feeb41b122eae83f80950f 100644 (file)
@@ -75,9 +75,11 @@ struct rtos_type
        char * name;
        int (*detect_rtos)                 ( struct target* target );
        int (*create)                      ( struct target* target );
+       int (*smp_init)(struct target *target);
        int (*update_threads)              ( struct rtos*   rtos );
        int (*get_thread_reg_list)         ( struct rtos *rtos, int64_t thread_id, char ** hex_reg_list );
        int (*get_symbol_list_to_lookup)   (symbol_table_elem_t * symbol_list[] );
+       int (*clean)(struct target *target);
 };
 
 
@@ -105,5 +107,6 @@ int rtos_try_next( struct target * target );
 int gdb_thread_packet(struct connection *connection, char *packet, int packet_size);
 int rtos_get_gdb_reg_list(struct connection *connection);
 int rtos_update_threads( struct target *target );
+int rtos_smp_init(struct target *target);
 
 #endif // RTOS_H
index 70915556817cae9ddd4cfcbad3adcab8d10abe36..8d84a991f2ee4058fff367c9eebe460c496fb86e 100644 (file)
@@ -836,6 +836,11 @@ static int gdb_new_connection(struct connection *connection)
        breakpoint_clear_target(gdb_service->target);
        watchpoint_clear_target(gdb_service->target);
 
+       /* clean previous rtos session if supported*/
+       if ((gdb_service->target->rtos) &&
+                       (gdb_service->target->rtos->type->clean))
+               gdb_service->target->rtos->type->clean(gdb_service->target);
+
        /* remove the initial ACK from the incoming buffer */
        if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK)
                return retval;
@@ -869,9 +874,9 @@ static int gdb_new_connection(struct connection *connection)
 
        gdb_actual_connections++;
        LOG_DEBUG("New GDB Connection: %d, Target %s, state: %s",
-                 gdb_actual_connections,
-                 target_name(gdb_service->target),
-                 target_state_name(gdb_service->target));
+                       gdb_actual_connections,
+                       target_name(gdb_service->target),
+                       target_state_name(gdb_service->target));
 
        /* DANGER! If we fail subsequently, we must remove this handler,
         * otherwise we occasionally see crashes as the timer can invoke the
@@ -2256,6 +2261,7 @@ static int gdb_input_inner(struct connection *connection)
                                case 'c':
                                case 's':
                                        {
+                                               gdb_thread_packet(connection, packet, packet_size);
                                                log_add_callback(gdb_log_callback, connection);
 
                                                if (gdb_con->mem_write_error)
index c3d65e33bdf7eea988d692720e3420d7a0c30ac2..e53d6f844668cd6cf4ba52e3688ea782ad51dfa0 100644 (file)
@@ -5119,11 +5119,12 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        int i;
        const char *targetname;
        int retval,len;
-       struct target *target;
-       struct target_list *head, *curr;
-    curr = (struct target_list*) NULL;
-       head = (struct target_list*) NULL;
-       
+       struct target *target = (struct target *) NULL;
+       struct target_list *head, *curr, *new;
+       curr = (struct target_list *) NULL;
+       head = (struct target_list *) NULL;
+       new = (struct target_list *) NULL;
+
        retval = 0;
        LOG_DEBUG("%d",argc);
        /* argv[1] = target to associate in smp
@@ -5139,7 +5140,6 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
                LOG_DEBUG("%s ",targetname);
                if (target)
                {
-                       struct target_list *new;
                        new=malloc(sizeof(struct target_list));
                        new->target = target;
                        new->next = (struct target_list*)NULL;
@@ -5160,11 +5160,13 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
     while(curr!=(struct target_list *)NULL)
        {
-    target=curr->target;
-       target->smp = 1;
-       target->head = head;
-       curr=curr->next;
+               target = curr->target;
+               target->smp = 1;
+               target->head = head;
+               curr = curr->next;
        }
+       if (target->rtos)
+               retval = rtos_smp_init(head->target);
        return retval;
 }