From owner-dev-commits-src-all@freebsd.org Sat Jan 2 19:53:32 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 7CCBE4DD42A; Sat, 2 Jan 2021 19:53:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D7Xd83207z4syt; Sat, 2 Jan 2021 19:53:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4FFFE1ADC0; Sat, 2 Jan 2021 19:53:32 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 102JrWTp061176; Sat, 2 Jan 2021 19:53:32 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 102JrWvW061175; Sat, 2 Jan 2021 19:53:32 GMT (envelope-from git) Date: Sat, 2 Jan 2021 19:53:32 GMT Message-Id: <202101021953.102JrWvW061175@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Michal Meloun Subject: git: bd03acedb804 - main - arm: Fix atomic_testand{set, clear}_32(). According to atomic (9), the bit position argument should be a modulo operand size. While I'm in, add missing implementation of atomic_testandclear_64(). For more details see https://reviews.freebsd.org/D27886 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mmel X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: bd03acedb804add1e22178d50eb2bfb703974ddf Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Jan 2021 19:53:32 -0000 The branch main has been updated by mmel: URL: https://cgit.FreeBSD.org/src/commit/?id=bd03acedb804add1e22178d50eb2bfb703974ddf commit bd03acedb804add1e22178d50eb2bfb703974ddf Author: Michal Meloun AuthorDate: 2021-01-02 19:30:00 +0000 Commit: Michal Meloun CommitDate: 2021-01-02 19:53:11 +0000 arm: Fix atomic_testand{set,clear}_32(). According to atomic (9), the bit position argument should be a modulo operand size. While I'm in, add missing implementation of atomic_testandclear_64(). For more details see https://reviews.freebsd.org/D27886 Discused with: rlibby MFC after: 3 weeks --- sys/arm/include/atomic-v6.h | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/sys/arm/include/atomic-v6.h b/sys/arm/include/atomic-v6.h index 38072b5b3d77..ede879cb9fa8 100644 --- a/sys/arm/include/atomic-v6.h +++ b/sys/arm/include/atomic-v6.h @@ -881,7 +881,7 @@ atomic_testandclear_32(volatile uint32_t *ptr, u_int bit) [oldv] "=&r" (oldv), [newv] "=&r" (newv) : [ptr] "r" (ptr), - "[bit]" (bit) + "[bit]" (bit & 0x1f) : "cc", "ip", "memory"); return (result); @@ -902,6 +902,23 @@ atomic_testandclear_long(volatile u_long *p, u_int v) } #define atomic_testandclear_long atomic_testandclear_long + +static __inline int +atomic_testandclear_64(volatile uint64_t *p, u_int v) +{ + volatile uint32_t *p32; + + p32 = (volatile uint32_t *)p; + /* + * Assume little-endian, + * atomic_testandclear_32() uses only last 5 bits of v + */ + if (v >= 32) { + p32++; + } + return (atomic_testandclear_32(p32, v)); +} + static __inline int atomic_testandset_32(volatile uint32_t *ptr, u_int bit) { @@ -925,7 +942,7 @@ atomic_testandset_32(volatile uint32_t *ptr, u_int bit) [oldv] "=&r" (oldv), [newv] "=&r" (newv) : [ptr] "r" (ptr), - "[bit]" (bit) + "[bit]" (bit & 0x1f) : "cc", "ip", "memory"); return (result); @@ -952,9 +969,11 @@ atomic_testandset_64(volatile uint64_t *p, u_int v) volatile uint32_t *p32; p32 = (volatile uint32_t *)p; - /* Assume little-endian */ + /* + * Assume little-endian, + * atomic_testandset_32() uses only last 5 bits of v + */ if (v >= 32) { - v &= 0x1f; p32++; } return (atomic_testandset_32(p32, v));