@@ -13,368 +13,6 @@ tar -xf libffi-${LIBFFI_VERSION}.tar.gz
1313
1414pushd libffi-${LIBFFI_VERSION}
1515
16- # Patches needed to fix compilation on aarch64. Will presumably be in libffi
17- # 3.4.7 or 3.5.
18-
19- # Commit f64141ee3f9e455a060bd09e9ab72b6c94653d7c.
20- patch -p1 << 'EOF '
21- diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
22- index fdd0e8b..60cfa50 100644
23- --- a/src/aarch64/sysv.S
24- +++ b/src/aarch64/sysv.S
25- @@ -68,7 +68,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
26- #define BTI_J hint #36
27- /*
28- * The ELF Notes section needs to indicate if BTI is supported, as the first ELF loaded that doesn't
29- - * declare this support disables it for the whole process.
30- + * declare this support disables it for memory region containing the loaded library.
31- */
32- # define GNU_PROPERTY_AARCH64_BTI (1 << 0) /* Has Branch Target Identification */
33- .text
34- @@ -527,6 +527,7 @@ L(do_closure):
35- #if defined(FFI_EXEC_STATIC_TRAMP)
36- .align 4
37- CNAME(ffi_closure_SYSV_V_alt):
38- + BTI_C
39- /* See the comments above trampoline_code_table. */
40- ldr x17, [sp, #8] /* Load closure in x17 */
41- add sp, sp, #16 /* Restore the stack */
42- @@ -541,6 +542,7 @@ CNAME(ffi_closure_SYSV_V_alt):
43-
44- .align 4
45- CNAME(ffi_closure_SYSV_alt):
46- + BTI_C
47- /* See the comments above trampoline_code_table. */
48- ldr x17, [sp, #8] /* Load closure in x17 */
49- add sp, sp, #16 /* Restore the stack */
50- diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am
51- index d286cf7..6ba98e1 100644
52- --- a/testsuite/Makefile.am
53- +++ b/testsuite/Makefile.am
54- @@ -8,7 +8,7 @@ CLEANFILES = *.exe core* *.log *.sum
55-
56- EXTRA_DIST = config/default.exp emscripten/build.sh emscripten/conftest.py \
57- emscripten/node-tests.sh emscripten/test.html emscripten/test_libffi.py \
58- - emscripten/build-tests.sh lib/libffi.exp lib/target-libpath.exp \
59- + emscripten/build-tests.sh lib/libffi.exp lib/target-libpath.exp \
60- lib/wrapper.exp libffi.bhaible/Makefile libffi.bhaible/README \
61- libffi.bhaible/alignof.h libffi.bhaible/bhaible.exp libffi.bhaible/test-call.c \
62- libffi.bhaible/test-callback.c libffi.bhaible/testcases.c libffi.call/align_mixed.c \
63- EOF
64-
65- # Commit 45d284f2d066cc3a080c5be88e51b4d934349797.
66- patch -p1 << 'EOF '
67- diff --git a/configure.ac b/configure.ac
68- index 816bfd6..b35a999 100644
69- --- a/configure.ac
70- +++ b/configure.ac
71- @@ -189,17 +189,17 @@ AC_CACHE_CHECK([whether compiler supports pointer authentication],
72- AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
73- #ifdef __clang__
74- # if __has_feature(ptrauth_calls)
75- -# define HAVE_PTRAUTH 1
76- +# define HAVE_ARM64E_PTRAUTH 1
77- # endif
78- #endif
79-
80- -#ifndef HAVE_PTRAUTH
81- +#ifndef HAVE_ARM64E_PTRAUTH
82- # error Pointer authentication not supported
83- #endif
84- ]])],[libffi_cv_as_ptrauth=yes],[libffi_cv_as_ptrauth=no])
85- ])
86- if test "x$libffi_cv_as_ptrauth" = xyes; then
87- - AC_DEFINE(HAVE_PTRAUTH, 1,
88- + AC_DEFINE(HAVE_ARM64E_PTRAUTH, 1,
89- [Define if your compiler supports pointer authentication.])
90- fi
91-
92- diff --git a/include/ffi_cfi.h b/include/ffi_cfi.h
93- index f4c292d..8565663 100644
94- --- a/include/ffi_cfi.h
95- +++ b/include/ffi_cfi.h
96- @@ -49,6 +49,7 @@
97- # define cfi_personality(enc, exp) .cfi_personality enc, exp
98- # define cfi_lsda(enc, exp) .cfi_lsda enc, exp
99- # define cfi_escape(...) .cfi_escape __VA_ARGS__
100- +# define cfi_window_save .cfi_window_save
101-
102- #else
103-
104- @@ -71,6 +72,7 @@
105- # define cfi_personality(enc, exp)
106- # define cfi_lsda(enc, exp)
107- # define cfi_escape(...)
108- +# define cfi_window_save
109-
110- #endif /* HAVE_AS_CFI_PSEUDO_OP */
111- #endif /* FFI_CFI_H */
112- diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c
113- index b13738e..964934d 100644
114- --- a/src/aarch64/ffi.c
115- +++ b/src/aarch64/ffi.c
116- @@ -63,7 +63,7 @@ struct call_context
117- #if FFI_EXEC_TRAMPOLINE_TABLE
118-
119- #ifdef __MACH__
120- -#ifdef HAVE_PTRAUTH
121- +#ifdef HAVE_ARM64E_PTRAUTH
122- #include <ptrauth.h>
123- #endif
124- #include <mach/vm_param.h>
125- @@ -877,7 +877,7 @@ ffi_prep_closure_loc (ffi_closure *closure,
126-
127- #if FFI_EXEC_TRAMPOLINE_TABLE
128- # ifdef __MACH__
129- -# ifdef HAVE_PTRAUTH
130- +# ifdef HAVE_ARM64E_PTRAUTH
131- codeloc = ptrauth_auth_data(codeloc, ptrauth_key_function_pointer, 0);
132- # endif
133- void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE);
134- diff --git a/src/aarch64/internal.h b/src/aarch64/internal.h
135- index b5d102b..c39f9cb 100644
136- --- a/src/aarch64/internal.h
137- +++ b/src/aarch64/internal.h
138- @@ -81,20 +81,62 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
139- /* Helpers for writing assembly compatible with arm ptr auth */
140- #ifdef LIBFFI_ASM
141-
142- -#ifdef HAVE_PTRAUTH
143- -#define SIGN_LR pacibsp
144- -#define SIGN_LR_WITH_REG(x) pacib lr, x
145- -#define AUTH_LR_AND_RET retab
146- -#define AUTH_LR_WITH_REG(x) autib lr, x
147- -#define BRANCH_AND_LINK_TO_REG blraaz
148- -#define BRANCH_TO_REG braaz
149- -#else
150- -#define SIGN_LR
151- -#define SIGN_LR_WITH_REG(x)
152- -#define AUTH_LR_AND_RET ret
153- -#define AUTH_LR_WITH_REG(x)
154- -#define BRANCH_AND_LINK_TO_REG blr
155- -#define BRANCH_TO_REG br
156- -#endif
157- -
158- -#endif
159- + #if defined(HAVE_ARM64E_PTRAUTH)
160- + /* ARM64E ABI For Darwin */
161- + #define SIGN_LR pacibsp
162- + #define SIGN_LR_WITH_REG(x) pacib lr, x
163- + #define AUTH_LR_AND_RET retab
164- + #define AUTH_LR_WITH_REG(x) autib lr, x
165- + #define BRANCH_AND_LINK_TO_REG blraaz
166- + #define BRANCH_TO_REG braaz
167- + #define PAC_CFI_WINDOW_SAVE
168- + /* Linux PAC Support */
169- + #elif defined(__ARM_FEATURE_PAC_DEFAULT)
170- + #define GNU_PROPERTY_AARCH64_POINTER_AUTH (1 << 1)
171- + #define PAC_CFI_WINDOW_SAVE cfi_window_save
172- + #define TMP_REG x9
173- + #define BRANCH_TO_REG br
174- + #define BRANCH_AND_LINK_TO_REG blr
175- + #define SIGN_LR_LINUX_ONLY SIGN_LR
176- + /* Which key to sign with? */
177- + #if (__ARM_FEATURE_PAC_DEFAULT & 1) == 1
178- + /* Signed with A-key */
179- + #define SIGN_LR hint #25 /* paciasp */
180- + #define AUTH_LR hint #29 /* autiasp */
181- + #else
182- + /* Signed with B-key */
183- + #define SIGN_LR hint #27 /* pacibsp */
184- + #define AUTH_LR hint #31 /* autibsp */
185- + #endif /* __ARM_FEATURE_PAC_DEFAULT */
186- + #define AUTH_LR_WITH_REG(x) _auth_lr_with_reg x
187- +.macro _auth_lr_with_reg modifier
188- + mov TMP_REG, sp
189- + mov sp, \modifier
190- + AUTH_LR
191- + mov sp, TMP_REG
192- +.endm
193- + #define SIGN_LR_WITH_REG(x) _sign_lr_with_reg x
194- +.macro _sign_lr_with_reg modifier
195- + mov TMP_REG, sp
196- + mov sp, \modifier
197- + SIGN_LR
198- + mov sp, TMP_REG
199- +.endm
200- + #define AUTH_LR_AND_RET _auth_lr_and_ret modifier
201- +.macro _auth_lr_and_ret modifier
202- + AUTH_LR
203- + ret
204- +.endm
205- + #undef TMP_REG
206- +
207- + /* No Pointer Auth */
208- + #else
209- + #define SIGN_LR
210- + #define SIGN_LR_WITH_REG(x)
211- + #define AUTH_LR_AND_RET ret
212- + #define AUTH_LR_WITH_REG(x)
213- + #define BRANCH_AND_LINK_TO_REG blr
214- + #define BRANCH_TO_REG br
215- + #define PAC_CFI_WINDOW_SAVE
216- + #endif /* HAVE_ARM64E_PTRAUTH */
217- +#endif /* LIBFFI_ASM */
218- diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
219- index 60cfa50..6a9a561 100644
220- --- a/src/aarch64/sysv.S
221- +++ b/src/aarch64/sysv.S
222- @@ -92,27 +92,27 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
223- cfi_startproc
224- CNAME(ffi_call_SYSV):
225- BTI_C
226- - /* Sign the lr with x1 since that is where it will be stored */
227- + PAC_CFI_WINDOW_SAVE
228- + /* Sign the lr with x1 since that is the CFA which is the modifer used in auth instructions */
229- SIGN_LR_WITH_REG(x1)
230-
231- - /* Use a stack frame allocated by our caller. */
232- -#if defined(HAVE_PTRAUTH) && defined(__APPLE__)
233- +#if defined(HAVE_ARM64E_PTRAUTH) && defined(__APPLE__)
234- /* darwin's libunwind assumes that the cfa is the sp and that's the data
235- * used to sign the lr. In order to allow unwinding through this
236- * function it is necessary to point the cfa at the signing register.
237- */
238- cfi_def_cfa(x1, 0);
239- -#else
240- - cfi_def_cfa(x1, 40);
241- #endif
242- + /* Use a stack frame allocated by our caller. */
243- stp x29, x30, [x1]
244- + cfi_def_cfa_register(x1)
245- + cfi_rel_offset (x29, 0)
246- + cfi_rel_offset (x30, 8)
247- mov x9, sp
248- str x9, [x1, #32]
249- mov x29, x1
250- - mov sp, x0
251- cfi_def_cfa_register(x29)
252- - cfi_rel_offset (x29, 0)
253- - cfi_rel_offset (x30, 8)
254- + mov sp, x0
255-
256- mov x9, x2 /* save fn */
257- mov x8, x3 /* install structure return */
258- @@ -326,6 +326,7 @@ CNAME(ffi_closure_SYSV_V):
259- cfi_startproc
260- BTI_C
261- SIGN_LR
262- + PAC_CFI_WINDOW_SAVE
263- stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
264- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
265- cfi_rel_offset (x29, 0)
266- @@ -351,6 +352,7 @@ CNAME(ffi_closure_SYSV_V):
267- CNAME(ffi_closure_SYSV):
268- BTI_C
269- SIGN_LR
270- + PAC_CFI_WINDOW_SAVE
271- stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
272- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
273- cfi_rel_offset (x29, 0)
274- @@ -648,6 +650,8 @@ CNAME(ffi_go_closure_SYSV_V):
275- cfi_startproc
276- CNAME(ffi_go_closure_SYSV):
277- BTI_C
278- + SIGN_LR_LINUX_ONLY
279- + PAC_CFI_WINDOW_SAVE
280- stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
281- cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
282- cfi_rel_offset (x29, 0)
283- diff --git a/src/closures.c b/src/closures.c
284- index 67a94a8..02cf78f 100644
285- --- a/src/closures.c
286- +++ b/src/closures.c
287- @@ -164,7 +164,7 @@ ffi_tramp_is_present (__attribute__((unused)) void *ptr)
288-
289- #include <mach/mach.h>
290- #include <pthread.h>
291- -#ifdef HAVE_PTRAUTH
292- +#ifdef HAVE_ARM64E_PTRAUTH
293- #include <ptrauth.h>
294- #endif
295- #include <stdio.h>
296- @@ -223,7 +223,7 @@ ffi_trampoline_table_alloc (void)
297- /* Remap the trampoline table on top of the placeholder page */
298- trampoline_page = config_page + PAGE_MAX_SIZE;
299-
300- -#ifdef HAVE_PTRAUTH
301- +#ifdef HAVE_ARM64E_PTRAUTH
302- trampoline_page_template = (vm_address_t)(uintptr_t)ptrauth_auth_data((void *)&ffi_closure_trampoline_table_page, ptrauth_key_function_pointer, 0);
303- #else
304- trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page;
305- @@ -268,7 +268,7 @@ ffi_trampoline_table_alloc (void)
306- ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
307- entry->trampoline =
308- (void *) (trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
309- -#ifdef HAVE_PTRAUTH
310- +#ifdef HAVE_ARM64E_PTRAUTH
311- entry->trampoline = ptrauth_sign_unauthenticated(entry->trampoline, ptrauth_key_function_pointer, 0);
312- #endif
313-
314- EOF
315-
316- # Commit 9c9e8368e49804c4f7c35ac9f0d7c1d0d533308b.
317- patch -p1 << 'EOF '
318- diff --git a/src/aarch64/internal.h b/src/aarch64/internal.h
319- index c39f9cb..50fa5c1 100644
320- --- a/src/aarch64/internal.h
321- +++ b/src/aarch64/internal.h
322- @@ -88,6 +88,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
323- #define AUTH_LR_AND_RET retab
324- #define AUTH_LR_WITH_REG(x) autib lr, x
325- #define BRANCH_AND_LINK_TO_REG blraaz
326- + #define SIGN_LR_LINUX_ONLY
327- #define BRANCH_TO_REG braaz
328- #define PAC_CFI_WINDOW_SAVE
329- /* Linux PAC Support */
330- @@ -136,6 +137,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
331- #define AUTH_LR_AND_RET ret
332- #define AUTH_LR_WITH_REG(x)
333- #define BRANCH_AND_LINK_TO_REG blr
334- + #define SIGN_LR_LINUX_ONLY
335- #define BRANCH_TO_REG br
336- #define PAC_CFI_WINDOW_SAVE
337- #endif /* HAVE_ARM64E_PTRAUTH */
338- EOF
339-
340- # Commit 8308bed5b2423878aa20d7884a99cf2e30b8daf7.
341- patch -p1 << 'EOF '
342- diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
343- index 6a9a561..e83bc65 100644
344- --- a/src/aarch64/sysv.S
345- +++ b/src/aarch64/sysv.S
346- @@ -89,8 +89,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
347- x5 closure
348- */
349-
350- - cfi_startproc
351- CNAME(ffi_call_SYSV):
352- + cfi_startproc
353- BTI_C
354- PAC_CFI_WINDOW_SAVE
355- /* Sign the lr with x1 since that is the CFA which is the modifer used in auth instructions */
356- @@ -348,8 +348,8 @@ CNAME(ffi_closure_SYSV_V):
357- #endif
358-
359- .align 4
360- - cfi_startproc
361- CNAME(ffi_closure_SYSV):
362- + cfi_startproc
363- BTI_C
364- SIGN_LR
365- PAC_CFI_WINDOW_SAVE
366- @@ -647,8 +647,8 @@ CNAME(ffi_go_closure_SYSV_V):
367- #endif
368-
369- .align 4
370- - cfi_startproc
371- CNAME(ffi_go_closure_SYSV):
372- + cfi_startproc
373- BTI_C
374- SIGN_LR_LINUX_ONLY
375- PAC_CFI_WINDOW_SAVE
376- EOF
377-
37816EXTRA_CONFIGURE=
37917
38018# mkostemp() was introduced in macOS 10.10 and libffi doesn't have
0 commit comments