static int uCOS_III_get_thread_reg_list(struct rtos *rtos, threadid_t threadid, char **hex_reg_list) { struct uCOS_III_params *params = rtos->rtos_specific_params; int retval; /* find thread address for threadid */ symbol_address_t thread_address = 0; retval = uCOS_III_find_thread_address(rtos, threadid, &thread_address); if (retval != ERROR_OK) { LOG_ERROR("uCOS-III: failed to find thread address"); return retval; } /* read thread stack address */ symbol_address_t stack_address = 0; retval = target_read_memory(rtos->target, thread_address + params->thread_stack_offset, params->pointer_width, 1, (void *)&stack_address); if (retval != ERROR_OK) { LOG_ERROR("uCOS-III: failed to read stack address"); return retval; } return rtos_generic_stack_read(rtos->target, params->stacking_info, stack_address, hex_reg_list); }
static int embKernel_get_thread_reg_list(struct rtos *rtos, int64_t thread_id, char **hex_reg_list) { int retval; const struct embKernel_params *param; int64_t stack_ptr = 0; *hex_reg_list = NULL; if (rtos == NULL) return -1; if (thread_id == 0) return -2; if (rtos->rtos_specific_params == NULL) return -1; param = (const struct embKernel_params *) rtos->rtos_specific_params; /* Read the stack pointer */ retval = target_read_buffer(rtos->target, thread_id + param->thread_stack_offset, param->pointer_width, (uint8_t *) &stack_ptr); if (retval != ERROR_OK) { LOG_ERROR("Error reading stack frame from embKernel thread"); return retval; } return rtos_generic_stack_read(rtos->target, param->stacking_info, stack_ptr, hex_reg_list); }
/* * API function, get info of selected thread */ static int mqx_get_thread_reg_list( struct rtos *rtos, int64_t thread_id, char **hex_reg_list ) { int64_t stack_ptr = 0; uint32_t my_task_addr = 0; uint32_t task_queue_addr = 0; uint32_t task_queue_size = 0; uint32_t kernel_data_addr = 0; *hex_reg_list = NULL; if (thread_id == 0) { LOG_ERROR("MQX RTOS - invalid threadid: 0x%X", (int)thread_id); return ERROR_FAIL; } if (ERROR_OK != mqx_is_scheduler_running(rtos)) return ERROR_FAIL; /* get kernel_data symbol */ if (ERROR_OK != mqx_get_symbol( rtos, mqx_VAL_mqx_kernel_data, &kernel_data_addr )) { return ERROR_FAIL; } /* read kernel_data */ if (ERROR_OK != mqx_get_member( rtos, kernel_data_addr, 0, 4, "_mqx_kernel_data", &kernel_data_addr )) { return ERROR_FAIL; } /* get task queue address */ task_queue_addr = kernel_data_addr + MQX_KERNEL_OFFSET_TDLIST; /* get task queue size */ if (ERROR_OK != mqx_get_member( rtos, task_queue_addr, MQX_QUEUE_OFFSET_SIZE, 2, "kernel_data->TD_LIST.SIZE", &task_queue_size )) { return ERROR_FAIL; } /* search for taskid */ for ( uint32_t i = 0, taskpool_addr = task_queue_addr; i < (uint32_t)rtos->thread_count; i++ ) { uint32_t tmp_address = 0, task_addr = 0; uint32_t task_id = 0; /* set current taskpool address */ tmp_address = taskpool_addr; if (ERROR_OK != mqx_get_member( rtos, tmp_address, MQX_TASK_OFFSET_NEXT, 4, "td_struct_ptr->NEXT", &taskpool_addr )) { return ERROR_FAIL; } /* get task address from taskpool */ task_addr = taskpool_addr - MQX_TASK_OFFSET_TDLIST; /* get value of td_struct->TASK_ID */ if (ERROR_OK != mqx_get_member( rtos, task_addr, MQX_TASK_OFFSET_ID, 4, "td_struct_ptr->TASK_ID", &task_id )) { return ERROR_FAIL; } /* found taskid, break */ if (task_id == thread_id) { my_task_addr = task_addr; break; } } if (!my_task_addr) { LOG_ERROR("MQX_RTOS - threadid %" PRId64 " does not match any task", thread_id); return ERROR_FAIL; } /* get task stack head address */ if (ERROR_OK != mqx_get_member( rtos, my_task_addr, MQX_TASK_OFFSET_STACK, 4, "task->STACK_PTR", &stack_ptr )) { return ERROR_FAIL; } return rtos_generic_stack_read( rtos->target, ((struct mqx_params *)rtos->rtos_specific_params)->stacking_info, stack_ptr, hex_reg_list ); }