libc: Prepare support for Armv8.3-A PAuth and Armv8.5-A BTI in *.S
The instruction "bti c" is added through ENTRY*() macro,
using __bionic_asm_custom_entry(f).
The .note.gnu.property section is added with the new macro
NOTE_GNU_PROPERTY(). BTI and PAuth features are automatically
selected based on the presence of __ARM_FEATURE_* macros.
Furthermore, gensyscalls.py got updated to append the new
macro to the generated syscalls-arm64.S.
Test: Tested on FVP with BTI enabled.
Change-Id: I40ffe294b8426421125fffd0a9758567d919a09d
diff --git a/libc/private/bionic_asm.h b/libc/private/bionic_asm.h
index 6409563..6d4f7d5 100644
--- a/libc/private/bionic_asm.h
+++ b/libc/private/bionic_asm.h
@@ -35,6 +35,7 @@
#define __bionic_asm_custom_entry(f)
#define __bionic_asm_custom_end(f)
#define __bionic_asm_function_type @function
+#define __bionic_asm_custom_note_gnu_section()
#if defined(__aarch64__)
#include <private/bionic_asm_arm64.h>
@@ -83,4 +84,7 @@
.globl alias; \
.equ alias, original
+#define NOTE_GNU_PROPERTY() \
+ __bionic_asm_custom_note_gnu_section()
+
#endif
diff --git a/libc/private/bionic_asm_arm64.h b/libc/private/bionic_asm_arm64.h
index 463ca31..c11732a 100644
--- a/libc/private/bionic_asm_arm64.h
+++ b/libc/private/bionic_asm_arm64.h
@@ -41,3 +41,32 @@
#undef __bionic_asm_function_type
#define __bionic_asm_function_type %function
+
+#if defined(__ARM_FEATURE_BTI_DEFAULT)
+#define __bionic_asm_aarch64_feature_bti (1 << 0)
+#undef __bionic_asm_custom_entry
+#define __bionic_asm_custom_entry(f) hint #34 // BTI C
+#else
+#define __bionic_asm_aarch64_feature_bti 0
+#endif
+
+#if defined(__ARM_FEATURE_PAC_DEFAULT)
+#define __bionic_asm_aarch64_feature_pac (1 << 1)
+#else
+#define __bionic_asm_aarch64_feature_pac 0
+#endif
+
+#undef __bionic_asm_custom_note_gnu_section
+#define __bionic_asm_custom_note_gnu_section() \
+ .pushsection .note.gnu.property, "a"; \
+ .balign 8; \
+ .long 4; \
+ .long 0x10; \
+ .long 0x5; /* NT_GNU_PROPERTY_TYPE_0 */ \
+ .asciz "GNU"; \
+ .long 0xc0000000; /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ \
+ .long 4; \
+ .long (__bionic_asm_aarch64_feature_pac | \
+ __bionic_asm_aarch64_feature_bti); \
+ .long 0; \
+ .popsection; \
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index 0271a04..0e0e25f 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -459,6 +459,8 @@
if syscall.has_key("asm-%s" % arch):
print(syscall["asm-%s" % arch])
+ if arch == 'arm64':
+ print('\nNOTE_GNU_PROPERTY()\n')
if __name__ == "__main__":
if len(sys.argv) < 2: