Module Name: src Committed By: matt Date: Fri Aug 31 23:41:52 UTC 2012
Modified Files: src/common/lib/libc/arch/arm/atomic: atomic_add_32.S atomic_and_32.S atomic_cas_32.S atomic_cas_8.S atomic_dec_32.S atomic_inc_32.S atomic_or_32.S atomic_swap.S Log Message: Add dmb/dsb instructions as required by the armv7 arch man. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S \ src/common/lib/libc/arch/arm/atomic/atomic_and_32.S \ src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S \ src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S \ src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S \ src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S \ src/common/lib/libc/arch/arm/atomic/atomic_or_32.S cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/arm/atomic/atomic_swap.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libc/arch/arm/atomic/atomic_add_32.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.2 Sat Aug 16 07:12:39 2008 +++ src/common/lib/libc/arch/arm/atomic/atomic_add_32.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_add_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $ */ +/* $NetBSD: atomic_add_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -40,6 +40,11 @@ ENTRY_NP(_atomic_add_32) strex ip, r2, [r3] /* try to store */ cmp ip, #0 /* succeed? */ bne 1b /* no, try again */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return old value */ END(_atomic_add_32) ATOMIC_OP_ALIAS(atomic_add_32,_atomic_add_32) @@ -57,6 +62,11 @@ ENTRY_NP(_atomic_add_32_nv) strex r2, r0, [r3] /* try to store */ cmp r2, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_add_32_nv) ATOMIC_OP_ALIAS(atomic_add_32_nv,_atomic_add_32_nv) Index: src/common/lib/libc/arch/arm/atomic/atomic_and_32.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.2 Sat Aug 16 07:12:39 2008 +++ src/common/lib/libc/arch/arm/atomic/atomic_and_32.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_and_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $ */ +/* $NetBSD: atomic_and_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -40,6 +40,11 @@ ENTRY_NP(_atomic_and_32) strex ip, r2, [r3] /* try to store */ cmp ip, #0 /* succeed? */ bne 1b /* no, try again */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return old value */ END(_atomic_and_32) ATOMIC_OP_ALIAS(atomic_and_32,_atomic_and_32) @@ -55,6 +60,11 @@ ENTRY_NP(_atomic_and_32_nv) strex r2, r0, [r3] /* try to store */ cmp r2, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_and_32_nv) ATOMIC_OP_ALIAS(atomic_and_32_nv,_atomic_and_32_nv) Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.2 Sat Aug 16 07:12:39 2008 +++ src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_cas_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $ */ +/* $NetBSD: atomic_cas_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -44,15 +44,28 @@ ENTRY_NP(_atomic_cas_32) strex ip, r2, [r3] /* store new value */ cmp ip, #0 /* succeed? */ bne 1b /* nope, try again. */ - RET /* yes, return. */ +#ifdef _ARM_ARCH_7 + dsb +#else + mcr p15, 0, ip, c7, c10, 4 /* data synchronization barrier */ +#endif + RET /* return. */ END(_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_ulong,_atomic_cas_32) ATOMIC_OP_ALIAS(atomic_cas_ptr,_atomic_cas_32) +ATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic_cas_32) +ATOMIC_OP_ALIAS(atomic_cas_uint_ni,_atomic_cas_32) +ATOMIC_OP_ALIAS(atomic_cas_ulong_ni,_atomic_cas_32) +ATOMIC_OP_ALIAS(atomic_cas_ptr_ni,_atomic_cas_32) STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32) STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_32) +STRONG_ALIAS(_atomic_cas_32_ni,_atomic_cas_32) +STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_32) +STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32) +STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_32) STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_32) #endif /* _ARCH_ARM_6 */ Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.2 Thu Aug 16 16:49:10 2012 +++ src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_cas_8.S,v 1.2 2012/08/16 16:49:10 matt Exp $ */ +/* $NetBSD: atomic_cas_8.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -44,7 +44,12 @@ ENTRY_NP(_atomic_cas_8) strexb ip, r2, [r3] /* store new value */ cmp ip, #0 /* succeed? */ bne 1b /* nope, try again. */ - RET /* yes, return. */ +#ifdef _ARM_ARCH_7 + dsb /* data synchronization barrier */ +#else + mcr p15, 0, ip, c7, c10, 4 /* data synchronization barrier */ +#endif + RET /* return. */ END(_atomic_cas_8) ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8) Index: src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.2 Sat Aug 16 07:12:39 2008 +++ src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_dec_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $ */ +/* $NetBSD: atomic_dec_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -39,6 +39,11 @@ ENTRY_NP(_atomic_dec_32) strex r3, r1, [r2] /* try to store */ cmp r3, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_dec_32) ATOMIC_OP_ALIAS(atomic_dec_32,_atomic_dec_32) @@ -56,6 +61,11 @@ ENTRY_NP(_atomic_dec_32_nv) strex r1, r0, [r2] /* try to store */ cmp r1, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_dec_32_nv) ATOMIC_OP_ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv) Index: src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.2 Sat Aug 16 07:12:39 2008 +++ src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_inc_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $ */ +/* $NetBSD: atomic_inc_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -39,6 +39,11 @@ ENTRY_NP(_atomic_inc_32) strex r3, r1, [r2] /* try to store */ cmp r3, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_inc_32) ATOMIC_OP_ALIAS(atomic_inc_32,_atomic_inc_32) @@ -56,6 +61,11 @@ ENTRY_NP(_atomic_inc_32_nv) strex r1, r0, [r2] /* try to store */ cmp r1, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_inc_32_nv) ATOMIC_OP_ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv) Index: src/common/lib/libc/arch/arm/atomic/atomic_or_32.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.3 --- src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.2 Sat Aug 16 07:12:39 2008 +++ src/common/lib/libc/arch/arm/atomic/atomic_or_32.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_or_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $ */ +/* $NetBSD: atomic_or_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -39,6 +39,11 @@ ENTRY_NP(_atomic_or_32) strex ip, r2, [r3] /* try to store */ cmp ip, #0 /* succeed? */ bne 1b /* no, try again */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return old value */ END(_atomic_or_32) ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32) @@ -54,6 +59,11 @@ ENTRY_NP(_atomic_or_32_nv) strex r2, r0, [r3] /* try to store */ cmp r2, #0 /* succeed? */ bne 1b /* no, try again? */ +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET /* return new value */ END(_atomic_or_32_nv) ATOMIC_OP_ALIAS(atomic_or_32_nv,_atomic_or_32_nv) Index: src/common/lib/libc/arch/arm/atomic/atomic_swap.S diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.4 --- src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.3 Thu Aug 16 16:49:10 2012 +++ src/common/lib/libc/arch/arm/atomic/atomic_swap.S Fri Aug 31 23:41:52 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_swap.S,v 1.3 2012/08/16 16:49:10 matt Exp $ */ +/* $NetBSD: atomic_swap.S,v 1.4 2012/08/31 23:41:52 matt Exp $ */ /*- * Copyright (c) 2007,2012 The NetBSD Foundation, Inc. @@ -49,13 +49,20 @@ ENTRY_NP(_atomic_swap_32) 1: #ifdef _ARM_ARCH_6 ldrex r0, [r2] - strex r3, r1, [r2] + cmp r0, r1 + strexne ip, r1, [r2] #else swp r0, r1, [r2] - mov r3, #0 + cmp r0, r1 + movsne ip, #0 #endif - cmp r3, #0 + cmpne ip, #0 bne 1b +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET END(_atomic_swap_32) ATOMIC_OP_ALIAS(atomic_swap_32,_atomic_swap_32) @@ -78,6 +85,11 @@ ENTRY_NP(_atomic_swap_8) #endif cmp r3, #0 bne 1b +#ifdef _ARM_ARCH_7 + dmb +#else + mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */ +#endif RET END(_atomic_swap_8) ATOMIC_OP_ALIAS(atomic_swap_8,_atomic_swap_8)