From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1944) id 1C3AD384643C; Wed, 26 Oct 2022 15:21:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1C3AD384643C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1666797677; bh=3Eyaza8hIe/pCjUmxwHNW2q4aGQZ1TtdKnYs6SzoBiI=; h=From:To:Subject:Date:From; b=l5/wAGFovOi2m38laToVDGRZvmAfOCoAvQsehrTLHpGpha6JTTyTaEhjZLuK6wi8s 6vQZucULaUPTugRVMqSepTeW/wTL8Fie1VYggAm6GCBkYMDY9WTpD4f/kZCW06zVoG 7YNiNY++YkADH8wys8ZNP2C5EkodzWV0CC+b4zNc= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Szabolcs Nagy To: glibc-cvs@sourceware.org Subject: [glibc/arm/morello/main] cheri: fix posix timers X-Act-Checkin: glibc X-Git-Author: Szabolcs Nagy X-Git-Refname: refs/heads/arm/morello/main X-Git-Oldrev: 0e84d042d0af2f63a1c2f3212aacf792dbf464a0 X-Git-Newrev: 03b5c19d67bab9abb0223601a4f0928936fb9ab0 Message-Id: <20221026152117.1C3AD384643C@sourceware.org> Date: Wed, 26 Oct 2022 15:21:05 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=03b5c19d67bab9abb0223601a4f0928936fb9ab0 commit 03b5c19d67bab9abb0223601a4f0928936fb9ab0 Author: Szabolcs Nagy Date: Tue Apr 19 15:18:56 2022 +0100 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. Diff: --- sysdeps/unix/sysv/linux/kernel-posix-timers.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sysdeps/unix/sysv/linux/kernel-posix-timers.h b/sysdeps/unix/sysv/linux/kernel-posix-timers.h index 82ce92f2ae..371e328258 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)