Skip to content

Commit 65a1e24

Browse files
committed
runtime: save/restore callee-save registers in arm's sigtramp
ARM's R4-R8 & R10-R11 are callee-save registers, and R9 may be callee-save or not. This CL saves them at the beginning of sigtramp and restores them in the end. fixes golang#32738 Change-Id: Ib7eb80836bc074e2e6a46ae4602ba8a3b96c5456 Reviewed-on: https://go-review.googlesource.com/c/go/+/183777 Reviewed-by: Cherry Zhang <cherryyz@google.com>
1 parent 8dc1a15 commit 65a1e24

File tree

5 files changed

+44
-20
lines changed

5 files changed

+44
-20
lines changed

src/runtime/sys_darwin_arm.s

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -182,14 +182,8 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
182182

183183
TEXT runtime·sigtramp(SB),NOSPLIT,$0
184184
// Reserve space for callee-save registers and arguments.
185-
SUB $40, R13
186-
187-
MOVW R4, 16(R13)
188-
MOVW R5, 20(R13)
189-
MOVW R6, 24(R13)
190-
MOVW R7, 28(R13)
191-
MOVW R8, 32(R13)
192-
MOVW R11, 36(R13)
185+
MOVM.DB.W [R4-R11], (R13)
186+
SUB $16, R13
193187

194188
// Save arguments.
195189
MOVW R0, 4(R13) // sig
@@ -238,14 +232,8 @@ nog:
238232
MOVW R5, R13
239233

240234
// Restore callee-save registers.
241-
MOVW 16(R13), R4
242-
MOVW 20(R13), R5
243-
MOVW 24(R13), R6
244-
MOVW 28(R13), R7
245-
MOVW 32(R13), R8
246-
MOVW 36(R13), R11
247-
248-
ADD $40, R13
235+
ADD $16, R13
236+
MOVM.IA.W (R13), [R4-R11]
249237

250238
RET
251239

src/runtime/sys_freebsd_arm.s

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,11 @@ TEXT runtime·asmSigaction(SB),NOSPLIT|NOFRAME,$0
246246
MOVW R0, ret+12(FP)
247247
RET
248248

249-
TEXT runtime·sigtramp(SB),NOSPLIT,$12
249+
TEXT runtime·sigtramp(SB),NOSPLIT,$0
250+
// Reserve space for callee-save registers and arguments.
251+
MOVM.DB.W [R4-R11], (R13)
252+
SUB $16, R13
253+
250254
// this might be called in external code context,
251255
// where g is not set.
252256
// first save R0, because runtime·load_g will clobber it
@@ -258,6 +262,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$12
258262
MOVW R1, 8(R13)
259263
MOVW R2, 12(R13)
260264
BL runtime·sigtrampgo(SB)
265+
266+
// Restore callee-save registers.
267+
ADD $16, R13
268+
MOVM.IA.W (R13), [R4-R11]
269+
261270
RET
262271

263272
TEXT runtime·mmap(SB),NOSPLIT,$16

src/runtime/sys_linux_arm.s

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,11 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
493493
MOVW R4, R13
494494
RET
495495

496-
TEXT runtime·sigtramp(SB),NOSPLIT,$12
496+
TEXT runtime·sigtramp(SB),NOSPLIT,$0
497+
// Reserve space for callee-save registers and arguments.
498+
MOVM.DB.W [R4-R11], (R13)
499+
SUB $16, R13
500+
497501
// this might be called in external code context,
498502
// where g is not set.
499503
// first save R0, because runtime·load_g will clobber it
@@ -506,6 +510,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$12
506510
MOVW R2, 12(R13)
507511
MOVW $runtime·sigtrampgo(SB), R11
508512
BL (R11)
513+
514+
// Restore callee-save registers.
515+
ADD $16, R13
516+
MOVM.IA.W (R13), [R4-R11]
517+
509518
RET
510519

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

src/runtime/sys_netbsd_arm.s

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,11 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
300300
MOVW R4, R13
301301
RET
302302

303-
TEXT runtime·sigtramp(SB),NOSPLIT,$12
303+
TEXT runtime·sigtramp(SB),NOSPLIT,$0
304+
// Reserve space for callee-save registers and arguments.
305+
MOVM.DB.W [R4-R11], (R13)
306+
SUB $16, R13
307+
304308
// this might be called in external code context,
305309
// where g is not set.
306310
// first save R0, because runtime·load_g will clobber it
@@ -312,6 +316,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$12
312316
MOVW R1, 8(R13)
313317
MOVW R2, 12(R13)
314318
BL runtime·sigtrampgo(SB)
319+
320+
// Restore callee-save registers.
321+
ADD $16, R13
322+
MOVM.IA.W (R13), [R4-R11]
323+
315324
RET
316325

317326
TEXT runtime·mmap(SB),NOSPLIT,$12

src/runtime/sys_openbsd_arm.s

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,11 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-16
247247
MOVW R4, R13
248248
RET
249249

250-
TEXT runtime·sigtramp(SB),NOSPLIT,$12
250+
TEXT runtime·sigtramp(SB),NOSPLIT,$0
251+
// Reserve space for callee-save registers and arguments.
252+
MOVM.DB.W [R4-R11], (R13)
253+
SUB $16, R13
254+
251255
// If called from an external code context, g will not be set.
252256
// Save R0, since runtime·load_g will clobber it.
253257
MOVW R0, 4(R13) // signum
@@ -258,6 +262,11 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$12
258262
MOVW R1, 8(R13)
259263
MOVW R2, 12(R13)
260264
BL runtime·sigtrampgo(SB)
265+
266+
// Restore callee-save registers.
267+
ADD $16, R13
268+
MOVM.IA.W (R13), [R4-R11]
269+
261270
RET
262271

263272
// int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void));

0 commit comments

Comments
 (0)