Re: [PATCH 6/8] riscv: refactor __get_user and __put_user

2020-09-08 Thread Palmer Dabbelt

On Sun, 06 Sep 2020 22:58:23 PDT (-0700), Christoph Hellwig wrote:

Add new __get_user_nocheck and __put_user_nocheck that switch on the size
and call the actual inline assembly helpers, and move the uaccess enable
/ disable into the actual __get_user and __put_user.  This prepares for
natively implementing __get_kernel_nofault and __put_kernel_nofault.

Also don't bother with the deprecated register keyword for the error
return.

Signed-off-by: Christoph Hellwig 
---
 arch/riscv/include/asm/uaccess.h | 94 ++--
 1 file changed, 52 insertions(+), 42 deletions(-)

diff --git a/arch/riscv/include/asm/uaccess.h b/arch/riscv/include/asm/uaccess.h
index e8eedf22e90747..b67d1c616ec348 100644
--- a/arch/riscv/include/asm/uaccess.h
+++ b/arch/riscv/include/asm/uaccess.h
@@ -107,7 +107,6 @@ static inline int __access_ok(unsigned long addr, unsigned 
long size)
 do {   \
uintptr_t __tmp;\
__typeof__(x) __x;  \
-   __enable_user_access(); \
__asm__ __volatile__ (  \
"1:\n"\
"  " insn " %1, %3\n"   \
@@ -125,7 +124,6 @@ do {
\
"  .previous" \
: "+r" (err), "=" (__x), "=r" (__tmp)   \
: "m" (*(ptr)), "i" (-EFAULT)); \
-   __disable_user_access();\
(x) = __x;  \
 } while (0)

@@ -138,7 +136,6 @@ do {
\
u32 __user *__ptr = (u32 __user *)(ptr);\
u32 __lo, __hi; \
uintptr_t __tmp;\
-   __enable_user_access(); \
__asm__ __volatile__ (  \
"1:\n"\
"  lw %1, %4\n"   \
@@ -162,12 +159,30 @@ do {  
\
"=r" (__tmp)  \
: "m" (__ptr[__LSW]), "m" (__ptr[__MSW]),   \
"i" (-EFAULT));   \
-   __disable_user_access();\
(x) = (__typeof__(x))((__typeof__((x)-(x)))(\
(((u64)__hi << 32) | __lo))); \
 } while (0)
 #endif /* CONFIG_64BIT */

+#define __get_user_nocheck(x, __gu_ptr, __gu_err)  \
+do {   \
+   switch (sizeof(*__gu_ptr)) {\
+   case 1: \
+   __get_user_asm("lb", (x), __gu_ptr, __gu_err);\
+   break;  \
+   case 2: \
+   __get_user_asm("lh", (x), __gu_ptr, __gu_err);\
+   break;  \
+   case 4: \
+   __get_user_asm("lw", (x), __gu_ptr, __gu_err);\
+   break;  \
+   case 8: \
+   __get_user_8((x), __gu_ptr, __gu_err);  \
+   break;  \
+   default:\
+   BUILD_BUG();\
+   }   \
+} while (0)

 /**
  * __get_user: - Get a simple variable from user space, with less checking.
@@ -191,25 +206,15 @@ do {  
\
  */
 #define __get_user(x, ptr) \
 ({ \
-   register long __gu_err = 0; \
const __typeof__(*(ptr)) __user *__gu_ptr = (ptr);  \
+   long __gu_err = 0;  \
+   \
__chk_user_ptr(__gu_ptr);   \
-   switch (sizeof(*__gu_ptr)) {\
-   case 1: \
-   __get_user_asm("lb", (x), __gu_ptr, __gu_err);\
-   break;  \

[PATCH 6/8] riscv: refactor __get_user and __put_user

2020-09-06 Thread Christoph Hellwig
Add new __get_user_nocheck and __put_user_nocheck that switch on the size
and call the actual inline assembly helpers, and move the uaccess enable
/ disable into the actual __get_user and __put_user.  This prepares for
natively implementing __get_kernel_nofault and __put_kernel_nofault.

Also don't bother with the deprecated register keyword for the error
return.

Signed-off-by: Christoph Hellwig 
---
 arch/riscv/include/asm/uaccess.h | 94 ++--
 1 file changed, 52 insertions(+), 42 deletions(-)

diff --git a/arch/riscv/include/asm/uaccess.h b/arch/riscv/include/asm/uaccess.h
index e8eedf22e90747..b67d1c616ec348 100644
--- a/arch/riscv/include/asm/uaccess.h
+++ b/arch/riscv/include/asm/uaccess.h
@@ -107,7 +107,6 @@ static inline int __access_ok(unsigned long addr, unsigned 
long size)
 do {   \
uintptr_t __tmp;\
__typeof__(x) __x;  \
-   __enable_user_access(); \
__asm__ __volatile__ (  \
"1:\n"  \
"   " insn " %1, %3\n"  \
@@ -125,7 +124,6 @@ do {
\
"   .previous"  \
: "+r" (err), "=" (__x), "=r" (__tmp) \
: "m" (*(ptr)), "i" (-EFAULT)); \
-   __disable_user_access();\
(x) = __x;  \
 } while (0)
 
@@ -138,7 +136,6 @@ do {
\
u32 __user *__ptr = (u32 __user *)(ptr);\
u32 __lo, __hi; \
uintptr_t __tmp;\
-   __enable_user_access(); \
__asm__ __volatile__ (  \
"1:\n"  \
"   lw %1, %4\n"\
@@ -162,12 +159,30 @@ do {  
\
"=r" (__tmp)\
: "m" (__ptr[__LSW]), "m" (__ptr[__MSW]),   \
"i" (-EFAULT)); \
-   __disable_user_access();\
(x) = (__typeof__(x))((__typeof__((x)-(x)))(\
(((u64)__hi << 32) | __lo)));   \
 } while (0)
 #endif /* CONFIG_64BIT */
 
+#define __get_user_nocheck(x, __gu_ptr, __gu_err)  \
+do {   \
+   switch (sizeof(*__gu_ptr)) {\
+   case 1: \
+   __get_user_asm("lb", (x), __gu_ptr, __gu_err);  \
+   break;  \
+   case 2: \
+   __get_user_asm("lh", (x), __gu_ptr, __gu_err);  \
+   break;  \
+   case 4: \
+   __get_user_asm("lw", (x), __gu_ptr, __gu_err);  \
+   break;  \
+   case 8: \
+   __get_user_8((x), __gu_ptr, __gu_err);  \
+   break;  \
+   default:\
+   BUILD_BUG();\
+   }   \
+} while (0)
 
 /**
  * __get_user: - Get a simple variable from user space, with less checking.
@@ -191,25 +206,15 @@ do {  
\
  */
 #define __get_user(x, ptr) \
 ({ \
-   register long __gu_err = 0; \
const __typeof__(*(ptr)) __user *__gu_ptr = (ptr);  \
+   long __gu_err = 0;  \
+   \
__chk_user_ptr(__gu_ptr);   \
-   switch (sizeof(*__gu_ptr)) {\
-   case 1: \
-   __get_user_asm("lb", (x), __gu_ptr, __gu_err);  \
-   break;  \
-   case 2: \
-   

[PATCH 6/8] riscv: refactor __get_user and __put_user

2020-09-04 Thread Christoph Hellwig
Add new __get_user_nocheck and __put_user_nocheck that switch on the size
and call the actual inline assembly helpers, and move the uaccess enable
/ disable into the actual __get_user and __put_user.  This prepares for
natively implementing __get_kernel_nofault and __put_kernel_nofault.

Also don't bother with the deprecated register keyword for the error
return.

Signed-off-by: Christoph Hellwig 
---
 arch/riscv/include/asm/uaccess.h | 94 ++--
 1 file changed, 52 insertions(+), 42 deletions(-)

diff --git a/arch/riscv/include/asm/uaccess.h b/arch/riscv/include/asm/uaccess.h
index e8eedf22e90747..b67d1c616ec348 100644
--- a/arch/riscv/include/asm/uaccess.h
+++ b/arch/riscv/include/asm/uaccess.h
@@ -107,7 +107,6 @@ static inline int __access_ok(unsigned long addr, unsigned 
long size)
 do {   \
uintptr_t __tmp;\
__typeof__(x) __x;  \
-   __enable_user_access(); \
__asm__ __volatile__ (  \
"1:\n"  \
"   " insn " %1, %3\n"  \
@@ -125,7 +124,6 @@ do {
\
"   .previous"  \
: "+r" (err), "=" (__x), "=r" (__tmp) \
: "m" (*(ptr)), "i" (-EFAULT)); \
-   __disable_user_access();\
(x) = __x;  \
 } while (0)
 
@@ -138,7 +136,6 @@ do {
\
u32 __user *__ptr = (u32 __user *)(ptr);\
u32 __lo, __hi; \
uintptr_t __tmp;\
-   __enable_user_access(); \
__asm__ __volatile__ (  \
"1:\n"  \
"   lw %1, %4\n"\
@@ -162,12 +159,30 @@ do {  
\
"=r" (__tmp)\
: "m" (__ptr[__LSW]), "m" (__ptr[__MSW]),   \
"i" (-EFAULT)); \
-   __disable_user_access();\
(x) = (__typeof__(x))((__typeof__((x)-(x)))(\
(((u64)__hi << 32) | __lo)));   \
 } while (0)
 #endif /* CONFIG_64BIT */
 
+#define __get_user_nocheck(x, __gu_ptr, __gu_err)  \
+do {   \
+   switch (sizeof(*__gu_ptr)) {\
+   case 1: \
+   __get_user_asm("lb", (x), __gu_ptr, __gu_err);  \
+   break;  \
+   case 2: \
+   __get_user_asm("lh", (x), __gu_ptr, __gu_err);  \
+   break;  \
+   case 4: \
+   __get_user_asm("lw", (x), __gu_ptr, __gu_err);  \
+   break;  \
+   case 8: \
+   __get_user_8((x), __gu_ptr, __gu_err);  \
+   break;  \
+   default:\
+   BUILD_BUG();\
+   }   \
+} while (0)
 
 /**
  * __get_user: - Get a simple variable from user space, with less checking.
@@ -191,25 +206,15 @@ do {  
\
  */
 #define __get_user(x, ptr) \
 ({ \
-   register long __gu_err = 0; \
const __typeof__(*(ptr)) __user *__gu_ptr = (ptr);  \
+   long __gu_err = 0;  \
+   \
__chk_user_ptr(__gu_ptr);   \
-   switch (sizeof(*__gu_ptr)) {\
-   case 1: \
-   __get_user_asm("lb", (x), __gu_ptr, __gu_err);  \
-   break;  \
-   case 2: \
-