Skip to content

Commit cbdf9ad

Browse files
benshi001cherrymui
authored andcommitted
runtime: save/restore callee saved registers in arm64's sigtramp
ARM64's R19-R29 and F8-F15 are callee saved registers, which should be saved in the beginning of sigtramp, and restored at the end. fixes #31827 Change-Id: I622e03f1a13fec969d3a11b6a303a8a492e02bcd Reviewed-on: https://go-review.googlesource.com/c/go/+/177045 Run-TryBot: Ben Shi <powerman1st@163.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
1 parent 38c129b commit cbdf9ad

File tree

5 files changed

+215
-75
lines changed

5 files changed

+215
-75
lines changed

misc/cgo/testsanitizers/tsan_test.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@
55
package sanitizers_test
66

77
import (
8-
"runtime"
98
"strings"
109
"testing"
1110
)
1211

1312
func TestTSAN(t *testing.T) {
14-
if runtime.GOARCH == "arm64" {
15-
t.Skip("skipping test; see https://golang.org/issue/25682")
16-
}
1713
t.Parallel()
1814
requireOvercommit(t)
1915
config := configure("thread")

src/runtime/sys_darwin_arm64.s

Lines changed: 80 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ TEXT runtime·read_trampoline(SB),NOSPLIT,$0
4141
MOVD 8(R0), R1 // arg 2 buf
4242
MOVW 16(R0), R2 // arg 3 count
4343
MOVW 0(R0), R0 // arg 1 fd
44-
BL libc_read(SB)
44+
BL libc_read(SB)
4545
RET
4646

4747
TEXT runtime·exit_trampoline(SB),NOSPLIT|NOFRAME,$0
@@ -72,7 +72,7 @@ TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0
7272
MOVD $-1, R2
7373
CMP R0, R2
7474
BNE ok
75-
BL libc_error(SB)
75+
BL libc_error(SB)
7676
MOVW (R0), R1
7777
MOVD $0, R0
7878
ok:
@@ -84,8 +84,8 @@ TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0
8484
MOVD 8(R0), R1 // arg 2 len
8585
MOVD 0(R0), R0 // arg 1 addr
8686
BL libc_munmap(SB)
87-
CMP $0, R0
88-
BEQ 2(PC)
87+
CMP $0, R0
88+
BEQ 2(PC)
8989
BL notok<>(SB)
9090
RET
9191

@@ -145,22 +145,28 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
145145
BL (R11)
146146
RET
147147

148-
TEXT runtime·sigtramp(SB),NOSPLIT,$0
149-
// Reserve space for callee-save registers and arguments.
150-
SUB $(8*16), RSP
151-
152-
// Save callee-save registers.
153-
MOVD R19, (8*4)(RSP)
154-
MOVD R20, (8*5)(RSP)
155-
MOVD R21, (8*6)(RSP)
156-
MOVD R22, (8*7)(RSP)
157-
MOVD R23, (8*8)(RSP)
158-
MOVD R24, (8*9)(RSP)
159-
MOVD R25, (8*10)(RSP)
160-
MOVD R26, (8*11)(RSP)
161-
MOVD R27, (8*12)(RSP)
162-
MOVD g, (8*13)(RSP)
163-
MOVD R29, (8*14)(RSP)
148+
TEXT runtime·sigtramp(SB),NOSPLIT,$192
149+
// Save callee-save registers in the case of signal forwarding.
150+
// Please refer to https://golang.org/issue/31827 .
151+
MOVD R19, 8*4(RSP)
152+
MOVD R20, 8*5(RSP)
153+
MOVD R21, 8*6(RSP)
154+
MOVD R22, 8*7(RSP)
155+
MOVD R23, 8*8(RSP)
156+
MOVD R24, 8*9(RSP)
157+
MOVD R25, 8*10(RSP)
158+
MOVD R26, 8*11(RSP)
159+
MOVD R27, 8*12(RSP)
160+
MOVD g, 8*13(RSP)
161+
MOVD R29, 8*14(RSP)
162+
FMOVD F8, 8*15(RSP)
163+
FMOVD F9, 8*16(RSP)
164+
FMOVD F10, 8*17(RSP)
165+
FMOVD F11, 8*18(RSP)
166+
FMOVD F12, 8*19(RSP)
167+
FMOVD F13, 8*20(RSP)
168+
FMOVD F14, 8*21(RSP)
169+
FMOVD F15, 8*22(RSP)
164170

165171
// Save arguments.
166172
MOVW R0, (8*1)(RSP) // sig
@@ -174,9 +180,9 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$0
174180
BEQ 2(PC)
175181
BL runtime·load_g(SB)
176182

177-
MOVD RSP, R6
178-
CMP $0, g
179-
BEQ nog
183+
MOVD RSP, R6
184+
CMP $0, g
185+
BEQ nog
180186
// iOS always use the main stack to run the signal handler.
181187
// We need to switch to gsignal ourselves.
182188
MOVD g_m(g), R11
@@ -221,8 +227,14 @@ nog:
221227
MOVD (8*12)(RSP), R27
222228
MOVD (8*13)(RSP), g
223229
MOVD (8*14)(RSP), R29
224-
225-
ADD $(8*16), RSP
230+
FMOVD (8*15)(RSP), F8
231+
FMOVD (8*16)(RSP), F9
232+
FMOVD (8*17)(RSP), F10
233+
FMOVD (8*18)(RSP), F11
234+
FMOVD (8*19)(RSP), F12
235+
FMOVD (8*20)(RSP), F13
236+
FMOVD (8*21)(RSP), F14
237+
FMOVD (8*22)(RSP), F15
226238

227239
RET
228240

@@ -234,7 +246,7 @@ TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0
234246
MOVD 16(R0), R2 // arg 3 old
235247
MOVW 0(R0), R0 // arg 1 how
236248
BL libc_pthread_sigmask(SB)
237-
CMP $0, R0
249+
CMP $0, R0
238250
BEQ 2(PC)
239251
BL notok<>(SB)
240252
RET
@@ -279,7 +291,7 @@ TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0
279291
MOVD $-1, R2
280292
CMP R0, R2
281293
BNE ok
282-
BL libc_error(SB)
294+
BL libc_error(SB)
283295
MOVW (R0), R0 // errno
284296
NEG R0, R0 // caller wants it as a negative error code
285297
ok:
@@ -308,60 +320,60 @@ TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0
308320
// mstart_stub is the first function executed on a new thread started by pthread_create.
309321
// It just does some low-level setup and then calls mstart.
310322
// Note: called with the C calling convention.
311-
TEXT runtime·mstart_stub(SB),NOSPLIT,$0
323+
TEXT runtime·mstart_stub(SB),NOSPLIT,$160
312324
// R0 points to the m.
313325
// We are already on m's g0 stack.
314326

315327
// Save callee-save registers.
316-
SUB $144, RSP
317-
MOVD R19, 0(RSP)
318-
MOVD R20, 8(RSP)
319-
MOVD R21, 16(RSP)
320-
MOVD R22, 24(RSP)
321-
MOVD R23, 32(RSP)
322-
MOVD R24, 40(RSP)
323-
MOVD R25, 48(RSP)
324-
MOVD R26, 56(RSP)
325-
MOVD R27, 64(RSP)
326-
MOVD g, 72(RSP)
327-
FMOVD F8, 80(RSP)
328-
FMOVD F9, 88(RSP)
329-
FMOVD F10, 96(RSP)
330-
FMOVD F11, 104(RSP)
331-
FMOVD F12, 112(RSP)
332-
FMOVD F13, 120(RSP)
333-
FMOVD F14, 128(RSP)
334-
FMOVD F15, 136(RSP)
328+
MOVD R19, 8(RSP)
329+
MOVD R20, 16(RSP)
330+
MOVD R21, 24(RSP)
331+
MOVD R22, 32(RSP)
332+
MOVD R23, 40(RSP)
333+
MOVD R24, 48(RSP)
334+
MOVD R25, 56(RSP)
335+
MOVD R26, 64(RSP)
336+
MOVD R27, 72(RSP)
337+
MOVD g, 80(RSP)
338+
MOVD R29, 88(RSP)
339+
FMOVD F8, 96(RSP)
340+
FMOVD F9, 104(RSP)
341+
FMOVD F10, 112(RSP)
342+
FMOVD F11, 120(RSP)
343+
FMOVD F12, 128(RSP)
344+
FMOVD F13, 136(RSP)
345+
FMOVD F14, 144(RSP)
346+
FMOVD F15, 152(RSP)
335347

336348
MOVD m_g0(R0), g
337349

338-
BL runtime·mstart(SB)
350+
BL runtime·mstart(SB)
339351

340352
// Restore callee-save registers.
341-
MOVD 0(RSP), R19
342-
MOVD 8(RSP), R20
343-
MOVD 16(RSP), R21
344-
MOVD 24(RSP), R22
345-
MOVD 32(RSP), R23
346-
MOVD 40(RSP), R24
347-
MOVD 48(RSP), R25
348-
MOVD 56(RSP), R26
349-
MOVD 64(RSP), R27
350-
MOVD 72(RSP), g
351-
FMOVD 80(RSP), F8
352-
FMOVD 88(RSP), F9
353-
FMOVD 96(RSP), F10
354-
FMOVD 104(RSP), F11
355-
FMOVD 112(RSP), F12
356-
FMOVD 120(RSP), F13
357-
FMOVD 128(RSP), F14
358-
FMOVD 136(RSP), F15
359-
ADD $144, RSP
353+
MOVD 8(RSP), R19
354+
MOVD 16(RSP), R20
355+
MOVD 24(RSP), R21
356+
MOVD 32(RSP), R22
357+
MOVD 40(RSP), R23
358+
MOVD 48(RSP), R24
359+
MOVD 56(RSP), R25
360+
MOVD 64(RSP), R26
361+
MOVD 72(RSP), R27
362+
MOVD 80(RSP), g
363+
MOVD 88(RSP), R29
364+
FMOVD 96(RSP), F8
365+
FMOVD 104(RSP), F9
366+
FMOVD 112(RSP), F10
367+
FMOVD 120(RSP), F11
368+
FMOVD 128(RSP), F12
369+
FMOVD 136(RSP), F13
370+
FMOVD 144(RSP), F14
371+
FMOVD 152(RSP), F15
360372

361373
// Go is all done with this OS thread.
362374
// Tell pthread everything is ok (we never join with this thread, so
363375
// the value here doesn't really matter).
364-
MOVD $0, R0
376+
MOVD $0, R0
365377

366378
RET
367379

src/runtime/sys_linux_arm64.s

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,29 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
316316
BL (R11)
317317
RET
318318

319-
TEXT runtime·sigtramp(SB),NOSPLIT,$24
319+
TEXT runtime·sigtramp(SB),NOSPLIT,$192
320+
// Save callee-save registers in the case of signal forwarding.
321+
// Please refer to https://golang.org/issue/31827 .
322+
MOVD R19, 8*4(RSP)
323+
MOVD R20, 8*5(RSP)
324+
MOVD R21, 8*6(RSP)
325+
MOVD R22, 8*7(RSP)
326+
MOVD R23, 8*8(RSP)
327+
MOVD R24, 8*9(RSP)
328+
MOVD R25, 8*10(RSP)
329+
MOVD R26, 8*11(RSP)
330+
MOVD R27, 8*12(RSP)
331+
MOVD g, 8*13(RSP)
332+
MOVD R29, 8*14(RSP)
333+
FMOVD F8, 8*15(RSP)
334+
FMOVD F9, 8*16(RSP)
335+
FMOVD F10, 8*17(RSP)
336+
FMOVD F11, 8*18(RSP)
337+
FMOVD F12, 8*19(RSP)
338+
FMOVD F13, 8*20(RSP)
339+
FMOVD F14, 8*21(RSP)
340+
FMOVD F15, 8*22(RSP)
341+
320342
// this might be called in external code context,
321343
// where g is not set.
322344
// first save R0, because runtime·load_g will clobber it
@@ -330,6 +352,28 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$24
330352
MOVD R2, 24(RSP)
331353
MOVD $runtime·sigtrampgo(SB), R0
332354
BL (R0)
355+
356+
// Restore callee-save registers.
357+
MOVD 8*4(RSP), R19
358+
MOVD 8*5(RSP), R20
359+
MOVD 8*6(RSP), R21
360+
MOVD 8*7(RSP), R22
361+
MOVD 8*8(RSP), R23
362+
MOVD 8*9(RSP), R24
363+
MOVD 8*10(RSP), R25
364+
MOVD 8*11(RSP), R26
365+
MOVD 8*12(RSP), R27
366+
MOVD 8*13(RSP), g
367+
MOVD 8*14(RSP), R29
368+
FMOVD 8*15(RSP), F8
369+
FMOVD 8*16(RSP), F9
370+
FMOVD 8*17(RSP), F10
371+
FMOVD 8*18(RSP), F11
372+
FMOVD 8*19(RSP), F12
373+
FMOVD 8*20(RSP), F13
374+
FMOVD 8*21(RSP), F14
375+
FMOVD 8*22(RSP), F15
376+
333377
RET
334378

335379
TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0

src/runtime/sys_netbsd_arm64.s

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,29 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32
276276
BL (R11)
277277
RET
278278

279-
TEXT runtime·sigtramp(SB),NOSPLIT,$24
279+
TEXT runtime·sigtramp(SB),NOSPLIT,$192
280+
// Save callee-save registers in the case of signal forwarding.
281+
// Please refer to https://golang.org/issue/31827 .
282+
MOVD R19, 8*4(RSP)
283+
MOVD R20, 8*5(RSP)
284+
MOVD R21, 8*6(RSP)
285+
MOVD R22, 8*7(RSP)
286+
MOVD R23, 8*8(RSP)
287+
MOVD R24, 8*9(RSP)
288+
MOVD R25, 8*10(RSP)
289+
MOVD R26, 8*11(RSP)
290+
MOVD R27, 8*12(RSP)
291+
MOVD g, 8*13(RSP)
292+
MOVD R29, 8*14(RSP)
293+
FMOVD F8, 8*15(RSP)
294+
FMOVD F9, 8*16(RSP)
295+
FMOVD F10, 8*17(RSP)
296+
FMOVD F11, 8*18(RSP)
297+
FMOVD F12, 8*19(RSP)
298+
FMOVD F13, 8*20(RSP)
299+
FMOVD F14, 8*21(RSP)
300+
FMOVD F15, 8*22(RSP)
301+
280302
// this might be called in external code context,
281303
// where g is not set.
282304
// first save R0, because runtime·load_g will clobber it
@@ -290,6 +312,28 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$24
290312
MOVD R1, 16(RSP)
291313
MOVD R2, 24(RSP)
292314
BL runtime·sigtrampgo(SB)
315+
316+
// Restore callee-save registers.
317+
MOVD 8*4(RSP), R19
318+
MOVD 8*5(RSP), R20
319+
MOVD 8*6(RSP), R21
320+
MOVD 8*7(RSP), R22
321+
MOVD 8*8(RSP), R23
322+
MOVD 8*9(RSP), R24
323+
MOVD 8*10(RSP), R25
324+
MOVD 8*11(RSP), R26
325+
MOVD 8*12(RSP), R27
326+
MOVD 8*13(RSP), g
327+
MOVD 8*14(RSP), R29
328+
FMOVD 8*15(RSP), F8
329+
FMOVD 8*16(RSP), F9
330+
FMOVD 8*17(RSP), F10
331+
FMOVD 8*18(RSP), F11
332+
FMOVD 8*19(RSP), F12
333+
FMOVD 8*20(RSP), F13
334+
FMOVD 8*21(RSP), F14
335+
FMOVD 8*22(RSP), F15
336+
293337
RET
294338

295339
TEXT runtime·mmap(SB),NOSPLIT,$0

0 commit comments

Comments
 (0)