71 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _ASM_GENERIC_BITOPS_ATOMIC_H_3#define _ASM_GENERIC_BITOPS_ATOMIC_H_4 5#include <linux/atomic.h>6#include <linux/compiler.h>7#include <asm/barrier.h>8 9/*10 * Implementation of atomic bitops using atomic-fetch ops.11 * See Documentation/atomic_bitops.txt for details.12 */13 14static __always_inline void15arch_set_bit(unsigned int nr, volatile unsigned long *p)16{17 p += BIT_WORD(nr);18 raw_atomic_long_or(BIT_MASK(nr), (atomic_long_t *)p);19}20 21static __always_inline void22arch_clear_bit(unsigned int nr, volatile unsigned long *p)23{24 p += BIT_WORD(nr);25 raw_atomic_long_andnot(BIT_MASK(nr), (atomic_long_t *)p);26}27 28static __always_inline void29arch_change_bit(unsigned int nr, volatile unsigned long *p)30{31 p += BIT_WORD(nr);32 raw_atomic_long_xor(BIT_MASK(nr), (atomic_long_t *)p);33}34 35static __always_inline int36arch_test_and_set_bit(unsigned int nr, volatile unsigned long *p)37{38 long old;39 unsigned long mask = BIT_MASK(nr);40 41 p += BIT_WORD(nr);42 old = raw_atomic_long_fetch_or(mask, (atomic_long_t *)p);43 return !!(old & mask);44}45 46static __always_inline int47arch_test_and_clear_bit(unsigned int nr, volatile unsigned long *p)48{49 long old;50 unsigned long mask = BIT_MASK(nr);51 52 p += BIT_WORD(nr);53 old = raw_atomic_long_fetch_andnot(mask, (atomic_long_t *)p);54 return !!(old & mask);55}56 57static __always_inline int58arch_test_and_change_bit(unsigned int nr, volatile unsigned long *p)59{60 long old;61 unsigned long mask = BIT_MASK(nr);62 63 p += BIT_WORD(nr);64 old = raw_atomic_long_fetch_xor(mask, (atomic_long_t *)p);65 return !!(old & mask);66}67 68#include <asm-generic/bitops/instrumented-atomic.h>69 70#endif /* _ASM_GENERIC_BITOPS_ATOMIC_H */71