cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cmpxchg.h (1928B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ALPHA_CMPXCHG_H
      3#define _ALPHA_CMPXCHG_H
      4
      5/*
      6 * Atomic exchange routines.
      7 */
      8
      9#define ____xchg(type, args...)		__xchg ## type ## _local(args)
     10#define ____cmpxchg(type, args...)	__cmpxchg ## type ## _local(args)
     11#include <asm/xchg.h>
     12
     13#define xchg_local(ptr, x)						\
     14({									\
     15	__typeof__(*(ptr)) _x_ = (x);					\
     16	(__typeof__(*(ptr))) __xchg_local((ptr), (unsigned long)_x_,	\
     17				       sizeof(*(ptr)));			\
     18})
     19
     20#define arch_cmpxchg_local(ptr, o, n)					\
     21({									\
     22	__typeof__(*(ptr)) _o_ = (o);					\
     23	__typeof__(*(ptr)) _n_ = (n);					\
     24	(__typeof__(*(ptr))) __cmpxchg_local((ptr), (unsigned long)_o_,	\
     25					  (unsigned long)_n_,		\
     26					  sizeof(*(ptr)));		\
     27})
     28
     29#define arch_cmpxchg64_local(ptr, o, n)					\
     30({									\
     31	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\
     32	cmpxchg_local((ptr), (o), (n));					\
     33})
     34
     35#undef ____xchg
     36#undef ____cmpxchg
     37#define ____xchg(type, args...)		__xchg ##type(args)
     38#define ____cmpxchg(type, args...)	__cmpxchg ##type(args)
     39#include <asm/xchg.h>
     40
     41/*
     42 * The leading and the trailing memory barriers guarantee that these
     43 * operations are fully ordered.
     44 */
     45#define arch_xchg(ptr, x)						\
     46({									\
     47	__typeof__(*(ptr)) __ret;					\
     48	__typeof__(*(ptr)) _x_ = (x);					\
     49	smp_mb();							\
     50	__ret = (__typeof__(*(ptr)))					\
     51		__xchg((ptr), (unsigned long)_x_, sizeof(*(ptr)));	\
     52	smp_mb();							\
     53	__ret;								\
     54})
     55
     56#define arch_cmpxchg(ptr, o, n)						\
     57({									\
     58	__typeof__(*(ptr)) __ret;					\
     59	__typeof__(*(ptr)) _o_ = (o);					\
     60	__typeof__(*(ptr)) _n_ = (n);					\
     61	smp_mb();							\
     62	__ret = (__typeof__(*(ptr))) __cmpxchg((ptr),			\
     63		(unsigned long)_o_, (unsigned long)_n_, sizeof(*(ptr)));\
     64	smp_mb();							\
     65	__ret;								\
     66})
     67
     68#define arch_cmpxchg64(ptr, o, n)					\
     69({									\
     70	BUILD_BUG_ON(sizeof(*(ptr)) != 8);				\
     71	arch_cmpxchg((ptr), (o), (n));					\
     72})
     73
     74#undef ____cmpxchg
     75
     76#endif /* _ALPHA_CMPXCHG_H */