tcl/target|board: add config Atheros ar2315
[fw/openocd] / src / rtos / rtos.c
index d09e110546e110a01d01d86e0890f6c4de93c2b5..528546eaa3473f6700a3c1e442257e628df4d674 100644 (file)
@@ -35,6 +35,7 @@ extern struct rtos_type eCos_rtos;
 extern struct rtos_type Linux_os;
 extern struct rtos_type ChibiOS_rtos;
 extern struct rtos_type embKernel_rtos;
+extern struct rtos_type mqx_rtos;
 
 static struct rtos_type *rtos_types[] = {
        &ThreadX_rtos,
@@ -43,6 +44,7 @@ static struct rtos_type *rtos_types[] = {
        &Linux_os,
        &ChibiOS_rtos,
        &embKernel_rtos,
+       &mqx_rtos,
        NULL
 };
 
@@ -303,7 +305,7 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                        if (detail->extra_info_str != NULL)
                                str_size += strlen(detail->extra_info_str);
 
-                       char *tmp_str = malloc(str_size + 7);
+                       char *tmp_str = calloc(str_size + 7, sizeof(char));
                        char *tmp_str_ptr = tmp_str;
 
                        if (detail->display_str != NULL)
@@ -404,8 +406,11 @@ int rtos_thread_packet(struct connection *connection, char const *packet, int pa
                return ERROR_OK;
        } else if (packet[0] == 'H') {  /* Set current thread ( 'c' for step and continue, 'g' for
                                         * all other operations ) */
-               if ((packet[1] == 'g') && (target->rtos != NULL))
+               if ((packet[1] == 'g') && (target->rtos != NULL)) {
                        sscanf(packet, "Hg%16" SCNx64, &target->rtos->current_threadid);
+                       LOG_DEBUG("RTOS: GDB requested to set current thread to 0x%" PRIx64 "\r\n",
+                                                                               target->rtos->current_threadid);
+               }
                gdb_put_packet(connection, "OK", 2);
                return ERROR_OK;
        }
@@ -422,6 +427,12 @@ int rtos_get_gdb_reg_list(struct connection *connection)
                        ((current_threadid != target->rtos->current_thread) ||
                        (target->smp))) {       /* in smp several current thread are possible */
                char *hex_reg_list;
+
+               LOG_DEBUG("RTOS: getting register list for thread 0x%" PRIx64
+                                 ", target->rtos->current_thread=0x%" PRIx64 "\r\n",
+                                                                               current_threadid,
+                                                                               target->rtos->current_thread);
+
                target->rtos->type->get_thread_reg_list(target->rtos,
                        current_threadid,
                        &hex_reg_list);
@@ -462,6 +473,8 @@ int rtos_generic_stack_read(struct target *target,
                LOG_ERROR("Error reading stack frame from thread");
                return retval;
        }
+       LOG_DEBUG("RTOS: Read stack frame at 0x%" PRIx32, address);
+
 #if 0
                LOG_OUTPUT("Stack Data :");
                for (i = 0; i < stacking->stack_registers_size; i++)
@@ -472,13 +485,12 @@ int rtos_generic_stack_read(struct target *target,
                list_size += stacking->register_offsets[i].width_bits/8;
        *hex_reg_list = malloc(list_size*2 + 1);
        tmp_str_ptr = *hex_reg_list;
-       new_stack_ptr = stack_ptr - stacking->stack_growth_direction *
-               stacking->stack_registers_size;
-       if (stacking->stack_alignment != 0) {
-               /* Align new stack pointer to x byte boundary */
-               new_stack_ptr =
-                       (new_stack_ptr & (~((int64_t) stacking->stack_alignment - 1))) +
-                       ((stacking->stack_growth_direction == -1) ? stacking->stack_alignment : 0);
+       if (stacking->calculate_process_stack != NULL) {
+               new_stack_ptr = stacking->calculate_process_stack(target,
+                               stack_data, stacking, stack_ptr);
+       } else {
+               new_stack_ptr = stack_ptr - stacking->stack_growth_direction *
+                       stacking->stack_registers_size;
        }
        for (i = 0; i < stacking->num_output_registers; i++) {
                int j;