Commit 7f4afef2 authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

arm: fix compilation on ARMv6

Cc: Ruslan Kuprieiev <kupruser@gmail.com>
Signed-off-by: 's avatarAndrew Vagin <avagin@openvz.org>
Tested-by: 's avatarRuslan Kuprieiev <kupruser@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent fa992b9d
......@@ -14,10 +14,47 @@ typedef struct {
#define smp_mb() __asm__ __volatile__ ("dmb" : : : "memory")
static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
{
int oldval;
unsigned long res;
smp_mb();
prefetchw(&ptr->counter);
do {
__asm__ __volatile__("@ atomic_cmpxchg\n"
"ldrex %1, [%3]\n"
"mov %0, #0\n"
"teq %1, %4\n"
"strexeq %0, %5, [%3]\n"
: "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
: "r" (&ptr->counter), "Ir" (old), "r" (new)
: "cc");
} while (res);
smp_mb();
return oldval;
}
#elif defined(CONFIG_ARMV6)
/* SMP isn't supported for ARMv6 */
#define smp_mb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory")
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
{
int ret;
ret = v->counter;
if (ret == old)
v->counter = new;
return ret;
}
#else
#error ARM architecture version (CONFIG_ARMV*) not set or unsupported.
......@@ -91,28 +128,4 @@ static inline int atomic_dec(atomic_t *v) { return atomic_sub_return(1, v) + 1;
#define atomic_inc_return(v) (atomic_add_return(1, v))
static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
{
int oldval;
unsigned long res;
smp_mb();
prefetchw(&ptr->counter);
do {
__asm__ __volatile__("@ atomic_cmpxchg\n"
"ldrex %1, [%3]\n"
"mov %0, #0\n"
"teq %1, %4\n"
"strexeq %0, %5, [%3]\n"
: "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
: "r" (&ptr->counter), "Ir" (old), "r" (new)
: "cc");
} while (res);
smp_mb();
return oldval;
}
#endif /* __CR_ATOMIC_H__ */
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