89 lines
2.2 KiB
Text
89 lines
2.2 KiB
Text
|
Index: src/aarch64/ffi.c
|
||
|
--- src/aarch64/ffi.c.orig
|
||
|
+++ src/aarch64/ffi.c
|
||
|
@@ -390,47 +390,59 @@ extend_hfa_type (void *dest, void *src, int h)
|
||
|
"adr %0, 0f\n"
|
||
|
" add %0, %0, %1\n"
|
||
|
" br %0\n"
|
||
|
-"0: ldp s16, s17, [%3]\n" /* S4 */
|
||
|
+"0: bti j\n" /* S4 */
|
||
|
+" ldp s16, s17, [%3]\n"
|
||
|
" ldp s18, s19, [%3, #8]\n"
|
||
|
" b 4f\n"
|
||
|
-" ldp s16, s17, [%3]\n" /* S3 */
|
||
|
+" bti j\n" /* S3 */
|
||
|
+" ldp s16, s17, [%3]\n"
|
||
|
" ldr s18, [%3, #8]\n"
|
||
|
" b 3f\n"
|
||
|
-" ldp s16, s17, [%3]\n" /* S2 */
|
||
|
+" bti j\n" /* S2 */
|
||
|
+" ldp s16, s17, [%3]\n"
|
||
|
" b 2f\n"
|
||
|
" nop\n"
|
||
|
-" ldr s16, [%3]\n" /* S1 */
|
||
|
+" bti j\n" /* S1 */
|
||
|
+" ldr s16, [%3]\n"
|
||
|
" b 1f\n"
|
||
|
" nop\n"
|
||
|
-" ldp d16, d17, [%3]\n" /* D4 */
|
||
|
+" bti j\n" /* D4 */
|
||
|
+" ldp d16, d17, [%3]\n"
|
||
|
" ldp d18, d19, [%3, #16]\n"
|
||
|
" b 4f\n"
|
||
|
-" ldp d16, d17, [%3]\n" /* D3 */
|
||
|
+" bti j\n" /* D3 */
|
||
|
+" ldp d16, d17, [%3]\n"
|
||
|
" ldr d18, [%3, #16]\n"
|
||
|
" b 3f\n"
|
||
|
-" ldp d16, d17, [%3]\n" /* D2 */
|
||
|
+" bti j\n" /* D2 */
|
||
|
+" ldp d16, d17, [%3]\n"
|
||
|
" b 2f\n"
|
||
|
" nop\n"
|
||
|
-" ldr d16, [%3]\n" /* D1 */
|
||
|
+" bti j\n" /* D1 */
|
||
|
+" ldr d16, [%3]\n"
|
||
|
" b 1f\n"
|
||
|
" nop\n"
|
||
|
-" ldp q16, q17, [%3]\n" /* Q4 */
|
||
|
+" bti j\n" /* Q4 */
|
||
|
+" ldp q16, q17, [%3]\n"
|
||
|
" ldp q18, q19, [%3, #32]\n"
|
||
|
" b 4f\n"
|
||
|
-" ldp q16, q17, [%3]\n" /* Q3 */
|
||
|
+" bti j\n" /* Q3 */
|
||
|
+" ldp q16, q17, [%3]\n"
|
||
|
" ldr q18, [%3, #32]\n"
|
||
|
" b 3f\n"
|
||
|
-" ldp q16, q17, [%3]\n" /* Q2 */
|
||
|
+" bti j\n" /* Q2 */
|
||
|
+" ldp q16, q17, [%3]\n"
|
||
|
" b 2f\n"
|
||
|
" nop\n"
|
||
|
-" ldr q16, [%3]\n" /* Q1 */
|
||
|
+" bti j\n" /* Q1 */
|
||
|
+" ldr q16, [%3]\n"
|
||
|
" b 1f\n"
|
||
|
"4: str q19, [%2, #48]\n"
|
||
|
"3: str q18, [%2, #32]\n"
|
||
|
"2: str q17, [%2, #16]\n"
|
||
|
"1: str q16, [%2]"
|
||
|
: "=&r"(x0)
|
||
|
- : "r"(f * 12), "r"(dest), "r"(src)
|
||
|
+ : "r"(f * 16), "r"(dest), "r"(src)
|
||
|
: "memory", "v16", "v17", "v18", "v19");
|
||
|
}
|
||
|
#endif
|
||
|
@@ -873,8 +885,9 @@ ffi_prep_closure_loc (ffi_closure *closure,
|
||
|
# endif
|
||
|
#else
|
||
|
static const unsigned char trampoline[16] = {
|
||
|
- 0x90, 0x00, 0x00, 0x58, /* ldr x16, tramp+16 */
|
||
|
- 0xf1, 0xff, 0xff, 0x10, /* adr x17, tramp+0 */
|
||
|
+ 0x5f, 0x24, 0x03, 0xd5, /* bti c */
|
||
|
+ 0x70, 0x00, 0x00, 0x58, /* ldr x16, tramp+16 */
|
||
|
+ 0xd1, 0xff, 0xff, 0x10, /* adr x17, tramp+0 */
|
||
|
0x00, 0x02, 0x1f, 0xd6 /* br x16 */
|
||
|
};
|
||
|
char *tramp = closure->tramp;
|