[CRIU] [PATCH] arm: fix compilation on ARMv6

Ruslan Kuprieiev kupruser at gmail.com
Mon Dec 22 03:59:05 PST 2014


Tested-by: Ruslan Kuprieiev <kupruser at gmail.com>

22.12.2014 13:16, Andrew Vagin пишет:
> Cc: Ruslan Kuprieiev <kupruser at gmail.com>
> Signed-off-by: Andrew Vagin <avagin at openvz.org>
> ---
>   arch/arm/include/asm/atomic.h |   61 +++++++++++++++++++++++++----------------
>   1 file changed, 37 insertions(+), 24 deletions(-)
>
> diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
> index 04faf58..cd0df37 100644
> --- a/arch/arm/include/asm/atomic.h
> +++ b/arch/arm/include/asm/atomic.h
> @@ -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__ */
>


More information about the CRIU mailing list