8
8
9
9
// ARM atomic operations, for use by asm_$(GOOS)_arm.s.
10
10
11
+ #define DMB_ISHST_7 \
12
+ MOVB runtime·goarm(SB), R11; \
13
+ CMP $7 , R11; \
14
+ BLT 2 (PC); \
15
+ WORD $0xf57ff05a // dmb ishst
16
+
17
+ #define DMB_ISH_7 \
18
+ MOVB runtime·goarm(SB), R11; \
19
+ CMP $7 , R11; \
20
+ BLT 2 (PC); \
21
+ WORD $0xf57ff05b // dmb ish
22
+
11
23
TEXT ·armCompareAndSwapUint32(SB),NOSPLIT,$0 -13
12
24
MOVW addr+0 (FP), R1
13
25
MOVW old+4 (FP), R2
@@ -17,10 +29,12 @@ casloop:
17
29
LDREX (R1), R0
18
30
CMP R0, R2
19
31
BNE casfail
32
+ DMB_ISHST_7
20
33
STREX R3, (R1), R0
21
34
CMP $0 , R0
22
35
BNE casloop
23
36
MOVW $1 , R0
37
+ DMB_ISH_7
24
38
MOVBU R0, ret +12 (FP)
25
39
RET
26
40
casfail:
@@ -46,10 +60,12 @@ cas64loop:
46
60
BNE cas64fail
47
61
CMP R3, R7
48
62
BNE cas64fail
63
+ DMB_ISHST_7
49
64
STREXD R4, (R1), R0 // stores R4 and R5
50
65
CMP $0 , R0
51
66
BNE cas64loop
52
67
MOVW $1 , R0
68
+ DMB_ISH_7
53
69
MOVBU R0, ret +20 (FP)
54
70
RET
55
71
cas64fail:
@@ -64,9 +80,11 @@ addloop:
64
80
// LDREX and STREX were introduced in ARMv6.
65
81
LDREX (R1), R3
66
82
ADD R2, R3
83
+ DMB_ISHST_7
67
84
STREX R3, (R1), R0
68
85
CMP $0 , R0
69
86
BNE addloop
87
+ DMB_ISH_7
70
88
MOVW R3, ret +8 (FP)
71
89
RET
72
90
@@ -84,9 +102,11 @@ add64loop:
84
102
LDREXD (R1), R4 // loads R4 and R5
85
103
ADD .S R2, R4
86
104
ADC R3, R5
105
+ DMB_ISHST_7
87
106
STREXD R4, (R1), R0 // stores R4 and R5
88
107
CMP $0 , R0
89
108
BNE add64loop
109
+ DMB_ISH_7
90
110
MOVW R4, retlo+12 (FP)
91
111
MOVW R5, rethi+16 (FP)
92
112
RET
@@ -97,9 +117,11 @@ TEXT ·armSwapUint32(SB),NOSPLIT,$0-12
97
117
swaploop:
98
118
// LDREX and STREX were introduced in ARMv6.
99
119
LDREX (R1), R3
120
+ DMB_ISHST_7
100
121
STREX R2, (R1), R0
101
122
CMP $0 , R0
102
123
BNE swaploop
124
+ DMB_ISH_7
103
125
MOVW R3, old+8 (FP)
104
126
RET
105
127
@@ -115,9 +137,11 @@ TEXT ·armSwapUint64(SB),NOSPLIT,$0-20
115
137
swap64loop:
116
138
// LDREXD and STREXD were introduced in ARMv6k.
117
139
LDREXD (R1), R4 // loads R4 and R5
140
+ DMB_ISHST_7
118
141
STREXD R2, (R1), R0 // stores R2 and R3
119
142
CMP $0 , R0
120
143
BNE swap64loop
144
+ DMB_ISH_7
121
145
MOVW R4, oldlo+12 (FP)
122
146
MOVW R5, oldhi+16 (FP)
123
147
RET
@@ -131,9 +155,11 @@ TEXT ·armLoadUint64(SB),NOSPLIT,$0-12
131
155
MOVW R2, (R2)
132
156
load64loop:
133
157
LDREXD (R1), R2 // loads R2 and R3
158
+ DMB_ISHST_7
134
159
STREXD R2, (R1), R0 // stores R2 and R3
135
160
CMP $0 , R0
136
161
BNE load64loop
162
+ DMB_ISH_7
137
163
MOVW R2, vallo+4 (FP)
138
164
MOVW R3, valhi+8 (FP)
139
165
RET
@@ -149,9 +175,11 @@ TEXT ·armStoreUint64(SB),NOSPLIT,$0-12
149
175
MOVW valhi+8 (FP), R3
150
176
store64loop:
151
177
LDREXD (R1), R4 // loads R4 and R5
178
+ DMB_ISHST_7
152
179
STREXD R2, (R1), R0 // stores R2 and R3
153
180
CMP $0 , R0
154
181
BNE store64loop
182
+ DMB_ISH_7
155
183
RET
156
184
157
185
// Check for broken 64-bit LDREXD as found in QEMU.
0 commit comments