diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2012-05-30 08:57:48 +0100 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2012-05-30 08:57:48 +0100 |
commit | dd08a7f12fe6b115c4a1209b0c9b81ba472c5249 (patch) | |
tree | 9bb8da562d494748256a663b277a7584ae52d27b /tools/memshr | |
parent | 39a735b1e114c094e56b0aa05aee2ac5f5b77239 (diff) | |
download | xen-dd08a7f12fe6b115c4a1209b0c9b81ba472c5249.tar.gz xen-dd08a7f12fe6b115c4a1209b0c9b81ba472c5249.tar.bz2 xen-dd08a7f12fe6b115c4a1209b0c9b81ba472c5249.zip |
arm: compile memshr
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Ian Campbell <Ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'tools/memshr')
-rw-r--r-- | tools/memshr/bidir-hash.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/tools/memshr/bidir-hash.c b/tools/memshr/bidir-hash.c index 6c0dc3d92d..45d473e5d0 100644 --- a/tools/memshr/bidir-hash.c +++ b/tools/memshr/bidir-hash.c @@ -109,6 +109,37 @@ static void hash_resize(struct __hash *h); } while (0) static inline void atomic_inc(uint32_t *v) { ia64_fetchadd4_rel(v, 1); } static inline void atomic_dec(uint32_t *v) { ia64_fetchadd4_rel(v, -1); } +#elif defined(__arm__) +static inline void atomic_inc(uint32_t *v) +{ + unsigned long tmp; + int result; + + __asm__ __volatile__("@ atomic_add\n" +"1: ldrex %0, [%3]\n" +" add %0, %0, #1\n" +" strex %1, %0, [%3]\n" +" teq %1, #0\n" +" bne 1b" + : "=&r" (result), "=&r" (tmp), "+Qo" (*v) + : "r" (v) + : "cc"); +} +static inline void atomic_dec(uint32_t *v) +{ + unsigned long tmp; + int result; + + __asm__ __volatile__("@ atomic_sub\n" +"1: ldrex %0, [%3]\n" +" sub %0, %0, #1\n" +" strex %1, %0, [%3]\n" +" teq %1, #0\n" +" bne 1b" + : "=&r" (result), "=&r" (tmp), "+Qo" (*v) + : "r" (v) + : "cc"); +} #else /* __x86__ */ static inline void atomic_inc(uint32_t *v) { |