|
@@ -0,0 +1,97 @@
|
|
|
|
+From 52a747a316042e70a22acb489df9e51bfc6bf2d5 Mon Sep 17 00:00:00 2001
|
|
|
|
+From: Markus Mayer <mmayer@broadcom.com>
|
|
|
|
+Date: Fri, 21 Feb 2025 11:19:34 -0800
|
|
|
|
+Subject: [PATCH] aarch64: define struct user_pac_mask if needed
|
|
|
|
+
|
|
|
|
+On Aarch64, Linux is using Pointer Authentication Code (PAC) for pointer
|
|
|
|
+authentication.[1] The struct "user_pac_mask" has been part of the Linux
|
|
|
|
+kernel since version 5.0 as part of this feature. However, older kernels
|
|
|
|
+do not define it.
|
|
|
|
+
|
|
|
|
+Therefore, we want to check if the definition is present in the kernel
|
|
|
|
+headers and provide one if it isn't. This ensures two things:
|
|
|
|
+
|
|
|
|
+* elfutils will continue to compile against kernel headers from 4.x
|
|
|
|
+* binaries built against older kernel headers will still be fully
|
|
|
|
+ functional if used on a newer system
|
|
|
|
+
|
|
|
|
+For reference, the build error that is being avoided looks like this:
|
|
|
|
+
|
|
|
|
+[...]
|
|
|
|
+ CC aarch64_initreg.o
|
|
|
|
+aarch64_initreg.c: In function 'aarch64_set_initial_registers_tid':
|
|
|
|
+aarch64_initreg.c:61:24: error: storage size of 'pac_mask' isn't known
|
|
|
|
+ struct user_pac_mask pac_mask;
|
|
|
|
+ ^~~~~~~~
|
|
|
|
+aarch64_initreg.c:61:24: warning: unused variable 'pac_mask' [-Wunused-variable]
|
|
|
|
+make[4]: *** [Makefile:831: aarch64_initreg.o] Error 1
|
|
|
|
+make[3]: *** [Makefile:547: all-recursive] Error 1
|
|
|
|
+make[2]: *** [Makefile:463: all] Error 2
|
|
|
|
+
|
|
|
|
+[1] https://docs.kernel.org/arch/arm64/pointer-authentication.html
|
|
|
|
+
|
|
|
|
+https://sourceware.org/bugzilla/show_bug.cgi?id=32684
|
|
|
|
+
|
|
|
|
+Fixes: 64e3b451ad2c ("aarch64: extend dwfl_thread_state_registers to handle PAC")
|
|
|
|
+Signed-off-by: Markus Mayer <mmayer@broadcom.com>
|
|
|
|
+Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
|
|
|
|
+Upstream: https://sourceware.org/git/?p=elfutils.git;a=commit;h=52a747a316042e70a22acb489df9e51bfc6bf2d5
|
|
|
|
+---
|
|
|
|
+ backends/aarch64_initreg.c | 21 +++++++++++++++++++++
|
|
|
|
+ configure.ac | 8 ++++++++
|
|
|
|
+ 2 files changed, 29 insertions(+)
|
|
|
|
+
|
|
|
|
+diff --git a/backends/aarch64_initreg.c b/backends/aarch64_initreg.c
|
|
|
|
+index 5ec45ea60..a6badbb45 100644
|
|
|
|
+--- a/backends/aarch64_initreg.c
|
|
|
|
++++ b/backends/aarch64_initreg.c
|
|
|
|
+@@ -47,6 +47,27 @@
|
|
|
|
+ #define BACKEND aarch64_
|
|
|
|
+ #include "libebl_CPU.h"
|
|
|
|
+
|
|
|
|
++/*
|
|
|
|
++ * pointer authentication masks (NT_ARM_PAC_MASK)
|
|
|
|
++ *
|
|
|
|
++ * Defined by Linux kernel headers since Linux 5.0. Define it here if kernel
|
|
|
|
++ * headers are older than that, to ensure this file builds regardless.
|
|
|
|
++ */
|
|
|
|
++#if defined(__aarch64__) && defined(__linux__)
|
|
|
|
++
|
|
|
|
++#ifndef NT_ARM_PAC_MASK
|
|
|
|
++#define NT_ARM_PAC_MASK 0x406
|
|
|
|
++#endif
|
|
|
|
++
|
|
|
|
++#ifndef HAVE_USER_PACK_MASK
|
|
|
|
++struct user_pac_mask {
|
|
|
|
++ __u64 data_mask;
|
|
|
|
++ __u64 insn_mask;
|
|
|
|
++};
|
|
|
|
++#endif
|
|
|
|
++
|
|
|
|
++#endif /* __aarch64__ && __linux__ */
|
|
|
|
++
|
|
|
|
+ bool
|
|
|
|
+ aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)),
|
|
|
|
+ ebl_tid_registers_t *setfunc __attribute__ ((unused)),
|
|
|
|
+diff --git a/configure.ac b/configure.ac
|
|
|
|
+index e57d39275..3298f7fc7 100644
|
|
|
|
+--- a/configure.ac
|
|
|
|
++++ b/configure.ac
|
|
|
|
+@@ -777,6 +777,14 @@ if test "$sys_user_has_user_regs" = "yes"; then
|
|
|
|
+ [Define to 1 if <sys/user.h> defines struct user_regs_struct])
|
|
|
|
+ fi
|
|
|
|
+
|
|
|
|
++AC_CHECK_TYPE([struct user_pac_mask],
|
|
|
|
++ [has_user_pac_mask=yes], [has_user_pac_mask=no],
|
|
|
|
++ [[#include <asm/ptrace.h>]])
|
|
|
|
++if test "$has_user_pac_mask" = "yes"; then
|
|
|
|
++ AC_DEFINE(HAVE_USER_PACK_MASK, 1,
|
|
|
|
++ [Defined if struct user_pac_mask exists.])
|
|
|
|
++fi
|
|
|
|
++
|
|
|
|
+ # On a 64-bit host where can can use $CC -m32, we'll run two sets of tests.
|
|
|
|
+ utrace_BIARCH
|
|
|
|
+ CC_BIARCH="$CC $utrace_biarch"
|
|
|
|
+--
|
|
|
|
+2.43.5
|
|
|
|
+
|