Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/x86/lib/atomic64_386_32.S
10820 views
1
/*
2
* atomic64_t for 386/486
3
*
4
* Copyright © 2010 Luca Barbieri
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
10
*/
11
12
#include <linux/linkage.h>
13
#include <asm/alternative-asm.h>
14
#include <asm/dwarf2.h>
15
16
/* if you want SMP support, implement these with real spinlocks */
17
.macro LOCK reg
18
pushfl_cfi
19
cli
20
.endm
21
22
.macro UNLOCK reg
23
popfl_cfi
24
.endm
25
26
#define BEGIN(op) \
27
.macro endp; \
28
CFI_ENDPROC; \
29
ENDPROC(atomic64_##op##_386); \
30
.purgem endp; \
31
.endm; \
32
ENTRY(atomic64_##op##_386); \
33
CFI_STARTPROC; \
34
LOCK v;
35
36
#define ENDP endp
37
38
#define RET \
39
UNLOCK v; \
40
ret
41
42
#define RET_ENDP \
43
RET; \
44
ENDP
45
46
#define v %ecx
47
BEGIN(read)
48
movl (v), %eax
49
movl 4(v), %edx
50
RET_ENDP
51
#undef v
52
53
#define v %esi
54
BEGIN(set)
55
movl %ebx, (v)
56
movl %ecx, 4(v)
57
RET_ENDP
58
#undef v
59
60
#define v %esi
61
BEGIN(xchg)
62
movl (v), %eax
63
movl 4(v), %edx
64
movl %ebx, (v)
65
movl %ecx, 4(v)
66
RET_ENDP
67
#undef v
68
69
#define v %ecx
70
BEGIN(add)
71
addl %eax, (v)
72
adcl %edx, 4(v)
73
RET_ENDP
74
#undef v
75
76
#define v %ecx
77
BEGIN(add_return)
78
addl (v), %eax
79
adcl 4(v), %edx
80
movl %eax, (v)
81
movl %edx, 4(v)
82
RET_ENDP
83
#undef v
84
85
#define v %ecx
86
BEGIN(sub)
87
subl %eax, (v)
88
sbbl %edx, 4(v)
89
RET_ENDP
90
#undef v
91
92
#define v %ecx
93
BEGIN(sub_return)
94
negl %edx
95
negl %eax
96
sbbl $0, %edx
97
addl (v), %eax
98
adcl 4(v), %edx
99
movl %eax, (v)
100
movl %edx, 4(v)
101
RET_ENDP
102
#undef v
103
104
#define v %esi
105
BEGIN(inc)
106
addl $1, (v)
107
adcl $0, 4(v)
108
RET_ENDP
109
#undef v
110
111
#define v %esi
112
BEGIN(inc_return)
113
movl (v), %eax
114
movl 4(v), %edx
115
addl $1, %eax
116
adcl $0, %edx
117
movl %eax, (v)
118
movl %edx, 4(v)
119
RET_ENDP
120
#undef v
121
122
#define v %esi
123
BEGIN(dec)
124
subl $1, (v)
125
sbbl $0, 4(v)
126
RET_ENDP
127
#undef v
128
129
#define v %esi
130
BEGIN(dec_return)
131
movl (v), %eax
132
movl 4(v), %edx
133
subl $1, %eax
134
sbbl $0, %edx
135
movl %eax, (v)
136
movl %edx, 4(v)
137
RET_ENDP
138
#undef v
139
140
#define v %ecx
141
BEGIN(add_unless)
142
addl %eax, %esi
143
adcl %edx, %edi
144
addl (v), %eax
145
adcl 4(v), %edx
146
cmpl %eax, %esi
147
je 3f
148
1:
149
movl %eax, (v)
150
movl %edx, 4(v)
151
movl $1, %eax
152
2:
153
RET
154
3:
155
cmpl %edx, %edi
156
jne 1b
157
xorl %eax, %eax
158
jmp 2b
159
ENDP
160
#undef v
161
162
#define v %esi
163
BEGIN(inc_not_zero)
164
movl (v), %eax
165
movl 4(v), %edx
166
testl %eax, %eax
167
je 3f
168
1:
169
addl $1, %eax
170
adcl $0, %edx
171
movl %eax, (v)
172
movl %edx, 4(v)
173
movl $1, %eax
174
2:
175
RET
176
3:
177
testl %edx, %edx
178
jne 1b
179
jmp 2b
180
ENDP
181
#undef v
182
183
#define v %esi
184
BEGIN(dec_if_positive)
185
movl (v), %eax
186
movl 4(v), %edx
187
subl $1, %eax
188
sbbl $0, %edx
189
js 1f
190
movl %eax, (v)
191
movl %edx, 4(v)
192
1:
193
RET_ENDP
194
#undef v
195
196