Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1525883 > unrolled thread

[PATCH 4.4 28/37] sparc64: Prepare to move to more saner user copy exception handling.

Started byGreg Kroah-Hartman <gregkh@linuxfoundation.org>
First post2016-11-19 10:30 +0100
Last post2016-11-19 10:30 +0100
Articles 1 — 1 participant

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 4.4 28/37] sparc64: Prepare to move to more saner user copy exception handling. Greg Kroah-Hartman <gregkh@linuxfoundation.org> - 2016-11-19 10:30 +0100

#1525883 — [PATCH 4.4 28/37] sparc64: Prepare to move to more saner user copy exception handling.

FromGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Date2016-11-19 10:30 +0100
Subject[PATCH 4.4 28/37] sparc64: Prepare to move to more saner user copy exception handling.
Message-ID<sFa89-33e-5@gated-at.bofh.it>
4.4-stable review patch.  If anyone has any objections, please let me know.

------------------

From: "David S. Miller" <davem@davemloft.net>


[ Upstream commit 83a17d2661674d8c198adc0e183418f72aabab79 ]

The fixup helper function mechanism for handling user copy fault
handling is not %100 accurrate, and can never be made so.

We are going to transition the code to return the running return
return length, which is always kept track in one or more registers
of each of these routines.

In order to convert them one by one, we have to allow the existing
behavior to continue functioning.

Therefore make all the copy code that wants the fixup helper to be
used return negative one.

After all of the user copy routines have been converted, this logic
and the fixup helpers themselves can be removed completely.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 arch/sparc/include/asm/uaccess_64.h |   21 +++++++++++++++------
 arch/sparc/kernel/head_64.S         |   23 +++++++++++------------
 arch/sparc/lib/GENcopy_from_user.S  |    2 +-
 arch/sparc/lib/GENcopy_to_user.S    |    2 +-
 arch/sparc/lib/NG2copy_from_user.S  |    4 ++--
 arch/sparc/lib/NG2copy_to_user.S    |    4 ++--
 arch/sparc/lib/NG4copy_from_user.S  |    4 ++--
 arch/sparc/lib/NG4copy_to_user.S    |    4 ++--
 arch/sparc/lib/NGcopy_from_user.S   |    2 +-
 arch/sparc/lib/NGcopy_to_user.S     |    2 +-
 arch/sparc/lib/U1copy_from_user.S   |    4 ++--
 arch/sparc/lib/U1copy_to_user.S     |    4 ++--
 arch/sparc/lib/U3copy_from_user.S   |    4 ++--
 arch/sparc/lib/U3copy_to_user.S     |    4 ++--
 arch/sparc/lib/copy_in_user.S       |    2 +-
 15 files changed, 47 insertions(+), 39 deletions(-)

--- a/arch/sparc/include/asm/uaccess_64.h
+++ b/arch/sparc/include/asm/uaccess_64.h
@@ -211,8 +211,11 @@ copy_from_user(void *to, const void __us
 {
 	unsigned long ret = ___copy_from_user(to, from, size);
 
-	if (unlikely(ret))
-		ret = copy_from_user_fixup(to, from, size);
+	if (unlikely(ret)) {
+		if ((long)ret < 0)
+			ret = copy_from_user_fixup(to, from, size);
+		return ret;
+	}
 
 	return ret;
 }
@@ -228,8 +231,11 @@ copy_to_user(void __user *to, const void
 {
 	unsigned long ret = ___copy_to_user(to, from, size);
 
-	if (unlikely(ret))
-		ret = copy_to_user_fixup(to, from, size);
+	if (unlikely(ret)) {
+		if ((long)ret < 0)
+			ret = copy_to_user_fixup(to, from, size);
+		return ret;
+	}
 	return ret;
 }
 #define __copy_to_user copy_to_user
@@ -244,8 +250,11 @@ copy_in_user(void __user *to, void __use
 {
 	unsigned long ret = ___copy_in_user(to, from, size);
 
-	if (unlikely(ret))
-		ret = copy_in_user_fixup(to, from, size);
+	if (unlikely(ret)) {
+		if ((long)ret < 0)
+			ret = copy_in_user_fixup(to, from, size);
+		return ret;
+	}
 	return ret;
 }
 #define __copy_in_user copy_in_user
--- a/arch/sparc/kernel/head_64.S
+++ b/arch/sparc/kernel/head_64.S
@@ -922,41 +922,40 @@ prom_tba:	.xword	0
 tlb_type:	.word	0	/* Must NOT end up in BSS */
 	.section	".fixup",#alloc,#execinstr
 
-	.globl	__retl_efault, __ret_one, __retl_one
 ENTRY(__retl_efault)
 	retl
 	 mov	-EFAULT, %o0
 ENDPROC(__retl_efault)
 
-ENTRY(__retl_one)
+ENTRY(__retl_mone)
 	retl
-	 mov	1, %o0
-ENDPROC(__retl_one)
+	 mov	-1, %o0
+ENDPROC(__retl_mone)
 
-ENTRY(__retl_one_fp)
+ENTRY(__retl_mone_fp)
 	VISExitHalf
 	retl
 	 mov	1, %o0
-ENDPROC(__retl_one_fp)
+ENDPROC(__retl_mone_fp)
 
-ENTRY(__ret_one_asi)
+ENTRY(__ret_mone_asi)
 	wr	%g0, ASI_AIUS, %asi
 	ret
 	 restore %g0, 1, %o0
-ENDPROC(__ret_one_asi)
+ENDPROC(__ret_mone_asi)
 
-ENTRY(__retl_one_asi)
+ENTRY(__retl_mone_asi)
 	wr	%g0, ASI_AIUS, %asi
 	retl
 	 mov	1, %o0
-ENDPROC(__retl_one_asi)
+ENDPROC(__retl_mone_asi)
 
-ENTRY(__retl_one_asi_fp)
+ENTRY(__retl_mone_asi_fp)
 	wr	%g0, ASI_AIUS, %asi
 	VISExitHalf
 	retl
 	 mov	1, %o0
-ENDPROC(__retl_one_asi_fp)
+ENDPROC(__retl_mone_asi_fp)
 
 ENTRY(__retl_o1)
 	retl
--- a/arch/sparc/lib/GENcopy_from_user.S
+++ b/arch/sparc/lib/GENcopy_from_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/GENcopy_to_user.S
+++ b/arch/sparc/lib/GENcopy_to_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/NG2copy_from_user.S
+++ b/arch/sparc/lib/NG2copy_from_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi;\
+	.word 98b, __retl_mone_asi;\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi_fp;\
+	.word 98b, __retl_mone_asi_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/NG2copy_to_user.S
+++ b/arch/sparc/lib/NG2copy_to_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi;\
+	.word 98b, __retl_mone_asi;\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi_fp;\
+	.word 98b, __retl_mone_asi_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/NG4copy_from_user.S
+++ b/arch/sparc/lib/NG4copy_from_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi;\
+	.word 98b, __retl_mone_asi;\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi_fp;\
+	.word 98b, __retl_mone_asi_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/NG4copy_to_user.S
+++ b/arch/sparc/lib/NG4copy_to_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi;\
+	.word 98b, __retl_mone_asi;\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_asi_fp;\
+	.word 98b, __retl_mone_asi_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/NGcopy_from_user.S
+++ b/arch/sparc/lib/NGcopy_from_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __ret_one_asi;\
+	.word 98b, __ret_mone_asi;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/NGcopy_to_user.S
+++ b/arch/sparc/lib/NGcopy_to_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __ret_one_asi;\
+	.word 98b, __ret_mone_asi;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/U1copy_from_user.S
+++ b/arch/sparc/lib/U1copy_from_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_fp;\
+	.word 98b, __retl_mone_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/U1copy_to_user.S
+++ b/arch/sparc/lib/U1copy_to_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_fp;\
+	.word 98b, __retl_mone_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/U3copy_from_user.S
+++ b/arch/sparc/lib/U3copy_from_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_fp;\
+	.word 98b, __retl_mone_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/U3copy_to_user.S
+++ b/arch/sparc/lib/U3copy_to_user.S
@@ -7,7 +7,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 
@@ -15,7 +15,7 @@
 98:	x;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one_fp;\
+	.word 98b, __retl_mone_fp;\
 	.text;			\
 	.align 4;
 
--- a/arch/sparc/lib/copy_in_user.S
+++ b/arch/sparc/lib/copy_in_user.S
@@ -12,7 +12,7 @@
 98:	x,y;			\
 	.section __ex_table,"a";\
 	.align 4;		\
-	.word 98b, __retl_one;	\
+	.word 98b, __retl_mone;	\
 	.text;			\
 	.align 4;
 

[toc] | [standalone]


Back to top | Article view | linux.kernel


csiph-web