Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sh: Implement __get_user_u64() required for 64-bit get_user()

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 <glaubitz@physik.fu-berlin.de>
Acked-by: Yoshinori Sato <ysato@users.sourceforge.jp>
Signed-off-by: Rich Felker <dalias@libc.org>

authored by

John Paul Adrian Glaubitz and committed by
Rich Felker
2d2b308a 2202d81b

+53
+53
arch/sh/include/asm/uaccess_32.h
··· 26 26 case 4: \ 27 27 __get_user_asm(x, ptr, retval, "l"); \ 28 28 break; \ 29 + case 8: \ 30 + __get_user_u64(x, ptr, retval); \ 31 + break; \ 29 32 default: \ 30 33 __get_user_unknown(); \ 31 34 break; \ ··· 68 65 #endif /* CONFIG_MMU */ 69 66 70 67 extern void __get_user_unknown(void); 68 + 69 + #if defined(CONFIG_CPU_LITTLE_ENDIAN) 70 + #define __get_user_u64(x, addr, err) \ 71 + ({ \ 72 + __asm__ __volatile__( \ 73 + "1:\n\t" \ 74 + "mov.l %2,%R1\n\t" \ 75 + "mov.l %T2,%S1\n\t" \ 76 + "2:\n" \ 77 + ".section .fixup,\"ax\"\n" \ 78 + "3:\n\t" \ 79 + "mov #0,%R1\n\t" \ 80 + "mov #0,%S1\n\t" \ 81 + "mov.l 4f, %0\n\t" \ 82 + "jmp @%0\n\t" \ 83 + " mov %3, %0\n\t" \ 84 + ".balign 4\n" \ 85 + "4: .long 2b\n\t" \ 86 + ".previous\n" \ 87 + ".section __ex_table,\"a\"\n\t" \ 88 + ".long 1b, 3b\n\t" \ 89 + ".long 1b + 2, 3b\n\t" \ 90 + ".previous" \ 91 + :"=&r" (err), "=&r" (x) \ 92 + :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) 93 + #else 94 + #define __get_user_u64(x, addr, err) \ 95 + ({ \ 96 + __asm__ __volatile__( \ 97 + "1:\n\t" \ 98 + "mov.l %2,%S1\n\t" \ 99 + "mov.l %T2,%R1\n\t" \ 100 + "2:\n" \ 101 + ".section .fixup,\"ax\"\n" \ 102 + "3:\n\t" \ 103 + "mov #0,%S1\n\t" \ 104 + "mov #0,%R1\n\t" \ 105 + "mov.l 4f, %0\n\t" \ 106 + "jmp @%0\n\t" \ 107 + " mov %3, %0\n\t" \ 108 + ".balign 4\n" \ 109 + "4: .long 2b\n\t" \ 110 + ".previous\n" \ 111 + ".section __ex_table,\"a\"\n\t" \ 112 + ".long 1b, 3b\n\t" \ 113 + ".long 1b + 2, 3b\n\t" \ 114 + ".previous" \ 115 + :"=&r" (err), "=&r" (x) \ 116 + :"m" (__m(addr)), "i" (-EFAULT), "0" (err)); }) 117 + #endif 71 118 72 119 #define __put_user_size(x,ptr,size,retval) \ 73 120 do { \