From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1944) id A62013846431; Wed, 26 Oct 2022 15:17:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A62013846431 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1666797429; bh=ncbD9YpLfClfk/OkLUgLB/pPmLhLNOBSbeKLa11VDxk=; h=From:To:Subject:Date:From; b=inz9Sr3WrPF5miC45D7g1LfS04ud5l7LveTd7Y8a/xN2DAkOnRHMwRgH+Ng+1n4qU 6ArTAWviTL/QMDqRw+VjnMKWKNNKJB9tM2sh/ZeRILysH21QDRkfOfCMDXnX8l9YVF IV18aK55nV92qOu56g/+a+6Gl2Oy0lhvfbcLRz9U= 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: Implement 128-bit atomics X-Act-Checkin: glibc X-Git-Author: Szabolcs Nagy X-Git-Refname: refs/heads/arm/morello/main X-Git-Oldrev: 8170982f1b44370c40e5da166962bcb3d0bd4d34 X-Git-Newrev: ebedf4cbaf2d2654c19be8095925ffe434c86997 Message-Id: <20221026151709.A62013846431@sourceware.org> Date: Wed, 26 Oct 2022 15:17:09 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=ebedf4cbaf2d2654c19be8095925ffe434c86997 commit ebedf4cbaf2d2654c19be8095925ffe434c86997 Author: Szabolcs Nagy Date: Tue Jun 8 12:48:43 2021 +0100 cheri: Implement 128-bit atomics Arm Morello requires 128-bit atomics. Diff: --- include/atomic.h | 17 +++++++++++++++-- sysdeps/aarch64/atomic-machine.h | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/include/atomic.h b/include/atomic.h index 2cb52c9cfd..140ef2a5a5 100644 --- a/include/atomic.h +++ b/include/atomic.h @@ -62,6 +62,8 @@ __atg1_result = pre##_32_##post (mem, __VA_ARGS__); \ else if (sizeof (*mem) == 8) \ __atg1_result = pre##_64_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 16) \ + __atg1_result = pre##_128_##post (mem, __VA_ARGS__); \ else \ abort (); \ __atg1_result; \ @@ -77,6 +79,8 @@ __atg2_result = pre##_32_##post (mem, __VA_ARGS__); \ else if (sizeof (*mem) == 8) \ __atg2_result = pre##_64_##post (mem, __VA_ARGS__); \ + else if (sizeof (*mem) == 16) \ + __atg2_result = pre##_128_##post (mem, __VA_ARGS__); \ else \ abort (); \ __atg2_result; \ @@ -540,7 +544,11 @@ /* We require 32b atomic operations; some archs also support 64b atomic operations. */ void __atomic_link_error (void); -# if __HAVE_64B_ATOMICS == 1 +# if defined __CHERI_PURE_CAPABILITY__ +# define __atomic_check_size(mem) \ + if ((sizeof (*mem) != 4) && (sizeof (*mem) != 8) && (sizeof (*mem) != 16)) \ + __atomic_link_error (); +# elif __HAVE_64B_ATOMICS == 1 # define __atomic_check_size(mem) \ if ((sizeof (*mem) != 4) && (sizeof (*mem) != 8)) \ __atomic_link_error (); @@ -553,7 +561,12 @@ void __atomic_link_error (void); need other atomic operations of such sizes, and restricting the support to loads and stores makes this easier for archs that do not have native support for atomic operations to less-than-word-sized data. */ -# if __HAVE_64B_ATOMICS == 1 +# if defined __CHERI_PURE_CAPABILITY__ +# define __atomic_check_size_ls(mem) \ + if ((sizeof (*mem) != 1) && (sizeof (*mem) != 2) && (sizeof (*mem) != 4) \ + && (sizeof (*mem) != 8) && (sizeof (*mem) != 16)) \ + __atomic_link_error (); +# elif __HAVE_64B_ATOMICS == 1 # define __atomic_check_size_ls(mem) \ if ((sizeof (*mem) != 1) && (sizeof (*mem) != 2) && (sizeof (*mem) != 4) \ && (sizeof (*mem) != 8)) \ diff --git a/sysdeps/aarch64/atomic-machine.h b/sysdeps/aarch64/atomic-machine.h index 52b3fb2047..14e9481392 100644 --- a/sysdeps/aarch64/atomic-machine.h +++ b/sysdeps/aarch64/atomic-machine.h @@ -54,6 +54,13 @@ model, __ATOMIC_RELAXED); \ }) +# define __arch_compare_and_exchange_bool_128_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + !__atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, \ + model, __ATOMIC_RELAXED); \ + }) + # define __arch_compare_and_exchange_val_8_int(mem, newval, oldval, model) \ ({ \ typeof (*mem) __oldval = (oldval); \ @@ -86,6 +93,14 @@ __oldval; \ }) +# define __arch_compare_and_exchange_val_128_int(mem, newval, oldval, model) \ + ({ \ + typeof (*mem) __oldval = (oldval); \ + __atomic_compare_exchange_n (mem, (void *) &__oldval, newval, 0, \ + model, __ATOMIC_RELAXED); \ + __oldval; \ + }) + /* Compare and exchange with "acquire" semantics, ie barrier after. */ @@ -118,6 +133,9 @@ # define __arch_exchange_64_int(mem, newval, model) \ __atomic_exchange_n (mem, newval, model) +# define __arch_exchange_128_int(mem, newval, model) \ + __atomic_exchange_n (mem, newval, model) + # define atomic_exchange_acq(mem, value) \ __atomic_val_bysize (__arch_exchange, int, mem, value, __ATOMIC_ACQUIRE) @@ -139,6 +157,9 @@ # define __arch_exchange_and_add_64_int(mem, value, model) \ __atomic_fetch_add (mem, value, model) +# define __arch_exchange_and_add_128_int(mem, value, model) \ + __atomic_fetch_add (mem, value, model) + # define atomic_exchange_and_add_acq(mem, value) \ __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ __ATOMIC_ACQUIRE)