[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen staging] atomic: add atomic_and operations
commit 75b7411617108bdc820d337064b38ac09f794fc5 Author: Roger Pau Monné <roger.pau@xxxxxxxxxx> AuthorDate: Wed Feb 26 10:51:31 2020 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Wed Feb 26 10:51:31 2020 +0100 atomic: add atomic_and operations To x86 and Arm. This performs an atomic AND operation against an atomic_t variable with the provided mask. Requested-by: Jan Beulich <jbeulich@xxxxxxxx> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Julien Grall <julien@xxxxxxx> --- xen/include/asm-arm/arm32/atomic.h | 17 +++++++++++++++++ xen/include/asm-arm/arm64/atomic.h | 14 ++++++++++++++ xen/include/asm-x86/atomic.h | 8 ++++++++ 3 files changed, 39 insertions(+) diff --git a/xen/include/asm-arm/arm32/atomic.h b/xen/include/asm-arm/arm32/atomic.h index c03eb684cd..2832a72792 100644 --- a/xen/include/asm-arm/arm32/atomic.h +++ b/xen/include/asm-arm/arm32/atomic.h @@ -96,6 +96,23 @@ static inline int atomic_sub_return(int i, atomic_t *v) return result; } +static inline void atomic_and(int m, atomic_t *v) +{ + unsigned long tmp; + int result; + + prefetchw(&v->counter); + __asm__ __volatile__("@ atomic_and\n" +"1: ldrex %0, [%3]\n" +" and %0, %0, %4\n" +" strex %1, %0, [%3]\n" +" teq %1, #0\n" +" bne 1b" + : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter) + : "r" (&v->counter), "Ir" (m) + : "cc"); +} + static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) { int oldval; diff --git a/xen/include/asm-arm/arm64/atomic.h b/xen/include/asm-arm/arm64/atomic.h index bce38d4ca2..2d42567866 100644 --- a/xen/include/asm-arm/arm64/atomic.h +++ b/xen/include/asm-arm/arm64/atomic.h @@ -91,6 +91,20 @@ static inline int atomic_sub_return(int i, atomic_t *v) return result; } +static inline void atomic_and(int m, atomic_t *v) +{ + unsigned long tmp; + int result; + + asm volatile("// atomic_and\n" +"1: ldxr %w0, %2\n" +" and %w0, %w0, %w3\n" +" stxr %w1, %w0, %2\n" +" cbnz %w1, 1b" + : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) + : "Ir" (m)); +} + static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) { unsigned long tmp; diff --git a/xen/include/asm-x86/atomic.h b/xen/include/asm-x86/atomic.h index 682bcf91b1..6b40f9c9f8 100644 --- a/xen/include/asm-x86/atomic.h +++ b/xen/include/asm-x86/atomic.h @@ -224,6 +224,14 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) return c; } +static inline void atomic_and(int m, atomic_t *v) +{ + asm volatile ( + "lock andl %1, %0" + : "+m" (*(volatile int *)&v->counter) + : "ir" (m) ); +} + #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) #endif /* __ARCH_X86_ATOMIC__ */ -- generated by git-patchbot for /home/xen/git/xen.git#staging _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |