Skip to contentSkip to conversation

Unify asm-x86/atomic.h

PATCH In review Jan Kiszka 3 participants 11 messages Aug 22, 2008 – Aug 25, 2008

Subsystems (2)
lore
Share & tools
lore

Jan Kiszka

author
#0 lore raw

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
Index: b/include/asm-x86/atomic.h
===================================================================
@@ -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
Index: b/include/asm-x86/atomic_32.h
===================================================================
@@ -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
Index: b/include/asm-x86/atomic_64.h
===================================================================
@@ -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 */
#1 lore raw
Quoted 2 lines · Jan Kiszka

...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on x86_32 SMP.

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.
author
#2 lore raw
Quoted 9 lines · Gilles Chanteperdrix
Quoted 2 lines · Jan Kiszka

...and also automatically fixes the missing LOCK prefix for pthread_mutex_* services on x86_32 SMP.

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).

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
Index: b/include/asm-x86/atomic.h
===================================================================
@@ -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
Index: b/include/asm-x86/atomic_32.h
===================================================================
@@ -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 *v
 	return 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
Index: b/include/asm-x86/atomic_64.h
===================================================================
@@ -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 */
#3 lore raw
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_32 SMP.

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).

Quoted 4 lines

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.

We could use atomic_long_t on the two arches.

Signature · 1 line
					    Gilles.
author
#4 lore raw
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_32 SMP.

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).

Quoted 6 lines
Quoted 4 lines

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.

We could use atomic_long_t on 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

author
#5 lore raw
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_32 SMP.

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).

Quoted 8 lines
Quoted 5 lines
Quoted 4 lines

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.

We could use atomic_long_t on 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
Index: b/include/asm-x86/atomic.h
===================================================================
@@ -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
Index: b/include/asm-x86/Makefile.am
===================================================================
@@ -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

#6 lore raw

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.
author
#7 lore raw
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
#8 lore raw
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.
#9 lore raw
In reply to Gilles Chanteperdrix
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.
author
#10 lore raw
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