ffi 1.17.0 → 1.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +17 -0
- data/Gemfile +3 -1
- data/Rakefile +2 -2
- data/ext/ffi_c/Function.c +52 -34
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +48 -60
- data/ext/ffi_c/libffi/Makefile.am +4 -3
- data/ext/ffi_c/libffi/Makefile.in +5 -25
- data/ext/ffi_c/libffi/README.md +19 -2
- data/ext/ffi_c/libffi/acinclude.m4 +6 -0
- data/ext/ffi_c/libffi/config.guess +80 -22
- data/ext/ffi_c/libffi/config.sub +161 -80
- data/ext/ffi_c/libffi/configure +41 -25
- data/ext/ffi_c/libffi/configure.ac +9 -8
- data/ext/ffi_c/libffi/configure.host +0 -5
- data/ext/ffi_c/libffi/doc/Makefile.in +1 -0
- data/ext/ffi_c/libffi/doc/libffi.texi +3 -3
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +3 -3
- data/ext/ffi_c/libffi/include/Makefile.in +1 -0
- data/ext/ffi_c/libffi/include/ffi_cfi.h +2 -0
- data/ext/ffi_c/libffi/include/ffi_common.h +17 -0
- data/ext/ffi_c/libffi/man/Makefile.in +1 -0
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +7 -4
- data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +2 -2
- data/ext/ffi_c/libffi/src/aarch64/internal.h +63 -17
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +16 -12
- data/ext/ffi_c/libffi/src/arc/arcompact.S +2 -2
- data/ext/ffi_c/libffi/src/arc/ffi.c +6 -2
- data/ext/ffi_c/libffi/src/closures.c +3 -3
- data/ext/ffi_c/libffi/src/dlmalloc.c +1 -0
- data/ext/ffi_c/libffi/src/mips/ffitarget.h +2 -4
- data/ext/ffi_c/libffi/src/mips/n32.S +4 -0
- data/ext/ffi_c/libffi/src/mips/o32.S +4 -0
- data/ext/ffi_c/libffi/src/or1k/ffi.c +2 -2
- data/ext/ffi_c/libffi/src/powerpc/ffi.c +13 -0
- data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +26 -19
- data/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +26 -16
- data/ext/ffi_c/libffi/src/powerpc/internal.h +10 -0
- data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +47 -0
- data/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +24 -0
- data/ext/ffi_c/libffi/src/prep_cif.c +1 -4
- data/ext/ffi_c/libffi/src/s390/ffi.c +28 -1
- data/ext/ffi_c/libffi/src/s390/internal.h +11 -0
- data/ext/ffi_c/libffi/src/s390/sysv.S +38 -0
- data/ext/ffi_c/libffi/src/sparc/ffi.c +16 -0
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +10 -262
- data/ext/ffi_c/libffi/src/x86/ffi.c +4 -1
- data/ext/ffi_c/libffi/src/x86/ffi64.c +4 -1
- data/ext/ffi_c/libffi/testsuite/Makefile.am +4 -3
- data/ext/ffi_c/libffi/testsuite/Makefile.in +5 -3
- data/ext/ffi_c/libffi/testsuite/emscripten/build-tests.sh +4 -24
- data/ext/ffi_c/libffi/testsuite/emscripten/build.sh +8 -25
- data/ext/ffi_c/libffi/testsuite/emscripten/node-tests.sh +3 -28
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +2 -2
- data/ext/ffi_c/libffi/testsuite/libffi.call/overread.c +54 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/struct_int_float.c +88 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +1 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/x32.c +31 -0
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_sshortchar.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.closures/cls_multi_ushortchar.c +1 -1
- data/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +1 -1
- data/lib/ffi/ffi.rb +59 -0
- data/lib/ffi/version.rb +1 -1
- data/sig/ffi/auto_pointer.rbs +0 -1
- data/sig/ffi/library.rbs +1 -1
- data.tar.gz.sig +0 -0
- metadata +18 -18
- metadata.gz.sig +0 -0
- data/ext/ffi_c/libffi/.circleci/config.yml +0 -156
- data/ext/ffi_c/libffi/src/nios2/ffi.c +0 -304
- data/ext/ffi_c/libffi/src/nios2/ffitarget.h +0 -52
- data/ext/ffi_c/libffi/src/nios2/sysv.S +0 -136
@@ -192,9 +192,10 @@ static void unmarshal_atom(call_builder *cb, int type, void *data) {
|
|
192
192
|
/* for arguments passed by reference returns the pointer, otherwise the arg is copied (up to MAXCOPYARG bytes) */
|
193
193
|
static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) {
|
194
194
|
size_t realign[2];
|
195
|
-
void *pointer;
|
196
195
|
|
197
196
|
#if defined(__ARC64_ARCH64__)
|
197
|
+
void *pointer;
|
198
|
+
|
198
199
|
if (type->size > 2 * __SIZEOF_POINTER__) {
|
199
200
|
/* pass by reference */
|
200
201
|
unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer);
|
@@ -348,7 +349,10 @@ ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
|
|
348
349
|
void *user_data, void *codeloc)
|
349
350
|
{
|
350
351
|
uint32_t *tramp = (uint32_t *) & (closure->tramp[0]);
|
352
|
+
|
353
|
+
#if defined(__ARC64_ARCH64__)
|
351
354
|
size_t address_ffi_closure = (size_t) ffi_closure_asm;
|
355
|
+
#endif
|
352
356
|
|
353
357
|
switch (cif->abi)
|
354
358
|
{
|
@@ -367,7 +371,7 @@ ffi_prep_closure_loc (ffi_closure * closure, ffi_cif * cif,
|
|
367
371
|
FFI_ASSERT (tramp == codeloc);
|
368
372
|
tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */
|
369
373
|
tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */
|
370
|
-
tramp[2] = CODE_ENDIAN (ffi_closure_asm);
|
374
|
+
tramp[2] = CODE_ENDIAN ((uint32_t) ffi_closure_asm);
|
371
375
|
break;
|
372
376
|
#endif
|
373
377
|
|
@@ -164,7 +164,7 @@ ffi_tramp_is_present (__attribute__((unused)) void *ptr)
|
|
164
164
|
|
165
165
|
#include <mach/mach.h>
|
166
166
|
#include <pthread.h>
|
167
|
-
#ifdef
|
167
|
+
#ifdef HAVE_ARM64E_PTRAUTH
|
168
168
|
#include <ptrauth.h>
|
169
169
|
#endif
|
170
170
|
#include <stdio.h>
|
@@ -223,7 +223,7 @@ ffi_trampoline_table_alloc (void)
|
|
223
223
|
/* Remap the trampoline table on top of the placeholder page */
|
224
224
|
trampoline_page = config_page + PAGE_MAX_SIZE;
|
225
225
|
|
226
|
-
#ifdef
|
226
|
+
#ifdef HAVE_ARM64E_PTRAUTH
|
227
227
|
trampoline_page_template = (vm_address_t)(uintptr_t)ptrauth_auth_data((void *)&ffi_closure_trampoline_table_page, ptrauth_key_function_pointer, 0);
|
228
228
|
#else
|
229
229
|
trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
|
@@ -268,7 +268,7 @@ ffi_trampoline_table_alloc (void)
|
|
268
268
|
ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
|
269
269
|
entry->trampoline =
|
270
270
|
(void *) (trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
|
271
|
-
#ifdef
|
271
|
+
#ifdef HAVE_ARM64E_PTRAUTH
|
272
272
|
entry->trampoline = ptrauth_sign_unauthenticated(entry->trampoline, ptrauth_key_function_pointer, 0);
|
273
273
|
#endif
|
274
274
|
|
@@ -3388,6 +3388,7 @@ static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
|
|
3388
3388
|
mchunkptr tnext = chunk_plus_offset(sp, ssize);
|
3389
3389
|
mchunkptr p = tnext;
|
3390
3390
|
int nfences = 0;
|
3391
|
+
(void)nfences; // Suppress unused variable warning
|
3391
3392
|
|
3392
3393
|
/* reset top to new space */
|
3393
3394
|
init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
|
@@ -32,16 +32,14 @@
|
|
32
32
|
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
|
33
33
|
#endif
|
34
34
|
|
35
|
-
#ifdef
|
36
|
-
# include <asm/sgidefs.h>
|
37
|
-
#elif defined(__rtems__)
|
35
|
+
#ifdef __rtems__
|
38
36
|
/*
|
39
37
|
* Subprogram calling convention - copied from sgidefs.h
|
40
38
|
*/
|
41
39
|
#define _MIPS_SIM_ABI32 1
|
42
40
|
#define _MIPS_SIM_NABI32 2
|
43
41
|
#define _MIPS_SIM_ABI64 3
|
44
|
-
#elif !defined(__OpenBSD__) && !defined(__FreeBSD__)
|
42
|
+
#elif !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__linux__)
|
45
43
|
# include <sgidefs.h>
|
46
44
|
#endif
|
47
45
|
|
@@ -110,7 +110,7 @@ void* ffi_prep_args(char *stack, extended_cif *ecif)
|
|
110
110
|
|
111
111
|
extern void ffi_call_SYSV(unsigned,
|
112
112
|
extended_cif *,
|
113
|
-
void *(*)(
|
113
|
+
void *(*)(char *, extended_cif *),
|
114
114
|
unsigned *,
|
115
115
|
void (*fn)(void),
|
116
116
|
unsigned);
|
@@ -180,7 +180,7 @@ void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5,
|
|
180
180
|
register int *r13 __asm__ ("r13");
|
181
181
|
|
182
182
|
ffi_closure* closure = (ffi_closure*) r13;
|
183
|
-
char *stack_args = sp;
|
183
|
+
char *stack_args = (char*) sp;
|
184
184
|
|
185
185
|
/* Lay the register arguments down in a continuous chunk of memory. */
|
186
186
|
unsigned register_args[6] =
|
@@ -31,6 +31,8 @@
|
|
31
31
|
#include "ffi.h"
|
32
32
|
#include "ffi_common.h"
|
33
33
|
#include "ffi_powerpc.h"
|
34
|
+
#include "internal.h"
|
35
|
+
#include <tramp.h>
|
34
36
|
|
35
37
|
#if HAVE_LONG_DOUBLE_VARIANT
|
36
38
|
/* Adjust ffi_type_longdouble. */
|
@@ -173,3 +175,14 @@ ffi_prep_go_closure (ffi_go_closure *closure,
|
|
173
175
|
closure->fun = fun;
|
174
176
|
return FFI_OK;
|
175
177
|
}
|
178
|
+
|
179
|
+
#ifdef FFI_EXEC_STATIC_TRAMP
|
180
|
+
void *
|
181
|
+
ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
|
182
|
+
{
|
183
|
+
extern void *trampoline_code_table;
|
184
|
+
*tramp_size = PPC_TRAMP_SIZE;
|
185
|
+
*map_size = PPC_TRAMP_MAP_SIZE;
|
186
|
+
return &trampoline_code_table;
|
187
|
+
}
|
188
|
+
#endif
|
@@ -29,6 +29,7 @@
|
|
29
29
|
----------------------------------------------------------------------- */
|
30
30
|
|
31
31
|
#include "ffi.h"
|
32
|
+
#include <tramp.h>
|
32
33
|
|
33
34
|
#ifdef POWERPC64
|
34
35
|
#include "ffi_common.h"
|
@@ -820,32 +821,38 @@ ffi_prep_closure_loc_linux64 (ffi_closure *closure,
|
|
820
821
|
void *user_data,
|
821
822
|
void *codeloc)
|
822
823
|
{
|
823
|
-
#if _CALL_ELF == 2
|
824
|
-
unsigned int *tramp = (unsigned int *) &closure->tramp[0];
|
825
|
-
|
826
824
|
if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI)
|
827
825
|
return FFI_BAD_ABI;
|
828
826
|
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
827
|
+
#ifdef FFI_EXEC_STATIC_TRAMP
|
828
|
+
if (ffi_tramp_is_present(closure))
|
829
|
+
{
|
830
|
+
/* Initialize the static trampoline's parameters. */
|
831
|
+
void (*dest)(void) = ffi_closure_LINUX64;
|
832
|
+
ffi_tramp_set_parms (closure->ftramp, dest, closure);
|
833
|
+
}
|
834
|
+
else
|
835
|
+
#endif
|
836
|
+
{
|
837
|
+
#if _CALL_ELF == 2
|
838
|
+
unsigned int *tramp = (unsigned int *) &closure->tramp[0];
|
839
|
+
tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */
|
840
|
+
tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */
|
841
|
+
tramp[2] = 0x7d8903a6; /* mtctr 12 */
|
842
|
+
tramp[3] = 0x4e800420; /* bctr */
|
833
843
|
/* 1: .quad function_addr */
|
834
844
|
/* 2: .quad context */
|
835
|
-
|
836
|
-
|
837
|
-
|
845
|
+
*(void **) &tramp[4] = (void *) ffi_closure_LINUX64;
|
846
|
+
*(void **) &tramp[6] = codeloc;
|
847
|
+
flush_icache ((char *) tramp, (char *) codeloc, 4 * 4);
|
838
848
|
#else
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
/* Copy function address and TOC from ffi_closure_LINUX64 OPD. */
|
845
|
-
memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *));
|
846
|
-
tramp[1] = codeloc;
|
847
|
-
memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *));
|
849
|
+
/* Copy function address and TOC from ffi_closure_LINUX64 OPD. */
|
850
|
+
void **tramp = (void **) &closure->tramp[0];
|
851
|
+
memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *));
|
852
|
+
tramp[1] = codeloc;
|
853
|
+
memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *));
|
848
854
|
#endif
|
855
|
+
}
|
849
856
|
|
850
857
|
closure->cif = cif;
|
851
858
|
closure->fun = fun;
|
@@ -29,6 +29,7 @@
|
|
29
29
|
----------------------------------------------------------------------- */
|
30
30
|
|
31
31
|
#include "ffi.h"
|
32
|
+
#include <tramp.h>
|
32
33
|
|
33
34
|
#ifndef POWERPC64
|
34
35
|
#include "ffi_common.h"
|
@@ -636,25 +637,34 @@ ffi_prep_closure_loc_sysv (ffi_closure *closure,
|
|
636
637
|
void *user_data,
|
637
638
|
void *codeloc)
|
638
639
|
{
|
639
|
-
unsigned int *tramp;
|
640
|
-
|
641
640
|
if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI)
|
642
641
|
return FFI_BAD_ABI;
|
643
642
|
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
/*
|
657
|
-
|
643
|
+
#ifdef FFI_EXEC_STATIC_TRAMP
|
644
|
+
if (ffi_tramp_is_present(closure))
|
645
|
+
{
|
646
|
+
/* Initialize the static trampoline's parameters. */
|
647
|
+
void (*dest)(void) = ffi_closure_SYSV;
|
648
|
+
ffi_tramp_set_parms (closure->ftramp, dest, closure);
|
649
|
+
}
|
650
|
+
else
|
651
|
+
#endif
|
652
|
+
{
|
653
|
+
unsigned int *tramp = (unsigned int *) &closure->tramp[0];
|
654
|
+
tramp[0] = 0x7c0802a6; /* mflr r0 */
|
655
|
+
tramp[1] = 0x429f0005; /* bcl 20,31,.+4 */
|
656
|
+
tramp[2] = 0x7d6802a6; /* mflr r11 */
|
657
|
+
tramp[3] = 0x7c0803a6; /* mtlr r0 */
|
658
|
+
tramp[4] = 0x800b0018; /* lwz r0,24(r11) */
|
659
|
+
tramp[5] = 0x816b001c; /* lwz r11,28(r11) */
|
660
|
+
tramp[6] = 0x7c0903a6; /* mtctr r0 */
|
661
|
+
tramp[7] = 0x4e800420; /* bctr */
|
662
|
+
*(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */
|
663
|
+
*(void **) &tramp[9] = codeloc; /* context */
|
664
|
+
|
665
|
+
/* Flush the icache. */
|
666
|
+
flush_icache ((char *)tramp, (char *)codeloc, 8 * 4);
|
667
|
+
}
|
658
668
|
|
659
669
|
closure->cif = cif;
|
660
670
|
closure->fun = fun;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#ifdef FFI_EXEC_STATIC_TRAMP
|
2
|
+
/* For the trampoline code table mapping, a mapping size of 64K is chosen. */
|
3
|
+
#define PPC_TRAMP_MAP_SHIFT 16
|
4
|
+
#define PPC_TRAMP_MAP_SIZE (1 << PPC_TRAMP_MAP_SHIFT)
|
5
|
+
# ifdef __PCREL__
|
6
|
+
# define PPC_TRAMP_SIZE 24
|
7
|
+
# else
|
8
|
+
# define PPC_TRAMP_SIZE 40
|
9
|
+
# endif /* __PCREL__ */
|
10
|
+
#endif /* FFI_EXEC_STATIC_TRAMP */
|
@@ -27,6 +27,7 @@
|
|
27
27
|
#define LIBFFI_ASM
|
28
28
|
#include <fficonfig.h>
|
29
29
|
#include <ffi.h>
|
30
|
+
#include "internal.h"
|
30
31
|
|
31
32
|
.file "linux64_closure.S"
|
32
33
|
|
@@ -559,7 +560,53 @@ ffi_go_closure_linux64:
|
|
559
560
|
.size .ffi_go_closure_linux64,.-.ffi_go_closure_linux64
|
560
561
|
# endif
|
561
562
|
# endif
|
563
|
+
|
564
|
+
#ifdef FFI_EXEC_STATIC_TRAMP
|
565
|
+
.text
|
566
|
+
.align PPC_TRAMP_MAP_SHIFT
|
567
|
+
FFI_HIDDEN (trampoline_code_table)
|
568
|
+
.globl trampoline_code_table
|
569
|
+
# if _CALL_ELF == 2
|
570
|
+
.type trampoline_code_table,@function
|
571
|
+
trampoline_code_table:
|
572
|
+
.localentry trampoline_code_table,.-trampoline_code_table
|
573
|
+
# else
|
574
|
+
.section ".opd","aw"
|
575
|
+
.align 3
|
576
|
+
trampoline_code_table:
|
577
|
+
.quad .L.trampoline_code_table,.TOC.@tocbase,0
|
578
|
+
.type trampoline_code_table,@function
|
579
|
+
.text
|
580
|
+
.L.trampoline_code_table:
|
581
|
+
# endif
|
582
|
+
.rept PPC_TRAMP_MAP_SIZE / PPC_TRAMP_SIZE
|
583
|
+
#ifdef __PCREL__
|
584
|
+
pla %r2,PPC_TRAMP_MAP_SIZE
|
585
|
+
ld %r11,0(%r2)
|
586
|
+
ld %r12,8(%r2)
|
587
|
+
mtctr %r12
|
588
|
+
bctr
|
589
|
+
#else
|
590
|
+
mflr %r0
|
591
|
+
bcl 20,31,$+4
|
592
|
+
mflr %r11
|
593
|
+
addis %r11,%r11,PPC_TRAMP_MAP_SIZE@ha
|
594
|
+
mtlr %r0
|
595
|
+
ld %r12,(PPC_TRAMP_MAP_SIZE+0)@l(%r11)
|
596
|
+
mtctr %r12
|
597
|
+
ld %r11,(PPC_TRAMP_MAP_SIZE-8)@l(%r11)
|
598
|
+
bctr
|
599
|
+
nop
|
600
|
+
#endif
|
601
|
+
.endr
|
602
|
+
.align PPC_TRAMP_MAP_SHIFT
|
603
|
+
#if _CALL_ELF == 2
|
604
|
+
.size trampoline_code_table,.-trampoline_code_table
|
605
|
+
#else
|
606
|
+
.size trampoline_code_table,.-.L.trampoline_code_table
|
562
607
|
#endif
|
608
|
+
#endif /* FFI_EXEC_STATIC_TRAMP */
|
609
|
+
#endif /* POWERPC64 */
|
563
610
|
|
564
611
|
#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2
|
565
612
|
.section .note.GNU-stack,"",@progbits
|
@@ -27,6 +27,7 @@
|
|
27
27
|
#define LIBFFI_ASM
|
28
28
|
#include <fficonfig.h>
|
29
29
|
#include <ffi.h>
|
30
|
+
#include "internal.h"
|
30
31
|
#include <powerpc/asm.h>
|
31
32
|
|
32
33
|
.file "ppc_closure.S"
|
@@ -391,6 +392,29 @@ ENTRY(ffi_go_closure_sysv)
|
|
391
392
|
.cfi_endproc
|
392
393
|
END(ffi_go_closure_sysv)
|
393
394
|
|
395
|
+
#ifdef FFI_EXEC_STATIC_TRAMP
|
396
|
+
.text
|
397
|
+
.align PPC_TRAMP_MAP_SHIFT
|
398
|
+
FFI_HIDDEN (trampoline_code_table)
|
399
|
+
.globl trampoline_code_table
|
400
|
+
.type trampoline_code_table,@function
|
401
|
+
trampoline_code_table:
|
402
|
+
.rept PPC_TRAMP_MAP_SIZE / PPC_TRAMP_SIZE
|
403
|
+
mflr %r0
|
404
|
+
bcl 20,31,$+4
|
405
|
+
mflr %r11
|
406
|
+
addis %r11,%r11,PPC_TRAMP_MAP_SIZE@ha
|
407
|
+
mtlr %r0
|
408
|
+
lwz %r0,(PPC_TRAMP_MAP_SIZE-4)@l(%r11)
|
409
|
+
mtctr %r0
|
410
|
+
lwz %r11,(PPC_TRAMP_MAP_SIZE-8)@l(%r11)
|
411
|
+
bctr
|
412
|
+
nop
|
413
|
+
.endr
|
414
|
+
.size trampoline_code_table,.-trampoline_code_table
|
415
|
+
.align PPC_TRAMP_MAP_SHIFT
|
416
|
+
#endif /* FFI_EXEC_STATIC_TRAMP */
|
417
|
+
|
394
418
|
#if defined __ELF__ && defined __linux__
|
395
419
|
.section .note.GNU-stack,"",@progbits
|
396
420
|
#endif
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/* -----------------------------------------------------------------------
|
2
|
-
prep_cif.c - Copyright (c) 2011, 2012, 2021 Anthony Green
|
2
|
+
prep_cif.c - Copyright (c) 2011, 2012, 2021, 2025 Anthony Green
|
3
3
|
Copyright (c) 1996, 1998, 2007 Red Hat, Inc.
|
4
4
|
Copyright (c) 2022 Oracle and/or its affiliates.
|
5
5
|
|
@@ -158,9 +158,6 @@ ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi,
|
|
158
158
|
#endif
|
159
159
|
#ifdef XTENSA
|
160
160
|
&& (cif->rtype->size > 16)
|
161
|
-
#endif
|
162
|
-
#ifdef NIOS2
|
163
|
-
&& (cif->rtype->size > 8)
|
164
161
|
#endif
|
165
162
|
)
|
166
163
|
bytes = STACK_ARG_SIZE(sizeof(void*));
|
@@ -32,6 +32,7 @@
|
|
32
32
|
#include <ffi_common.h>
|
33
33
|
#include <stdint.h>
|
34
34
|
#include "internal.h"
|
35
|
+
#include <tramp.h>
|
35
36
|
|
36
37
|
/*====================== End of Includes =============================*/
|
37
38
|
|
@@ -720,16 +721,30 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
|
720
721
|
#endif
|
721
722
|
0x07f1 /* br %r1 */
|
722
723
|
};
|
723
|
-
|
724
|
+
void (*dest)(void);
|
724
725
|
unsigned long *tramp = (unsigned long *)&closure->tramp;
|
725
726
|
|
726
727
|
if (cif->abi != FFI_SYSV)
|
727
728
|
return FFI_BAD_ABI;
|
728
729
|
|
730
|
+
|
731
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
732
|
+
if (ffi_tramp_is_present(closure))
|
733
|
+
{
|
734
|
+
/* Initialize the static trampoline's parameters. */
|
735
|
+
dest = ffi_closure_SYSV;
|
736
|
+
ffi_tramp_set_parms (closure->ftramp, dest, closure);
|
737
|
+
goto out;
|
738
|
+
}
|
739
|
+
#endif
|
740
|
+
|
729
741
|
memcpy (tramp, template, sizeof(template));
|
730
742
|
tramp[2] = (unsigned long)codeloc;
|
731
743
|
tramp[3] = (unsigned long)&ffi_closure_SYSV;
|
732
744
|
|
745
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
746
|
+
out:
|
747
|
+
#endif
|
733
748
|
closure->cif = cif;
|
734
749
|
closure->fun = fun;
|
735
750
|
closure->user_data = user_data;
|
@@ -754,3 +769,15 @@ ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif,
|
|
754
769
|
|
755
770
|
return FFI_OK;
|
756
771
|
}
|
772
|
+
|
773
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
774
|
+
void *
|
775
|
+
ffi_tramp_arch (size_t *tramp_size, size_t *map_size)
|
776
|
+
{
|
777
|
+
extern void *trampoline_code_table;
|
778
|
+
|
779
|
+
*tramp_size = FFI390_TRAMP_SIZE;
|
780
|
+
*map_size = FFI390_TRAMP_MAP_SIZE;
|
781
|
+
return &trampoline_code_table;
|
782
|
+
}
|
783
|
+
#endif
|
@@ -9,3 +9,14 @@
|
|
9
9
|
#define FFI390_RET_IN_MEM 8
|
10
10
|
|
11
11
|
#define FFI390_RET_STRUCT (FFI390_RET_VOID | FFI390_RET_IN_MEM)
|
12
|
+
|
13
|
+
|
14
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
15
|
+
/*
|
16
|
+
* For the trampoline code table mapping, a mapping size of 4K is chosen.
|
17
|
+
*/
|
18
|
+
#define FFI390_TRAMP_MAP_SHIFT 12
|
19
|
+
#define FFI390_TRAMP_MAP_SIZE (1 << FFI390_TRAMP_MAP_SHIFT)
|
20
|
+
#define FFI390_TRAMP_SIZE 16
|
21
|
+
|
22
|
+
#endif
|
@@ -28,6 +28,7 @@
|
|
28
28
|
#define LIBFFI_ASM
|
29
29
|
#include <fficonfig.h>
|
30
30
|
#include <ffi.h>
|
31
|
+
#include "internal.h"
|
31
32
|
|
32
33
|
.text
|
33
34
|
|
@@ -318,6 +319,43 @@ ffi_closure_SYSV:
|
|
318
319
|
br %r14
|
319
320
|
.cfi_endproc
|
320
321
|
.size ffi_closure_SYSV,.-ffi_closure_SYSV
|
322
|
+
|
323
|
+
|
324
|
+
#if defined(FFI_EXEC_STATIC_TRAMP)
|
325
|
+
/*
|
326
|
+
* Below is the definition of the trampoline code table. Each element in
|
327
|
+
* the code table is a trampoline.
|
328
|
+
*/
|
329
|
+
/*
|
330
|
+
* The trampoline uses the volatile register r0 and r1. As the registers are
|
331
|
+
* marked volatile in the ABI, the original values are not saved.
|
332
|
+
*
|
333
|
+
* The trampoline has two parameters - target code to jump to and data for
|
334
|
+
* the target code. The trampoline extracts the parameters from its parameter
|
335
|
+
* block (see tramp_table_map()). The trampoline saves the data address in r0.
|
336
|
+
* Finally, it jumps to the target code.
|
337
|
+
*/
|
338
|
+
|
339
|
+
.align FFI390_TRAMP_MAP_SIZE
|
340
|
+
trampoline_code_table:
|
341
|
+
.rept FFI390_TRAMP_MAP_SIZE / FFI390_TRAMP_SIZE
|
342
|
+
basr %r1,0 # load next instruction address to r1
|
343
|
+
lmg %r0,%r1,4094(%r1) # load parameter block
|
344
|
+
# r0 -> data
|
345
|
+
# r1 -> code
|
346
|
+
br %r1 # jump to r1/code
|
347
|
+
.balign 8
|
348
|
+
.endr
|
349
|
+
|
350
|
+
.globl trampoline_code_table
|
351
|
+
FFI_HIDDEN(trampoline_code_table)
|
352
|
+
#ifdef __ELF__
|
353
|
+
.type trampoline_code_table, @function
|
354
|
+
.size trampoline_code_table,.- trampoline_code_table
|
355
|
+
#endif
|
356
|
+
.align FFI390_TRAMP_MAP_SIZE
|
357
|
+
#endif /* FFI_EXEC_STATIC_TRAMP */
|
358
|
+
|
321
359
|
#endif /* !s390x */
|
322
360
|
|
323
361
|
#if defined __ELF__ && defined __linux__
|
@@ -286,6 +286,8 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
286
286
|
void **avalue, void *closure)
|
287
287
|
{
|
288
288
|
size_t bytes = cif->bytes;
|
289
|
+
size_t i, nargs = cif->nargs;
|
290
|
+
ffi_type **arg_types = cif->arg_types;
|
289
291
|
|
290
292
|
FFI_ASSERT (cif->abi == FFI_V8);
|
291
293
|
|
@@ -295,6 +297,20 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
|
295
297
|
&& (cif->flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT)
|
296
298
|
bytes += FFI_ALIGN (cif->rtype->size, 8);
|
297
299
|
|
300
|
+
/* If we have any structure arguments, make a copy so we are passing
|
301
|
+
by value. */
|
302
|
+
for (i = 0; i < nargs; i++)
|
303
|
+
{
|
304
|
+
ffi_type *at = arg_types[i];
|
305
|
+
int size = at->size;
|
306
|
+
if (at->type == FFI_TYPE_STRUCT)
|
307
|
+
{
|
308
|
+
char *argcopy = alloca (size);
|
309
|
+
memcpy (argcopy, avalue[i], size);
|
310
|
+
avalue[i] = argcopy;
|
311
|
+
}
|
312
|
+
}
|
313
|
+
|
298
314
|
ffi_call_v8(cif, fn, rvalue, avalue, -bytes, closure);
|
299
315
|
}
|
300
316
|
|