xref: /kvm-unit-tests/lib/arm/asm/bitops.h (revision 71a6a145226927f50d938b0f2befc24363a496bc)
1f20e2561SAndrew Jones #ifndef _ASMARM_BITOPS_H_
2f20e2561SAndrew Jones #define _ASMARM_BITOPS_H_
3f20e2561SAndrew Jones /*
449f758b8SAndrew Jones  * Adapted from
5f20e2561SAndrew Jones  *   arch/arm/lib/bitops.h
6f20e2561SAndrew Jones  *
749f758b8SAndrew Jones  * Copyright (C) 2017, Red Hat Inc, Andrew Jones <drjones@redhat.com>
8f20e2561SAndrew Jones  *
949f758b8SAndrew Jones  * This work is licensed under the terms of the GNU GPL, version 2.
10f20e2561SAndrew Jones  */
11f20e2561SAndrew Jones 
126ed97c50SPeter Feiner #ifndef _BITOPS_H_
136ed97c50SPeter Feiner #error only <bitops.h> can be included directly
146ed97c50SPeter Feiner #endif
156ed97c50SPeter Feiner 
16f20e2561SAndrew Jones #define BITS_PER_LONG	32
17f20e2561SAndrew Jones 
18*71a6a145SAndrew Jones #define HAVE_BUILTIN_FLS 1
19*71a6a145SAndrew Jones 
20f20e2561SAndrew Jones #define ATOMIC_BITOP(insn, mask, word)				\
21f20e2561SAndrew Jones ({								\
22f20e2561SAndrew Jones 	unsigned long tmp1, tmp2;				\
23f20e2561SAndrew Jones 	asm volatile(						\
24f20e2561SAndrew Jones 	"1:	ldrex	%0, [%2]\n"				\
25f20e2561SAndrew Jones 		insn"	%0, %0, %3\n"				\
26f20e2561SAndrew Jones 	"	strex	%1, %0, [%2]\n"				\
27f20e2561SAndrew Jones 	"	cmp	%1, #0\n"				\
28f20e2561SAndrew Jones 	"	bne	1b\n"					\
29f20e2561SAndrew Jones 	: "=&r" (tmp1), "=&r" (tmp2)				\
30f20e2561SAndrew Jones 	: "r" (word), "r" (mask)				\
31f20e2561SAndrew Jones 	: "cc");						\
32f20e2561SAndrew Jones })
33f20e2561SAndrew Jones 
34f20e2561SAndrew Jones #define ATOMIC_TESTOP(insn, mask, word, old)			\
35f20e2561SAndrew Jones ({								\
36f20e2561SAndrew Jones 	unsigned long tmp1, tmp2;				\
37f20e2561SAndrew Jones 	asm volatile(						\
38f20e2561SAndrew Jones 	"1:	ldrex	%0, [%3]\n"				\
39f20e2561SAndrew Jones 	"	and	%1, %0, %4\n"				\
40f20e2561SAndrew Jones 		insn"	%0, %0, %4\n"				\
41f20e2561SAndrew Jones 	"	strex	%2, %0, [%3]\n"				\
42f20e2561SAndrew Jones 	"	cmp	%2, #0\n"				\
43f20e2561SAndrew Jones 	"	bne	1b\n"					\
44f20e2561SAndrew Jones 	: "=&r" (tmp1), "=&r" (old), "=&r" (tmp2)		\
45f20e2561SAndrew Jones 	: "r" (word), "r" (mask)				\
46f20e2561SAndrew Jones 	: "cc");						\
47f20e2561SAndrew Jones })
48f20e2561SAndrew Jones 
49f20e2561SAndrew Jones extern void set_bit(int nr, volatile unsigned long *addr);
50f20e2561SAndrew Jones extern void clear_bit(int nr, volatile unsigned long *addr);
51f20e2561SAndrew Jones extern int test_bit(int nr, const volatile unsigned long *addr);
52f20e2561SAndrew Jones extern int test_and_set_bit(int nr, volatile unsigned long *addr);
53f20e2561SAndrew Jones extern int test_and_clear_bit(int nr, volatile unsigned long *addr);
54f20e2561SAndrew Jones 
55f20e2561SAndrew Jones #endif /* _ASMARM_BITOPS_H_ */
56