rtos :introduce possible overload by rtos of gdb_thread_packet

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>
__archive__
Michel JAOUEN 2012-01-03 15:41:53 +01:00 committed by Øyvind Harboe
parent ca173ff4d4
commit 1db60b9c43
2 changed files with 18 additions and 7 deletions

View File

@ -48,6 +48,8 @@ static struct rtos_type *rtos_types[] =
NULL NULL
}; };
int rtos_thread_packet(struct connection *connection, char *packet, int packet_size);
int rtos_create(Jim_GetOptInfo *goi, struct target * target) 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->current_thread = 0;
target->rtos->symbols = NULL; target->rtos->symbols = NULL;
target->rtos->target = target; 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") ) if ( 0 != strcmp( cp, "auto") )
{ {
@ -125,10 +129,18 @@ int rtos_create(Jim_GetOptInfo *goi, struct target * target)
return JIM_OK; return JIM_OK;
} }
int gdb_thread_packet(struct connection *connection, char *packet, int packet_size) 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 rtos_thread_packet(struct connection *connection, char *packet, int packet_size)
{ {
struct target *target = get_target_from_connection(connection); 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 ) 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); sscanf(packet, "Hg%16" SCNx64, &current_threadid);
}
gdb_put_packet(connection, "OK", 2); gdb_put_packet(connection, "OK", 2);
return ERROR_OK; return ERROR_OK;
} }

View File

@ -61,9 +61,10 @@ struct rtos
threadid_t current_thread; threadid_t current_thread;
struct thread_detail* thread_details; struct thread_detail* thread_details;
int thread_count; int thread_count;
int (*gdb_thread_packet)(struct connection *connection, char *packet, int packet_size);
void * rtos_specific_params; void * rtos_specific_params;
}; };