Skip to content

Commit 2d2b308

Browse files
glaubitzRich Felker
authored andcommitted
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 <[email protected]> Acked-by: Yoshinori Sato <[email protected]> Signed-off-by: Rich Felker <[email protected]>
1 parent 2202d81 commit 2d2b308

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

arch/sh/include/asm/uaccess_32.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ do { \
2626
case 4: \
2727
__get_user_asm(x, ptr, retval, "l"); \
2828
break; \
29+
case 8: \
30+
__get_user_u64(x, ptr, retval); \
31+
break; \
2932
default: \
3033
__get_user_unknown(); \
3134
break; \
@@ -66,6 +69,56 @@ do { \
6669

6770
extern void __get_user_unknown(void);
6871

72+
#if defined(CONFIG_CPU_LITTLE_ENDIAN)
73+
#define __get_user_u64(x, addr, err) \
74+
({ \
75+
__asm__ __volatile__( \
76+
"1:\n\t" \
77+
"mov.l %2,%R1\n\t" \
78+
"mov.l %T2,%S1\n\t" \
79+
"2:\n" \
80+
".section .fixup,\"ax\"\n" \
81+
"3:\n\t" \
82+
"mov #0,%R1\n\t" \
83+
"mov #0,%S1\n\t" \
84+
"mov.l 4f, %0\n\t" \
85+
"jmp @%0\n\t" \
86+
" mov %3, %0\n\t" \
87+
".balign 4\n" \
88+
"4: .long 2b\n\t" \
89+
".previous\n" \
90+
".section __ex_table,\"a\"\n\t" \
91+
".long 1b, 3b\n\t" \
92+
".long 1b + 2, 3b\n\t" \
93+
".previous" \
94+
:"=&r" (err), "=&r" (x) \
95+
:"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
96+
#else
97+
#define __get_user_u64(x, addr, err) \
98+
({ \
99+
__asm__ __volatile__( \
100+
"1:\n\t" \
101+
"mov.l %2,%S1\n\t" \
102+
"mov.l %T2,%R1\n\t" \
103+
"2:\n" \
104+
".section .fixup,\"ax\"\n" \
105+
"3:\n\t" \
106+
"mov #0,%S1\n\t" \
107+
"mov #0,%R1\n\t" \
108+
"mov.l 4f, %0\n\t" \
109+
"jmp @%0\n\t" \
110+
" mov %3, %0\n\t" \
111+
".balign 4\n" \
112+
"4: .long 2b\n\t" \
113+
".previous\n" \
114+
".section __ex_table,\"a\"\n\t" \
115+
".long 1b, 3b\n\t" \
116+
".long 1b + 2, 3b\n\t" \
117+
".previous" \
118+
:"=&r" (err), "=&r" (x) \
119+
:"m" (__m(addr)), "i" (-EFAULT), "0" (err)); })
120+
#endif
121+
69122
#define __put_user_size(x,ptr,size,retval) \
70123
do { \
71124
retval = 0; \

0 commit comments

Comments
 (0)