Message ID | 24d58e5509c1391f3506f390367d73c782b5bc30.1594224951.git.szabolcs.nagy@arm.com |
---|---|
State | New |
Headers | show |
Series | aarch64: Fix target libraries for BTI [PR96001] | expand |
> -----Original Message----- > From: Szabolcs Nagy <Szabolcs.Nagy@arm.com> > Sent: 08 July 2020 17:28 > To: gcc-patches@gcc.gnu.org > Cc: Richard Earnshaw <Richard.Earnshaw@arm.com>; Kyrylo Tkachov > <Kyrylo.Tkachov@arm.com> > Subject: [PATCH 6/6] 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. > > libitm/ChangeLog: > > 2020-07-08 Szabolcs Nagy <szabolcs.nagy@arm.com> > > * config/aarch64/sjlj.S: Add BTI marking and related definitions, > and add BTI c to function entries. > > --- > Note: there is some redundancy: the libgcc fixup patch needed > the same macro definitions, but i did not find a convenient > place from where both libgcc and libitm can include them. Since > this is a common problem i expect a change in the assembler > that will be able to add the note without doing this manually, > until then i think we can live with the code duplication. Ok. Thanks, Kyrill > --- > libitm/config/aarch64/sjlj.S | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/libitm/config/aarch64/sjlj.S b/libitm/config/aarch64/sjlj.S > index 5b97b973e27..e2093ca1a97 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 > -- > 2.17.1
diff --git a/libitm/config/aarch64/sjlj.S b/libitm/config/aarch64/sjlj.S index 5b97b973e27..e2093ca1a97 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