Commit 59a74e7e by Szabolcs Nagy

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.

(cherry picked from commit 319078dad62eba942d33c8975bdcbb09d1c68ba6)
parent 8475641c
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "asmcfi.h" #include "asmcfi.h"
#define BTI_C hint 34
.text .text
.align 2 .align 2
.global _ITM_beginTransaction .global _ITM_beginTransaction
...@@ -31,6 +33,7 @@ ...@@ -31,6 +33,7 @@
_ITM_beginTransaction: _ITM_beginTransaction:
cfi_startproc cfi_startproc
BTI_C
mov x1, sp mov x1, sp
stp x29, x30, [sp, -11*16]! stp x29, x30, [sp, -11*16]!
cfi_adjust_cfa_offset(11*16) cfi_adjust_cfa_offset(11*16)
...@@ -70,6 +73,7 @@ GTM_longjmp: ...@@ -70,6 +73,7 @@ GTM_longjmp:
/* The first parameter becomes the return value (x0). /* The first parameter becomes the return value (x0).
The third parameter is ignored for now. */ The third parameter is ignored for now. */
cfi_startproc cfi_startproc
BTI_C
ldp x19, x20, [x1, 1*16] ldp x19, x20, [x1, 1*16]
ldp x21, x22, [x1, 2*16] ldp x21, x22, [x1, 2*16]
ldp x23, x24, [x1, 3*16] ldp x23, x24, [x1, 3*16]
...@@ -87,6 +91,29 @@ GTM_longjmp: ...@@ -87,6 +91,29 @@ GTM_longjmp:
cfi_endproc cfi_endproc
.size GTM_longjmp, . - GTM_longjmp .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__) #if defined(__linux__) || defined(__FreeBSD__)
.section .note.GNU-stack, "", %progbits .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 #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment