diff mbox series

[5/6] aarch64: Fix BTI support in libgcc

Message ID 07344034e9db66f4eeb850344e844ad0e366107f.1594224951.git.szabolcs.nagy@arm.com
State New
Headers show
Series aarch64: Fix target libraries for BTI [PR96001] | expand

Commit Message

Szabolcs Nagy July 8, 2020, 4:27 p.m. UTC
lse.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 libgcc is built with branch
protection, because old linkers mishandle the note (merge
them incorrectly or emit warnings), the BTI instructions
are added unconditionally.

Note: BTI c is only necessary at function entry if the function
may be called indirectly, currently lse functions are not called
indirectly, but BTI is added for ABI reasons e.g. to allow
linkers later to emit stub code with indirect jump.

libgcc/ChangeLog:

2020-07-08  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* config/aarch64/lse.S: Add BTI marking and related definitions,
	and add BTI c to function entries.
---
 libgcc/config/aarch64/lse.S | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

Comments

Kyrylo Tkachov July 8, 2020, 4:47 p.m. UTC | #1
> -----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 5/6] aarch64: Fix BTI support in libgcc
> 
> lse.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 libgcc is built with branch
> protection, because old linkers mishandle the note (merge
> them incorrectly or emit warnings), the BTI instructions
> are added unconditionally.
> 
> Note: BTI c is only necessary at function entry if the function
> may be called indirectly, currently lse functions are not called
> indirectly, but BTI is added for ABI reasons e.g. to allow
> linkers later to emit stub code with indirect jump.
> 

Ok.
Thanks,
Kyrill

> libgcc/ChangeLog:
> 
> 2020-07-08  Szabolcs Nagy  <szabolcs.nagy@arm.com>
> 
> 	* config/aarch64/lse.S: Add BTI marking and related definitions,
> 	and add BTI c to function entries.
> ---
>  libgcc/config/aarch64/lse.S | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/libgcc/config/aarch64/lse.S b/libgcc/config/aarch64/lse.S
> index 9e2acae806b..64691c601c1 100644
> --- a/libgcc/config/aarch64/lse.S
> +++ b/libgcc/config/aarch64/lse.S
> @@ -136,6 +136,8 @@ see the files COPYING3 and COPYING.RUNTIME
> respectively.  If not, see
>  #define tmp1	17
>  #define tmp2	15
> 
> +#define BTI_C	hint	34
> +
>  /* Start and end a function.  */
>  .macro	STARTFN name
>  	.text
> @@ -145,6 +147,7 @@ see the files COPYING3 and COPYING.RUNTIME
> respectively.  If not, see
>  	.type	\name, %function
>  	.cfi_startproc
>  \name:
> +	BTI_C
>  .endm
> 
>  .macro	ENDFN name
> @@ -275,6 +278,29 @@ STARTFN	NAME(LDNM)
>  ENDFN	NAME(LDNM)
>  #endif
> 
> +/* 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 mbox series

Patch

diff --git a/libgcc/config/aarch64/lse.S b/libgcc/config/aarch64/lse.S
index 9e2acae806b..64691c601c1 100644
--- a/libgcc/config/aarch64/lse.S
+++ b/libgcc/config/aarch64/lse.S
@@ -136,6 +136,8 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define tmp1	17
 #define tmp2	15
 
+#define BTI_C	hint	34
+
 /* Start and end a function.  */
 .macro	STARTFN name
 	.text
@@ -145,6 +147,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 	.type	\name, %function
 	.cfi_startproc
 \name:
+	BTI_C
 .endm
 
 .macro	ENDFN name
@@ -275,6 +278,29 @@  STARTFN	NAME(LDNM)
 ENDFN	NAME(LDNM)
 #endif
 
+/* 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