xref: /kvm-unit-tests/lib/riscv/bitops.c (revision 48d5952451de62a4db23cf73024f702cf1a64fc3)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2023, Ventana Micro Systems Inc., Andrew Jones <ajones@ventanamicro.com>
4  */
5 #include <bitops.h>
6 
set_bit(int nr,volatile unsigned long * addr)7 void set_bit(int nr, volatile unsigned long *addr)
8 {
9 	volatile unsigned long *word = addr + BIT_WORD(nr);
10 	unsigned long mask = BIT_MASK(nr);
11 
12 	__sync_or_and_fetch(word, mask);
13 }
14 
clear_bit(int nr,volatile unsigned long * addr)15 void clear_bit(int nr, volatile unsigned long *addr)
16 {
17 	volatile unsigned long *word = addr + BIT_WORD(nr);
18 	unsigned long mask = BIT_MASK(nr);
19 
20 	__sync_and_and_fetch(word, ~mask);
21 }
22 
test_bit(int nr,const volatile unsigned long * addr)23 int test_bit(int nr, const volatile unsigned long *addr)
24 {
25 	const volatile unsigned long *word = addr + BIT_WORD(nr);
26 	unsigned long mask = BIT_MASK(nr);
27 
28 	return (*word & mask) != 0;
29 }
30 
test_and_set_bit(int nr,volatile unsigned long * addr)31 int test_and_set_bit(int nr, volatile unsigned long *addr)
32 {
33 	volatile unsigned long *word = addr + BIT_WORD(nr);
34 	unsigned long mask = BIT_MASK(nr);
35 	unsigned long old = __sync_fetch_and_or(word, mask);
36 
37 	return (old & mask) != 0;
38 }
39 
test_and_clear_bit(int nr,volatile unsigned long * addr)40 int test_and_clear_bit(int nr, volatile unsigned long *addr)
41 {
42 	volatile unsigned long *word = addr + BIT_WORD(nr);
43 	unsigned long mask = BIT_MASK(nr);
44 	unsigned long old = __sync_fetch_and_and(word, ~mask);
45 
46 	return (old & mask) != 0;
47 }
48