35 char *stacktemp = stack;
41 nfixedargs = ecif->
cif->nfixedargs;
42 arg = ecif->
cif->arg_types;
45 if (ecif->
cif->rtype->type == FFI_TYPE_STRUCT)
47 *(
void **) stack = ecif->
rvalue;
51 for(
i=0;
i<ecif->
cif->nargs;
i++)
55 if ((nfixedargs == 0) && (
count < 24))
58 stack = stacktemp + 24;
66 *(
void **)stack = *
argv;
70 *(
signed int *) stack = (
signed int)*(SINT8 *)(*
argv);
74 *(
unsigned int *) stack = (
unsigned int)*(UINT8 *)(*
argv);
78 *(
signed int *) stack = (
signed int)*(SINT16 *)(*
argv);
82 *(
unsigned int *) stack = (
unsigned int)*(UINT16 *)(*
argv);
88 case FFI_TYPE_POINTER:
89 *(
int *)stack = *(
int*)(*argv);
108 return stacktemp + ((
count>24)?24:0);
119 void ffi_call(ffi_cif *cif,
void (*fn)(
void),
void *rvalue,
void **avalue)
127 for(
i = 0,
arg = cif->arg_types,
size=0; i < cif->nargs;
i++,
arg++)
129 if ((*arg)->type == FFI_TYPE_STRUCT)
132 if ((*arg)->size <= 4)
139 if (cif->nargs != cif->nfixedargs)
142 if (cif->rtype->type == FFI_TYPE_STRUCT)
164 unsigned long r6,
unsigned long r7,
unsigned long r8)
166 register int *sp
__asm__ (
"r17");
167 register int *r13
__asm__ (
"r13");
169 ffi_closure* closure = (ffi_closure*) r13;
170 char *stack_args = sp;
173 unsigned register_args[6] =
174 {
r3, r4, r5, r6, r7, r8 };
177 void *struct_rvalue = (
void *)
r3;
179 ffi_cif *cif = closure->cif;
180 ffi_type **arg_types = cif->arg_types;
181 void **avalue =
alloca (cif->nargs *
sizeof(
void *));
182 char *
ptr = (
char *) register_args;
184 int nfixedargs = cif->nfixedargs;
189 if ((cif->rtype !=
NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
196 for (
i = 0;
i < cif->nargs;
i++)
200 if ((nfixedargs == 0) && (
count < 24))
207 switch (arg_types[
i]->
type)
214 case FFI_TYPE_SINT16:
215 case FFI_TYPE_UINT16:
219 case FFI_TYPE_SINT32:
220 case FFI_TYPE_UINT32:
222 case FFI_TYPE_POINTER:
226 case FFI_TYPE_STRUCT:
227 avalue[
i] = *(
void**)
ptr;
234 if (
ptr == ®ister_args[5])
251 if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT))
253 (closure->fun) (cif, struct_rvalue, avalue, closure->user_data);
257 (closure->fun) (cif, &rvalue, avalue, closure->user_data);
259 asm (
"l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : :
"r" (&rvalue));
267 void (*fun)(ffi_cif*,
void*,
void**,
void*),
271 unsigned short *tramp = (
unsigned short *) closure->tramp;
273 unsigned long cls = (
unsigned long) codeloc;
279 closure->user_data = user_data;
283 tramp[0] = (0x6 << 10) | (13 << 5);
284 tramp[1] = cls >> 16;
285 tramp[2] = (0x2a << 10) | (13 << 5) | 13;
286 tramp[3] = cls & 0xFFFF;
288 tramp[4] = (0x6 << 10) | (15 << 5);
290 tramp[6] = (0x2a << 10) | (15 << 5) | 15;
291 tramp[7] = fn & 0xFFFF;
293 tramp[8] = (0x11 << 10);
296 tramp[10] = (0x2a << 10) | (17 << 5) | 1;
308 if (cif->rtype->type == FFI_TYPE_STRUCT)
309 cif->flags = FFI_TYPE_STRUCT;
311 if (cif->rtype->size > 4)
312 cif->flags = FFI_TYPE_UINT64;
314 cif->nfixedargs = cif->nargs;
321 unsigned int nfixedargs,
unsigned int ntotalargs)
326 cif->nfixedargs = nfixedargs;