Skip to content

Commit 0b67c8f

Browse files
Michael Karcherandreas-gaisler
authored andcommitted
sparc: fix accurate exception reporting in copy_{from_to}_user for Niagara
The referenced commit introduced exception handlers on user-space memory references in copy_from_user and copy_to_user. These handlers return from the respective function and calculate the remaining bytes left to copy using the current register contents. This commit fixes a couple of bad calculations and a broken epilogue in the exception handlers. This will prevent crashes and ensure correct return values of copy_from_user and copy_to_user in the faulting case. The behaviour of memcpy stays unchanged. Fixes: 7ae3aaf ("sparc64: Convert NGcopy_{from,to}_user to accurate exception reporting.") Tested-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> # on SPARC T4 with modified kernel to use Niagara 1 code Tested-by: Magnus Lindholm <linmag7@gmail.com> # on Sun Fire T2000 Signed-off-by: Michael Karcher <kernel@mkarcher.dialup.fu-berlin.de> Tested-by: Ethan Hawke <ehawk@ember.systems> # on Sun Fire T2000 Tested-by: Ken Link <iissmart@numberzero.org> # on Sun Fire T1000 Reviewed-by: Andreas Larsson <andreas@gaisler.com> Link: https://lore.kernel.org/r/20250905-memcpy_series-v4-3-1ca72dda195b@mkarcher.dialup.fu-berlin.de Signed-off-by: Andreas Larsson <andreas@gaisler.com>
1 parent 47b49c0 commit 0b67c8f

1 file changed

Lines changed: 18 additions & 11 deletions

File tree

arch/sparc/lib/NGmemcpy.S

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@
7979
#ifndef EX_RETVAL
8080
#define EX_RETVAL(x) x
8181
__restore_asi:
82-
ret
8382
wr %g0, ASI_AIUS, %asi
83+
ret
8484
restore
8585
ENTRY(NG_ret_i2_plus_i4_plus_1)
8686
ba,pt %xcc, __restore_asi
@@ -125,15 +125,16 @@ ENTRY(NG_ret_i2_plus_g1_minus_56)
125125
ba,pt %xcc, __restore_asi
126126
add %i2, %g1, %i0
127127
ENDPROC(NG_ret_i2_plus_g1_minus_56)
128-
ENTRY(NG_ret_i2_plus_i4)
128+
ENTRY(NG_ret_i2_plus_i4_plus_16)
129+
add %i4, 16, %i4
129130
ba,pt %xcc, __restore_asi
130131
add %i2, %i4, %i0
131-
ENDPROC(NG_ret_i2_plus_i4)
132-
ENTRY(NG_ret_i2_plus_i4_minus_8)
133-
sub %i4, 8, %i4
132+
ENDPROC(NG_ret_i2_plus_i4_plus_16)
133+
ENTRY(NG_ret_i2_plus_i4_plus_8)
134+
add %i4, 8, %i4
134135
ba,pt %xcc, __restore_asi
135136
add %i2, %i4, %i0
136-
ENDPROC(NG_ret_i2_plus_i4_minus_8)
137+
ENDPROC(NG_ret_i2_plus_i4_plus_8)
137138
ENTRY(NG_ret_i2_plus_8)
138139
ba,pt %xcc, __restore_asi
139140
add %i2, 8, %i0
@@ -160,6 +161,12 @@ ENTRY(NG_ret_i2_and_7_plus_i4)
160161
ba,pt %xcc, __restore_asi
161162
add %i2, %i4, %i0
162163
ENDPROC(NG_ret_i2_and_7_plus_i4)
164+
ENTRY(NG_ret_i2_and_7_plus_i4_plus_8)
165+
and %i2, 7, %i2
166+
add %i4, 8, %i4
167+
ba,pt %xcc, __restore_asi
168+
add %i2, %i4, %i0
169+
ENDPROC(NG_ret_i2_and_7_plus_i4)
163170
#endif
164171

165172
.align 64
@@ -405,13 +412,13 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
405412
andn %i2, 0xf, %i4
406413
and %i2, 0xf, %i2
407414
1: subcc %i4, 0x10, %i4
408-
EX_LD(LOAD(ldx, %i1, %o4), NG_ret_i2_plus_i4)
415+
EX_LD(LOAD(ldx, %i1, %o4), NG_ret_i2_plus_i4_plus_16)
409416
add %i1, 0x08, %i1
410-
EX_LD(LOAD(ldx, %i1, %g1), NG_ret_i2_plus_i4)
417+
EX_LD(LOAD(ldx, %i1, %g1), NG_ret_i2_plus_i4_plus_16)
411418
sub %i1, 0x08, %i1
412-
EX_ST(STORE(stx, %o4, %i1 + %i3), NG_ret_i2_plus_i4)
419+
EX_ST(STORE(stx, %o4, %i1 + %i3), NG_ret_i2_plus_i4_plus_16)
413420
add %i1, 0x8, %i1
414-
EX_ST(STORE(stx, %g1, %i1 + %i3), NG_ret_i2_plus_i4_minus_8)
421+
EX_ST(STORE(stx, %g1, %i1 + %i3), NG_ret_i2_plus_i4_plus_8)
415422
bgu,pt %XCC, 1b
416423
add %i1, 0x8, %i1
417424
73: andcc %i2, 0x8, %g0
@@ -468,7 +475,7 @@ FUNC_NAME: /* %i0=dst, %i1=src, %i2=len */
468475
subcc %i4, 0x8, %i4
469476
srlx %g3, %i3, %i5
470477
or %i5, %g2, %i5
471-
EX_ST(STORE(stx, %i5, %o0), NG_ret_i2_and_7_plus_i4)
478+
EX_ST(STORE(stx, %i5, %o0), NG_ret_i2_and_7_plus_i4_plus_8)
472479
add %o0, 0x8, %o0
473480
bgu,pt %icc, 1b
474481
sllx %g3, %g1, %g2

0 commit comments

Comments
 (0)