]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
aarch64: Add glibc.cpu.aarch64_gcs tunable
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Mon, 17 Jul 2023 07:31:05 +0000 (08:31 +0100)
committerYury Khrustalev <yury.khrustalev@arm.com>
Thu, 10 Oct 2024 12:40:35 +0000 (13:40 +0100)
This tunable is for controlling the GCS status. It is the argument to
the PR_SET_SHADOW_STACK_STATUS prctl, by default 0, so GCS is disabled.

The status is stored into GL(dl_aarch64_gcs) early and only applied
later, since enabling GCS is tricky: it must happen on a top level
stack frame. (Using GL instead of GLRO because it may need updates
depending on loaded libraries that happen after readonly protection
is applied, however library marking based GCS setting is not yet
implemented.)

sysdeps/aarch64/dl-tunables.list
sysdeps/unix/sysv/linux/aarch64/cpu-features.c
sysdeps/unix/sysv/linux/aarch64/dl-procruntime.c [new file with mode: 0644]

index 92c6cbfa92bbf60103548ae6c0b9c06359adc38a..c08be869326b69b54e1c112a9c787f3c5d77dd42 100644 (file)
@@ -21,5 +21,10 @@ glibc {
     name {
       type: STRING
     }
+    aarch64_gcs {
+      type: UINT_64
+      minval: 0
+      default: 0
+    }
   }
 }
index c0b047bc0dbeae428c89e12688b7d802e4cb3a43..4a63875b1984b4072440e4c74d729055c643c52c 100644 (file)
@@ -176,4 +176,8 @@ init_cpu_features (struct cpu_features *cpu_features)
 
   /* Check if MOPS is supported.  */
   cpu_features->mops = GLRO (dl_hwcap2) & HWCAP2_MOPS;
+
+  if (GLRO (dl_hwcap) & HWCAP_GCS)
+    /* GCS status may be updated later by binary compatibility checks.  */
+    GL (dl_aarch64_gcs) = TUNABLE_GET (glibc, cpu, aarch64_gcs, uint64_t, 0);
 }
diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-procruntime.c b/sysdeps/unix/sysv/linux/aarch64/dl-procruntime.c
new file mode 100644 (file)
index 0000000..23c61da
--- /dev/null
@@ -0,0 +1,37 @@
+/* Data for processor runtime information.  AArch64 version.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef PROCINFO_CLASS
+# define PROCINFO_CLASS
+#endif
+
+#if !IS_IN (ldconfig)
+# if !defined PROCINFO_DECL && defined SHARED
+  ._dl_aarch64_gcs
+# else
+PROCINFO_CLASS unsigned long _dl_aarch64_gcs
+# endif
+# ifndef PROCINFO_DECL
+= 0
+# endif
+# if !defined SHARED || defined PROCINFO_DECL
+;
+# else
+,
+# endif
+#endif