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)
{
{
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 );
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);
};
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
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;
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
case 'c':
case 's':
{
+ gdb_thread_packet(connection, packet, packet_size);
log_add_callback(gdb_log_callback, connection);
if (gdb_con->mem_write_error)
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
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;
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;
}