Unify asm-x86/atomic.h
Subsystems (2)
PATCH 2/2 Unify asm-x86/atomic.h
...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on x86_32 SMP.
--- include/asm-x86/atomic.h | 64 ++++++++++++++++++++++++++++++++++++++++++++ include/asm-x86/atomic_32.h | 31 --------------------- include/asm-x86/atomic_64.h | 33 ---------------------- 3 files changed, 64 insertions(+), 64 deletions(-)
include/asm-x86/atomic.h +64 -0
@@ -1,5 +1,69 @@ +/* +* Copyright (C) 2007 Philippe Gerum <[email protected]>. +* +* Xenomai is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published +* by the Free Software Foundation; either version 2 of the License, +* or (at your option) any later version. +* +* Xenomai is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Xenomai; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +* 02111-1307, USA. +*/ + +#ifndef _XENO_ASM_X86_ATOMIC_H +#define _XENO_ASM_X86_ATOMIC_H + +#include <asm/xenomai/features.h> + +typedef unsigned long atomic_flags_t ; + +#ifdef __KERNEL__ + +#include <linux/bitops.h> +#include <asm/atomic.h> +#include <asm/system.h> + +#define xnarch_atomic_set_mask (pflags,mask) \ + atomic_set_mask((mask),(unsigned *)(pflags)) +#define xnarch_atomic_clear_mask (pflags,mask) \ + atomic_clear_mask((mask),(unsigned *)(pflags)) +#define xnarch_atomic_xchg (ptr,x) xchg(ptr,x) + +#define xnarch_memory_barrier () smp_mb() + +#else /* !__KERNEL__ */ + +#include <xeno_config.h> + +#ifdef CONFIG_SMP +#define LOCK_PREFIX "lock ; " +#else +#define LOCK_PREFIX "" +#endif + +typedef struct {unsigned long counter; }xnarch_atomic_t ; + +#define xnarch_atomic_get (v) ((v)->counter) + +#define xnarch_atomic_set (v,i) (((v)->counter) = (i)) + +#define xnarch_write_memory_barrier () xnarch_memory_barrier() + +#endif /* __KERNEL__ */ +#ifdef __i386__#include "atomic_32.h" #else #include "atomic_64.h" #endif + +#include <asm-generic/xenomai/atomic.h> + +#endif /* !_XENO_ASM_X86_ATOMIC_64_H */
include/asm-x86/atomic_32.h +0 -31
@@ -19,48 +19,23 @@ #ifndef _XENO_ASM_X86_ATOMIC_32_H #define _XENO_ASM_X86_ATOMIC_32_H -#define _XENO_ASM_X86_ATOMIC_H #ifdef __KERNEL__ -#include <linux/bitops.h> -#include <asm/atomic.h> -#include <asm/system.h> - #define xnarch_atomic_set(pcounter,i) atomic_set(pcounter,i) #define xnarch_atomic_get(pcounter) atomic_read(pcounter) #define xnarch_atomic_inc(pcounter) atomic_inc(pcounter) #define xnarch_atomic_dec(pcounter) atomic_dec(pcounter) #define xnarch_atomic_inc_and_test(pcounter) atomic_inc_and_test(pcounter) #define xnarch_atomic_dec_and_test(pcounter) atomic_dec_and_test(pcounter) -#define xnarch_atomic_set_mask(pflags,mask) atomic_set_mask(mask,pflags) -#define xnarch_atomic_clear_mask(pflags,mask) atomic_clear_mask(mask,pflags) -#define xnarch_atomic_xchg(ptr,x) xchg(ptr,x) #define xnarch_atomic_cmpxchg(pcounter,old,new) \ atomic_cmpxchg((pcounter),(old),(new)) -#define xnarch_memory_barrier() smp_mb() - -typedef atomic_t atomic_counter_t; -typedef atomic_t xnarch_atomic_t; - #else /* !__KERNEL__ */ -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif - -typedef struct { int counter; } xnarch_atomic_t; - struct __xeno_xchg_dummy { unsigned long a[100]; }; #define __xeno_xg(x) ((struct __xeno_xchg_dummy *)(x)) -#define xnarch_atomic_get(v) ((v)->counter) - -#define xnarch_atomic_set(v,i) (((v)->counter) = (i)) - static inline unsigned long xnarch_atomic_xchg (volatile void *ptr, unsigned long x) {
@@ -88,13 +63,7 @@ xnarch_atomic_cmpxchg(xnarch_atomic_t *v#define xnarch_read_memory_barrier () \ __asm__ __volatile__ (LOCK_PREFIX "addl $0,0(%%esp)": : :"memory") -#define xnarch_write_memory_barrier () xnarch_memory_barrier()#endif /* !__KERNEL__ */ -typedef unsigned long atomic_flags_t ; - -#include <asm/xenomai/features.h> -#include <asm-generic/xenomai/atomic.h> -#endif /* !_XENO_ASM_X86_ATOMIC_32_H */
include/asm-x86/atomic_64.h +0 -33
@@ -19,55 +19,25 @@ #ifndef _XENO_ASM_X86_ATOMIC_64_H #define _XENO_ASM_X86_ATOMIC_64_H -#define _XENO_ASM_X86_ATOMIC_H - -#include <asm/xenomai/features.h> - -typedef unsigned long atomic_flags_t; #ifdef __KERNEL__ -#include <linux/bitops.h> -#include <asm/atomic.h> -#include <asm/system.h> - #define xnarch_atomic_set(pcounter,i) atomic64_set(pcounter,i) #define xnarch_atomic_get(pcounter) atomic64_read(pcounter) #define xnarch_atomic_inc(pcounter) atomic64_inc(pcounter) #define xnarch_atomic_dec(pcounter) atomic64_dec(pcounter) #define xnarch_atomic_inc_and_test(pcounter) atomic64_inc_and_test(pcounter) #define xnarch_atomic_dec_and_test(pcounter) atomic64_dec_and_test(pcounter) -#define xnarch_atomic_set_mask(pflags,mask) \ - atomic_set_mask((mask),(unsigned *)(pflags)) -#define xnarch_atomic_clear_mask(pflags,mask) \ - atomic_clear_mask((mask),(unsigned *)(pflags)) -#define xnarch_atomic_xchg(ptr,x) xchg(ptr,x) #define xnarch_atomic_cmpxchg(pcounter,old,new) \ atomic64_cmpxchg((pcounter),(old),(new)) -#define xnarch_memory_barrier() smp_mb() - typedef atomic64_t atomic_counter_t; typedef atomic64_t xnarch_atomic_t; -#include <asm-generic/xenomai/atomic.h> - #else /* !__KERNEL__ */ -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif - -typedef struct { unsigned long counter; } xnarch_atomic_t; - #define __xeno_xg(x) ((volatile long *)(x)) -#define xnarch_atomic_get(v) ((v)->counter) - -#define xnarch_atomic_set(v,i) (((v)->counter) = (i)) - static inline unsigned long xnarch_atomic_xchg (volatile void *ptr, unsigned long x) {
@@ -93,10 +63,7 @@ xnarch_atomic_cmpxchg(xnarch_atomic_t *v#define xnarch_memory_barrier () asm volatile("mfence":::"memory")#define xnarch_read_memory_barrier () asm volatile("lfence":::"memory") -#define xnarch_write_memory_barrier () xnarch_memory_barrier()#endif /* __KERNEL__ */ -#include <asm-generic/xenomai/atomic.h> -#endif /* !_XENO_ASM_X86_ATOMIC_64_H */
Quoted 2 lines · Jan Kiszka
...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on
x86_32SMP.
This looks to me as a half-way unification. Can we not totally get rid of atomic_32.h and atomic_64.h ? I mean since we are using unsigned long as atomic_t on both platforms, there should not be much difference (except maybe the inline asm).
Signature · 1 line
Gilles.
Quoted 9 lines · Gilles Chanteperdrix
Quoted 2 lines · Jan Kiszka
...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on
x86_32SMP.This looks to me as a half-way unification. Can we not totally get rid of
atomic_32.handatomic_64.h? I mean since we are using unsigned long asatomic_ton both platforms, there should not be much difference (except maybe the inline asm).
I could merge all atomic_32/64.h hunks into atomic.h if that this preferred, but I cannot help getting rid of the atomic_t vs. atomic64_t differences, thus the sub-arch specific part cannot be reduced as far as I see it ATM.
However, yesterday's version contained a regression /wrt 32 bit (missing atomic_counter_t and xnarch_atomic_t type definitions), this one is better:
--- include/asm-x86/atomic.h | 64 ++++++++++++++++++++++++++++++++++++++++++++ include/asm-x86/atomic_32.h | 31 --------------------- include/asm-x86/atomic_64.h | 33 ---------------------- 3 files changed, 65 insertions(+), 63 deletions(-)
include/asm-x86/atomic.h +64 -0
@@ -1,5 +1,69 @@ +/* +* Copyright (C) 2007 Philippe Gerum <[email protected]>. +* +* Xenomai is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published +* by the Free Software Foundation; either version 2 of the License, +* or (at your option) any later version. +* +* Xenomai is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Xenomai; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +* 02111-1307, USA. +*/ + +#ifndef _XENO_ASM_X86_ATOMIC_H +#define _XENO_ASM_X86_ATOMIC_H + +#include <asm/xenomai/features.h> + +typedef unsigned long atomic_flags_t ; + +#ifdef __KERNEL__ + +#include <linux/bitops.h> +#include <asm/atomic.h> +#include <asm/system.h> + +#define xnarch_atomic_set_mask (pflags,mask) \ + atomic_set_mask((mask),(unsigned *)(pflags)) +#define xnarch_atomic_clear_mask (pflags,mask) \ + atomic_clear_mask((mask),(unsigned *)(pflags)) +#define xnarch_atomic_xchg (ptr,x) xchg(ptr,x) + +#define xnarch_memory_barrier () smp_mb() + +#else /* !__KERNEL__ */ + +#include <xeno_config.h> + +#ifdef CONFIG_SMP +#define LOCK_PREFIX "lock ; " +#else +#define LOCK_PREFIX "" +#endif + +typedef struct {unsigned long counter; }xnarch_atomic_t ; + +#define xnarch_atomic_get (v) ((v)->counter) + +#define xnarch_atomic_set (v,i) (((v)->counter) = (i)) + +#define xnarch_write_memory_barrier () xnarch_memory_barrier() + +#endif /* __KERNEL__ */ +#ifdef __i386__#include "atomic_32.h" #else #include "atomic_64.h" #endif + +#include <asm-generic/xenomai/atomic.h> + +#endif /* !_XENO_ASM_X86_ATOMIC_64_H */
include/asm-x86/atomic_32.h +1 -30
@@ -19,48 +19,26 @@ #ifndef _XENO_ASM_X86_ATOMIC_32_H #define _XENO_ASM_X86_ATOMIC_32_H -#define _XENO_ASM_X86_ATOMIC_H #ifdef __KERNEL__ -#include <linux/bitops.h> -#include <asm/atomic.h> -#include <asm/system.h> - #define xnarch_atomic_set(pcounter,i) atomic_set(pcounter,i) #define xnarch_atomic_get(pcounter) atomic_read(pcounter) #define xnarch_atomic_inc(pcounter) atomic_inc(pcounter) #define xnarch_atomic_dec(pcounter) atomic_dec(pcounter) #define xnarch_atomic_inc_and_test(pcounter) atomic_inc_and_test(pcounter) #define xnarch_atomic_dec_and_test(pcounter) atomic_dec_and_test(pcounter) -#define xnarch_atomic_set_mask(pflags,mask) atomic_set_mask(mask,pflags) -#define xnarch_atomic_clear_mask(pflags,mask) atomic_clear_mask(mask,pflags) -#define xnarch_atomic_xchg(ptr,x) xchg(ptr,x) #define xnarch_atomic_cmpxchg(pcounter,old,new) \ atomic_cmpxchg((pcounter),(old),(new)) -#define xnarch_memory_barrier() smp_mb() - typedef atomic_t atomic_counter_t; typedef atomic_t xnarch_atomic_t; #else /* !__KERNEL__ */ -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif - -typedef struct { int counter; } xnarch_atomic_t; - struct __xeno_xchg_dummy { unsigned long a[100]; }; #define __xeno_xg(x) ((struct __xeno_xchg_dummy *)(x)) -#define xnarch_atomic_get(v) ((v)->counter) - -#define xnarch_atomic_set(v,i) (((v)->counter) = (i)) - static inline unsigned long xnarch_atomic_xchg (volatile void *ptr, unsigned long x) {
@@ -84,17 +62,10 @@ xnarch_atomic_cmpxchg(xnarch_atomic_t *vreturn prev; } -#define xnarch_memory_barrier () __asm__ __volatile__("": : :"memory") - +#define xnarch_memory_barrier () __asm__ __volatile__("": : :"memory")#define xnarch_read_memory_barrier () \ __asm__ __volatile__ (LOCK_PREFIX "addl $0,0(%%esp)": : :"memory") -#define xnarch_write_memory_barrier () xnarch_memory_barrier()#endif /* !__KERNEL__ */ -typedef unsigned long atomic_flags_t ; - -#include <asm/xenomai/features.h> -#include <asm-generic/xenomai/atomic.h> -#endif /* !_XENO_ASM_X86_ATOMIC_32_H */
include/asm-x86/atomic_64.h +0 -33
@@ -19,55 +19,25 @@ #ifndef _XENO_ASM_X86_ATOMIC_64_H #define _XENO_ASM_X86_ATOMIC_64_H -#define _XENO_ASM_X86_ATOMIC_H - -#include <asm/xenomai/features.h> - -typedef unsigned long atomic_flags_t; #ifdef __KERNEL__ -#include <linux/bitops.h> -#include <asm/atomic.h> -#include <asm/system.h> - #define xnarch_atomic_set(pcounter,i) atomic64_set(pcounter,i) #define xnarch_atomic_get(pcounter) atomic64_read(pcounter) #define xnarch_atomic_inc(pcounter) atomic64_inc(pcounter) #define xnarch_atomic_dec(pcounter) atomic64_dec(pcounter) #define xnarch_atomic_inc_and_test(pcounter) atomic64_inc_and_test(pcounter) #define xnarch_atomic_dec_and_test(pcounter) atomic64_dec_and_test(pcounter) -#define xnarch_atomic_set_mask(pflags,mask) \ - atomic_set_mask((mask),(unsigned *)(pflags)) -#define xnarch_atomic_clear_mask(pflags,mask) \ - atomic_clear_mask((mask),(unsigned *)(pflags)) -#define xnarch_atomic_xchg(ptr,x) xchg(ptr,x) #define xnarch_atomic_cmpxchg(pcounter,old,new) \ atomic64_cmpxchg((pcounter),(old),(new)) -#define xnarch_memory_barrier() smp_mb() - typedef atomic64_t atomic_counter_t; typedef atomic64_t xnarch_atomic_t; -#include <asm-generic/xenomai/atomic.h> - #else /* !__KERNEL__ */ -#ifdef CONFIG_SMP -#define LOCK_PREFIX "lock ; " -#else -#define LOCK_PREFIX "" -#endif - -typedef struct { unsigned long counter; } xnarch_atomic_t; - #define __xeno_xg(x) ((volatile long *)(x)) -#define xnarch_atomic_get(v) ((v)->counter) - -#define xnarch_atomic_set(v,i) (((v)->counter) = (i)) - static inline unsigned long xnarch_atomic_xchg (volatile void *ptr, unsigned long x) {
@@ -93,10 +63,7 @@ xnarch_atomic_cmpxchg(xnarch_atomic_t *v#define xnarch_memory_barrier () asm volatile("mfence":::"memory")#define xnarch_read_memory_barrier () asm volatile("lfence":::"memory") -#define xnarch_write_memory_barrier () xnarch_memory_barrier()#endif /* __KERNEL__ */ -#include <asm-generic/xenomai/atomic.h> -#endif /* !_XENO_ASM_X86_ATOMIC_64_H */
Quoted 10 lines · Jan Kiszka
Quoted 8 lines · Gilles Chanteperdrix
Quoted 2 lines · Jan Kiszka
...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on
x86_32SMP.This looks to me as a half-way unification. Can we not totally get rid of
atomic_32.handatomic_64.h? I mean since we are using unsigned long asatomic_ton both platforms, there should not be much difference (except maybe the inline asm).
Quoted 4 lines
I could merge all atomic_32/64.h hunks into
atomic.hif that this preferred, but I cannot help getting rid of theatomic_tvs.atomic64_tdifferences, thus the sub-arch specific part cannot be reduced as far as I see it ATM.
We could use atomic_long_t on the two arches.
Signature · 1 line
Gilles.
Quoted 10 lines · Gilles Chanteperdrix
Quoted 9 lines · Jan Kiszka
Quoted 8 lines · Gilles Chanteperdrix
Quoted 2 lines · Jan Kiszka
...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on
x86_32SMP.This looks to me as a half-way unification. Can we not totally get rid of
atomic_32.handatomic_64.h? I mean since we are using unsigned long asatomic_ton both platforms, there should not be much difference (except maybe the inline asm).
Quoted 6 lines
Quoted 4 lines
I could merge all atomic_32/64.h hunks into
atomic.hif that this preferred, but I cannot help getting rid of theatomic_tvs.atomic64_tdifferences, thus the sub-arch specific part cannot be reduced as far as I see it ATM.We could use
atomic_long_ton the two arches.
OK, but then it becomes wrapping business (2.4...) - on the long term a vanishing issue, granted. Will look into this.
Jan
Quoted 11 lines · Jan Kiszka
Quoted 10 lines · Gilles Chanteperdrix
Quoted 9 lines · Jan Kiszka
Quoted 8 lines · Gilles Chanteperdrix
Quoted 2 lines · Jan Kiszka
...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on
x86_32SMP.This looks to me as a half-way unification. Can we not totally get rid of
atomic_32.handatomic_64.h? I mean since we are using unsigned long asatomic_ton both platforms, there should not be much difference (except maybe the inline asm).
Quoted 8 lines
Quoted 5 lines
Quoted 4 lines
I could merge all atomic_32/64.h hunks into
atomic.hif that this preferred, but I cannot help getting rid of theatomic_tvs.atomic64_tdifferences, thus the sub-arch specific part cannot be reduced as far as I see it ATM.We could use
atomic_long_ton the two arches.OK, but then it becomes wrapping business (2.4...) - on the long term a vanishing issue, granted. Will look into this.
Here we go, an atomic_long_t based unification patch. Cannot test 2.4 kernel built, unfortunately, but the rest is fine (note: requires bootstrap run).
Jan
--- include/asm-generic/wrappers.h | 82 ++++++++++++++++++----- include/asm-x86/Makefile.am | 2 include/asm-x86/atomic.h | 142 ++++++++++++++++++++++++++++++++++++++++- include/asm-x86/atomic_32.h | 101 ----------------------------- include/asm-x86/atomic_64.h | 102 ----------------------------- 5 files changed, 203 insertions(+), 226 deletions(-)
include/asm-x86/atomic.h +139 -3
@@ -1,5 +1,141 @@ -#ifdef __i386__ -#include "atomic_32.h" +/* +* Copyright (C) 2007 Philippe Gerum <[email protected]>. +* +* Xenomai is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published +* by the Free Software Foundation; either version 2 of the License, +* or (at your option) any later version. +* +* Xenomai is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Xenomai; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +* 02111-1307, USA. +*/ + +#ifndef _XENO_ASM_X86_ATOMIC_H +#define _XENO_ASM_X86_ATOMIC_H + +#include <asm/xenomai/features.h> + +typedef unsigned long atomic_flags_t ; + +#ifdef __KERNEL__ + +#include <linux/bitops.h> +#include <asm/atomic.h> +#include <asm/system.h> + +#define xnarch_atomic_set (pcounter,i) atomic_long_set(pcounter,i) +#define xnarch_atomic_get (pcounter) atomic_long_read(pcounter) +#define xnarch_atomic_inc (pcounter) atomic_long_inc(pcounter) +#define xnarch_atomic_dec (pcounter) atomic_long_dec(pcounter) +#define xnarch_atomic_inc_and_test (pcounter) \ + atomic_long_inc_and_test(pcounter) +#define xnarch_atomic_dec_and_test (pcounter) \ + atomic_long_dec_and_test(pcounter) +#define xnarch_atomic_cmpxchg (pcounter,old,new) \ + atomic_long_cmpxchg((pcounter),(old),(new)) + +typedef atomic_long_t atomic_counter_t ; +typedef atomic_long_t xnarch_atomic_t ; + +#define xnarch_atomic_set_mask (pflags,mask) \ + atomic_set_mask((mask),(unsigned *)(pflags)) +#define xnarch_atomic_clear_mask (pflags,mask) \ + atomic_clear_mask((mask),(unsigned *)(pflags)) +#define xnarch_atomic_xchg (ptr,x) xchg(ptr,x) + +#define xnarch_memory_barrier () smp_mb() + +#else /* !__KERNEL__ */ + +#include <xeno_config.h> + +#ifdef CONFIG_SMP +#define LOCK_PREFIX "lock ; "#else -#include "atomic_64.h" +#define LOCK_PREFIX ""#endif + +typedef struct {unsigned long counter; }xnarch_atomic_t ; + +#define xnarch_atomic_get (v) ((v)->counter) + +#define xnarch_atomic_set (v,i) (((v)->counter) = (i)) + +#define xnarch_write_memory_barrier () xnarch_memory_barrier() + +#ifdef __i386__ + +struct __xeno_xchg_dummy {unsigned long a[100 ]; }; +#define __xeno_xg (x) ((struct __xeno_xchg_dummy *)(x)) + +static inline unsigned long xnarch_atomic_xchg (volatile void *ptr, +unsigned long x) +{ + __asm__ __volatile__("xchgl %0,%1" + :"=r" (x) + :"m" (*__xeno_xg (ptr)),"0" (x) + :"memory" ); +return x; +} + +static inline unsigned long +xnarch_atomic_cmpxchg (xnarch_atomic_t *v,unsigned long old,unsigned long newval) +{ +volatile void *ptr = &v->counter; +unsigned long prev; + + __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" + :"=a" (prev) + :"r" (newval),"m" (*__xeno_xg (ptr)),"0" (old) + :"memory" ); +return prev; +} + +#define xnarch_memory_barrier () __asm__ __volatile__("": : :"memory") +#define xnarch_read_memory_barrier () \ + __asm__ __volatile__ (LOCK_PREFIX "addl $0,0(%%esp)": : :"memory") + +#else /* x86_64 */ + +#define __xeno_xg (x) ((volatile long *)(x)) + +static inline unsigned long xnarch_atomic_xchg (volatile void *ptr, +unsigned long x) +{ + __asm__ __volatile__("xchgq %0,%1" + :"=r" (x) + :"m" (*__xeno_xg (ptr)),"0" (x) + :"memory" ); +return x; +} + +static inline unsigned long +xnarch_atomic_cmpxchg (xnarch_atomic_t *v,unsigned long old,unsigned long newval) +{ +volatile void *ptr = &v->counter; +unsigned long prev; + + __asm__ __volatile__(LOCK_PREFIX "cmpxchgq %1,%2" + :"=a" (prev) + :"r" (newval),"m" (*__xeno_xg (ptr)),"0" (old) + :"memory" ); +return prev; +} + +#define xnarch_memory_barrier () asm volatile("mfence":::"memory") +#define xnarch_read_memory_barrier () asm volatile("lfence":::"memory") + +#endif /* x86_64 */ + +#endif /* __KERNEL__ */ + +#include <asm-generic/xenomai/atomic.h> + +#endif /* !_XENO_ASM_X86_ATOMIC_64_H */
include/asm-x86/atomic_64.h deleted +0 -102
102 lines not on this page · raw message
include/asm-generic/wrappers.h +64 -18
110 lines not on this page · raw message
include/asm-x86/Makefile.am +0 -2
@@ -4,8 +4,6 @@ includesub_HEADERS = \ arith_32.h \ arith_64.h \ arith.h \ - atomic_32.h \ - atomic_64.h \ atomic.h \ calibration.h \ features_32.h \
include/asm-x86/atomic_32.h deleted +0 -101
101 lines not on this page · raw message
include/asm-generic/wrappers.h line 45
Quoted 5 lines · Jan Kiszka
include/asm-generic/wrappers.h +5
-0+#include <asm/atomic.h> + +#if BITS_PER_LONG !=32 +#error Upgrade to kernel 2.6! +#endif
I am not well versed with the 2.4 support. But are we sure we support no 64 bits architecture with 2.4 ? What about ppc64 ?
Signature · 1 line
Gilles.
Quoted 9 lines · Gilles Chanteperdrix
include/asm-generic/wrappers.h line 45
Quoted 5 lines · Jan Kiszka
include/asm-generic/wrappers.h +5
-0+#include <asm/atomic.h> + +#if BITS_PER_LONG !=32 +#error Upgrade to kernel 2.6! +#endif I am not well versed with the 2.4 support. But are we sure we support no 64 bits architecture with 2.4 ? What about ppc64 ?
AFAIK, only ppc32 is supported on kernel 2.4 now, and I don't think ppc64 ever was. Just i386 and ppc32 should bother us /wrt wrapping.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux
Quoted 10 lines · Jan Kiszka
Quoted 8 lines · Gilles Chanteperdrix
include/asm-generic/wrappers.h line 45
Quoted 5 lines · Jan Kiszka
include/asm-generic/wrappers.h +5
-0+#include <asm/atomic.h> + +#if BITS_PER_LONG !=32 +#error Upgrade to kernel 2.6! +#endif I am not well versed with the 2.4 support. But are we sure we support no 64 bits architecture with 2.4 ? What about ppc64 ?
Quoted 2 lines
AFAIK, only ppc32 is supported on kernel 2.4 now, and I don't think ppc64 ever was. Just i386 and ppc32 should bother us /wrt wrapping.
It is OK for me then.
Signature · 1 line
Gilles.
Quoted 10 lines · Gilles Chanteperdrix
include/asm-generic/wrappers.h line 45
Quoted 5 lines · Jan Kiszka
include/asm-generic/wrappers.h +5
-0+#include <asm/atomic.h> + +#if BITS_PER_LONG !=32 +#error Upgrade to kernel 2.6! +#endif I am not well versed with the 2.4 support. But are we sure we support no 64 bits architecture with 2.4 ? What about ppc64 ?
No other 2.4 port will be merged, so this should be ok. ppc64 is 2.6 only for us.
Signature · 1 line
Philippe.
Quoted 11 lines · Philippe Gerum
Quoted 9 lines · Gilles Chanteperdrix
include/asm-generic/wrappers.h line 45
Quoted 5 lines · Jan Kiszka
include/asm-generic/wrappers.h +5
-0+#include <asm/atomic.h> + +#if BITS_PER_LONG !=32 +#error Upgrade to kernel 2.6! +#endif I am not well versed with the 2.4 support. But are we sure we support no 64 bits architecture with 2.4 ? What about ppc64 ?
Quoted 1 line
No other 2.4 port will be merged, so this should be ok. ppc64 is 2.6 only for us.
Fine, so I merged my patch.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux