aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2022-04-19 15:18:56 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2022-11-22 14:31:25 +0000
commitabb1d6bb4114b95391d9e50de5bda4302bca950a (patch)
tree7069f29f86f064f07dcc6650685c1133ad277960 /sysdeps/unix
parent3e833b93fd62b42d02b65c51d081b10afc23e389 (diff)
downloadglibc-abb1d6bb4114b95391d9e50de5bda4302bca950a.zip
glibc-abb1d6bb4114b95391d9e50de5bda4302bca950a.tar.gz
glibc-abb1d6bb4114b95391d9e50de5bda4302bca950a.tar.bz2
cheri: fix posix timers
We need to distinguish timerids that are small integers returned by the kernel and timerids that are pointers to struct timer. The existing pointer tagging does not work for CHERI because of the pointer shift. Simply use the top bit without shift to tag pointers. This still relies on the top byte ignore of aarch64 (the top byte does not affect the capability representation) and that pointers are not tagged for other reasons (like HWASAN). Note: this is morello specific and does not work for generic cheri.
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/kernel-posix-timers.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/kernel-posix-timers.h b/sysdeps/unix/sysv/linux/kernel-posix-timers.h
index 82ce92f..371e328 100644
--- a/sysdeps/unix/sysv/linux/kernel-posix-timers.h
+++ b/sysdeps/unix/sysv/linux/kernel-posix-timers.h
@@ -79,6 +79,25 @@ kernel_timer_to_timerid (kernel_timer_t ktimerid)
return (timer_t) ((intptr_t) ktimerid);
}
+#ifdef __CHERI_PURE_CAPABILITY__
+static inline timer_t
+timer_to_timerid (struct timer *ptr)
+{
+ return (timer_t) ((uintptr_t) ptr | ~(-1UL/2));
+}
+
+static inline bool
+timer_is_sigev_thread (timer_t timerid)
+{
+ return ((uintptr_t) timerid & ~(-1UL/2)) != 0;
+}
+
+static inline struct timer *
+timerid_to_timer (timer_t timerid)
+{
+ return (struct timer *)((uintptr_t) timerid & (-1UL/2));
+}
+#else
static inline timer_t
timer_to_timerid (struct timer *ptr)
{
@@ -96,6 +115,7 @@ timerid_to_timer (timer_t timerid)
{
return (struct timer *)((uintptr_t) timerid << 1);
}
+#endif
static inline kernel_timer_t
timerid_to_kernel_timer (timer_t timerid)