Exemple #1
0
static int
fetch_context_init(struct Process *proc, struct fetch_context *context)
{
	context->greg = 2;
	context->freg = 0;
	return fetch_register_banks(proc, context);
}
struct fetch_context *
arch_fetch_arg_init(enum tof type, struct process *proc,
		    struct arg_type_info *ret_info)
{
	struct fetch_context *context = malloc(sizeof(*context));

	{
		struct process *mainp = proc;
		while (mainp->libraries == NULL && mainp->parent != NULL)
			mainp = mainp->parent;
		context->hardfp = mainp->libraries->arch.hardfp;
	}

	if (context == NULL
	    || fetch_register_banks(proc, context) < 0) {
		free(context);
		return NULL;
	}

	if (ret_info->type == ARGTYPE_STRUCT
	    || ret_info->type == ARGTYPE_ARRAY) {
		size_t sz = type_sizeof(proc, ret_info);
		assert(sz != (size_t)-1);
		if (sz > 4) {
			/* XXX double cast */
			context->ret_struct
				= (arch_addr_t)context->regs.uregs[0];
			context->ncrn++;
		}
	}

	return context;
}
int
arch_fetch_retval(struct fetch_context *ctx, enum tof type,
		  struct process *proc, struct arg_type_info *info,
		  struct value *valuep)
{
	if (fetch_register_banks(proc, ctx) < 0)
		return -1;

	if (ctx->hardfp && !ctx->in_varargs) {
		int rc;
		if ((rc = consider_vfp(ctx, proc, info, valuep)) != 1)
			return rc;
	}

	size_t sz = type_sizeof(proc, info);
	assert(sz != (size_t)-1);

	switch (info->type) {
		unsigned char *data;

	case ARGTYPE_VOID:
		return 0;

	case ARGTYPE_FLOAT:
	case ARGTYPE_DOUBLE:
		if (ctx->hardfp && !ctx->in_varargs) {
			unsigned char *data = value_reserve(valuep, sz);
			if (data == NULL)
				return -1;
			memmove(data, &ctx->fpregs, sz);
			return 0;
		}
		goto pass_in_registers;

	case ARGTYPE_ARRAY:
	case ARGTYPE_STRUCT:
		if (sz > 4) {
			value_in_inferior(valuep, ctx->ret_struct);
			return 0;
		}
		/* Fall through.  */

	case ARGTYPE_CHAR:
	case ARGTYPE_SHORT:
	case ARGTYPE_USHORT:
	case ARGTYPE_INT:
	case ARGTYPE_UINT:
	case ARGTYPE_LONG:
	case ARGTYPE_ULONG:
	case ARGTYPE_POINTER:
	pass_in_registers:
		if ((data = value_reserve(valuep, sz)) == NULL)
			return -1;
		memmove(data, ctx->regs.uregs, sz);
		return 0;
	}
	assert(info->type != info->type);
	abort();
}
static int
fetch_context_init(struct process *proc, struct fetch_context *context,
		   bool syscall_enter)
{
	context->greg = 2;
	context->freg = 0;
	return fetch_register_banks(proc, context, syscall_enter);
}