On Thu, 11 Jun 2020 16:58:11 +0900,
John Paul Adrian Glaubitz wrote:
> 
> Trying to build the kernel with CONFIG_INFINIBAND_USER_ACCESS enabled fails
> 
>      ERROR: "__get_user_unknown" [drivers/infiniband/core/ib_uverbs.ko] 
> undefined!
> 
> with on SH since the kernel misses a 64-bit implementation of get_user().
> 
> Implement the missing 64-bit get_user() as __get_user_u64(), matching the
> already existing __put_user_u64() which implements the 64-bit put_user().
> 
> Signed-off-by: John Paul Adrian Glaubitz <glaub...@physik.fu-berlin.de>
> ---
>  arch/sh/include/asm/uaccess_32.h | 53 ++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
> 
> diff --git a/arch/sh/include/asm/uaccess_32.h 
> b/arch/sh/include/asm/uaccess_32.h
> index 624cf55acc27..5d7ddc092afd 100644
> --- a/arch/sh/include/asm/uaccess_32.h
> +++ b/arch/sh/include/asm/uaccess_32.h
> @@ -26,6 +26,9 @@ do {                                                        
>         \
>       case 4:                                                 \
>               __get_user_asm(x, ptr, retval, "l");            \
>               break;                                          \
> +     case 8:                                                 \
> +             __get_user_u64(x, ptr, retval);                 \
> +             break;                                          \
>       default:                                                \
>               __get_user_unknown();                           \
>               break;                                          \
> @@ -66,6 +69,56 @@ do {                                                       
> \
>  
>  extern void __get_user_unknown(void);
>  
> +#if defined(CONFIG_CPU_LITTLE_ENDIAN)
> +#define __get_user_u64(x, addr, err) \
> +({ \
> +__asm__ __volatile__( \
> +     "1:\n\t" \
> +     "mov.l  %2,%R1\n\t" \
> +     "mov.l  %T2,%S1\n\t" \
> +     "2:\n" \
> +     ".section       .fixup,\"ax\"\n" \
> +     "3:\n\t" \
> +     "mov  #0,%R1\n\t"   \
> +     "mov  #0,%S1\n\t"   \
> +     "mov.l  4f, %0\n\t" \
> +     "jmp    @%0\n\t" \
> +     " mov   %3, %0\n\t" \
> +     ".balign        4\n" \
> +     "4:     .long   2b\n\t" \
> +     ".previous\n" \
> +     ".section       __ex_table,\"a\"\n\t" \
> +     ".long  1b, 3b\n\t" \
> +     ".long  1b + 2, 3b\n\t" \
> +     ".previous" \
> +     :"=&r" (err), "=&r" (x) \
> +     :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
> +#else
> +#define __get_user_u64(x, addr, err) \
> +({ \
> +__asm__ __volatile__( \
> +     "1:\n\t" \
> +     "mov.l  %2,%S1\n\t" \
> +     "mov.l  %T2,%R1\n\t" \
> +     "2:\n" \
> +     ".section       .fixup,\"ax\"\n" \
> +     "3:\n\t" \
> +     "mov  #0,%S1\n\t"   \
> +     "mov  #0,%R1\n\t"   \
> +     "mov.l  4f, %0\n\t" \
> +     "jmp    @%0\n\t" \
> +     " mov   %3, %0\n\t" \
> +     ".balign        4\n" \
> +     "4:     .long   2b\n\t" \
> +     ".previous\n" \
> +     ".section       __ex_table,\"a\"\n\t" \
> +     ".long  1b, 3b\n\t" \
> +     ".long  1b + 2, 3b\n\t" \
> +     ".previous" \
> +     :"=&r" (err), "=&r" (x) \
> +     :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
> +#endif
> +
>  #define __put_user_size(x,ptr,size,retval)           \
>  do {                                                 \
>       retval = 0;                                     \
> -- 
> 2.27.0
> 

Acked-by: Yoshinori Sato <ys...@users.sourceforge.jp>

-- 
Yosinori Sato

Reply via email to