aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2015-10-02 18:17:54 -0400
committerAustin Clements <austin@google.com>2015-11-13 17:26:39 +0000
commitfc0f36b2ce201142a9137fa8ea6a55e454d1213f (patch)
tree25626da0d5ae1ad6de8d128eb99f8a232832884b
parent9f59bc85a2c9932caebf0b6c6a282a0e839d62af (diff)
downloadgo-fc0f36b2ce201142a9137fa8ea6a55e454d1213f.tar.gz
go-fc0f36b2ce201142a9137fa8ea6a55e454d1213f.zip
[release-branch.go1.5] runtime: use 4 byte writes in amd64p32 memmove/memclr
Currently, amd64p32's memmove and memclr use 8 byte writes as much as possible and 1 byte writes for the tail of the object. However, if an object ends with a 4 byte pointer at an 8 byte aligned offset, this may copy/zero the pointer field one byte at a time, allowing the garbage collector to observe a partially copied pointer. Fix this by using 4 byte writes instead of 8 byte writes. Updates #12552. Change-Id: I13324fd05756fb25ae57e812e836f0a975b5595c Reviewed-on: https://go-review.googlesource.com/15370 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-on: https://go-review.googlesource.com/16908 Reviewed-by: Russ Cox <rsc@golang.org>
-rw-r--r--src/runtime/asm_amd64p32.s6
-rw-r--r--src/runtime/memmove_nacl_amd64p32.s23
2 files changed, 16 insertions, 13 deletions
diff --git a/src/runtime/asm_amd64p32.s b/src/runtime/asm_amd64p32.s
index 6e97256c70..a001a764e7 100644
--- a/src/runtime/asm_amd64p32.s
+++ b/src/runtime/asm_amd64p32.s
@@ -627,12 +627,12 @@ TEXT runtime·memclr(SB),NOSPLIT,$0-8
MOVL ptr+0(FP), DI
MOVL n+4(FP), CX
MOVQ CX, BX
- ANDQ $7, BX
- SHRQ $3, CX
+ ANDQ $3, BX
+ SHRQ $2, CX
MOVQ $0, AX
CLD
REP
- STOSQ
+ STOSL
MOVQ BX, CX
REP
STOSB
diff --git a/src/runtime/memmove_nacl_amd64p32.s b/src/runtime/memmove_nacl_amd64p32.s
index 373607afec..be9e1e55be 100644
--- a/src/runtime/memmove_nacl_amd64p32.s
+++ b/src/runtime/memmove_nacl_amd64p32.s
@@ -4,6 +4,9 @@
#include "textflag.h"
+// This could use MOVSQ, but we use MOVSL so that if an object ends in
+// a 4 byte pointer, we copy it as a unit instead of byte by byte.
+
TEXT runtime·memmove(SB), NOSPLIT, $0-12
MOVL to+0(FP), DI
MOVL from+4(FP), SI
@@ -14,9 +17,9 @@ TEXT runtime·memmove(SB), NOSPLIT, $0-12
forward:
MOVL BX, CX
- SHRL $3, CX
- ANDL $7, BX
- REP; MOVSQ
+ SHRL $2, CX
+ ANDL $3, BX
+ REP; MOVSL
MOVL BX, CX
REP; MOVSB
RET
@@ -32,13 +35,13 @@ back:
STD
MOVL BX, CX
- SHRL $3, CX
- ANDL $7, BX
- SUBL $8, DI
- SUBL $8, SI
- REP; MOVSQ
- ADDL $7, DI
- ADDL $7, SI
+ SHRL $2, CX
+ ANDL $3, BX
+ SUBL $4, DI
+ SUBL $4, SI
+ REP; MOVSL
+ ADDL $3, DI
+ ADDL $3, SI
MOVL BX, CX
REP; MOVSB
CLD