ยปCore Development>Code coverage>Modules/_ctypes/libffi/src/powerpc/ffi_sysv.c

Python code coverage for Modules/_ctypes/libffi/src/powerpc/ffi_sysv.c

#countcontent
1n/a/* -----------------------------------------------------------------------
2n/a ffi_sysv.c - Copyright (C) 2013 IBM
3n/a Copyright (C) 2011 Anthony Green
4n/a Copyright (C) 2011 Kyle Moffett
5n/a Copyright (C) 2008 Red Hat, Inc
6n/a Copyright (C) 2007, 2008 Free Software Foundation, Inc
7n/a Copyright (c) 1998 Geoffrey Keating
8n/a
9n/a PowerPC Foreign Function Interface
10n/a
11n/a Permission is hereby granted, free of charge, to any person obtaining
12n/a a copy of this software and associated documentation files (the
13n/a ``Software''), to deal in the Software without restriction, including
14n/a without limitation the rights to use, copy, modify, merge, publish,
15n/a distribute, sublicense, and/or sell copies of the Software, and to
16n/a permit persons to whom the Software is furnished to do so, subject to
17n/a the following conditions:
18n/a
19n/a The above copyright notice and this permission notice shall be included
20n/a in all copies or substantial portions of the Software.
21n/a
22n/a THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
23n/a OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24n/a MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25n/a IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
26n/a OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27n/a ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
28n/a OTHER DEALINGS IN THE SOFTWARE.
29n/a ----------------------------------------------------------------------- */
30n/a
31n/a#include "ffi.h"
32n/a
33n/a#ifndef POWERPC64
34n/a#include "ffi_common.h"
35n/a#include "ffi_powerpc.h"
36n/a
37n/a
38n/a/* About the SYSV ABI. */
39n/a#define ASM_NEEDS_REGISTERS 4
40n/a#define NUM_GPR_ARG_REGISTERS 8
41n/a#define NUM_FPR_ARG_REGISTERS 8
42n/a
43n/a
44n/a#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
45n/a/* Adjust size of ffi_type_longdouble. */
46n/avoid FFI_HIDDEN
47n/affi_prep_types_sysv (ffi_abi abi)
48n/a{
49n/a if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV)
50n/a {
51n/a ffi_type_longdouble.size = 8;
52n/a ffi_type_longdouble.alignment = 8;
53n/a }
54n/a else
55n/a {
56n/a ffi_type_longdouble.size = 16;
57n/a ffi_type_longdouble.alignment = 16;
58n/a }
59n/a}
60n/a#endif
61n/a
62n/a/* Transform long double, double and float to other types as per abi. */
63n/astatic int
64n/atranslate_float (int abi, int type)
65n/a{
66n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
67n/a if (type == FFI_TYPE_LONGDOUBLE
68n/a && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0)
69n/a type = FFI_TYPE_DOUBLE;
70n/a#endif
71n/a if ((abi & FFI_SYSV_SOFT_FLOAT) != 0)
72n/a {
73n/a if (type == FFI_TYPE_FLOAT)
74n/a type = FFI_TYPE_UINT32;
75n/a else if (type == FFI_TYPE_DOUBLE)
76n/a type = FFI_TYPE_UINT64;
77n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
78n/a else if (type == FFI_TYPE_LONGDOUBLE)
79n/a type = FFI_TYPE_UINT128;
80n/a }
81n/a else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0)
82n/a {
83n/a if (type == FFI_TYPE_LONGDOUBLE)
84n/a type = FFI_TYPE_STRUCT;
85n/a#endif
86n/a }
87n/a return type;
88n/a}
89n/a
90n/a/* Perform machine dependent cif processing */
91n/astatic ffi_status
92n/affi_prep_cif_sysv_core (ffi_cif *cif)
93n/a{
94n/a ffi_type **ptr;
95n/a unsigned bytes;
96n/a unsigned i, fparg_count = 0, intarg_count = 0;
97n/a unsigned flags = cif->flags;
98n/a unsigned struct_copy_size = 0;
99n/a unsigned type = cif->rtype->type;
100n/a unsigned size = cif->rtype->size;
101n/a
102n/a /* The machine-independent calculation of cif->bytes doesn't work
103n/a for us. Redo the calculation. */
104n/a
105n/a /* Space for the frame pointer, callee's LR, and the asm's temp regs. */
106n/a bytes = (2 + ASM_NEEDS_REGISTERS) * sizeof (int);
107n/a
108n/a /* Space for the GPR registers. */
109n/a bytes += NUM_GPR_ARG_REGISTERS * sizeof (int);
110n/a
111n/a /* Return value handling. The rules for SYSV are as follows:
112n/a - 32-bit (or less) integer values are returned in gpr3;
113n/a - Structures of size <= 4 bytes also returned in gpr3;
114n/a - 64-bit integer values and structures between 5 and 8 bytes are returned
115n/a in gpr3 and gpr4;
116n/a - Larger structures are allocated space and a pointer is passed as
117n/a the first argument.
118n/a - Single/double FP values are returned in fpr1;
119n/a - long doubles (if not equivalent to double) are returned in
120n/a fpr1,fpr2 for Linux and as for large structs for SysV. */
121n/a
122n/a type = translate_float (cif->abi, type);
123n/a
124n/a switch (type)
125n/a {
126n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
127n/a case FFI_TYPE_LONGDOUBLE:
128n/a flags |= FLAG_RETURNS_128BITS;
129n/a /* Fall through. */
130n/a#endif
131n/a case FFI_TYPE_DOUBLE:
132n/a flags |= FLAG_RETURNS_64BITS;
133n/a /* Fall through. */
134n/a case FFI_TYPE_FLOAT:
135n/a flags |= FLAG_RETURNS_FP;
136n/a#ifdef __NO_FPRS__
137n/a return FFI_BAD_ABI;
138n/a#endif
139n/a break;
140n/a
141n/a case FFI_TYPE_UINT128:
142n/a flags |= FLAG_RETURNS_128BITS;
143n/a /* Fall through. */
144n/a case FFI_TYPE_UINT64:
145n/a case FFI_TYPE_SINT64:
146n/a flags |= FLAG_RETURNS_64BITS;
147n/a break;
148n/a
149n/a case FFI_TYPE_STRUCT:
150n/a /* The final SYSV ABI says that structures smaller or equal 8 bytes
151n/a are returned in r3/r4. A draft ABI used by linux instead
152n/a returns them in memory. */
153n/a if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)
154n/a {
155n/a flags |= FLAG_RETURNS_SMST;
156n/a break;
157n/a }
158n/a intarg_count++;
159n/a flags |= FLAG_RETVAL_REFERENCE;
160n/a /* Fall through. */
161n/a case FFI_TYPE_VOID:
162n/a flags |= FLAG_RETURNS_NOTHING;
163n/a break;
164n/a
165n/a default:
166n/a /* Returns 32-bit integer, or similar. Nothing to do here. */
167n/a break;
168n/a }
169n/a
170n/a /* The first NUM_GPR_ARG_REGISTERS words of integer arguments, and the
171n/a first NUM_FPR_ARG_REGISTERS fp arguments, go in registers; the rest
172n/a goes on the stack. Structures and long doubles (if not equivalent
173n/a to double) are passed as a pointer to a copy of the structure.
174n/a Stuff on the stack needs to keep proper alignment. */
175n/a for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
176n/a {
177n/a unsigned short typenum = (*ptr)->type;
178n/a
179n/a typenum = translate_float (cif->abi, typenum);
180n/a
181n/a switch (typenum)
182n/a {
183n/a#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
184n/a case FFI_TYPE_LONGDOUBLE:
185n/a fparg_count++;
186n/a /* Fall thru */
187n/a#endif
188n/a case FFI_TYPE_DOUBLE:
189n/a fparg_count++;
190n/a /* If this FP arg is going on the stack, it must be
191n/a 8-byte-aligned. */
192n/a if (fparg_count > NUM_FPR_ARG_REGISTERS
193n/a && intarg_count >= NUM_GPR_ARG_REGISTERS
194n/a && intarg_count % 2 != 0)
195n/a intarg_count++;
196n/a#ifdef __NO_FPRS__
197n/a return FFI_BAD_ABI;
198n/a#endif
199n/a break;
200n/a
201n/a case FFI_TYPE_FLOAT:
202n/a fparg_count++;
203n/a#ifdef __NO_FPRS__
204n/a return FFI_BAD_ABI;
205n/a#endif
206n/a break;
207n/a
208n/a case FFI_TYPE_UINT128:
209n/a /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set
210n/a of four consecutive gprs. If we do not have enough, we
211n/a have to adjust the intarg_count value. */
212n/a if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3
213n/a && intarg_count < NUM_GPR_ARG_REGISTERS)
214n/a intarg_count = NUM_GPR_ARG_REGISTERS;
215n/a intarg_count += 4;
216n/a break;
217n/a
218n/a case FFI_TYPE_UINT64:
219n/a case FFI_TYPE_SINT64:
220n/a /* 'long long' arguments are passed as two words, but
221n/a either both words must fit in registers or both go
222n/a on the stack. If they go on the stack, they must
223n/a be 8-byte-aligned.
224n/a
225n/a Also, only certain register pairs can be used for
226n/a passing long long int -- specifically (r3,r4), (r5,r6),
227n/a (r7,r8), (r9,r10). */
228n/a if (intarg_count == NUM_GPR_ARG_REGISTERS-1
229n/a || intarg_count % 2 != 0)
230n/a intarg_count++;
231n/a intarg_count += 2;
232n/a break;
233n/a
234n/a case FFI_TYPE_STRUCT:
235n/a /* We must allocate space for a copy of these to enforce
236n/a pass-by-value. Pad the space up to a multiple of 16
237n/a bytes (the maximum alignment required for anything under
238n/a the SYSV ABI). */
239n/a struct_copy_size += ((*ptr)->size + 15) & ~0xF;
240n/a /* Fall through (allocate space for the pointer). */
241n/a
242n/a case FFI_TYPE_POINTER:
243n/a case FFI_TYPE_INT:
244n/a case FFI_TYPE_UINT32:
245n/a case FFI_TYPE_SINT32:
246n/a case FFI_TYPE_UINT16:
247n/a case FFI_TYPE_SINT16:
248n/a case FFI_TYPE_UINT8:
249n/a case FFI_TYPE_SINT8:
250n/a /* Everything else is passed as a 4-byte word in a GPR, either
251n/a the object itself or a pointer to it. */
252n/a intarg_count++;
253n/a break;
254n/a
255n/a default:
256n/a FFI_ASSERT (0);
257n/a }
258n/a }
259n/a
260n/a if (fparg_count != 0)
261n/a flags |= FLAG_FP_ARGUMENTS;
262n/a if (intarg_count > 4)
263n/a flags |= FLAG_4_GPR_ARGUMENTS;
264n/a if (struct_copy_size != 0)
265n/a flags |= FLAG_ARG_NEEDS_COPY;
266n/a
267n/a /* Space for the FPR registers, if needed. */
268n/a if (fparg_count != 0)
269n/a bytes += NUM_FPR_ARG_REGISTERS * sizeof (double);
270n/a
271n/a /* Stack space. */
272n/a if (intarg_count > NUM_GPR_ARG_REGISTERS)
273n/a bytes += (intarg_count - NUM_GPR_ARG_REGISTERS) * sizeof (int);
274n/a if (fparg_count > NUM_FPR_ARG_REGISTERS)
275n/a bytes += (fparg_count - NUM_FPR_ARG_REGISTERS) * sizeof (double);
276n/a
277n/a /* The stack space allocated needs to be a multiple of 16 bytes. */
278n/a bytes = (bytes + 15) & ~0xF;
279n/a
280n/a /* Add in the space for the copied structures. */
281n/a bytes += struct_copy_size;
282n/a
283n/a cif->flags = flags;
284n/a cif->bytes = bytes;
285n/a
286n/a return FFI_OK;
287n/a}
288n/a
289n/affi_status FFI_HIDDEN
290n/affi_prep_cif_sysv (ffi_cif *cif)
291n/a{
292n/a if ((cif->abi & FFI_SYSV) == 0)
293n/a {
294n/a /* This call is from old code. Translate to new ABI values. */
295n/a cif->flags |= FLAG_COMPAT;
296n/a switch (cif->abi)
297n/a {
298n/a default:
299n/a return FFI_BAD_ABI;
300n/a
301n/a case FFI_COMPAT_SYSV:
302n/a cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128;
303n/a break;
304n/a
305n/a case FFI_COMPAT_GCC_SYSV:
306n/a cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128;
307n/a break;
308n/a
309n/a case FFI_COMPAT_LINUX:
310n/a cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE
311n/a | FFI_SYSV_LONG_DOUBLE_128);
312n/a break;
313n/a
314n/a case FFI_COMPAT_LINUX_SOFT_FLOAT:
315n/a cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE
316n/a | FFI_SYSV_LONG_DOUBLE_128);
317n/a break;
318n/a }
319n/a }
320n/a return ffi_prep_cif_sysv_core (cif);
321n/a}
322n/a
323n/a/* ffi_prep_args_SYSV is called by the assembly routine once stack space
324n/a has been allocated for the function's arguments.
325n/a
326n/a The stack layout we want looks like this:
327n/a
328n/a | Return address from ffi_call_SYSV 4bytes | higher addresses
329n/a |--------------------------------------------|
330n/a | Previous backchain pointer 4 | stack pointer here
331n/a |--------------------------------------------|<+ <<< on entry to
332n/a | Saved r28-r31 4*4 | | ffi_call_SYSV
333n/a |--------------------------------------------| |
334n/a | GPR registers r3-r10 8*4 | | ffi_call_SYSV
335n/a |--------------------------------------------| |
336n/a | FPR registers f1-f8 (optional) 8*8 | |
337n/a |--------------------------------------------| | stack |
338n/a | Space for copied structures | | grows |
339n/a |--------------------------------------------| | down V
340n/a | Parameters that didn't fit in registers | |
341n/a |--------------------------------------------| | lower addresses
342n/a | Space for callee's LR 4 | |
343n/a |--------------------------------------------| | stack pointer here
344n/a | Current backchain pointer 4 |-/ during
345n/a |--------------------------------------------| <<< ffi_call_SYSV
346n/a
347n/a*/
348n/a
349n/avoid FFI_HIDDEN
350n/affi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
351n/a{
352n/a const unsigned bytes = ecif->cif->bytes;
353n/a const unsigned flags = ecif->cif->flags;
354n/a
355n/a typedef union
356n/a {
357n/a char *c;
358n/a unsigned *u;
359n/a long long *ll;
360n/a float *f;
361n/a double *d;
362n/a } valp;
363n/a
364n/a /* 'stacktop' points at the previous backchain pointer. */
365n/a valp stacktop;
366n/a
367n/a /* 'gpr_base' points at the space for gpr3, and grows upwards as
368n/a we use GPR registers. */
369n/a valp gpr_base;
370n/a int intarg_count;
371n/a
372n/a#ifndef __NO_FPRS__
373n/a /* 'fpr_base' points at the space for fpr1, and grows upwards as
374n/a we use FPR registers. */
375n/a valp fpr_base;
376n/a int fparg_count;
377n/a#endif
378n/a
379n/a /* 'copy_space' grows down as we put structures in it. It should
380n/a stay 16-byte aligned. */
381n/a valp copy_space;
382n/a
383n/a /* 'next_arg' grows up as we put parameters in it. */
384n/a valp next_arg;
385n/a
386n/a int i;
387n/a ffi_type **ptr;
388n/a#ifndef __NO_FPRS__
389n/a double double_tmp;
390n/a#endif
391n/a union
392n/a {
393n/a void **v;
394n/a char **c;
395n/a signed char **sc;
396n/a unsigned char **uc;
397n/a signed short **ss;
398n/a unsigned short **us;
399n/a unsigned int **ui;
400n/a long long **ll;
401n/a float **f;
402n/a double **d;
403n/a } p_argv;
404n/a size_t struct_copy_size;
405n/a unsigned gprvalue;
406n/a
407n/a stacktop.c = (char *) stack + bytes;
408n/a gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
409n/a intarg_count = 0;
410n/a#ifndef __NO_FPRS__
411n/a fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
412n/a fparg_count = 0;
413n/a copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
414n/a#else
415n/a copy_space.c = gpr_base.c;
416n/a#endif
417n/a next_arg.u = stack + 2;
418n/a
419n/a /* Check that everything starts aligned properly. */
420n/a FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
421n/a FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0);
422n/a FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
423n/a FFI_ASSERT ((bytes & 0xF) == 0);
424n/a FFI_ASSERT (copy_space.c >= next_arg.c);
425n/a
426n/a /* Deal with return values that are actually pass-by-reference. */
427n/a if (flags & FLAG_RETVAL_REFERENCE)
428n/a {
429n/a *gpr_base.u++ = (unsigned long) (char *) ecif->rvalue;
430n/a intarg_count++;
431n/a }
432n/a
433n/a /* Now for the arguments. */
434n/a p_argv.v = ecif->avalue;
435n/a for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
436n/a i > 0;
437n/a i--, ptr++, p_argv.v++)
438n/a {
439n/a unsigned int typenum = (*ptr)->type;
440n/a
441n/a typenum = translate_float (ecif->cif->abi, typenum);
442n/a
443n/a /* Now test the translated value */
444n/a switch (typenum)
445n/a {
446n/a#ifndef __NO_FPRS__
447n/a# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
448n/a case FFI_TYPE_LONGDOUBLE:
449n/a double_tmp = (*p_argv.d)[0];
450n/a
451n/a if (fparg_count >= NUM_FPR_ARG_REGISTERS - 1)
452n/a {
453n/a if (intarg_count >= NUM_GPR_ARG_REGISTERS
454n/a && intarg_count % 2 != 0)
455n/a {
456n/a intarg_count++;
457n/a next_arg.u++;
458n/a }
459n/a *next_arg.d = double_tmp;
460n/a next_arg.u += 2;
461n/a double_tmp = (*p_argv.d)[1];
462n/a *next_arg.d = double_tmp;
463n/a next_arg.u += 2;
464n/a }
465n/a else
466n/a {
467n/a *fpr_base.d++ = double_tmp;
468n/a double_tmp = (*p_argv.d)[1];
469n/a *fpr_base.d++ = double_tmp;
470n/a }
471n/a
472n/a fparg_count += 2;
473n/a FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
474n/a break;
475n/a# endif
476n/a case FFI_TYPE_DOUBLE:
477n/a double_tmp = **p_argv.d;
478n/a
479n/a if (fparg_count >= NUM_FPR_ARG_REGISTERS)
480n/a {
481n/a if (intarg_count >= NUM_GPR_ARG_REGISTERS
482n/a && intarg_count % 2 != 0)
483n/a {
484n/a intarg_count++;
485n/a next_arg.u++;
486n/a }
487n/a *next_arg.d = double_tmp;
488n/a next_arg.u += 2;
489n/a }
490n/a else
491n/a *fpr_base.d++ = double_tmp;
492n/a fparg_count++;
493n/a FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
494n/a break;
495n/a
496n/a case FFI_TYPE_FLOAT:
497n/a double_tmp = **p_argv.f;
498n/a if (fparg_count >= NUM_FPR_ARG_REGISTERS)
499n/a {
500n/a *next_arg.f = (float) double_tmp;
501n/a next_arg.u += 1;
502n/a intarg_count++;
503n/a }
504n/a else
505n/a *fpr_base.d++ = double_tmp;
506n/a fparg_count++;
507n/a FFI_ASSERT (flags & FLAG_FP_ARGUMENTS);
508n/a break;
509n/a#endif /* have FPRs */
510n/a
511n/a case FFI_TYPE_UINT128:
512n/a /* The soft float ABI for long doubles works like this, a long double
513n/a is passed in four consecutive GPRs if available. A maximum of 2
514n/a long doubles can be passed in gprs. If we do not have 4 GPRs
515n/a left, the long double is passed on the stack, 4-byte aligned. */
516n/a {
517n/a unsigned int int_tmp;
518n/a unsigned int ii;
519n/a if (intarg_count >= NUM_GPR_ARG_REGISTERS - 3)
520n/a {
521n/a if (intarg_count < NUM_GPR_ARG_REGISTERS)
522n/a intarg_count = NUM_GPR_ARG_REGISTERS;
523n/a for (ii = 0; ii < 4; ii++)
524n/a {
525n/a int_tmp = (*p_argv.ui)[ii];
526n/a *next_arg.u++ = int_tmp;
527n/a }
528n/a }
529n/a else
530n/a {
531n/a for (ii = 0; ii < 4; ii++)
532n/a {
533n/a int_tmp = (*p_argv.ui)[ii];
534n/a *gpr_base.u++ = int_tmp;
535n/a }
536n/a }
537n/a intarg_count += 4;
538n/a break;
539n/a }
540n/a
541n/a case FFI_TYPE_UINT64:
542n/a case FFI_TYPE_SINT64:
543n/a if (intarg_count == NUM_GPR_ARG_REGISTERS-1)
544n/a intarg_count++;
545n/a if (intarg_count >= NUM_GPR_ARG_REGISTERS)
546n/a {
547n/a if (intarg_count % 2 != 0)
548n/a {
549n/a intarg_count++;
550n/a next_arg.u++;
551n/a }
552n/a *next_arg.ll = **p_argv.ll;
553n/a next_arg.u += 2;
554n/a }
555n/a else
556n/a {
557n/a /* The abi states only certain register pairs can be
558n/a used for passing long long int specifically (r3,r4),
559n/a (r5,r6), (r7,r8), (r9,r10). If next arg is long long
560n/a but not correct starting register of pair then skip
561n/a until the proper starting register. */
562n/a if (intarg_count % 2 != 0)
563n/a {
564n/a intarg_count ++;
565n/a gpr_base.u++;
566n/a }
567n/a *gpr_base.ll++ = **p_argv.ll;
568n/a }
569n/a intarg_count += 2;
570n/a break;
571n/a
572n/a case FFI_TYPE_STRUCT:
573n/a struct_copy_size = ((*ptr)->size + 15) & ~0xF;
574n/a copy_space.c -= struct_copy_size;
575n/a memcpy (copy_space.c, *p_argv.c, (*ptr)->size);
576n/a
577n/a gprvalue = (unsigned long) copy_space.c;
578n/a
579n/a FFI_ASSERT (copy_space.c > next_arg.c);
580n/a FFI_ASSERT (flags & FLAG_ARG_NEEDS_COPY);
581n/a goto putgpr;
582n/a
583n/a case FFI_TYPE_UINT8:
584n/a gprvalue = **p_argv.uc;
585n/a goto putgpr;
586n/a case FFI_TYPE_SINT8:
587n/a gprvalue = **p_argv.sc;
588n/a goto putgpr;
589n/a case FFI_TYPE_UINT16:
590n/a gprvalue = **p_argv.us;
591n/a goto putgpr;
592n/a case FFI_TYPE_SINT16:
593n/a gprvalue = **p_argv.ss;
594n/a goto putgpr;
595n/a
596n/a case FFI_TYPE_INT:
597n/a case FFI_TYPE_UINT32:
598n/a case FFI_TYPE_SINT32:
599n/a case FFI_TYPE_POINTER:
600n/a
601n/a gprvalue = **p_argv.ui;
602n/a
603n/a putgpr:
604n/a if (intarg_count >= NUM_GPR_ARG_REGISTERS)
605n/a *next_arg.u++ = gprvalue;
606n/a else
607n/a *gpr_base.u++ = gprvalue;
608n/a intarg_count++;
609n/a break;
610n/a }
611n/a }
612n/a
613n/a /* Check that we didn't overrun the stack... */
614n/a FFI_ASSERT (copy_space.c >= next_arg.c);
615n/a FFI_ASSERT (gpr_base.u <= stacktop.u - ASM_NEEDS_REGISTERS);
616n/a /* The assert below is testing that the number of integer arguments agrees
617n/a with the number found in ffi_prep_cif_machdep(). However, intarg_count
618n/a is incremented whenever we place an FP arg on the stack, so account for
619n/a that before our assert test. */
620n/a#ifndef __NO_FPRS__
621n/a if (fparg_count > NUM_FPR_ARG_REGISTERS)
622n/a intarg_count -= fparg_count - NUM_FPR_ARG_REGISTERS;
623n/a FFI_ASSERT (fpr_base.u
624n/a <= stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS);
625n/a#endif
626n/a FFI_ASSERT (flags & FLAG_4_GPR_ARGUMENTS || intarg_count <= 4);
627n/a}
628n/a
629n/a#define MIN_CACHE_LINE_SIZE 8
630n/a
631n/astatic void
632n/aflush_icache (char *wraddr, char *xaddr, int size)
633n/a{
634n/a int i;
635n/a for (i = 0; i < size; i += MIN_CACHE_LINE_SIZE)
636n/a __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;"
637n/a : : "r" (xaddr + i), "r" (wraddr + i) : "memory");
638n/a __asm__ volatile ("icbi 0,%0;" "dcbf 0,%1;" "sync;" "isync;"
639n/a : : "r"(xaddr + size - 1), "r"(wraddr + size - 1)
640n/a : "memory");
641n/a}
642n/a
643n/affi_status FFI_HIDDEN
644n/affi_prep_closure_loc_sysv (ffi_closure *closure,
645n/a ffi_cif *cif,
646n/a void (*fun) (ffi_cif *, void *, void **, void *),
647n/a void *user_data,
648n/a void *codeloc)
649n/a{
650n/a unsigned int *tramp;
651n/a
652n/a if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI)
653n/a return FFI_BAD_ABI;
654n/a
655n/a tramp = (unsigned int *) &closure->tramp[0];
656n/a tramp[0] = 0x7c0802a6; /* mflr r0 */
657n/a tramp[1] = 0x4800000d; /* bl 10 <trampoline_initial+0x10> */
658n/a tramp[4] = 0x7d6802a6; /* mflr r11 */
659n/a tramp[5] = 0x7c0803a6; /* mtlr r0 */
660n/a tramp[6] = 0x800b0000; /* lwz r0,0(r11) */
661n/a tramp[7] = 0x816b0004; /* lwz r11,4(r11) */
662n/a tramp[8] = 0x7c0903a6; /* mtctr r0 */
663n/a tramp[9] = 0x4e800420; /* bctr */
664n/a *(void **) &tramp[2] = (void *) ffi_closure_SYSV; /* function */
665n/a *(void **) &tramp[3] = codeloc; /* context */
666n/a
667n/a /* Flush the icache. */
668n/a flush_icache ((char *)tramp, (char *)codeloc, FFI_TRAMPOLINE_SIZE);
669n/a
670n/a closure->cif = cif;
671n/a closure->fun = fun;
672n/a closure->user_data = user_data;
673n/a
674n/a return FFI_OK;
675n/a}
676n/a
677n/a/* Basically the trampoline invokes ffi_closure_SYSV, and on
678n/a entry, r11 holds the address of the closure.
679n/a After storing the registers that could possibly contain
680n/a parameters to be passed into the stack frame and setting
681n/a up space for a return value, ffi_closure_SYSV invokes the
682n/a following helper function to do most of the work. */
683n/a
684n/aint
685n/affi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
686n/a unsigned long *pgr, ffi_dblfl *pfr,
687n/a unsigned long *pst)
688n/a{
689n/a /* rvalue is the pointer to space for return value in closure assembly */
690n/a /* pgr is the pointer to where r3-r10 are stored in ffi_closure_SYSV */
691n/a /* pfr is the pointer to where f1-f8 are stored in ffi_closure_SYSV */
692n/a /* pst is the pointer to outgoing parameter stack in original caller */
693n/a
694n/a void ** avalue;
695n/a ffi_type ** arg_types;
696n/a long i, avn;
697n/a#ifndef __NO_FPRS__
698n/a long nf = 0; /* number of floating registers already used */
699n/a#endif
700n/a long ng = 0; /* number of general registers already used */
701n/a
702n/a ffi_cif *cif = closure->cif;
703n/a unsigned size = cif->rtype->size;
704n/a unsigned short rtypenum = cif->rtype->type;
705n/a
706n/a avalue = alloca (cif->nargs * sizeof (void *));
707n/a
708n/a /* First translate for softfloat/nonlinux */
709n/a rtypenum = translate_float (cif->abi, rtypenum);
710n/a
711n/a /* Copy the caller's structure return value address so that the closure
712n/a returns the data directly to the caller.
713n/a For FFI_SYSV the result is passed in r3/r4 if the struct size is less
714n/a or equal 8 bytes. */
715n/a if (rtypenum == FFI_TYPE_STRUCT
716n/a && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8))
717n/a {
718n/a rvalue = (void *) *pgr;
719n/a ng++;
720n/a pgr++;
721n/a }
722n/a
723n/a i = 0;
724n/a avn = cif->nargs;
725n/a arg_types = cif->arg_types;
726n/a
727n/a /* Grab the addresses of the arguments from the stack frame. */
728n/a while (i < avn) {
729n/a unsigned short typenum = arg_types[i]->type;
730n/a
731n/a /* We may need to handle some values depending on ABI. */
732n/a typenum = translate_float (cif->abi, typenum);
733n/a
734n/a switch (typenum)
735n/a {
736n/a#ifndef __NO_FPRS__
737n/a case FFI_TYPE_FLOAT:
738n/a /* Unfortunately float values are stored as doubles
739n/a in the ffi_closure_SYSV code (since we don't check
740n/a the type in that routine). */
741n/a if (nf < NUM_FPR_ARG_REGISTERS)
742n/a {
743n/a /* FIXME? here we are really changing the values
744n/a stored in the original calling routines outgoing
745n/a parameter stack. This is probably a really
746n/a naughty thing to do but... */
747n/a double temp = pfr->d;
748n/a pfr->f = (float) temp;
749n/a avalue[i] = pfr;
750n/a nf++;
751n/a pfr++;
752n/a }
753n/a else
754n/a {
755n/a avalue[i] = pst;
756n/a pst += 1;
757n/a }
758n/a break;
759n/a
760n/a case FFI_TYPE_DOUBLE:
761n/a if (nf < NUM_FPR_ARG_REGISTERS)
762n/a {
763n/a avalue[i] = pfr;
764n/a nf++;
765n/a pfr++;
766n/a }
767n/a else
768n/a {
769n/a if (((long) pst) & 4)
770n/a pst++;
771n/a avalue[i] = pst;
772n/a pst += 2;
773n/a }
774n/a break;
775n/a
776n/a# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
777n/a case FFI_TYPE_LONGDOUBLE:
778n/a if (nf < NUM_FPR_ARG_REGISTERS - 1)
779n/a {
780n/a avalue[i] = pfr;
781n/a pfr += 2;
782n/a nf += 2;
783n/a }
784n/a else
785n/a {
786n/a if (((long) pst) & 4)
787n/a pst++;
788n/a avalue[i] = pst;
789n/a pst += 4;
790n/a nf = 8;
791n/a }
792n/a break;
793n/a# endif
794n/a#endif
795n/a
796n/a case FFI_TYPE_UINT128:
797n/a /* Test if for the whole long double, 4 gprs are available.
798n/a otherwise the stuff ends up on the stack. */
799n/a if (ng < NUM_GPR_ARG_REGISTERS - 3)
800n/a {
801n/a avalue[i] = pgr;
802n/a pgr += 4;
803n/a ng += 4;
804n/a }
805n/a else
806n/a {
807n/a avalue[i] = pst;
808n/a pst += 4;
809n/a ng = 8+4;
810n/a }
811n/a break;
812n/a
813n/a case FFI_TYPE_SINT8:
814n/a case FFI_TYPE_UINT8:
815n/a#ifndef __LITTLE_ENDIAN__
816n/a if (ng < NUM_GPR_ARG_REGISTERS)
817n/a {
818n/a avalue[i] = (char *) pgr + 3;
819n/a ng++;
820n/a pgr++;
821n/a }
822n/a else
823n/a {
824n/a avalue[i] = (char *) pst + 3;
825n/a pst++;
826n/a }
827n/a break;
828n/a#endif
829n/a
830n/a case FFI_TYPE_SINT16:
831n/a case FFI_TYPE_UINT16:
832n/a#ifndef __LITTLE_ENDIAN__
833n/a if (ng < NUM_GPR_ARG_REGISTERS)
834n/a {
835n/a avalue[i] = (char *) pgr + 2;
836n/a ng++;
837n/a pgr++;
838n/a }
839n/a else
840n/a {
841n/a avalue[i] = (char *) pst + 2;
842n/a pst++;
843n/a }
844n/a break;
845n/a#endif
846n/a
847n/a case FFI_TYPE_SINT32:
848n/a case FFI_TYPE_UINT32:
849n/a case FFI_TYPE_POINTER:
850n/a if (ng < NUM_GPR_ARG_REGISTERS)
851n/a {
852n/a avalue[i] = pgr;
853n/a ng++;
854n/a pgr++;
855n/a }
856n/a else
857n/a {
858n/a avalue[i] = pst;
859n/a pst++;
860n/a }
861n/a break;
862n/a
863n/a case FFI_TYPE_STRUCT:
864n/a /* Structs are passed by reference. The address will appear in a
865n/a gpr if it is one of the first 8 arguments. */
866n/a if (ng < NUM_GPR_ARG_REGISTERS)
867n/a {
868n/a avalue[i] = (void *) *pgr;
869n/a ng++;
870n/a pgr++;
871n/a }
872n/a else
873n/a {
874n/a avalue[i] = (void *) *pst;
875n/a pst++;
876n/a }
877n/a break;
878n/a
879n/a case FFI_TYPE_SINT64:
880n/a case FFI_TYPE_UINT64:
881n/a /* Passing long long ints are complex, they must
882n/a be passed in suitable register pairs such as
883n/a (r3,r4) or (r5,r6) or (r6,r7), or (r7,r8) or (r9,r10)
884n/a and if the entire pair aren't available then the outgoing
885n/a parameter stack is used for both but an alignment of 8
886n/a must will be kept. So we must either look in pgr
887n/a or pst to find the correct address for this type
888n/a of parameter. */
889n/a if (ng < NUM_GPR_ARG_REGISTERS - 1)
890n/a {
891n/a if (ng & 1)
892n/a {
893n/a /* skip r4, r6, r8 as starting points */
894n/a ng++;
895n/a pgr++;
896n/a }
897n/a avalue[i] = pgr;
898n/a ng += 2;
899n/a pgr += 2;
900n/a }
901n/a else
902n/a {
903n/a if (((long) pst) & 4)
904n/a pst++;
905n/a avalue[i] = pst;
906n/a pst += 2;
907n/a ng = NUM_GPR_ARG_REGISTERS;
908n/a }
909n/a break;
910n/a
911n/a default:
912n/a FFI_ASSERT (0);
913n/a }
914n/a
915n/a i++;
916n/a }
917n/a
918n/a (closure->fun) (cif, rvalue, avalue, closure->user_data);
919n/a
920n/a /* Tell ffi_closure_SYSV how to perform return type promotions.
921n/a Because the FFI_SYSV ABI returns the structures <= 8 bytes in
922n/a r3/r4 we have to tell ffi_closure_SYSV how to treat them. We
923n/a combine the base type FFI_SYSV_TYPE_SMALL_STRUCT with the size of
924n/a the struct less one. We never have a struct with size zero.
925n/a See the comment in ffitarget.h about ordering. */
926n/a if (rtypenum == FFI_TYPE_STRUCT
927n/a && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)
928n/a return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size;
929n/a return rtypenum;
930n/a}
931n/a#endif