History

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().

John Paul Adrian Glaubitz committed 6 years ago

Commit 2d2b3081 parent 2202d811 file · +53 −0Browse files

Unified · Split

arch/sh/include/asm/uaccess_32.h+53−0
@@ -26,6 +26,9 @@ do { \ · 25 unmodified lines
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 { \ · 34 unmodified lines
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; \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t