]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Fix BTI support in libitm
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 2 Jul 2020 16:12:05 +0000 (17:12 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Thu, 16 Jul 2020 12:46:36 +0000 (13:46 +0100)
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.

(cherry picked from commit 319078dad62eba942d33c8975bdcbb09d1c68ba6)

libitm/config/aarch64/sjlj.S

index 740bcd0b5c7389b9fd98a98e52b37cb974bd32dd..367806b68fd878e7e7eac6e8fd980af0bd3e6f86 100644 (file)
@@ -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