Skip to content

Commit f289a34

Browse files
Christoph Hellwigpalmer-dabbelt
authored andcommitted
riscv: refactor __get_user and __put_user
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 <hch@lst.de> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
1 parent 11129e8 commit f289a34

1 file changed

Lines changed: 52 additions & 42 deletions

File tree

arch/riscv/include/asm/uaccess.h

Lines changed: 52 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
107107
do { \
108108
uintptr_t __tmp; \
109109
__typeof__(x) __x; \
110-
__enable_user_access(); \
111110
__asm__ __volatile__ ( \
112111
"1:\n" \
113112
" " insn " %1, %3\n" \
@@ -125,7 +124,6 @@ do { \
125124
" .previous" \
126125
: "+r" (err), "=&r" (__x), "=r" (__tmp) \
127126
: "m" (*(ptr)), "i" (-EFAULT)); \
128-
__disable_user_access(); \
129127
(x) = __x; \
130128
} while (0)
131129

@@ -138,7 +136,6 @@ do { \
138136
u32 __user *__ptr = (u32 __user *)(ptr); \
139137
u32 __lo, __hi; \
140138
uintptr_t __tmp; \
141-
__enable_user_access(); \
142139
__asm__ __volatile__ ( \
143140
"1:\n" \
144141
" lw %1, %4\n" \
@@ -162,12 +159,30 @@ do { \
162159
"=r" (__tmp) \
163160
: "m" (__ptr[__LSW]), "m" (__ptr[__MSW]), \
164161
"i" (-EFAULT)); \
165-
__disable_user_access(); \
166162
(x) = (__typeof__(x))((__typeof__((x)-(x)))( \
167163
(((u64)__hi << 32) | __lo))); \
168164
} while (0)
169165
#endif /* CONFIG_64BIT */
170166

167+
#define __get_user_nocheck(x, __gu_ptr, __gu_err) \
168+
do { \
169+
switch (sizeof(*__gu_ptr)) { \
170+
case 1: \
171+
__get_user_asm("lb", (x), __gu_ptr, __gu_err); \
172+
break; \
173+
case 2: \
174+
__get_user_asm("lh", (x), __gu_ptr, __gu_err); \
175+
break; \
176+
case 4: \
177+
__get_user_asm("lw", (x), __gu_ptr, __gu_err); \
178+
break; \
179+
case 8: \
180+
__get_user_8((x), __gu_ptr, __gu_err); \
181+
break; \
182+
default: \
183+
BUILD_BUG(); \
184+
} \
185+
} while (0)
171186

172187
/**
173188
* __get_user: - Get a simple variable from user space, with less checking.
@@ -191,25 +206,15 @@ do { \
191206
*/
192207
#define __get_user(x, ptr) \
193208
({ \
194-
register long __gu_err = 0; \
195209
const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
210+
long __gu_err = 0; \
211+
\
196212
__chk_user_ptr(__gu_ptr); \
197-
switch (sizeof(*__gu_ptr)) { \
198-
case 1: \
199-
__get_user_asm("lb", (x), __gu_ptr, __gu_err); \
200-
break; \
201-
case 2: \
202-
__get_user_asm("lh", (x), __gu_ptr, __gu_err); \
203-
break; \
204-
case 4: \
205-
__get_user_asm("lw", (x), __gu_ptr, __gu_err); \
206-
break; \
207-
case 8: \
208-
__get_user_8((x), __gu_ptr, __gu_err); \
209-
break; \
210-
default: \
211-
BUILD_BUG(); \
212-
} \
213+
\
214+
__enable_user_access(); \
215+
__get_user_nocheck(x, __gu_ptr, __gu_err); \
216+
__disable_user_access(); \
217+
\
213218
__gu_err; \
214219
})
215220

@@ -243,7 +248,6 @@ do { \
243248
do { \
244249
uintptr_t __tmp; \
245250
__typeof__(*(ptr)) __x = x; \
246-
__enable_user_access(); \
247251
__asm__ __volatile__ ( \
248252
"1:\n" \
249253
" " insn " %z3, %2\n" \
@@ -260,7 +264,6 @@ do { \
260264
" .previous" \
261265
: "+r" (err), "=r" (__tmp), "=m" (*(ptr)) \
262266
: "rJ" (__x), "i" (-EFAULT)); \
263-
__disable_user_access(); \
264267
} while (0)
265268

266269
#ifdef CONFIG_64BIT
@@ -272,7 +275,6 @@ do { \
272275
u32 __user *__ptr = (u32 __user *)(ptr); \
273276
u64 __x = (__typeof__((x)-(x)))(x); \
274277
uintptr_t __tmp; \
275-
__enable_user_access(); \
276278
__asm__ __volatile__ ( \
277279
"1:\n" \
278280
" sw %z4, %2\n" \
@@ -294,10 +296,28 @@ do { \
294296
"=m" (__ptr[__LSW]), \
295297
"=m" (__ptr[__MSW]) \
296298
: "rJ" (__x), "rJ" (__x >> 32), "i" (-EFAULT)); \
297-
__disable_user_access(); \
298299
} while (0)
299300
#endif /* CONFIG_64BIT */
300301

302+
#define __put_user_nocheck(x, __gu_ptr, __pu_err) \
303+
do { \
304+
switch (sizeof(*__gu_ptr)) { \
305+
case 1: \
306+
__put_user_asm("sb", (x), __gu_ptr, __pu_err); \
307+
break; \
308+
case 2: \
309+
__put_user_asm("sh", (x), __gu_ptr, __pu_err); \
310+
break; \
311+
case 4: \
312+
__put_user_asm("sw", (x), __gu_ptr, __pu_err); \
313+
break; \
314+
case 8: \
315+
__put_user_8((x), __gu_ptr, __pu_err); \
316+
break; \
317+
default: \
318+
BUILD_BUG(); \
319+
} \
320+
} while (0)
301321

302322
/**
303323
* __put_user: - Write a simple value into user space, with less checking.
@@ -320,25 +340,15 @@ do { \
320340
*/
321341
#define __put_user(x, ptr) \
322342
({ \
323-
register long __pu_err = 0; \
324343
__typeof__(*(ptr)) __user *__gu_ptr = (ptr); \
344+
long __pu_err = 0; \
345+
\
325346
__chk_user_ptr(__gu_ptr); \
326-
switch (sizeof(*__gu_ptr)) { \
327-
case 1: \
328-
__put_user_asm("sb", (x), __gu_ptr, __pu_err); \
329-
break; \
330-
case 2: \
331-
__put_user_asm("sh", (x), __gu_ptr, __pu_err); \
332-
break; \
333-
case 4: \
334-
__put_user_asm("sw", (x), __gu_ptr, __pu_err); \
335-
break; \
336-
case 8: \
337-
__put_user_8((x), __gu_ptr, __pu_err); \
338-
break; \
339-
default: \
340-
BUILD_BUG(); \
341-
} \
347+
\
348+
__enable_user_access(); \
349+
__put_user_nocheck(x, __gu_ptr, __pu_err); \
350+
__disable_user_access(); \
351+
\
342352
__pu_err; \
343353
})
344354

0 commit comments

Comments
 (0)