|
1 From fc0f36b2ce201142a9137fa8ea6a55e454d1213f Mon Sep 17 00:00:00 2001 |
|
2 From: Austin Clements <[email protected]> |
|
3 Date: Fri, 2 Oct 2015 18:17:54 -0400 |
|
4 Subject: [PATCH 29/63] [release-branch.go1.5] runtime: use 4 byte writes in |
|
5 amd64p32 memmove/memclr |
|
6 |
|
7 Currently, amd64p32's memmove and memclr use 8 byte writes as much as |
|
8 possible and 1 byte writes for the tail of the object. However, if an |
|
9 object ends with a 4 byte pointer at an 8 byte aligned offset, this |
|
10 may copy/zero the pointer field one byte at a time, allowing the |
|
11 garbage collector to observe a partially copied pointer. |
|
12 |
|
13 Fix this by using 4 byte writes instead of 8 byte writes. |
|
14 |
|
15 Updates #12552. |
|
16 |
|
17 Change-Id: I13324fd05756fb25ae57e812e836f0a975b5595c |
|
18 Reviewed-on: https://go-review.googlesource.com/15370 |
|
19 Run-TryBot: Austin Clements <[email protected]> |
|
20 TryBot-Result: Gobot Gobot <[email protected]> |
|
21 Reviewed-by: Brad Fitzpatrick <[email protected]> |
|
22 Reviewed-by: Keith Randall <[email protected]> |
|
23 Reviewed-on: https://go-review.googlesource.com/16908 |
|
24 Reviewed-by: Russ Cox <[email protected]> |
|
25 --- |
|
26 src/runtime/asm_amd64p32.s | 6 +++--- |
|
27 src/runtime/memmove_nacl_amd64p32.s | 23 +++++++++++++---------- |
|
28 2 files changed, 16 insertions(+), 13 deletions(-) |
|
29 |
|
30 diff --git a/src/runtime/asm_amd64p32.s b/src/runtime/asm_amd64p32.s |
|
31 index 6e97256..a001a76 100644 |
|
32 --- a/src/runtime/asm_amd64p32.s |
|
33 +++ b/src/runtime/asm_amd64p32.s |
|
34 @@ -627,12 +627,12 @@ TEXT runtime·memclr(SB),NOSPLIT,$0-8 |
|
35 MOVL ptr+0(FP), DI |
|
36 MOVL n+4(FP), CX |
|
37 MOVQ CX, BX |
|
38 - ANDQ $7, BX |
|
39 - SHRQ $3, CX |
|
40 + ANDQ $3, BX |
|
41 + SHRQ $2, CX |
|
42 MOVQ $0, AX |
|
43 CLD |
|
44 REP |
|
45 - STOSQ |
|
46 + STOSL |
|
47 MOVQ BX, CX |
|
48 REP |
|
49 STOSB |
|
50 diff --git a/src/runtime/memmove_nacl_amd64p32.s b/src/runtime/memmove_nacl_amd64p32.s |
|
51 index 373607a..be9e1e5 100644 |
|
52 --- a/src/runtime/memmove_nacl_amd64p32.s |
|
53 +++ b/src/runtime/memmove_nacl_amd64p32.s |
|
54 @@ -4,6 +4,9 @@ |
|
55 |
|
56 #include "textflag.h" |
|
57 |
|
58 +// This could use MOVSQ, but we use MOVSL so that if an object ends in |
|
59 +// a 4 byte pointer, we copy it as a unit instead of byte by byte. |
|
60 + |
|
61 TEXT runtime·memmove(SB), NOSPLIT, $0-12 |
|
62 MOVL to+0(FP), DI |
|
63 MOVL from+4(FP), SI |
|
64 @@ -14,9 +17,9 @@ TEXT runtime·memmove(SB), NOSPLIT, $0-12 |
|
65 |
|
66 forward: |
|
67 MOVL BX, CX |
|
68 - SHRL $3, CX |
|
69 - ANDL $7, BX |
|
70 - REP; MOVSQ |
|
71 + SHRL $2, CX |
|
72 + ANDL $3, BX |
|
73 + REP; MOVSL |
|
74 MOVL BX, CX |
|
75 REP; MOVSB |
|
76 RET |
|
77 @@ -32,13 +35,13 @@ back: |
|
78 STD |
|
79 |
|
80 MOVL BX, CX |
|
81 - SHRL $3, CX |
|
82 - ANDL $7, BX |
|
83 - SUBL $8, DI |
|
84 - SUBL $8, SI |
|
85 - REP; MOVSQ |
|
86 - ADDL $7, DI |
|
87 - ADDL $7, SI |
|
88 + SHRL $2, CX |
|
89 + ANDL $3, BX |
|
90 + SUBL $4, DI |
|
91 + SUBL $4, SI |
|
92 + REP; MOVSL |
|
93 + ADDL $3, DI |
|
94 + ADDL $3, SI |
|
95 MOVL BX, CX |
|
96 REP; MOVSB |
|
97 CLD |
|
98 -- |
|
99 2.6.1 |
|
100 |