From owner-svn-src-head@FreeBSD.ORG Tue Mar 31 23:47:18 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7966A106566C; Tue, 31 Mar 2009 23:47:18 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 67C308FC14; Tue, 31 Mar 2009 23:47:18 +0000 (UTC) (envelope-from cognet@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n2VNlIph013221; Tue, 31 Mar 2009 23:47:18 GMT (envelope-from cognet@svn.freebsd.org) Received: (from cognet@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n2VNlIZk013220; Tue, 31 Mar 2009 23:47:18 GMT (envelope-from cognet@svn.freebsd.org) Message-Id: <200903312347.n2VNlIZk013220@svn.freebsd.org> From: Olivier Houchard Date: Tue, 31 Mar 2009 23:47:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r190603 - head/sys/arm/include X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Mar 2009 23:47:18 -0000 Author: cognet Date: Tue Mar 31 23:47:18 2009 New Revision: 190603 URL: http://svn.freebsd.org/changeset/base/190603 Log: Fix the userland, RAS, version of atomic_fetchadd_32 : return the correct value, and do not store the wrong one in the supplied pointer. Submitted by: Mark Tinguely Modified: head/sys/arm/include/atomic.h Modified: head/sys/arm/include/atomic.h ============================================================================== --- head/sys/arm/include/atomic.h Tue Mar 31 23:06:20 2009 (r190602) +++ head/sys/arm/include/atomic.h Tue Mar 31 23:47:18 2009 (r190603) @@ -264,22 +264,23 @@ atomic_clear_32(volatile uint32_t *addre static __inline uint32_t atomic_fetchadd_32(volatile uint32_t *p, uint32_t v) { - uint32_t start, ras_start = ARM_RAS_START; + uint32_t start, tmp, ras_start = ARM_RAS_START; __asm __volatile("1:\n" "adr %1, 1b\n" "str %1, [%0]\n" "adr %1, 2f\n" "str %1, [%0, #4]\n" - "ldr %1, [%2]\n" - "add %1, %1, %3\n" - "str %0, [%2]\n" + "ldr %1, [%3]\n" + "mov %2, %1\n" + "add %2, %2, %4\n" + "str %2, [%3]\n" "2:\n" - "mov %3, #0\n" - "str %3, [%0]\n" - "mov %3, #0xffffffff\n" - "str %3, [%0, #4]\n" - : "+r" (ras_start), "=r" (start), "+r" (p), "+r" (v) + "mov %2, #0\n" + "str %2, [%0]\n" + "mov %2, #0xffffffff\n" + "str %2, [%0, #4]\n" + : "+r" (ras_start), "=r" (start), "=r" (tmp), "+r" (p), "+r" (v) : : "memory"); return (start); }