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); }