atomic.h (148453) | atomic.h (150627) |
---|---|
1/* $NetBSD: atomic.h,v 1.1 2002/10/19 12:22:34 bsh Exp $ */ 2 3/*- 4 * Copyright (C) 2003-2004 Olivier Houchard 5 * Copyright (C) 1994-1997 Mark Brinicombe 6 * Copyright (C) 1994 Brini 7 * All rights reserved. 8 * --- 19 unchanged lines hidden (view full) --- 28 * IN NO EVENT SHALL BRINI BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 30 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 31 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 32 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 33 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 34 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 * | 1/* $NetBSD: atomic.h,v 1.1 2002/10/19 12:22:34 bsh Exp $ */ 2 3/*- 4 * Copyright (C) 2003-2004 Olivier Houchard 5 * Copyright (C) 1994-1997 Mark Brinicombe 6 * Copyright (C) 1994 Brini 7 * All rights reserved. 8 * --- 19 unchanged lines hidden (view full) --- 28 * IN NO EVENT SHALL BRINI BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 30 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 31 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 32 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 33 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 34 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 * |
36 * $FreeBSD: head/sys/arm/include/atomic.h 148453 2005-07-27 20:01:45Z jhb $ | 36 * $FreeBSD: head/sys/arm/include/atomic.h 150627 2005-09-27 17:39:11Z jhb $ |
37 */ 38 39#ifndef _MACHINE_ATOMIC_H_ 40#define _MACHINE_ATOMIC_H_ 41 42 43 44#ifndef _LOCORE --- 77 unchanged lines hidden (view full) --- 122} 123 124static __inline void 125atomic_subtract_32(volatile u_int32_t *p, u_int32_t val) 126{ 127 __with_interrupts_disabled(*p -= val); 128} 129 | 37 */ 38 39#ifndef _MACHINE_ATOMIC_H_ 40#define _MACHINE_ATOMIC_H_ 41 42 43 44#ifndef _LOCORE --- 77 unchanged lines hidden (view full) --- 122} 123 124static __inline void 125atomic_subtract_32(volatile u_int32_t *p, u_int32_t val) 126{ 127 __with_interrupts_disabled(*p -= val); 128} 129 |
130static __inline uint32_t 131atomic_fetchadd_32(volatile uint32_t *p, uint32_t v) 132{ 133 uint32_t value; 134 135 __with_interrupts_disabled( 136 { 137 value = *p; 138 *p += v; 139 }); 140 return (value); 141} 142 |
|
130#else /* !_KERNEL */ 131 132static __inline u_int32_t 133atomic_cmpset_32(volatile u_int32_t *p, volatile u_int32_t cmpval, volatile u_int32_t newval) 134{ 135 register int done, ras_start; 136 137 __asm __volatile("1:\n" --- 97 unchanged lines hidden (view full) --- 235 "bic %1, %1, %3\n" 236 "str %1, [%2]\n" 237 "2:\n" 238 "mov %1, #0\n" 239 "str %1, [%0]\n" 240 : "=r" (ras_start), "=r" (start), "+r" (address), "+r" (clearmask)); 241 242} | 143#else /* !_KERNEL */ 144 145static __inline u_int32_t 146atomic_cmpset_32(volatile u_int32_t *p, volatile u_int32_t cmpval, volatile u_int32_t newval) 147{ 148 register int done, ras_start; 149 150 __asm __volatile("1:\n" --- 97 unchanged lines hidden (view full) --- 248 "bic %1, %1, %3\n" 249 "str %1, [%2]\n" 250 "2:\n" 251 "mov %1, #0\n" 252 "str %1, [%0]\n" 253 : "=r" (ras_start), "=r" (start), "+r" (address), "+r" (clearmask)); 254 255} |
256 257static __inline uint32_t 258atomic_fetchadd_32(volatile uint32_t *p, uint32_t v) 259{ 260 uint32_t ras_start, start; 261 262 __asm __volatile("1:\n" 263 "mov %0, #0xe0000008\n" 264 "adr %1, 2f\n" 265 "str %1, [%0]\n" 266 "adr %1, 1b\n" 267 "mov %0, #0xe0000004\n" 268 "str %1, [%0]\n" 269 "ldr %1, %2\n" 270 "add %3, %1, %3\n" 271 "str %3, %2\n" 272 "2:\n" 273 "mov %3, #0\n" 274 "str %3, [%0]\n" 275 : "=r" (ras_start), "=r" (start), "=m" (*p), "+r" (v)); 276 return (start); 277} 278 279 |
|
243#endif /* _KERNEL */ 244 245static __inline int 246atomic_load_32(volatile uint32_t *v) 247{ 248 249 return (*v); 250} --- 35 unchanged lines hidden (view full) --- 286#define atomic_store_rel_int atomic_store_32 287#define atomic_cmpset_rel_32 atomic_cmpset_32 288#define atomic_cmpset_rel_ptr atomic_cmpset_ptr 289#define atomic_load_acq_int atomic_load_32 290#define atomic_clear_ptr atomic_clear_32 291#define atomic_store_ptr atomic_store_32 292#define atomic_cmpset_ptr atomic_cmpset_32 293#define atomic_set_ptr atomic_set_32 | 280#endif /* _KERNEL */ 281 282static __inline int 283atomic_load_32(volatile uint32_t *v) 284{ 285 286 return (*v); 287} --- 35 unchanged lines hidden (view full) --- 323#define atomic_store_rel_int atomic_store_32 324#define atomic_cmpset_rel_32 atomic_cmpset_32 325#define atomic_cmpset_rel_ptr atomic_cmpset_ptr 326#define atomic_load_acq_int atomic_load_32 327#define atomic_clear_ptr atomic_clear_32 328#define atomic_store_ptr atomic_store_32 329#define atomic_cmpset_ptr atomic_cmpset_32 330#define atomic_set_ptr atomic_set_32 |
331#define atomic_fetchadd_int atomic_fetchadd_32 |
|
294 295#endif /* _MACHINE_ATOMIC_H_ */ | 332 333#endif /* _MACHINE_ATOMIC_H_ */ |