31 unsigned int,
unsigned int,
unsigned int*,
void (*fn)(
void),
32 unsigned int,
unsigned int);
36 #define WORD_SIZE sizeof(unsigned int)
37 #define ARGS_REGISTER_SIZE (WORD_SIZE * 6)
38 #define WORD_ALIGN(x) ALIGN(x, WORD_SIZE)
47 void* stack_args_p = stack;
55 if ((ecif->
cif->rtype !=
NULL) &&
56 (ecif->
cif->rtype->type == FFI_TYPE_STRUCT))
61 char* addr = stack_args_p;
70 for (
i = 0, p_arg = ecif->
cif->arg_types; i < ecif->cif->nargs;
73 size_t size = (*p_arg)->size;
74 int type = (*p_arg)->type;
75 void* value = p_argv[
i];
76 char* addr = stack_args_p;
80 stack_args_p += aligned_size;
85 *(
unsigned int *)addr = (
unsigned int)*(UINT8*)(value);
88 *(
signed int *)addr = (
signed int)*(SINT8*)(value);
91 *(
unsigned int *)addr = (
unsigned int)*(UINT16*)(value);
94 *(
signed int *)addr = (
signed int)*(SINT16*)(value);
126 case FFI_TYPE_SINT32:
127 case FFI_TYPE_UINT32:
129 case FFI_TYPE_SINT64:
130 case FFI_TYPE_UINT64:
131 case FFI_TYPE_DOUBLE:
133 memcpy(addr, value, aligned_size);
151 void ffi_call(ffi_cif* cif,
void (*fn)(
void),
void* rvalue,
void** avalue)
159 if ((rvalue ==
NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
169 ecif.
rvalue, fn, cif->rtype->type, cif->rtype->size);
178 ffi_closure* closure,
void* rvalue,
179 unsigned int* rtype,
unsigned int* rsize)
182 ffi_cif* cif = closure->cif;
183 ffi_type** arg_types = cif->arg_types;
190 char* stackclone =
alloca(cif->bytes);
191 void** avalue =
alloca(cif->nargs *
sizeof(
void*));
192 void* struct_rvalue =
NULL;
193 char*
ptr = stackclone;
197 int registers_used = cif->bytes;
201 memcpy(stackclone, register_args, registers_used);
210 if ((cif->rtype !=
NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) {
211 struct_rvalue = *((
void**)
ptr);
216 for (
i = 0;
i < cif->nargs;
i++)
218 switch (arg_types[
i]->
type)
222 #ifdef __BIG_ENDIAN__
228 case FFI_TYPE_SINT16:
229 case FFI_TYPE_UINT16:
230 #ifdef __BIG_ENDIAN__
236 case FFI_TYPE_STRUCT:
247 avalue[
i] = (
void*)
ptr;
249 case FFI_TYPE_UINT64:
250 case FFI_TYPE_SINT64:
251 case FFI_TYPE_DOUBLE:
254 case FFI_TYPE_SINT32:
255 case FFI_TYPE_UINT32:
266 *rsize = cif->rtype->size;
267 *rtype = cif->rtype->type;
268 if (struct_rvalue !=
NULL) {
269 closure->fun(cif, struct_rvalue, avalue, closure->user_data);
271 *((
void**)rvalue) = struct_rvalue;
273 closure->fun(cif, rvalue, avalue, closure->user_data);
278 ffi_closure* closure, ffi_cif* cif,
279 void (*fun)(ffi_cif*,
void*,
void**,
void*),
280 void* user_data,
void* codeloc)
282 unsigned long* tramp = (
unsigned long*)&(closure->tramp[0]);
283 unsigned long cls = (
unsigned long)codeloc;
284 unsigned long fn = 0;
289 closure->user_data = user_data;
298 tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff);
300 tramp[1] = 0x31600000 | (fn & 0xffff);
304 tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff);
306 tramp[3] = 0x31800000 | (cls & 0xffff);
310 tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff);
312 tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff);
314 tramp[6] = 0x98085800;