10
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
15
* Test and set bit atomically
19
* @ret old Old value of bit (zero or non-zero)
21
static inline __attribute__ (( always_inline )) int
22
test_and_set_bit ( unsigned int bit, volatile void *bits ) {
23
unsigned int index = ( bit / 64 );
24
unsigned int offset = ( bit % 64 );
25
volatile uint64_t *qword = ( ( ( volatile uint64_t * ) bits ) + index );
26
uint64_t mask = ( 1UL << offset );
31
__asm__ __volatile__ ( "\n1:\n\t"
34
"stxr %w2, %1, %3\n\t"
37
: "=&r" ( old ), "=&r" ( new ), "=&r" ( flag ),
42
return ( !! ( old & mask ) );
46
* Test and clear bit atomically
50
* @ret old Old value of bit (zero or non-zero)
52
static inline __attribute__ (( always_inline )) int
53
test_and_clear_bit ( unsigned int bit, volatile void *bits ) {
54
unsigned int index = ( bit / 64 );
55
unsigned int offset = ( bit % 64 );
56
volatile uint64_t *qword = ( ( ( volatile uint64_t * ) bits ) + index );
57
uint64_t mask = ( 1UL << offset );
62
__asm__ __volatile__ ( "\n1:\n\t"
65
"stxr %w2, %1, %3\n\t"
68
: "=&r" ( old ), "=&r" ( new ), "=&r" ( flag ),
73
return ( !! ( old & mask ) );
82
static inline __attribute__ (( always_inline )) void
83
set_bit ( unsigned int bit, volatile void *bits ) {
85
test_and_set_bit ( bit, bits );
89
* Clear bit atomically
94
static inline __attribute__ (( always_inline )) void
95
clear_bit ( unsigned int bit, volatile void *bits ) {
97
test_and_clear_bit ( bit, bits );
100
#endif /* _BITS_BITOPS_H */