Commit 7657e41a authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

[S390] atomic: use inline asm

Use inline assemblies for atomic_read/set(). This way there shouldn't
be any questions or subtle volatile semantics left.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent a8c8d7c6
...@@ -36,12 +36,19 @@ ...@@ -36,12 +36,19 @@
static inline int atomic_read(const atomic_t *v) 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) 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) static inline int atomic_add_return(int i, atomic_t *v)
...@@ -126,12 +133,19 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) ...@@ -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) 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) 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) static inline long long atomic64_add_return(long long i, atomic64_t *v)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment