aboutsummaryrefslogtreecommitdiff
path: root/libitm
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2020-07-02 17:12:05 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2020-07-09 09:50:25 +0100
commit319078dad62eba942d33c8975bdcbb09d1c68ba6 (patch)
treecb9435da01ea5e7c5e3c9bc3d236467500447a6a /libitm
parentf0f62fa0320762119446893c67cb52934bc5a05e (diff)
downloadgcc-319078dad62eba942d33c8975bdcbb09d1c68ba6.zip
gcc-319078dad62eba942d33c8975bdcbb09d1c68ba6.tar.gz
gcc-319078dad62eba942d33c8975bdcbb09d1c68ba6.tar.bz2
aarch64: Fix BTI support in libitm
sjlj.S did not have the GNU property note markup and the BTI c instructions that are necessary when it is built with branch protection. The notes are only added when libitm is built with branch protection, because old linkers mishandle the note (merge them incorrectly or emit warnings), the BTI instructions are added unconditionally. 2020-07-09 Szabolcs Nagy <szabolcs.nagy@arm.com> libitm/ChangeLog: * config/aarch64/sjlj.S: Add BTI marking and related definitions, and add BTI c to function entries.
Diffstat (limited to 'libitm')
-rw-r--r--libitm/config/aarch64/sjlj.S27
1 files changed, 27 insertions, 0 deletions
diff --git a/libitm/config/aarch64/sjlj.S b/libitm/config/aarch64/sjlj.S
index 5b97b97..e2093ca 100644
--- a/libitm/config/aarch64/sjlj.S
+++ b/libitm/config/aarch64/sjlj.S
@@ -24,6 +24,8 @@
#include "asmcfi.h"
+#define BTI_C hint 34
+
.text
.align 2
.global _ITM_beginTransaction
@@ -31,6 +33,7 @@
_ITM_beginTransaction:
cfi_startproc
+ BTI_C
mov x1, sp
stp x29, x30, [sp, -11*16]!
cfi_adjust_cfa_offset(11*16)
@@ -70,6 +73,7 @@ GTM_longjmp:
/* The first parameter becomes the return value (x0).
The third parameter is ignored for now. */
cfi_startproc
+ BTI_C
ldp x19, x20, [x1, 1*16]
ldp x21, x22, [x1, 2*16]
ldp x23, x24, [x1, 3*16]
@@ -87,6 +91,29 @@ GTM_longjmp:
cfi_endproc
.size GTM_longjmp, . - GTM_longjmp
+/* GNU_PROPERTY_AARCH64_* macros from elf.h for use in asm code. */
+#define FEATURE_1_AND 0xc0000000
+#define FEATURE_1_BTI 1
+#define FEATURE_1_PAC 2
+
+/* Add a NT_GNU_PROPERTY_TYPE_0 note. */
+#define GNU_PROPERTY(type, value) \
+ .section .note.gnu.property, "a"; \
+ .p2align 3; \
+ .word 4; \
+ .word 16; \
+ .word 5; \
+ .asciz "GNU"; \
+ .word type; \
+ .word 4; \
+ .word value; \
+ .word 0;
+
#if defined(__linux__) || defined(__FreeBSD__)
.section .note.GNU-stack, "", %progbits
+
+/* Add GNU property note if built with branch protection. */
+# ifdef __ARM_FEATURE_BTI_DEFAULT
+GNU_PROPERTY (FEATURE_1_AND, FEATURE_1_BTI)
+# endif
#endif