File libcosmos-fix-aarch64.patch of Package libcosmos

From 54b144f95866ba8d54854ac3db31776449af9dab Mon Sep 17 00:00:00 2001
From: Matthias Gerstner <Matthias.Gerstner@nefkom.net>
Date: Tue, 18 Mar 2025 15:53:16 +0200
Subject: [PATCH] ptrace API: exclude more ptrace::Request constants if not
 available

These constants are not available on aarch64. I don't see a better way
than to use the preprocessor to exclude them and also the wrappers in
Tracee at the moment.

Users of these requests likely are pretty low-level themselves, so
dealing with some #ifdef's will hopefully not be too much of a burden on
them.

Fixes #1
---
 include/proc/Tracee.hxx |  8 ++++++++
 include/proc/ptrace.hxx | 21 ++++++++++++++++++---
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/include/proc/Tracee.hxx b/include/proc/Tracee.hxx
index a92bd5d..e852bd0 100644
--- a/include/proc/Tracee.hxx
+++ b/include/proc/Tracee.hxx
@@ -208,6 +208,7 @@ public: // functions
 		this->request(ptrace::Request::POKEUSER, offset, value);
 	}
 
+#ifdef PTRACE_GETREGS
 	/// Copy the tracee's general purpose registers into the provided structure.
 	/**
 	 * You need to include sys/user.h and check out the data structure
@@ -222,7 +223,9 @@ public: // functions
 		// it, we'd need an #ifdef of some sort.
 		this->request(ptrace::Request::GETREGS, nullptr, &out);
 	}
+#endif
 
+#ifdef PTRACE_SETREGS
 	/// Modify the tracee's general purpose registers.
 	/**
 	 * Some register modifications may be disallowed by the kernel to
@@ -232,7 +235,9 @@ public: // functions
 		// NOTE: see getRegisters() about Sparc architecture
 		this->request(ptrace::Request::SETREGS, nullptr, &out);
 	}
+#endif
 
+#ifdef PTRACE_GETFPREGS
 	/// Copy the tracee's floating point registers into the provided structure.
 	/**
 	 * This is similar to getRegisters() but provides the floating point
@@ -244,7 +249,9 @@ public: // functions
 		// NOTE: see getRegisters() about Sparc architecture
 		this->request(ptrace::Request::GETFPREGS, nullptr, &out);
 	}
+#endif
 
+#ifdef PTRACE_SETFPREGS
 	/// Modify the tracee's floating point registers.
 	/**
 	 * \see setRegisters().
@@ -252,6 +259,7 @@ public: // functions
 	void setFloatRegisters(const struct user_fpregs_struct &out) {
 		this->request(ptrace::Request::SETFPREGS, nullptr, &out);
 	}
+#endif
 
 	/// Retrieve a set of registers from the tracee.
 	/**
diff --git a/include/proc/ptrace.hxx b/include/proc/ptrace.hxx
index 7329f6e..8187d10 100644
--- a/include/proc/ptrace.hxx
+++ b/include/proc/ptrace.hxx
@@ -82,9 +82,14 @@ enum class RegisterType {
 
 /// Basic requests that can be passed to the ptrace() system call.
 /**
+ * \note Some of these requests are only available on some architectures.
+ * Some have also been deprecated by now. This can only be modeled via #ifdefs
+ * currently, which means that client code has to deal with the possibility of
+ * the affected requests not being available.
+ *
  * \note On system call level this has an actual `enum __ptrace_request` type,
- *       thus there is no defined underlying type and we keep the compiler's
- *       default.
+ * thus there is no defined underlying type and we keep the compiler's
+ * default.
  **/
 enum class Request {
 	/// The tracee asks to be traced by its parent.
@@ -99,16 +104,24 @@ enum class Request {
 	POKEDATA           = PTRACE_POKEDATA,
 	/// Write a word at the given offset into the tracee's USER data.
 	POKEUSER           = PTRACE_POKEUSER,
+#ifdef PTRACE_GETREGS
 	/// Copy the tracee's general-purpose registers to the given address in the tracer.
 	GETREGS            = PTRACE_GETREGS,
+#endif
+#ifdef PTRACE_GETFPREGS
 	/// Copy the tracee's floating-point registers to the given address in the tracer.
 	GETFPREGS          = PTRACE_GETFPREGS,
+#endif
 	/// Reg the tracee's registers in an architecture dependent way.
 	GETREGSET          = PTRACE_GETREGSET,
+#ifdef PTRACE_SETREGS
 	/// Modify the tracee's general-purpose registers (not available on all architectures).
 	SETREGS            = PTRACE_SETREGS,
+#endif
+#ifdef PTRACE_SETFPREGS
 	/// Modify the tracee's floating-point registers.
 	SETFPREGS          = PTRACE_SETFPREGS,
+#endif
 	/// Modify the tracee's registers, analogous to GETREGSET.
 	SETREGSET          = PTRACE_SETREGSET,
 	/// Retrieve information about the signal that cause the tracee to stop. Copies a siginfo_t structure.
@@ -156,9 +169,11 @@ enum class Request {
 	SECCOMP_GET_FILTER = PTRACE_SECCOMP_GET_FILTER,
 	/// Restart the stopped tracee, but first detach from it.
 	DETACH             = PTRACE_DETACH,
+#ifdef PTRACE_GET_THREAD_AREA
 	/// Performs an operation similar to `get_thread_area()`.
 	GET_THREAD_AREA    = PTRACE_GET_THREAD_AREA,
-#if PTRACE_SET_THREAD_AREA
+#endif
+#ifdef PTRACE_SET_THREAD_AREA
 	/// Performs an operation similar to `set_thread_area()`.
 	SET_THREAD_AREA    = PTRACE_SET_THREAD_AREA,
 #endif
openSUSE Build Service is sponsored by