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

bitops-cas.h (1770B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __ASM_SH_BITOPS_CAS_H
      3#define __ASM_SH_BITOPS_CAS_H
      4
      5static inline unsigned __bo_cas(volatile unsigned *p, unsigned old, unsigned new)
      6{
      7	__asm__ __volatile__("cas.l %1,%0,@r0"
      8		: "+r"(new)
      9		: "r"(old), "z"(p)
     10		: "t", "memory" );
     11	return new;
     12}
     13
     14static inline void set_bit(int nr, volatile void *addr)
     15{
     16	unsigned mask, old;
     17	volatile unsigned *a = addr;
     18
     19	a += nr >> 5;
     20	mask = 1U << (nr & 0x1f);
     21
     22	do old = *a;
     23	while (__bo_cas(a, old, old|mask) != old);
     24}
     25
     26static inline void clear_bit(int nr, volatile void *addr)
     27{
     28	unsigned mask, old;
     29	volatile unsigned *a = addr;
     30
     31	a += nr >> 5;
     32	mask = 1U << (nr & 0x1f);
     33
     34	do old = *a;
     35	while (__bo_cas(a, old, old&~mask) != old);
     36}
     37
     38static inline void change_bit(int nr, volatile void *addr)
     39{
     40	unsigned mask, old;
     41	volatile unsigned *a = addr;
     42
     43	a += nr >> 5;
     44	mask = 1U << (nr & 0x1f);
     45
     46	do old = *a;
     47	while (__bo_cas(a, old, old^mask) != old);
     48}
     49
     50static inline int test_and_set_bit(int nr, volatile void *addr)
     51{
     52	unsigned mask, old;
     53	volatile unsigned *a = addr;
     54
     55	a += nr >> 5;
     56	mask = 1U << (nr & 0x1f);
     57
     58	do old = *a;
     59	while (__bo_cas(a, old, old|mask) != old);
     60
     61	return !!(old & mask);
     62}
     63
     64static inline int test_and_clear_bit(int nr, volatile void *addr)
     65{
     66	unsigned mask, old;
     67	volatile unsigned *a = addr;
     68
     69	a += nr >> 5;
     70	mask = 1U << (nr & 0x1f);
     71
     72	do old = *a;
     73	while (__bo_cas(a, old, old&~mask) != old);
     74
     75	return !!(old & mask);
     76}
     77
     78static inline int test_and_change_bit(int nr, volatile void *addr)
     79{
     80	unsigned mask, old;
     81	volatile unsigned *a = addr;
     82
     83	a += nr >> 5;
     84	mask = 1U << (nr & 0x1f);
     85
     86	do old = *a;
     87	while (__bo_cas(a, old, old^mask) != old);
     88
     89	return !!(old & mask);
     90}
     91
     92#include <asm-generic/bitops/non-atomic.h>
     93
     94#endif /* __ASM_SH_BITOPS_CAS_H */