Commit ebac7c96 authored by Michel JAOUEN's avatar Michel JAOUEN Committed by Øyvind Harboe
Browse files

rtos : smp support



Change-Id: I583cddf5e62ed77f108786a085569ab8699ad50d
Signed-off-by: default avatarMichel JAOUEN <michel.jaouen@stericsson.com>
Reviewed-on: http://openocd.zylin.com/344


Tested-by: jenkins
Reviewed-by: default avatarEvan Hunter <evan@ozhiker.com>
Reviewed-by: default avatarØyvind Harboe <oyvindharboe@gmail.com>
parent ff3028ce
...@@ -49,6 +49,13 @@ static struct rtos_type *rtos_types[] = ...@@ -49,6 +49,13 @@ static struct rtos_type *rtos_types[] =
int rtos_thread_packet(struct connection *connection, char *packet, int packet_size); 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) int rtos_create(Jim_GetOptInfo *goi, struct target * target)
{ {
...@@ -437,10 +444,11 @@ int rtos_get_gdb_reg_list(struct connection *connection) ...@@ -437,10 +444,11 @@ int rtos_get_gdb_reg_list(struct connection *connection)
{ {
struct target *target = get_target_from_connection(connection); struct target *target = get_target_from_connection(connection);
int64_t current_threadid = target->rtos->current_threadid; int64_t current_threadid = target->rtos->current_threadid;
if ( ( target->rtos != NULL ) && if ((target->rtos != NULL) &&
( current_threadid != -1 ) && (current_threadid != -1) &&
( current_threadid != 0 ) && (current_threadid != 0) &&
( current_threadid != target->rtos->current_thread ) ) ((current_threadid != target->rtos->current_thread) ||
(target->smp))) /* in smp several current thread are possible */
{ {
char * hex_reg_list; char * hex_reg_list;
target->rtos->type->get_thread_reg_list( target->rtos, current_threadid, &hex_reg_list ); target->rtos->type->get_thread_reg_list( target->rtos, current_threadid, &hex_reg_list );
......
...@@ -75,9 +75,11 @@ struct rtos_type ...@@ -75,9 +75,11 @@ struct rtos_type
char * name; char * name;
int (*detect_rtos) ( struct target* target ); int (*detect_rtos) ( struct target* target );
int (*create) ( struct target* target ); int (*create) ( struct target* target );
int (*smp_init)(struct target *target);
int (*update_threads) ( struct rtos* rtos ); int (*update_threads) ( struct rtos* rtos );
int (*get_thread_reg_list) ( struct rtos *rtos, int64_t thread_id, char ** hex_reg_list ); 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 (*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 ); ...@@ -105,5 +107,6 @@ int rtos_try_next( struct target * target );
int gdb_thread_packet(struct connection *connection, char *packet, int packet_size); int gdb_thread_packet(struct connection *connection, char *packet, int packet_size);
int rtos_get_gdb_reg_list(struct connection *connection); int rtos_get_gdb_reg_list(struct connection *connection);
int rtos_update_threads( struct target *target ); int rtos_update_threads( struct target *target );
int rtos_smp_init(struct target *target);
#endif // RTOS_H #endif // RTOS_H
...@@ -836,6 +836,11 @@ static int gdb_new_connection(struct connection *connection) ...@@ -836,6 +836,11 @@ static int gdb_new_connection(struct connection *connection)
breakpoint_clear_target(gdb_service->target); breakpoint_clear_target(gdb_service->target);
watchpoint_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 */ /* remove the initial ACK from the incoming buffer */
if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK) if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK)
return retval; return retval;
...@@ -869,9 +874,9 @@ static int gdb_new_connection(struct connection *connection) ...@@ -869,9 +874,9 @@ static int gdb_new_connection(struct connection *connection)
gdb_actual_connections++; gdb_actual_connections++;
LOG_DEBUG("New GDB Connection: %d, Target %s, state: %s", LOG_DEBUG("New GDB Connection: %d, Target %s, state: %s",
gdb_actual_connections, gdb_actual_connections,
target_name(gdb_service->target), target_name(gdb_service->target),
target_state_name(gdb_service->target)); target_state_name(gdb_service->target));
/* DANGER! If we fail subsequently, we must remove this handler, /* DANGER! If we fail subsequently, we must remove this handler,
* otherwise we occasionally see crashes as the timer can invoke the * otherwise we occasionally see crashes as the timer can invoke the
...@@ -2256,6 +2261,7 @@ static int gdb_input_inner(struct connection *connection) ...@@ -2256,6 +2261,7 @@ static int gdb_input_inner(struct connection *connection)
case 'c': case 'c':
case 's': case 's':
{ {
gdb_thread_packet(connection, packet, packet_size);
log_add_callback(gdb_log_callback, connection); log_add_callback(gdb_log_callback, connection);
if (gdb_con->mem_write_error) if (gdb_con->mem_write_error)
......
...@@ -5119,11 +5119,12 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv) ...@@ -5119,11 +5119,12 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
int i; int i;
const char *targetname; const char *targetname;
int retval,len; int retval,len;
struct target *target; struct target *target = (struct target *) NULL;
struct target_list *head, *curr; struct target_list *head, *curr, *new;
curr = (struct target_list*) NULL; curr = (struct target_list *) NULL;
head = (struct target_list*) NULL; head = (struct target_list *) NULL;
new = (struct target_list *) NULL;
retval = 0; retval = 0;
LOG_DEBUG("%d",argc); LOG_DEBUG("%d",argc);
/* argv[1] = target to associate in smp /* 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) ...@@ -5139,7 +5140,6 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
LOG_DEBUG("%s ",targetname); LOG_DEBUG("%s ",targetname);
if (target) if (target)
{ {
struct target_list *new;
new=malloc(sizeof(struct target_list)); new=malloc(sizeof(struct target_list));
new->target = target; new->target = target;
new->next = (struct target_list*)NULL; new->next = (struct target_list*)NULL;
...@@ -5160,11 +5160,13 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv) ...@@ -5160,11 +5160,13 @@ static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
while(curr!=(struct target_list *)NULL) while(curr!=(struct target_list *)NULL)
{ {
target=curr->target; target = curr->target;
target->smp = 1; target->smp = 1;
target->head = head; target->head = head;
curr=curr->next; curr = curr->next;
} }
if (target->rtos)
retval = rtos_smp_init(head->target);
return retval; return retval;
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment