Accepting request 1131289 from home:Guillaume_G:PAC_BTI
- Add upstream patches to fix BTI on aarch64: * 808.patch * 810.patch OBS-URL: https://build.opensuse.org/request/show/1131289 OBS-URL: https://build.opensuse.org/package/show/devel:libraries:c_c++/libffi?expand=0&rev=32
This commit is contained in:
parent
74d1b2c03c
commit
0791d1e60d
457
808.patch
Normal file
457
808.patch
Normal file
@ -0,0 +1,457 @@
|
||||
From cdb7b8c44f23d850d0fc5d783cb42f1bc516252f Mon Sep 17 00:00:00 2001
|
||||
From: Tobias Heider <me@tobhe.de>
|
||||
Date: Wed, 22 Nov 2023 15:21:56 +0100
|
||||
Subject: [PATCH] Add bti intructions to aarch64 assembly to work with strict
|
||||
BTI enforcement on OpenBSD.
|
||||
|
||||
---
|
||||
src/aarch64/ffi.c | 38 +++++---
|
||||
src/aarch64/sysv.S | 223 +++++++++++++++++++++++++++++++++++----------
|
||||
2 files changed, 202 insertions(+), 59 deletions(-)
|
||||
|
||||
diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c
|
||||
index 6544ac0fe..67b18fbfb 100644
|
||||
--- a/src/aarch64/ffi.c
|
||||
+++ b/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
|
||||
diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
|
||||
index 286f1f137..9f4188e00 100644
|
||||
--- a/src/aarch64/sysv.S
|
||||
+++ b/src/aarch64/sysv.S
|
||||
@@ -84,6 +84,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
cfi_startproc
|
||||
CNAME(ffi_call_SYSV):
|
||||
+ bti c
|
||||
/* Sign the lr with x1 since that is where it will be stored */
|
||||
SIGN_LR_WITH_REG(x1)
|
||||
|
||||
@@ -144,78 +145,142 @@ CNAME(ffi_call_SYSV):
|
||||
/* Save the return value as directed. */
|
||||
adr x5, 0f
|
||||
and w4, w4, #AARCH64_RET_MASK
|
||||
- add x5, x5, x4, lsl #3
|
||||
+ add x5, x5, x4, lsl #4
|
||||
br x5
|
||||
|
||||
- /* Note that each table entry is 2 insns, and thus 8 bytes.
|
||||
+ /* Note that each table entry is 4 insns, and thus 16 bytes.
|
||||
For integer data, note that we're storing into ffi_arg
|
||||
and therefore we want to extend to 64 bits; these types
|
||||
have two consecutive entries allocated for them. */
|
||||
.align 4
|
||||
-0: b 99f /* VOID */
|
||||
+0: bti j /* VOID */
|
||||
+ b 99f
|
||||
+ nop
|
||||
nop
|
||||
-1: str x0, [x3] /* INT64 */
|
||||
+1: bti j /* INT64 */
|
||||
+ str x0, [x3]
|
||||
b 99f
|
||||
-2: stp x0, x1, [x3] /* INT128 */
|
||||
+ nop
|
||||
+2: bti j /* INT128 */
|
||||
+ stp x0, x1, [x3]
|
||||
b 99f
|
||||
+ nop
|
||||
3: brk #1000 /* UNUSED */
|
||||
b 99f
|
||||
+ nop
|
||||
+ nop
|
||||
4: brk #1000 /* UNUSED */
|
||||
b 99f
|
||||
+ nop
|
||||
+ nop
|
||||
5: brk #1000 /* UNUSED */
|
||||
b 99f
|
||||
+ nop
|
||||
+ nop
|
||||
6: brk #1000 /* UNUSED */
|
||||
b 99f
|
||||
+ nop
|
||||
+ nop
|
||||
7: brk #1000 /* UNUSED */
|
||||
b 99f
|
||||
-8: st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */
|
||||
+ nop
|
||||
+ nop
|
||||
+8: bti j /* S4 */
|
||||
+ st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3]
|
||||
b 99f
|
||||
-9: st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */
|
||||
+ nop
|
||||
+9: bti j /* S3 */
|
||||
+ st3 { v0.s, v1.s, v2.s }[0], [x3]
|
||||
b 99f
|
||||
-10: stp s0, s1, [x3] /* S2 */
|
||||
+ nop
|
||||
+10: bti j /* S2 */
|
||||
+ stp s0, s1, [x3]
|
||||
b 99f
|
||||
-11: str s0, [x3] /* S1 */
|
||||
+ nop
|
||||
+11: bti j
|
||||
+ str s0, [x3] /* S1 */
|
||||
b 99f
|
||||
-12: st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */
|
||||
+ nop
|
||||
+12: bti j /* D4 */
|
||||
+ st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3]
|
||||
b 99f
|
||||
-13: st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */
|
||||
+ nop
|
||||
+13: bti j /* D3 */
|
||||
+ st3 { v0.d, v1.d, v2.d }[0], [x3]
|
||||
b 99f
|
||||
-14: stp d0, d1, [x3] /* D2 */
|
||||
+ nop
|
||||
+14: bti j /* D2 */
|
||||
+ stp d0, d1, [x3]
|
||||
b 99f
|
||||
-15: str d0, [x3] /* D1 */
|
||||
+ nop
|
||||
+15: bti j /* D1 */
|
||||
+ str d0, [x3]
|
||||
b 99f
|
||||
-16: str q3, [x3, #48] /* Q4 */
|
||||
nop
|
||||
-17: str q2, [x3, #32] /* Q3 */
|
||||
+16: bti j /* Q4 */
|
||||
+ str q3, [x3, #48]
|
||||
+ nop
|
||||
nop
|
||||
-18: stp q0, q1, [x3] /* Q2 */
|
||||
+17: bti j /* Q3 */
|
||||
+ str q2, [x3, #32]
|
||||
+ nop
|
||||
+ nop
|
||||
+18: bti j /* Q2 */
|
||||
+ stp q0, q1, [x3]
|
||||
b 99f
|
||||
-19: str q0, [x3] /* Q1 */
|
||||
+ nop
|
||||
+19: bti j /* Q1 */
|
||||
+ str q0, [x3]
|
||||
b 99f
|
||||
-20: uxtb w0, w0 /* UINT8 */
|
||||
+ nop
|
||||
+20: bti j /* UINT8 */
|
||||
+ uxtb w0, w0
|
||||
str x0, [x3]
|
||||
+ nop
|
||||
21: b 99f /* reserved */
|
||||
nop
|
||||
-22: uxth w0, w0 /* UINT16 */
|
||||
+ nop
|
||||
+ nop
|
||||
+22: bti j /* UINT16 */
|
||||
+ uxth w0, w0
|
||||
str x0, [x3]
|
||||
+ nop
|
||||
23: b 99f /* reserved */
|
||||
nop
|
||||
-24: mov w0, w0 /* UINT32 */
|
||||
+ nop
|
||||
+ nop
|
||||
+24: bti j /* UINT32 */
|
||||
+ mov w0, w0
|
||||
str x0, [x3]
|
||||
+ nop
|
||||
25: b 99f /* reserved */
|
||||
nop
|
||||
-26: sxtb x0, w0 /* SINT8 */
|
||||
+ nop
|
||||
+ nop
|
||||
+26: bti j /* SINT8 */
|
||||
+ sxtb x0, w0
|
||||
str x0, [x3]
|
||||
+ nop
|
||||
27: b 99f /* reserved */
|
||||
nop
|
||||
-28: sxth x0, w0 /* SINT16 */
|
||||
+ nop
|
||||
+ nop
|
||||
+28: bti j /* SINT16 */
|
||||
+ sxth x0, w0
|
||||
str x0, [x3]
|
||||
+ nop
|
||||
29: b 99f /* reserved */
|
||||
nop
|
||||
-30: sxtw x0, w0 /* SINT32 */
|
||||
+ nop
|
||||
+ nop
|
||||
+30: bti j /* SINT32 */
|
||||
+ sxtw x0, w0
|
||||
str x0, [x3]
|
||||
+ nop
|
||||
31: b 99f /* reserved */
|
||||
nop
|
||||
+ nop
|
||||
+ nop
|
||||
|
||||
/* Return now that result has been populated. */
|
||||
99:
|
||||
@@ -252,6 +317,7 @@ CNAME(ffi_call_SYSV):
|
||||
.align 4
|
||||
CNAME(ffi_closure_SYSV_V):
|
||||
cfi_startproc
|
||||
+ bti c
|
||||
SIGN_LR
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
@@ -276,6 +342,7 @@ CNAME(ffi_closure_SYSV_V):
|
||||
.align 4
|
||||
cfi_startproc
|
||||
CNAME(ffi_closure_SYSV):
|
||||
+ bti c
|
||||
SIGN_LR
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
@@ -305,73 +372,135 @@ L(do_closure):
|
||||
/* Load the return value as directed. */
|
||||
adr x1, 0f
|
||||
and w0, w0, #AARCH64_RET_MASK
|
||||
- add x1, x1, x0, lsl #3
|
||||
+ add x1, x1, x0, lsl #4
|
||||
add x3, sp, #16+CALL_CONTEXT_SIZE
|
||||
br x1
|
||||
|
||||
- /* Note that each table entry is 2 insns, and thus 8 bytes. */
|
||||
+ /* Note that each table entry is 4 insns, and thus 16 bytes. */
|
||||
.align 4
|
||||
-0: b 99f /* VOID */
|
||||
+0: bti j /* VOID */
|
||||
+ b 99f
|
||||
+ nop
|
||||
nop
|
||||
-1: ldr x0, [x3] /* INT64 */
|
||||
+1: bti j /* INT64 */
|
||||
+ ldr x0, [x3]
|
||||
b 99f
|
||||
-2: ldp x0, x1, [x3] /* INT128 */
|
||||
+ nop
|
||||
+2: bti j /* INT128 */
|
||||
+ ldp x0, x1, [x3]
|
||||
b 99f
|
||||
+ nop
|
||||
3: brk #1000 /* UNUSED */
|
||||
nop
|
||||
+ nop
|
||||
+ nop
|
||||
4: brk #1000 /* UNUSED */
|
||||
nop
|
||||
+ nop
|
||||
+ nop
|
||||
5: brk #1000 /* UNUSED */
|
||||
nop
|
||||
+ nop
|
||||
+ nop
|
||||
6: brk #1000 /* UNUSED */
|
||||
nop
|
||||
+ nop
|
||||
+ nop
|
||||
7: brk #1000 /* UNUSED */
|
||||
nop
|
||||
-8: ldr s3, [x3, #12] /* S4 */
|
||||
nop
|
||||
-9: ldr s2, [x3, #8] /* S3 */
|
||||
nop
|
||||
-10: ldp s0, s1, [x3] /* S2 */
|
||||
+8: bti j /* S4 */
|
||||
+ ldr s3, [x3, #12]
|
||||
+ nop
|
||||
+ nop
|
||||
+9: bti j /* S3 */
|
||||
+ ldr s2, [x3, #8]
|
||||
+ nop
|
||||
+ nop
|
||||
+10: bti j /* S2 */
|
||||
+ ldp s0, s1, [x3]
|
||||
b 99f
|
||||
-11: ldr s0, [x3] /* S1 */
|
||||
+ nop
|
||||
+11: bti j /* S1 */
|
||||
+ ldr s0, [x3]
|
||||
b 99f
|
||||
-12: ldr d3, [x3, #24] /* D4 */
|
||||
nop
|
||||
-13: ldr d2, [x3, #16] /* D3 */
|
||||
+12: bti j /* D4 */
|
||||
+ ldr d3, [x3, #24]
|
||||
+ nop
|
||||
+ nop
|
||||
+13: bti j /* D3 */
|
||||
+ ldr d2, [x3, #16]
|
||||
nop
|
||||
-14: ldp d0, d1, [x3] /* D2 */
|
||||
+ nop
|
||||
+14: bti j /* D2 */
|
||||
+ ldp d0, d1, [x3]
|
||||
b 99f
|
||||
-15: ldr d0, [x3] /* D1 */
|
||||
+ nop
|
||||
+15: bti j /* D1 */
|
||||
+ ldr d0, [x3]
|
||||
b 99f
|
||||
-16: ldr q3, [x3, #48] /* Q4 */
|
||||
nop
|
||||
-17: ldr q2, [x3, #32] /* Q3 */
|
||||
+16: bti j /* Q4 */
|
||||
+ ldr q3, [x3, #48]
|
||||
nop
|
||||
-18: ldp q0, q1, [x3] /* Q2 */
|
||||
+ nop
|
||||
+17: bti j /* Q3 */
|
||||
+ ldr q2, [x3, #32]
|
||||
+ nop
|
||||
+ nop
|
||||
+18: bti j /* Q2 */
|
||||
+ ldp q0, q1, [x3]
|
||||
b 99f
|
||||
-19: ldr q0, [x3] /* Q1 */
|
||||
+ nop
|
||||
+19: bti j /* Q1 */
|
||||
+ ldr q0, [x3]
|
||||
b 99f
|
||||
-20: ldrb w0, [x3, #BE(7)] /* UINT8 */
|
||||
+ nop
|
||||
+20: bti j /* UINT8 */
|
||||
+ ldrb w0, [x3, #BE(7)]
|
||||
b 99f
|
||||
+ nop
|
||||
21: brk #1000 /* reserved */
|
||||
nop
|
||||
-22: ldrh w0, [x3, #BE(6)] /* UINT16 */
|
||||
+ nop
|
||||
+ nop
|
||||
+22: bti j /* UINT16 */
|
||||
+ ldrh w0, [x3, #BE(6)]
|
||||
b 99f
|
||||
+ nop
|
||||
23: brk #1000 /* reserved */
|
||||
nop
|
||||
-24: ldr w0, [x3, #BE(4)] /* UINT32 */
|
||||
+ nop
|
||||
+ nop
|
||||
+24: bti j /* UINT32 */
|
||||
+ ldr w0, [x3, #BE(4)]
|
||||
b 99f
|
||||
+ nop
|
||||
25: brk #1000 /* reserved */
|
||||
nop
|
||||
-26: ldrsb x0, [x3, #BE(7)] /* SINT8 */
|
||||
+ nop
|
||||
+ nop
|
||||
+26: bti j /* SINT8 */
|
||||
+ ldrsb x0, [x3, #BE(7)]
|
||||
b 99f
|
||||
+ nop
|
||||
27: brk #1000 /* reserved */
|
||||
nop
|
||||
-28: ldrsh x0, [x3, #BE(6)] /* SINT16 */
|
||||
+ nop
|
||||
+ nop
|
||||
+28: bti j /* SINT16 */
|
||||
+ ldrsh x0, [x3, #BE(6)]
|
||||
b 99f
|
||||
+ nop
|
||||
29: brk #1000 /* reserved */
|
||||
nop
|
||||
-30: ldrsw x0, [x3, #BE(4)] /* SINT32 */
|
||||
+ nop
|
||||
+ nop
|
||||
+30: bti j /* SINT32 */
|
||||
+ ldrsw x0, [x3, #BE(4)]
|
||||
+ nop
|
||||
nop
|
||||
31: /* reserved */
|
||||
99: ldp x29, x30, [sp], #ffi_closure_SYSV_FS
|
||||
@@ -485,6 +614,7 @@ CNAME(ffi_closure_trampoline_table_page):
|
||||
.align 4
|
||||
CNAME(ffi_go_closure_SYSV_V):
|
||||
cfi_startproc
|
||||
+ bti c
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
cfi_rel_offset (x29, 0)
|
||||
@@ -508,6 +638,7 @@ CNAME(ffi_go_closure_SYSV_V):
|
||||
.align 4
|
||||
cfi_startproc
|
||||
CNAME(ffi_go_closure_SYSV):
|
||||
+ bti c
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
cfi_rel_offset (x29, 0)
|
424
810.patch
Normal file
424
810.patch
Normal file
@ -0,0 +1,424 @@
|
||||
From ad3b42caa238330e872ae32adea55defe7a14286 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Martin=20Storsj=C3=B6?= <martin@martin.st>
|
||||
Date: Mon, 27 Nov 2023 00:39:21 +0200
|
||||
Subject: [PATCH] aarch64: Write the BTI instructions as "hint" instructions
|
||||
|
||||
GNU binutils refuses to assemble the direct BTI instructions unless
|
||||
the target architecture explicitly supports BTI, ending up with errors
|
||||
such as
|
||||
|
||||
../src/aarch64/sysv.S: Assembler messages:
|
||||
../src/aarch64/sysv.S:87: Error: selected processor does not support `bti c'
|
||||
../src/aarch64/sysv.S:156: Error: selected processor does not support `bti j'
|
||||
|
||||
Building with -march=armv8.5-a fixes building this.
|
||||
|
||||
However, the BTI instructions assemble into hint instructions, that
|
||||
are ignored by processors that don't implement them. Therefore it is
|
||||
possible to assemble them for the baseline armv8.0-a target as well,
|
||||
by replacing "bti j" with "hint #36", "bti c" with "hint #34" and
|
||||
"bti jc" with "hint #38"; this assembles into the same instruction
|
||||
bits.
|
||||
---
|
||||
src/aarch64/ffi.c | 25 ++++++------
|
||||
src/aarch64/sysv.S | 97 ++++++++++++++++++++++++----------------------
|
||||
2 files changed, 63 insertions(+), 59 deletions(-)
|
||||
|
||||
diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c
|
||||
index 67b18fbf..8661a352 100644
|
||||
--- a/src/aarch64/ffi.c
|
||||
+++ b/src/aarch64/ffi.c
|
||||
@@ -386,55 +386,56 @@ extend_hfa_type (void *dest, void *src, int h)
|
||||
ssize_t f = h - AARCH64_RET_S4;
|
||||
void *x0;
|
||||
|
||||
+#define BTI_J "hint #36"
|
||||
asm volatile (
|
||||
"adr %0, 0f\n"
|
||||
" add %0, %0, %1\n"
|
||||
" br %0\n"
|
||||
-"0: bti j\n" /* S4 */
|
||||
+"0: "BTI_J"\n" /* S4 */
|
||||
" ldp s16, s17, [%3]\n"
|
||||
" ldp s18, s19, [%3, #8]\n"
|
||||
" b 4f\n"
|
||||
-" bti j\n" /* S3 */
|
||||
+" "BTI_J"\n" /* S3 */
|
||||
" ldp s16, s17, [%3]\n"
|
||||
" ldr s18, [%3, #8]\n"
|
||||
" b 3f\n"
|
||||
-" bti j\n" /* S2 */
|
||||
+" "BTI_J"\n" /* S2 */
|
||||
" ldp s16, s17, [%3]\n"
|
||||
" b 2f\n"
|
||||
" nop\n"
|
||||
-" bti j\n" /* S1 */
|
||||
+" "BTI_J"\n" /* S1 */
|
||||
" ldr s16, [%3]\n"
|
||||
" b 1f\n"
|
||||
" nop\n"
|
||||
-" bti j\n" /* D4 */
|
||||
+" "BTI_J"\n" /* D4 */
|
||||
" ldp d16, d17, [%3]\n"
|
||||
" ldp d18, d19, [%3, #16]\n"
|
||||
" b 4f\n"
|
||||
-" bti j\n" /* D3 */
|
||||
+" "BTI_J"\n" /* D3 */
|
||||
" ldp d16, d17, [%3]\n"
|
||||
" ldr d18, [%3, #16]\n"
|
||||
" b 3f\n"
|
||||
-" bti j\n" /* D2 */
|
||||
+" "BTI_J"\n" /* D2 */
|
||||
" ldp d16, d17, [%3]\n"
|
||||
" b 2f\n"
|
||||
" nop\n"
|
||||
-" bti j\n" /* D1 */
|
||||
+" "BTI_J"\n" /* D1 */
|
||||
" ldr d16, [%3]\n"
|
||||
" b 1f\n"
|
||||
" nop\n"
|
||||
-" bti j\n" /* Q4 */
|
||||
+" "BTI_J"\n" /* Q4 */
|
||||
" ldp q16, q17, [%3]\n"
|
||||
" ldp q18, q19, [%3, #32]\n"
|
||||
" b 4f\n"
|
||||
-" bti j\n" /* Q3 */
|
||||
+" "BTI_J"\n" /* Q3 */
|
||||
" ldp q16, q17, [%3]\n"
|
||||
" ldr q18, [%3, #32]\n"
|
||||
" b 3f\n"
|
||||
-" bti j\n" /* Q2 */
|
||||
+" "BTI_J"\n" /* Q2 */
|
||||
" ldp q16, q17, [%3]\n"
|
||||
" b 2f\n"
|
||||
" nop\n"
|
||||
-" bti j\n" /* Q1 */
|
||||
+" "BTI_J"\n" /* Q1 */
|
||||
" ldr q16, [%3]\n"
|
||||
" b 1f\n"
|
||||
"4: str q19, [%2, #48]\n"
|
||||
diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S
|
||||
index 9f4188e0..90816752 100644
|
||||
--- a/src/aarch64/sysv.S
|
||||
+++ b/src/aarch64/sysv.S
|
||||
@@ -64,6 +64,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
#define PTR_SIZE 8
|
||||
#endif
|
||||
|
||||
+#define BTI_C hint #34
|
||||
+#define BTI_J hint #36
|
||||
+
|
||||
.text
|
||||
.align 4
|
||||
|
||||
@@ -84,7 +87,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
cfi_startproc
|
||||
CNAME(ffi_call_SYSV):
|
||||
- bti c
|
||||
+ BTI_C
|
||||
/* Sign the lr with x1 since that is where it will be stored */
|
||||
SIGN_LR_WITH_REG(x1)
|
||||
|
||||
@@ -153,15 +156,15 @@ CNAME(ffi_call_SYSV):
|
||||
and therefore we want to extend to 64 bits; these types
|
||||
have two consecutive entries allocated for them. */
|
||||
.align 4
|
||||
-0: bti j /* VOID */
|
||||
+0: BTI_J /* VOID */
|
||||
b 99f
|
||||
nop
|
||||
nop
|
||||
-1: bti j /* INT64 */
|
||||
+1: BTI_J /* INT64 */
|
||||
str x0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-2: bti j /* INT128 */
|
||||
+2: BTI_J /* INT128 */
|
||||
stp x0, x1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
@@ -185,55 +188,55 @@ CNAME(ffi_call_SYSV):
|
||||
b 99f
|
||||
nop
|
||||
nop
|
||||
-8: bti j /* S4 */
|
||||
+8: BTI_J /* S4 */
|
||||
st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3]
|
||||
b 99f
|
||||
nop
|
||||
-9: bti j /* S3 */
|
||||
+9: BTI_J /* S3 */
|
||||
st3 { v0.s, v1.s, v2.s }[0], [x3]
|
||||
b 99f
|
||||
nop
|
||||
-10: bti j /* S2 */
|
||||
+10: BTI_J /* S2 */
|
||||
stp s0, s1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-11: bti j
|
||||
+11: BTI_J
|
||||
str s0, [x3] /* S1 */
|
||||
b 99f
|
||||
nop
|
||||
-12: bti j /* D4 */
|
||||
+12: BTI_J /* D4 */
|
||||
st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3]
|
||||
b 99f
|
||||
nop
|
||||
-13: bti j /* D3 */
|
||||
+13: BTI_J /* D3 */
|
||||
st3 { v0.d, v1.d, v2.d }[0], [x3]
|
||||
b 99f
|
||||
nop
|
||||
-14: bti j /* D2 */
|
||||
+14: BTI_J /* D2 */
|
||||
stp d0, d1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-15: bti j /* D1 */
|
||||
+15: BTI_J /* D1 */
|
||||
str d0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-16: bti j /* Q4 */
|
||||
+16: BTI_J /* Q4 */
|
||||
str q3, [x3, #48]
|
||||
nop
|
||||
nop
|
||||
-17: bti j /* Q3 */
|
||||
+17: BTI_J /* Q3 */
|
||||
str q2, [x3, #32]
|
||||
nop
|
||||
nop
|
||||
-18: bti j /* Q2 */
|
||||
+18: BTI_J /* Q2 */
|
||||
stp q0, q1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-19: bti j /* Q1 */
|
||||
+19: BTI_J /* Q1 */
|
||||
str q0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-20: bti j /* UINT8 */
|
||||
+20: BTI_J /* UINT8 */
|
||||
uxtb w0, w0
|
||||
str x0, [x3]
|
||||
nop
|
||||
@@ -241,7 +244,7 @@ CNAME(ffi_call_SYSV):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-22: bti j /* UINT16 */
|
||||
+22: BTI_J /* UINT16 */
|
||||
uxth w0, w0
|
||||
str x0, [x3]
|
||||
nop
|
||||
@@ -249,7 +252,7 @@ CNAME(ffi_call_SYSV):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-24: bti j /* UINT32 */
|
||||
+24: BTI_J /* UINT32 */
|
||||
mov w0, w0
|
||||
str x0, [x3]
|
||||
nop
|
||||
@@ -257,7 +260,7 @@ CNAME(ffi_call_SYSV):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-26: bti j /* SINT8 */
|
||||
+26: BTI_J /* SINT8 */
|
||||
sxtb x0, w0
|
||||
str x0, [x3]
|
||||
nop
|
||||
@@ -265,7 +268,7 @@ CNAME(ffi_call_SYSV):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-28: bti j /* SINT16 */
|
||||
+28: BTI_J /* SINT16 */
|
||||
sxth x0, w0
|
||||
str x0, [x3]
|
||||
nop
|
||||
@@ -273,7 +276,7 @@ CNAME(ffi_call_SYSV):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-30: bti j /* SINT32 */
|
||||
+30: BTI_J /* SINT32 */
|
||||
sxtw x0, w0
|
||||
str x0, [x3]
|
||||
nop
|
||||
@@ -317,7 +320,7 @@ CNAME(ffi_call_SYSV):
|
||||
.align 4
|
||||
CNAME(ffi_closure_SYSV_V):
|
||||
cfi_startproc
|
||||
- bti c
|
||||
+ BTI_C
|
||||
SIGN_LR
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
@@ -342,7 +345,7 @@ CNAME(ffi_closure_SYSV_V):
|
||||
.align 4
|
||||
cfi_startproc
|
||||
CNAME(ffi_closure_SYSV):
|
||||
- bti c
|
||||
+ BTI_C
|
||||
SIGN_LR
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
@@ -378,15 +381,15 @@ L(do_closure):
|
||||
|
||||
/* Note that each table entry is 4 insns, and thus 16 bytes. */
|
||||
.align 4
|
||||
-0: bti j /* VOID */
|
||||
+0: BTI_J /* VOID */
|
||||
b 99f
|
||||
nop
|
||||
nop
|
||||
-1: bti j /* INT64 */
|
||||
+1: BTI_J /* INT64 */
|
||||
ldr x0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-2: bti j /* INT128 */
|
||||
+2: BTI_J /* INT128 */
|
||||
ldp x0, x1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
@@ -410,55 +413,55 @@ L(do_closure):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-8: bti j /* S4 */
|
||||
+8: BTI_J /* S4 */
|
||||
ldr s3, [x3, #12]
|
||||
nop
|
||||
nop
|
||||
-9: bti j /* S3 */
|
||||
+9: BTI_J /* S3 */
|
||||
ldr s2, [x3, #8]
|
||||
nop
|
||||
nop
|
||||
-10: bti j /* S2 */
|
||||
+10: BTI_J /* S2 */
|
||||
ldp s0, s1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-11: bti j /* S1 */
|
||||
+11: BTI_J /* S1 */
|
||||
ldr s0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-12: bti j /* D4 */
|
||||
+12: BTI_J /* D4 */
|
||||
ldr d3, [x3, #24]
|
||||
nop
|
||||
nop
|
||||
-13: bti j /* D3 */
|
||||
+13: BTI_J /* D3 */
|
||||
ldr d2, [x3, #16]
|
||||
nop
|
||||
nop
|
||||
-14: bti j /* D2 */
|
||||
+14: BTI_J /* D2 */
|
||||
ldp d0, d1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-15: bti j /* D1 */
|
||||
+15: BTI_J /* D1 */
|
||||
ldr d0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-16: bti j /* Q4 */
|
||||
+16: BTI_J /* Q4 */
|
||||
ldr q3, [x3, #48]
|
||||
nop
|
||||
nop
|
||||
-17: bti j /* Q3 */
|
||||
+17: BTI_J /* Q3 */
|
||||
ldr q2, [x3, #32]
|
||||
nop
|
||||
nop
|
||||
-18: bti j /* Q2 */
|
||||
+18: BTI_J /* Q2 */
|
||||
ldp q0, q1, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-19: bti j /* Q1 */
|
||||
+19: BTI_J /* Q1 */
|
||||
ldr q0, [x3]
|
||||
b 99f
|
||||
nop
|
||||
-20: bti j /* UINT8 */
|
||||
+20: BTI_J /* UINT8 */
|
||||
ldrb w0, [x3, #BE(7)]
|
||||
b 99f
|
||||
nop
|
||||
@@ -466,7 +469,7 @@ L(do_closure):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-22: bti j /* UINT16 */
|
||||
+22: BTI_J /* UINT16 */
|
||||
ldrh w0, [x3, #BE(6)]
|
||||
b 99f
|
||||
nop
|
||||
@@ -474,7 +477,7 @@ L(do_closure):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-24: bti j /* UINT32 */
|
||||
+24: BTI_J /* UINT32 */
|
||||
ldr w0, [x3, #BE(4)]
|
||||
b 99f
|
||||
nop
|
||||
@@ -482,7 +485,7 @@ L(do_closure):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-26: bti j /* SINT8 */
|
||||
+26: BTI_J /* SINT8 */
|
||||
ldrsb x0, [x3, #BE(7)]
|
||||
b 99f
|
||||
nop
|
||||
@@ -490,7 +493,7 @@ L(do_closure):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-28: bti j /* SINT16 */
|
||||
+28: BTI_J /* SINT16 */
|
||||
ldrsh x0, [x3, #BE(6)]
|
||||
b 99f
|
||||
nop
|
||||
@@ -498,7 +501,7 @@ L(do_closure):
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
-30: bti j /* SINT32 */
|
||||
+30: BTI_J /* SINT32 */
|
||||
ldrsw x0, [x3, #BE(4)]
|
||||
nop
|
||||
nop
|
||||
@@ -614,7 +617,7 @@ CNAME(ffi_closure_trampoline_table_page):
|
||||
.align 4
|
||||
CNAME(ffi_go_closure_SYSV_V):
|
||||
cfi_startproc
|
||||
- bti c
|
||||
+ BTI_C
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
cfi_rel_offset (x29, 0)
|
||||
@@ -638,7 +641,7 @@ CNAME(ffi_go_closure_SYSV_V):
|
||||
.align 4
|
||||
cfi_startproc
|
||||
CNAME(ffi_go_closure_SYSV):
|
||||
- bti c
|
||||
+ BTI_C
|
||||
stp x29, x30, [sp, #-ffi_closure_SYSV_FS]!
|
||||
cfi_adjust_cfa_offset (ffi_closure_SYSV_FS)
|
||||
cfi_rel_offset (x29, 0)
|
@ -1,3 +1,10 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Dec 6 09:11:47 UTC 2023 - Guillaume GARDET <guillaume.gardet@opensuse.org>
|
||||
|
||||
- Add upstream patches to fix BTI on aarch64:
|
||||
* 808.patch
|
||||
* 810.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Oct 24 13:07:19 UTC 2022 - Andreas Schwab <schwab@suse.de>
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package libffi
|
||||
#
|
||||
# Copyright (c) 2022 SUSE LLC
|
||||
# Copyright (c) 2023 SUSE LLC
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@ -26,6 +26,9 @@ Group: Development/Languages/C and C++
|
||||
URL: https://sourceware.org/libffi/
|
||||
Source: https://github.com/libffi/libffi/releases/download/v%{version}/libffi-%{version}.tar.gz
|
||||
Source99: baselibs.conf
|
||||
# Fix BTI for aarch64 with PR 808 and 810
|
||||
Patch1: https://github.com/libffi/libffi/pull/808.patch
|
||||
Patch2: https://github.com/libffi/libffi/pull/810.patch
|
||||
# for make check
|
||||
BuildRequires: dejagnu
|
||||
BuildRequires: expect
|
||||
|
Loading…
x
Reference in New Issue
Block a user