diff options
author | Andreas Larsson <andreas@gaisler.com> | 2014-08-29 11:08:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-09 19:38:10 -0400 |
commit | 74cad25c076a2f5253312c2fe82d1a4daecc1323 (patch) | |
tree | dbf521e559c8e31c91c08f33e6eb3ca65f9d9a24 /arch/sparc/lib | |
parent | 408316258521168614bfb4da0e070490d3e65a17 (diff) |
sparc: Let memset return the address argument
This makes memset follow the standard (instead of returning 0 on success). This
is needed when certain versions of gcc optimizes around memset calls and assume
that the address argument is preserved in %o0.
Signed-off-by: Andreas Larsson <andreas@gaisler.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/lib')
-rw-r--r-- | arch/sparc/lib/memset.S | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/arch/sparc/lib/memset.S b/arch/sparc/lib/memset.S index 99c017be8719..f75e6906df14 100644 --- a/arch/sparc/lib/memset.S +++ b/arch/sparc/lib/memset.S | |||
@@ -3,8 +3,9 @@ | |||
3 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 3 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
5 | * | 5 | * |
6 | * Returns 0, if ok, and number of bytes not yet set if exception | 6 | * Calls to memset returns initial %o0. Calls to bzero returns 0, if ok, and |
7 | * occurs and we were called as clear_user. | 7 | * number of bytes not yet set if exception occurs and we were called as |
8 | * clear_user. | ||
8 | */ | 9 | */ |
9 | 10 | ||
10 | #include <asm/ptrace.h> | 11 | #include <asm/ptrace.h> |
@@ -65,6 +66,8 @@ __bzero_begin: | |||
65 | .globl __memset_start, __memset_end | 66 | .globl __memset_start, __memset_end |
66 | __memset_start: | 67 | __memset_start: |
67 | memset: | 68 | memset: |
69 | mov %o0, %g1 | ||
70 | mov 1, %g4 | ||
68 | and %o1, 0xff, %g3 | 71 | and %o1, 0xff, %g3 |
69 | sll %g3, 8, %g2 | 72 | sll %g3, 8, %g2 |
70 | or %g3, %g2, %g3 | 73 | or %g3, %g2, %g3 |
@@ -89,6 +92,7 @@ memset: | |||
89 | sub %o0, %o2, %o0 | 92 | sub %o0, %o2, %o0 |
90 | 93 | ||
91 | __bzero: | 94 | __bzero: |
95 | clr %g4 | ||
92 | mov %g0, %g3 | 96 | mov %g0, %g3 |
93 | 1: | 97 | 1: |
94 | cmp %o1, 7 | 98 | cmp %o1, 7 |
@@ -151,8 +155,8 @@ __bzero: | |||
151 | bne,a 8f | 155 | bne,a 8f |
152 | EX(stb %g3, [%o0], and %o1, 1) | 156 | EX(stb %g3, [%o0], and %o1, 1) |
153 | 8: | 157 | 8: |
154 | retl | 158 | b 0f |
155 | clr %o0 | 159 | nop |
156 | 7: | 160 | 7: |
157 | be 13b | 161 | be 13b |
158 | orcc %o1, 0, %g0 | 162 | orcc %o1, 0, %g0 |
@@ -164,6 +168,12 @@ __bzero: | |||
164 | bne 8b | 168 | bne 8b |
165 | EX(stb %g3, [%o0 - 1], add %o1, 1) | 169 | EX(stb %g3, [%o0 - 1], add %o1, 1) |
166 | 0: | 170 | 0: |
171 | andcc %g4, 1, %g0 | ||
172 | be 5f | ||
173 | nop | ||
174 | retl | ||
175 | mov %g1, %o0 | ||
176 | 5: | ||
167 | retl | 177 | retl |
168 | clr %o0 | 178 | clr %o0 |
169 | __memset_end: | 179 | __memset_end: |