From owner-svn-src-head@FreeBSD.ORG Sun Mar 1 10:04:15 2015 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E825A586; Sun, 1 Mar 2015 10:04:15 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B913CA0C; Sun, 1 Mar 2015 10:04:15 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t21A4FGE058400; Sun, 1 Mar 2015 10:04:15 GMT (envelope-from andrew@FreeBSD.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t21A4EkE058398; Sun, 1 Mar 2015 10:04:14 GMT (envelope-from andrew@FreeBSD.org) Message-Id: <201503011004.t21A4EkE058398@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: andrew set sender to andrew@FreeBSD.org using -f From: Andrew Turner Date: Sun, 1 Mar 2015 10:04:14 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r279483 - head/sys/cddl/dev/dtrace/arm X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18-1 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: Sun, 01 Mar 2015 10:04:16 -0000 Author: andrew Date: Sun Mar 1 10:04:14 2015 New Revision: 279483 URL: https://svnweb.freebsd.org/changeset/base/279483 Log: Fix the dtrace ARM atomic compare-and-set functions. These functions are expected to return the data in the memory location pointed at by target after the operation. The FreeBSD atomic functions previously used return either 0 or 1 to indicate if the comparison succeeded or not respectively. With this change these functions only support ARMv6 and later are supported by these functions. Sponsored by: ABT Systems Ltd Modified: head/sys/cddl/dev/dtrace/arm/dtrace_asm.S head/sys/cddl/dev/dtrace/arm/dtrace_isa.c Modified: head/sys/cddl/dev/dtrace/arm/dtrace_asm.S ============================================================================== --- head/sys/cddl/dev/dtrace/arm/dtrace_asm.S Sun Mar 1 09:29:59 2015 (r279482) +++ head/sys/cddl/dev/dtrace/arm/dtrace_asm.S Sun Mar 1 10:04:14 2015 (r279483) @@ -195,3 +195,25 @@ ENTRY(dtrace_caller) mov r0, #-1 RET END(dtrace_caller) + +/* +uint32_t +dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new) + +void * +dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new) +*/ +ENTRY(dtrace_cas32) +EENTRY(dtrace_casptr) +1: ldrex r3, [r0] /* Load target */ + cmp r3, r1 /* Check if *target == cmp */ + bne 2f /* No, return */ + strex r3, r2, [r0] /* Store new to target */ + cmp r3, #0 /* Did the store succeed? */ + bne 1b /* No, try again */ + mov r0, r2 /* Return the new value of the store */ +2: movne r0, r3 /* The first compare failed, return */ + /* the value loaded from memory */ + RET +EEND(dtrace_casptr) +END(dtrace_cas32) Modified: head/sys/cddl/dev/dtrace/arm/dtrace_isa.c ============================================================================== --- head/sys/cddl/dev/dtrace/arm/dtrace_isa.c Sun Mar 1 09:29:59 2015 (r279482) +++ head/sys/cddl/dev/dtrace/arm/dtrace_isa.c Sun Mar 1 10:04:14 2015 (r279483) @@ -262,34 +262,3 @@ dtrace_fuword64(void *uaddr) } return (dtrace_fuword64_nocheck(uaddr)); } - -#define __with_interrupts_disabled(expr) \ - do { \ - u_int cpsr_save, tmp; \ - \ - __asm __volatile( \ - "mrs %0, cpsr;" \ - "orr %1, %0, %2;" \ - "msr cpsr_fsxc, %1;" \ - : "=r" (cpsr_save), "=r" (tmp) \ - : "I" (PSR_I | PSR_F) \ - : "cc" ); \ - (expr); \ - __asm __volatile( \ - "msr cpsr_fsxc, %0" \ - : /* no output */ \ - : "r" (cpsr_save) \ - : "cc" ); \ - } while(0) - -uint32_t dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new) -{ - return atomic_cmpset_32((uint32_t*)target, (uint32_t)cmp, (uint32_t)new); - -} - -void * dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new) -{ - return (void*)dtrace_cas32((uint32_t*)target, (uint32_t)cmp, (uint32_t)new); -} -