Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sh/include/asm/bitops-grb.h
15125 views
1
#ifndef __ASM_SH_BITOPS_GRB_H
2
#define __ASM_SH_BITOPS_GRB_H
3
4
static inline void set_bit(int nr, volatile void * addr)
5
{
6
int mask;
7
volatile unsigned int *a = addr;
8
unsigned long tmp;
9
10
a += nr >> 5;
11
mask = 1 << (nr & 0x1f);
12
13
__asm__ __volatile__ (
14
" .align 2 \n\t"
15
" mova 1f, r0 \n\t" /* r0 = end point */
16
" mov r15, r1 \n\t" /* r1 = saved sp */
17
" mov #-6, r15 \n\t" /* LOGIN: r15 = size */
18
" mov.l @%1, %0 \n\t" /* load old value */
19
" or %2, %0 \n\t" /* or */
20
" mov.l %0, @%1 \n\t" /* store new value */
21
"1: mov r1, r15 \n\t" /* LOGOUT */
22
: "=&r" (tmp),
23
"+r" (a)
24
: "r" (mask)
25
: "memory" , "r0", "r1");
26
}
27
28
static inline void clear_bit(int nr, volatile void * addr)
29
{
30
int mask;
31
volatile unsigned int *a = addr;
32
unsigned long tmp;
33
34
a += nr >> 5;
35
mask = ~(1 << (nr & 0x1f));
36
__asm__ __volatile__ (
37
" .align 2 \n\t"
38
" mova 1f, r0 \n\t" /* r0 = end point */
39
" mov r15, r1 \n\t" /* r1 = saved sp */
40
" mov #-6, r15 \n\t" /* LOGIN: r15 = size */
41
" mov.l @%1, %0 \n\t" /* load old value */
42
" and %2, %0 \n\t" /* and */
43
" mov.l %0, @%1 \n\t" /* store new value */
44
"1: mov r1, r15 \n\t" /* LOGOUT */
45
: "=&r" (tmp),
46
"+r" (a)
47
: "r" (mask)
48
: "memory" , "r0", "r1");
49
}
50
51
static inline void change_bit(int nr, volatile void * addr)
52
{
53
int mask;
54
volatile unsigned int *a = addr;
55
unsigned long tmp;
56
57
a += nr >> 5;
58
mask = 1 << (nr & 0x1f);
59
__asm__ __volatile__ (
60
" .align 2 \n\t"
61
" mova 1f, r0 \n\t" /* r0 = end point */
62
" mov r15, r1 \n\t" /* r1 = saved sp */
63
" mov #-6, r15 \n\t" /* LOGIN: r15 = size */
64
" mov.l @%1, %0 \n\t" /* load old value */
65
" xor %2, %0 \n\t" /* xor */
66
" mov.l %0, @%1 \n\t" /* store new value */
67
"1: mov r1, r15 \n\t" /* LOGOUT */
68
: "=&r" (tmp),
69
"+r" (a)
70
: "r" (mask)
71
: "memory" , "r0", "r1");
72
}
73
74
static inline int test_and_set_bit(int nr, volatile void * addr)
75
{
76
int mask, retval;
77
volatile unsigned int *a = addr;
78
unsigned long tmp;
79
80
a += nr >> 5;
81
mask = 1 << (nr & 0x1f);
82
83
__asm__ __volatile__ (
84
" .align 2 \n\t"
85
" mova 1f, r0 \n\t" /* r0 = end point */
86
" mov r15, r1 \n\t" /* r1 = saved sp */
87
" mov #-14, r15 \n\t" /* LOGIN: r15 = size */
88
" mov.l @%2, %0 \n\t" /* load old value */
89
" mov %0, %1 \n\t"
90
" tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
91
" mov #-1, %1 \n\t" /* retvat = -1 */
92
" negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
93
" or %3, %0 \n\t"
94
" mov.l %0, @%2 \n\t" /* store new value */
95
"1: mov r1, r15 \n\t" /* LOGOUT */
96
: "=&r" (tmp),
97
"=&r" (retval),
98
"+r" (a)
99
: "r" (mask)
100
: "memory" , "r0", "r1" ,"t");
101
102
return retval;
103
}
104
105
static inline int test_and_clear_bit(int nr, volatile void * addr)
106
{
107
int mask, retval,not_mask;
108
volatile unsigned int *a = addr;
109
unsigned long tmp;
110
111
a += nr >> 5;
112
mask = 1 << (nr & 0x1f);
113
114
not_mask = ~mask;
115
116
__asm__ __volatile__ (
117
" .align 2 \n\t"
118
" mova 1f, r0 \n\t" /* r0 = end point */
119
" mov r15, r1 \n\t" /* r1 = saved sp */
120
" mov #-14, r15 \n\t" /* LOGIN */
121
" mov.l @%2, %0 \n\t" /* load old value */
122
" mov %0, %1 \n\t" /* %1 = *a */
123
" tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
124
" mov #-1, %1 \n\t" /* retvat = -1 */
125
" negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
126
" and %4, %0 \n\t"
127
" mov.l %0, @%2 \n\t" /* store new value */
128
"1: mov r1, r15 \n\t" /* LOGOUT */
129
: "=&r" (tmp),
130
"=&r" (retval),
131
"+r" (a)
132
: "r" (mask),
133
"r" (not_mask)
134
: "memory" , "r0", "r1", "t");
135
136
return retval;
137
}
138
139
static inline int test_and_change_bit(int nr, volatile void * addr)
140
{
141
int mask, retval;
142
volatile unsigned int *a = addr;
143
unsigned long tmp;
144
145
a += nr >> 5;
146
mask = 1 << (nr & 0x1f);
147
148
__asm__ __volatile__ (
149
" .align 2 \n\t"
150
" mova 1f, r0 \n\t" /* r0 = end point */
151
" mov r15, r1 \n\t" /* r1 = saved sp */
152
" mov #-14, r15 \n\t" /* LOGIN */
153
" mov.l @%2, %0 \n\t" /* load old value */
154
" mov %0, %1 \n\t" /* %1 = *a */
155
" tst %1, %3 \n\t" /* T = ((*a & mask) == 0) */
156
" mov #-1, %1 \n\t" /* retvat = -1 */
157
" negc %1, %1 \n\t" /* retval = (mask & *a) != 0 */
158
" xor %3, %0 \n\t"
159
" mov.l %0, @%2 \n\t" /* store new value */
160
"1: mov r1, r15 \n\t" /* LOGOUT */
161
: "=&r" (tmp),
162
"=&r" (retval),
163
"+r" (a)
164
: "r" (mask)
165
: "memory" , "r0", "r1", "t");
166
167
return retval;
168
}
169
170
#include <asm-generic/bitops/non-atomic.h>
171
172
#endif /* __ASM_SH_BITOPS_GRB_H */
173
174