Skip to content

Commit

Permalink
[S390] atomic: use inline asm
Browse files Browse the repository at this point in the history
Use inline assemblies for atomic_read/set(). This way there shouldn't
be any questions or subtle volatile semantics left.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Feb 17, 2011
1 parent a8c8d7c commit 7657e41
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions arch/s390/include/asm/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,19 @@

static inline int atomic_read(const atomic_t *v)
{
return ACCESS_ONCE(v->counter);
int c;

asm volatile(
" l %0,%1\n"
: "=d" (c) : "Q" (v->counter));
return c;
}

static inline void atomic_set(atomic_t *v, int i)
{
v->counter = i;
asm volatile(
" st %1,%0\n"
: "=Q" (v->counter) : "d" (i));
}

static inline int atomic_add_return(int i, atomic_t *v)
Expand Down Expand Up @@ -126,12 +133,19 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)

static inline long long atomic64_read(const atomic64_t *v)
{
return ACCESS_ONCE(v->counter);
long long c;

asm volatile(
" lg %0,%1\n"
: "=d" (c) : "Q" (v->counter));
return c;
}

static inline void atomic64_set(atomic64_t *v, long long i)
{
v->counter = i;
asm volatile(
" stg %1,%0\n"
: "=Q" (v->counter) : "d" (i));
}

static inline long long atomic64_add_return(long long i, atomic64_t *v)
Expand Down

0 comments on commit 7657e41

Please sign in to comment.