Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0796b55 authored by David S. Miller's avatar David S. Miller
Browse files

sparc64: Convert GENcopy_{from,to}_user to accurate exception reporting.



Report the exact number of bytes which have not been successfully
copied when an exception occurs, using the running remaining length.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0096ac9f
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -3,11 +3,11 @@
 * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
 */

#define EX_LD(x)		\
#define EX_LD(x,y)		\
98:	x;			\
	.section __ex_table,"a";\
	.align 4;		\
	.word 98b, __retl_mone;	\
	.word 98b, y;		\
	.text;			\
	.align 4;

+2 −2
Original line number Diff line number Diff line
@@ -3,11 +3,11 @@
 * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
 */

#define EX_ST(x)		\
#define EX_ST(x,y)		\
98:	x;			\
	.section __ex_table,"a";\
	.align 4;		\
	.word 98b, __retl_mone;	\
	.word 98b, y;		\
	.text;			\
	.align 4;

+34 −14
Original line number Diff line number Diff line
@@ -4,21 +4,18 @@
 */

#ifdef __KERNEL__
#include <linux/linkage.h>
#define GLOBAL_SPARE	%g7
#else
#define GLOBAL_SPARE	%g5
#endif

#ifndef EX_LD
#define EX_LD(x)	x
#define EX_LD(x,y)	x
#endif

#ifndef EX_ST
#define EX_ST(x)	x
#endif

#ifndef EX_RETVAL
#define EX_RETVAL(x)	x
#define EX_ST(x,y)	x
#endif

#ifndef LOAD
@@ -45,6 +42,29 @@
	.register	%g3,#scratch

	.text

#ifndef EX_RETVAL
#define EX_RETVAL(x)	x
ENTRY(GEN_retl_o4_1)
	add	%o4, %o2, %o4
	retl
	 add	%o4, 1, %o0
ENDPROC(GEN_retl_o4_1)
ENTRY(GEN_retl_g1_8)
	add	%g1, %o2, %g1
	retl
	 add	%g1, 8, %o0
ENDPROC(GEN_retl_g1_8)
ENTRY(GEN_retl_o2_4)
	retl
	 add	%o2, 4, %o0
ENDPROC(GEN_retl_o2_4)
ENTRY(GEN_retl_o2_1)
	retl
	 add	%o2, 1, %o0
ENDPROC(GEN_retl_o2_1)
#endif

	.align		64

	.globl	FUNC_NAME
@@ -73,8 +93,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	sub		%g0, %o4, %o4
	sub		%o2, %o4, %o2
1:	subcc		%o4, 1, %o4
	EX_LD(LOAD(ldub, %o1, %g1))
	EX_ST(STORE(stb, %g1, %o0))
	EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1)
	EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1)
	add		%o1, 1, %o1
	bne,pt		%XCC, 1b
	add		%o0, 1, %o0
@@ -82,8 +102,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	andn		%o2, 0x7, %g1
	sub		%o2, %g1, %o2
1:	subcc		%g1, 0x8, %g1
	EX_LD(LOAD(ldx, %o1, %g2))
	EX_ST(STORE(stx, %g2, %o0))
	EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8)
	EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8)
	add		%o1, 0x8, %o1
	bne,pt		%XCC, 1b
	 add		%o0, 0x8, %o0
@@ -100,8 +120,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */

1:
	subcc		%o2, 4, %o2
	EX_LD(LOAD(lduw, %o1, %g1))
	EX_ST(STORE(stw, %g1, %o1 + %o3))
	EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4)
	EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4)
	bgu,pt		%XCC, 1b
	 add		%o1, 4, %o1

@@ -111,8 +131,8 @@ FUNC_NAME: /* %o0=dst, %o1=src, %o2=len */
	.align		32
90:
	subcc		%o2, 1, %o2
	EX_LD(LOAD(ldub, %o1, %g1))
	EX_ST(STORE(stb, %g1, %o1 + %o3))
	EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1)
	EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1)
	bgu,pt		%XCC, 90b
	 add		%o1, 1, %o1
	retl