You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.5 KiB
107 lines
3.5 KiB
1 month ago
|
From b2e2ff20da88df60d2b435e384a8aece217c747e Mon Sep 17 00:00:00 2001
|
||
|
From: Tulio Magno Quites Machado Filho <tuliom@redhat.com>
|
||
|
Date: Tue, 13 Aug 2024 21:57:33 -0300
|
||
|
Subject: [PATCH] [OpenMP][AArch64] Fix branch protection in microtasks
|
||
|
(#102317)
|
||
|
|
||
|
Start __kmp_invoke_microtask with PACBTI in order to identify the
|
||
|
function as a valid branch target. Before returning, SP is
|
||
|
authenticated.
|
||
|
Also add the BTI and PAC markers to z_Linux_asm.S.
|
||
|
|
||
|
With this patch, libomp.so can now be generated with DT_AARCH64_BTI_PLT
|
||
|
when built with -mbranch-protection=standard.
|
||
|
|
||
|
The implementation is based on the code available in compiler-rt.
|
||
|
|
||
|
(cherry picked from commit 0aa22dcd2f6ec5f46b8ef18fee88066463734935)
|
||
|
---
|
||
|
openmp/runtime/src/z_Linux_asm.S | 53 ++++++++++++++++++++++++++++++++
|
||
|
1 file changed, 53 insertions(+)
|
||
|
|
||
|
diff --git a/openmp/runtime/src/z_Linux_asm.S b/openmp/runtime/src/z_Linux_asm.S
|
||
|
index 14987c298fa5..7ef2de900471 100644
|
||
|
--- a/openmp/runtime/src/z_Linux_asm.S
|
||
|
+++ b/openmp/runtime/src/z_Linux_asm.S
|
||
|
@@ -176,6 +176,53 @@ KMP_PREFIX_UNDERSCORE(\proc):
|
||
|
.endm
|
||
|
# endif // KMP_OS_DARWIN
|
||
|
|
||
|
+# if KMP_OS_LINUX
|
||
|
+// BTI and PAC gnu property note
|
||
|
+# define NT_GNU_PROPERTY_TYPE_0 5
|
||
|
+# define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000
|
||
|
+# define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 1
|
||
|
+# define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 2
|
||
|
+
|
||
|
+# define GNU_PROPERTY(type, value) \
|
||
|
+ .pushsection .note.gnu.property, "a"; \
|
||
|
+ .p2align 3; \
|
||
|
+ .word 4; \
|
||
|
+ .word 16; \
|
||
|
+ .word NT_GNU_PROPERTY_TYPE_0; \
|
||
|
+ .asciz "GNU"; \
|
||
|
+ .word type; \
|
||
|
+ .word 4; \
|
||
|
+ .word value; \
|
||
|
+ .word 0; \
|
||
|
+ .popsection
|
||
|
+# endif
|
||
|
+
|
||
|
+# if defined(__ARM_FEATURE_BTI_DEFAULT)
|
||
|
+# define BTI_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_BTI
|
||
|
+# else
|
||
|
+# define BTI_FLAG 0
|
||
|
+# endif
|
||
|
+# if __ARM_FEATURE_PAC_DEFAULT & 3
|
||
|
+# define PAC_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_PAC
|
||
|
+# else
|
||
|
+# define PAC_FLAG 0
|
||
|
+# endif
|
||
|
+
|
||
|
+# if (BTI_FLAG | PAC_FLAG) != 0
|
||
|
+# if PAC_FLAG != 0
|
||
|
+# define PACBTI_C hint #25
|
||
|
+# define PACBTI_RET hint #29
|
||
|
+# else
|
||
|
+# define PACBTI_C hint #34
|
||
|
+# define PACBTI_RET
|
||
|
+# endif
|
||
|
+# define GNU_PROPERTY_BTI_PAC \
|
||
|
+ GNU_PROPERTY(GNU_PROPERTY_AARCH64_FEATURE_1_AND, BTI_FLAG | PAC_FLAG)
|
||
|
+# else
|
||
|
+# define PACBTI_C
|
||
|
+# define PACBTI_RET
|
||
|
+# define GNU_PROPERTY_BTI_PAC
|
||
|
+# endif
|
||
|
#endif // (KMP_OS_LINUX || KMP_OS_DARWIN || KMP_OS_WINDOWS) && (KMP_ARCH_AARCH64 || KMP_ARCH_ARM)
|
||
|
|
||
|
.macro COMMON name, size, align_power
|
||
|
@@ -1292,6 +1339,7 @@ __tid = 8
|
||
|
// mark_begin;
|
||
|
.text
|
||
|
PROC __kmp_invoke_microtask
|
||
|
+ PACBTI_C
|
||
|
|
||
|
stp x29, x30, [sp, #-16]!
|
||
|
# if OMPT_SUPPORT
|
||
|
@@ -1355,6 +1403,7 @@ KMP_LABEL(kmp_1):
|
||
|
ldp x19, x20, [sp], #16
|
||
|
# endif
|
||
|
ldp x29, x30, [sp], #16
|
||
|
+ PACBTI_RET
|
||
|
ret
|
||
|
|
||
|
DEBUG_INFO __kmp_invoke_microtask
|
||
|
@@ -2465,3 +2514,7 @@ __kmp_unnamed_critical_addr:
|
||
|
.4byte .gomp_critical_user_
|
||
|
.size __kmp_unnamed_critical_addr, 4
|
||
|
#endif
|
||
|
+
|
||
|
+#if KMP_OS_LINUX && (KMP_ARCH_AARCH64 || KMP_ARCH_AARCH64_32)
|
||
|
+GNU_PROPERTY_BTI_PAC
|
||
|
+#endif
|
||
|
--
|
||
|
2.45.2
|
||
|
|