コード例 #1
0
ファイル: uCOS-III.c プロジェクト: IoTToolchain/OpenOCD
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);
}
コード例 #2
0
ファイル: embKernel.c プロジェクト: kriezwoek/openocd-mips64
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);
}
コード例 #3
0
ファイル: mqx.c プロジェクト: ChenXuJasper/openocd
/*
 * 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
	);
}