aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/asm_arm64.s
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2016-10-19 15:49:31 -0400
committerAustin Clements <austin@google.com>2016-10-28 20:48:02 +0000
commit70c107c68dca7d57a24b35dd81420fb889aa1031 (patch)
tree3f913f89ecd72a10cda5ccd22fefdb6ab6808a93 /src/runtime/asm_arm64.s
parent8f81dfe8b47e975b90bb4a2f8dd314d32c633176 (diff)
downloadgo-70c107c68dca7d57a24b35dd81420fb889aa1031.tar.gz
go-70c107c68dca7d57a24b35dd81420fb889aa1031.zip
runtime: add deletion barriers on gobuf.ctxt
gobuf.ctxt is set to nil from many places in assembly code and these assignments require write barriers with the hybrid barrier. Conveniently, in most of these places ctxt should already be nil, in which case we don't need the barrier. This commit changes these places to assert that ctxt is already nil. gogo is more complicated, since ctxt may not already be nil. For gogo, we manually perform the write barrier if ctxt is not nil. Updates #17503. Change-Id: I9d75e27c75a1b7f8b715ad112fc5d45ffa856d30 Reviewed-on: https://go-review.googlesource.com/31764 Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/runtime/asm_arm64.s')
-rw-r--r--src/runtime/asm_arm64.s26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s
index 675abb51d3..0e286d484f 100644
--- a/src/runtime/asm_arm64.s
+++ b/src/runtime/asm_arm64.s
@@ -111,13 +111,29 @@ TEXT runtime·gosave(SB), NOSPLIT, $-8-8
MOVD g, gobuf_g(R3)
MOVD ZR, gobuf_lr(R3)
MOVD ZR, gobuf_ret(R3)
- MOVD ZR, gobuf_ctxt(R3)
+ // Assert ctxt is zero. See func save.
+ MOVD gobuf_ctxt(R3), R0
+ CMP $0, R0
+ BEQ 2(PC)
+ CALL runtime·badctxt(SB)
RET
// void gogo(Gobuf*)
// restore state from Gobuf; longjmp
-TEXT runtime·gogo(SB), NOSPLIT, $-8-8
+TEXT runtime·gogo(SB), NOSPLIT, $24-8
MOVD buf+0(FP), R5
+
+ // If ctxt is not nil, invoke deletion barrier before overwriting.
+ MOVD gobuf_ctxt(R5), R0
+ CMP $0, R0
+ BEQ nilctxt
+ MOVD $gobuf_ctxt(R5), R0
+ MOVD R0, 8(RSP)
+ MOVD ZR, 16(RSP)
+ BL runtime·writebarrierptr_prewrite(SB)
+ MOVD buf+0(FP), R5
+
+nilctxt:
MOVD gobuf_g(R5), g
BL runtime·save_g(SB)
@@ -483,7 +499,11 @@ TEXT gosave<>(SB),NOSPLIT,$-8
MOVD R0, (g_sched+gobuf_sp)(g)
MOVD $0, (g_sched+gobuf_lr)(g)
MOVD $0, (g_sched+gobuf_ret)(g)
- MOVD $0, (g_sched+gobuf_ctxt)(g)
+ // Assert ctxt is zero. See func save.
+ MOVD (g_sched+gobuf_ctxt)(g), R0
+ CMP $0, R0
+ BEQ 2(PC)
+ CALL runtime·badctxt(SB)
RET
// func asmcgocall(fn, arg unsafe.Pointer) int32