From 6db35c40e98df4acec7b22bc97fdcd11a03ddb42 Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 27 Sep 2006 11:28:20 +0900 Subject: [PATCH] --- yaml --- r: 36221 b: refs/heads/master c: e4e3b5ccd77226c9c4dbb0737106b868dfc182d9 h: refs/heads/master i: 36219: dab69f4235384b2a122309f03e309ac5e875a1c7 v: v3 --- [refs] | 2 +- trunk/include/asm-sh/system.h | 40 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index a34b91880d24..41753fa7d3d0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0c91c1a7012911e4b0180a1c1ae258e2b706f987 +refs/heads/master: e4e3b5ccd77226c9c4dbb0737106b868dfc182d9 diff --git a/trunk/include/asm-sh/system.h b/trunk/include/asm-sh/system.h index ad35ad4958f4..e89728d405d8 100644 --- a/trunk/include/asm-sh/system.h +++ b/trunk/include/asm-sh/system.h @@ -6,6 +6,7 @@ * Copyright (C) 2002 Paul Mundt */ +#include /* * switch_to() should switch tasks to task nr n, first @@ -260,6 +261,45 @@ static __inline__ unsigned long __xchg(unsigned long x, volatile void * ptr, int return x; } +static inline unsigned long __cmpxchg_u32(volatile int * m, unsigned long old, + unsigned long new) +{ + __u32 retval; + unsigned long flags; + + local_irq_save(flags); + retval = *m; + if (retval == old) + *m = new; + local_irq_restore(flags); /* implies memory barrier */ + return retval; +} + +/* This function doesn't exist, so you'll get a linker error + * if something tries to do an invalid cmpxchg(). */ +extern void __cmpxchg_called_with_bad_pointer(void); + +#define __HAVE_ARCH_CMPXCHG 1 + +static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, + unsigned long new, int size) +{ + switch (size) { + case 4: + return __cmpxchg_u32(ptr, old, new); + } + __cmpxchg_called_with_bad_pointer(); + return old; +} + +#define cmpxchg(ptr,o,n) \ + ({ \ + __typeof__(*(ptr)) _o_ = (o); \ + __typeof__(*(ptr)) _n_ = (n); \ + (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \ + (unsigned long)_n_, sizeof(*(ptr))); \ + }) + /* XXX * disable hlt during certain critical i/o operations */