xref: /linux/arch/powerpc/include/asm/uaccess.h (revision bba2c3615bd6cfee7456d1130f2e6b01b3f4e9ba)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _ARCH_POWERPC_UACCESS_H
3 #define _ARCH_POWERPC_UACCESS_H
4 
5 #include <linux/sizes.h>
6 
7 #include <asm/processor.h>
8 #include <asm/page.h>
9 #include <asm/extable.h>
10 #include <asm/kup.h>
11 #include <asm/asm-compat.h>
12 
13 #ifdef __powerpc64__
14 /* We use TASK_SIZE_USER64 as TASK_SIZE is not constant */
15 #define TASK_SIZE_MAX		TASK_SIZE_USER64
16 #endif
17 
18 /* Threshold above which VMX copy path is used */
19 #define VMX_COPY_THRESHOLD 3328
20 
21 #define __access_ok __access_ok
22 
23 #include <asm-generic/access_ok.h>
24 
25 /*
26  * On powerpc64, TASK_SIZE_MAX is 0x0010000000000000 then even if both ptr and size
27  * are TASK_SIZE_MAX we are still inside the memory gap. So make it simple.
28  */
29 static __always_inline int __access_ok(const void __user *ptr, unsigned long size)
30 {
31 	unsigned long addr = (unsigned long)ptr;
32 
33 	if (IS_ENABLED(CONFIG_PPC64)) {
34 		BUILD_BUG_ON(!is_power_of_2(TASK_SIZE_MAX));
35 		BUILD_BUG_ON(TASK_SIZE_MAX > 0x0010000000000000);
36 
37 		if (statically_true(size > TASK_SIZE_MAX))
38 			return false;
39 		if (statically_true(size <= TASK_SIZE_MAX))
40 			return !(addr & ~(TASK_SIZE_MAX - 1));
41 		return !((size | addr) & ~(TASK_SIZE_MAX - 1));
42 	} else {
43 		if (statically_true(size <= SZ_128K))
44 			return addr < TASK_SIZE;
45 		return size <= TASK_SIZE && addr <= TASK_SIZE - size;
46 	}
47 }
48 
49 /*
50  * These are the main single-value transfer routines.  They automatically
51  * use the right size if we just have the right pointer type.
52  *
53  * This gets kind of ugly. We want to return _two_ values in "get_user()"
54  * and yet we don't want to do any pointers, because that is too much
55  * of a performance impact. Thus we have a few rather ugly macros here,
56  * and hide all the ugliness from the user.
57  *
58  * The "__xxx" versions of the user access functions are versions that
59  * do not verify the address space, that must have been done previously
60  * with a separate "access_ok()" call (this is used when we do multiple
61  * accesses to the same area of user memory).
62  *
63  * As we use the same address space for kernel and user data on the
64  * PowerPC, we can just do these as direct assignments.  (Of course, the
65  * exception handling means that it's no longer "just"...)
66  *
67  */
68 #define __put_user(x, ptr)					\
69 ({								\
70 	long __pu_err;						\
71 	__typeof__(*(ptr)) __user *__pu_addr = (ptr);		\
72 	__typeof__(*(ptr)) __pu_val = (__typeof__(*(ptr)))(x);	\
73 	__typeof__(sizeof(*(ptr))) __pu_size = sizeof(*(ptr));	\
74 								\
75 	might_fault();						\
76 	do {							\
77 		__label__ __pu_failed;				\
78 								\
79 		allow_user_access(__pu_addr, KUAP_WRITE);	\
80 		__put_user_size_goto(__pu_val, __pu_addr, __pu_size, __pu_failed);	\
81 		prevent_user_access(KUAP_WRITE);		\
82 		__pu_err = 0;					\
83 		break;						\
84 								\
85 __pu_failed:							\
86 		prevent_user_access(KUAP_WRITE);		\
87 		__pu_err = -EFAULT;				\
88 	} while (0);						\
89 								\
90 	__pu_err;						\
91 })
92 
93 #define put_user(x, ptr)						\
94 ({									\
95 	__typeof__(*(ptr)) __user *_pu_addr = (ptr);			\
96 									\
97 	access_ok(_pu_addr, sizeof(*(ptr))) ?				\
98 		  __put_user(x, _pu_addr) : -EFAULT;			\
99 })
100 
101 /*
102  * We don't tell gcc that we are accessing memory, but this is OK
103  * because we do not write to any memory gcc knows about, so there
104  * are no aliasing issues.
105  */
106 /* -mprefixed can generate offsets beyond range, fall back hack */
107 #ifdef CONFIG_PPC_KERNEL_PREFIXED
108 #define __put_user_asm_goto(x, addr, label, op)			\
109 	asm goto(					\
110 		"1:	" op " %0,0(%1)	# put_user\n"		\
111 		EX_TABLE(1b, %l2)				\
112 		:						\
113 		: "r" (x), "b" (addr)				\
114 		:						\
115 		: label)
116 #else
117 #define __put_user_asm_goto(x, addr, label, op)			\
118 	asm goto(					\
119 		"1:	" op "%U1%X1 %0,%1	# put_user\n"	\
120 		EX_TABLE(1b, %l2)				\
121 		:						\
122 		: "r" (x), "m<>" (*addr)			\
123 		:						\
124 		: label)
125 #endif
126 
127 #ifdef __powerpc64__
128 #ifdef CONFIG_PPC_KERNEL_PREFIXED
129 #define __put_user_asm2_goto(x, ptr, label)			\
130 	__put_user_asm_goto(x, ptr, label, "std")
131 #else
132 #define __put_user_asm2_goto(x, addr, label)			\
133 	asm goto ("1: std%U1%X1 %0,%1	# put_user\n"		\
134 		EX_TABLE(1b, %l2)				\
135 		:						\
136 		: "r" (x), DS_FORM_CONSTRAINT (*addr)		\
137 		:						\
138 		: label)
139 #endif // CONFIG_PPC_KERNEL_PREFIXED
140 #else /* __powerpc64__ */
141 #define __put_user_asm2_goto(x, addr, label)			\
142 	asm goto(					\
143 		"1:	stw%X1 %0, %1\n"			\
144 		"2:	stw%X1 %L0, %L1\n"			\
145 		EX_TABLE(1b, %l2)				\
146 		EX_TABLE(2b, %l2)				\
147 		:						\
148 		: "r" (x), "m" (*addr)				\
149 		:						\
150 		: label)
151 #endif /* __powerpc64__ */
152 
153 #define __put_user_size_goto(x, ptr, size, label)		\
154 do {								\
155 	__typeof__(*(ptr)) __user *__pus_addr = (ptr);		\
156 								\
157 	switch (size) {						\
158 	case 1: __put_user_asm_goto(x, __pus_addr, label, "stb"); break;	\
159 	case 2: __put_user_asm_goto(x, __pus_addr, label, "sth"); break;	\
160 	case 4: __put_user_asm_goto(x, __pus_addr, label, "stw"); break;	\
161 	case 8: __put_user_asm2_goto(x, __pus_addr, label); break;		\
162 	default: BUILD_BUG();					\
163 	}							\
164 } while (0)
165 
166 /*
167  * This does an atomic 128 byte aligned load from userspace.
168  * Upto caller to do enable_kernel_vmx() before calling!
169  */
170 #define __get_user_atomic_128_aligned(kaddr, uaddr, err)		\
171 	__asm__ __volatile__(				\
172 		".machine push\n"			\
173 		".machine altivec\n"			\
174 		"1:	lvx  0,0,%1	# get user\n"	\
175 		" 	stvx 0,0,%2	# put kernel\n"	\
176 		".machine pop\n"			\
177 		"2:\n"					\
178 		".section .fixup,\"ax\"\n"		\
179 		"3:	li %0,%3\n"			\
180 		"	b 2b\n"				\
181 		".previous\n"				\
182 		EX_TABLE(1b, 3b)			\
183 		: "=r" (err)			\
184 		: "b" (uaddr), "b" (kaddr), "i" (-EFAULT), "0" (err))
185 
186 #ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT
187 
188 /* -mprefixed can generate offsets beyond range, fall back hack */
189 #ifdef CONFIG_PPC_KERNEL_PREFIXED
190 #define __get_user_asm_goto(x, addr, label, op)			\
191 	asm_goto_output(					\
192 		"1:	"op" %0,0(%1)	# get_user\n"		\
193 		EX_TABLE(1b, %l2)				\
194 		: "=r" (x)					\
195 		: "b" (addr)					\
196 		:						\
197 		: label)
198 #else
199 #define __get_user_asm_goto(x, addr, label, op)			\
200 	asm_goto_output(					\
201 		"1:	"op"%U1%X1 %0, %1	# get_user\n"	\
202 		EX_TABLE(1b, %l2)				\
203 		: "=r" (x)					\
204 		: "m<>" (*addr)					\
205 		:						\
206 		: label)
207 #endif
208 
209 #ifdef __powerpc64__
210 #ifdef CONFIG_PPC_KERNEL_PREFIXED
211 #define __get_user_asm2_goto(x, addr, label)			\
212 	__get_user_asm_goto(x, addr, label, "ld")
213 #else
214 #define __get_user_asm2_goto(x, addr, label)			\
215 	asm_goto_output(					\
216 		"1:	ld%U1%X1 %0, %1	# get_user\n"		\
217 		EX_TABLE(1b, %l2)				\
218 		: "=r" (x)					\
219 		: DS_FORM_CONSTRAINT (*addr)			\
220 		:						\
221 		: label)
222 #endif // CONFIG_PPC_KERNEL_PREFIXED
223 #else /* __powerpc64__ */
224 #define __get_user_asm2_goto(x, addr, label)			\
225 	asm_goto_output(					\
226 		"1:	lwz%X1 %0, %1\n"			\
227 		"2:	lwz%X1 %L0, %L1\n"			\
228 		EX_TABLE(1b, %l2)				\
229 		EX_TABLE(2b, %l2)				\
230 		: "=&r" (x)					\
231 		: "m" (*addr)					\
232 		:						\
233 		: label)
234 #endif /* __powerpc64__ */
235 
236 #define __get_user_size_goto(x, ptr, size, label)				\
237 do {										\
238 	BUILD_BUG_ON(size > sizeof(x));						\
239 	switch (size) {								\
240 	case 1: __get_user_asm_goto(x, (u8 __user *)ptr, label, "lbz"); break;	\
241 	case 2: __get_user_asm_goto(x, (u16 __user *)ptr, label, "lhz"); break;	\
242 	case 4: __get_user_asm_goto(x, (u32 __user *)ptr, label, "lwz"); break;	\
243 	case 8: __get_user_asm2_goto(x, (u64 __user *)ptr, label);  break;	\
244 	default: x = 0; BUILD_BUG();						\
245 	}									\
246 } while (0)
247 
248 #define __get_user_size_allowed(x, ptr, size, retval)			\
249 do {									\
250 		__label__ __gus_failed;					\
251 									\
252 		__get_user_size_goto(x, ptr, size, __gus_failed);	\
253 		retval = 0;						\
254 		break;							\
255 __gus_failed:								\
256 		x = 0;							\
257 		retval = -EFAULT;					\
258 } while (0)
259 
260 #else /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT */
261 
262 #define __get_user_asm(x, addr, err, op)		\
263 	__asm__ __volatile__(				\
264 		"1:	"op"%U2%X2 %1, %2	# get_user\n"	\
265 		"2:\n"					\
266 		".section .fixup,\"ax\"\n"		\
267 		"3:	li %0,%3\n"			\
268 		"	li %1,0\n"			\
269 		"	b 2b\n"				\
270 		".previous\n"				\
271 		EX_TABLE(1b, 3b)			\
272 		: "=r" (err), "=r" (x)			\
273 		: "m<>" (*addr), "i" (-EFAULT), "0" (err))
274 
275 #ifdef __powerpc64__
276 #define __get_user_asm2(x, addr, err)			\
277 	__get_user_asm(x, addr, err, "ld")
278 #else /* __powerpc64__ */
279 #define __get_user_asm2(x, addr, err)			\
280 	__asm__ __volatile__(				\
281 		"1:	lwz%X2 %1, %2\n"			\
282 		"2:	lwz%X2 %L1, %L2\n"		\
283 		"3:\n"					\
284 		".section .fixup,\"ax\"\n"		\
285 		"4:	li %0,%3\n"			\
286 		"	li %1,0\n"			\
287 		"	li %L1,0\n"			\
288 		"	b 3b\n"				\
289 		".previous\n"				\
290 		EX_TABLE(1b, 4b)			\
291 		EX_TABLE(2b, 4b)			\
292 		: "=r" (err), "=&r" (x)			\
293 		: "m" (*addr), "i" (-EFAULT), "0" (err))
294 #endif /* __powerpc64__ */
295 
296 #define __get_user_size_allowed(x, ptr, size, retval)		\
297 do {								\
298 	retval = 0;						\
299 	BUILD_BUG_ON(size > sizeof(x));				\
300 	switch (size) {						\
301 	case 1: __get_user_asm(x, (u8 __user *)ptr, retval, "lbz"); break;	\
302 	case 2: __get_user_asm(x, (u16 __user *)ptr, retval, "lhz"); break;	\
303 	case 4: __get_user_asm(x, (u32 __user *)ptr, retval, "lwz"); break;	\
304 	case 8: __get_user_asm2(x, (u64 __user *)ptr, retval);  break;	\
305 	default: x = 0; BUILD_BUG();				\
306 	}							\
307 } while (0)
308 
309 #define __get_user_size_goto(x, ptr, size, label)		\
310 do {								\
311 	long __gus_retval;					\
312 								\
313 	__get_user_size_allowed(x, ptr, size, __gus_retval);	\
314 	if (__gus_retval)					\
315 		goto label;					\
316 } while (0)
317 
318 #endif /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT */
319 
320 /*
321  * This is a type: either unsigned long, if the argument fits into
322  * that type, or otherwise unsigned long long.
323  */
324 #define __long_type(x) \
325 	__typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
326 
327 #define __get_user(x, ptr)					\
328 ({								\
329 	long __gu_err;						\
330 	__long_type(*(ptr)) __gu_val;				\
331 	__typeof__(*(ptr)) __user *__gu_addr = (ptr);	\
332 	__typeof__(sizeof(*(ptr))) __gu_size = sizeof(*(ptr));	\
333 								\
334 	might_fault();					\
335 	barrier_nospec();					\
336 	allow_user_access(NULL, KUAP_READ);		\
337 	__get_user_size_allowed(__gu_val, __gu_addr, __gu_size, __gu_err);	\
338 	prevent_user_access(KUAP_READ);				\
339 	(x) = (__typeof__(*(ptr)))__gu_val;			\
340 								\
341 	__gu_err;						\
342 })
343 
344 #define get_user(x, ptr)						\
345 ({									\
346 	__typeof__(*(ptr)) __user *_gu_addr = (ptr);			\
347 									\
348 	access_ok(_gu_addr, sizeof(*(ptr))) ?				\
349 		  __get_user(x, _gu_addr) :				\
350 		  ((x) = (__force __typeof__(*(ptr)))0, -EFAULT);	\
351 })
352 
353 /* more complex routines */
354 
355 extern unsigned long __copy_tofrom_user(void __user *to,
356 		const void __user *from, unsigned long size);
357 
358 unsigned long __copy_tofrom_user_base(void __user *to,
359 				      const void __user *from, unsigned long size);
360 
361 unsigned long __copy_tofrom_user_power7_vmx(void __user *to,
362 					    const void __user *from, unsigned long size);
363 
364 static __always_inline bool will_use_vmx(unsigned long n)
365 {
366 	return IS_ENABLED(CONFIG_ALTIVEC) && cpu_has_feature(CPU_FTR_VMX_COPY) &&
367 	       n > VMX_COPY_THRESHOLD;
368 }
369 
370 static __always_inline unsigned long
371 raw_copy_tofrom_user(void __user *to, const void __user *from,
372 		     unsigned long n, unsigned long dir)
373 {
374 	unsigned long ret;
375 
376 	if (will_use_vmx(n) && enter_vmx_usercopy()) {
377 		allow_user_access(to, dir);
378 		ret = __copy_tofrom_user_power7_vmx(to, from, n);
379 		prevent_user_access(dir);
380 		exit_vmx_usercopy();
381 
382 		if (unlikely(ret)) {
383 			allow_user_access(to, dir);
384 			ret = __copy_tofrom_user_base(to, from, n);
385 			prevent_user_access(dir);
386 		}
387 		return ret;
388 	}
389 
390 	allow_user_access(to, dir);
391 	ret = __copy_tofrom_user(to, from, n);
392 	prevent_user_access(dir);
393 	return ret;
394 }
395 
396 #ifdef CONFIG_PPC64
397 static inline unsigned long
398 raw_copy_in_user(void __user *to, const void __user *from, unsigned long n)
399 {
400 	barrier_nospec();
401 	return raw_copy_tofrom_user(to, from, n, KUAP_READ_WRITE);
402 }
403 #endif /* CONFIG_PPC64 */
404 
405 static inline unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n)
406 {
407 	return raw_copy_tofrom_user((__force void __user *)to, from, n, KUAP_READ);
408 }
409 
410 static inline unsigned long
411 raw_copy_to_user(void __user *to, const void *from, unsigned long n)
412 {
413 	return raw_copy_tofrom_user(to, (__force const void __user *)from, n, KUAP_WRITE);
414 }
415 
416 unsigned long __arch_clear_user(void __user *addr, unsigned long size);
417 
418 static inline unsigned long __clear_user(void __user *addr, unsigned long size)
419 {
420 	unsigned long ret;
421 
422 	might_fault();
423 	allow_user_access(addr, KUAP_WRITE);
424 	ret = __arch_clear_user(addr, size);
425 	prevent_user_access(KUAP_WRITE);
426 	return ret;
427 }
428 
429 static inline unsigned long clear_user(void __user *addr, unsigned long size)
430 {
431 	return likely(access_ok(addr, size)) ? __clear_user(addr, size) : size;
432 }
433 
434 extern long strncpy_from_user(char *dst, const char __user *src, long count);
435 extern __must_check long strnlen_user(const char __user *str, long n);
436 
437 #ifdef CONFIG_ARCH_HAS_COPY_MC
438 unsigned long __must_check
439 copy_mc_generic(void *to, const void *from, unsigned long size);
440 
441 static inline unsigned long __must_check
442 copy_mc_to_kernel(void *to, const void *from, unsigned long size)
443 {
444 	return copy_mc_generic(to, from, size);
445 }
446 #define copy_mc_to_kernel copy_mc_to_kernel
447 
448 static inline unsigned long __must_check
449 copy_mc_to_user(void __user *to, const void *from, unsigned long n)
450 {
451 	if (check_copy_size(from, n, true)) {
452 		if (access_ok(to, n)) {
453 			allow_user_access(to, KUAP_WRITE);
454 			n = copy_mc_generic((void __force *)to, from, n);
455 			prevent_user_access(KUAP_WRITE);
456 		}
457 	}
458 
459 	return n;
460 }
461 #endif
462 
463 extern size_t copy_from_user_flushcache(void *dst, const void __user *src, size_t size);
464 
465 static __must_check __always_inline bool __user_access_begin(const void __user *ptr, size_t len,
466 							     unsigned long dir)
467 {
468 	if (unlikely(!access_ok(ptr, len)))
469 		return false;
470 
471 	might_fault();
472 
473 	if (dir & KUAP_READ)
474 		barrier_nospec();
475 	allow_user_access((void __user *)ptr, dir);
476 	return true;
477 }
478 
479 #define user_access_begin(p, l)		__user_access_begin(p, l, KUAP_READ_WRITE)
480 #define user_read_access_begin(p, l)	__user_access_begin(p, l, KUAP_READ)
481 #define user_write_access_begin(p, l)	__user_access_begin(p, l, KUAP_WRITE)
482 
483 #define user_access_end()		prevent_user_access(KUAP_READ_WRITE)
484 #define user_read_access_end()		prevent_user_access(KUAP_READ)
485 #define user_write_access_end()		prevent_user_access(KUAP_WRITE)
486 
487 #define user_access_save	prevent_user_access_return
488 #define user_access_restore	restore_user_access
489 
490 /*
491  * Masking the user address is an alternative to a conditional
492  * user_access_begin that can avoid the fencing. This only works
493  * for dense accesses starting at the address.
494  */
495 static inline void __user *mask_user_address_simple(const void __user *ptr)
496 {
497 	unsigned long addr = (unsigned long)ptr;
498 	unsigned long mask = (unsigned long)(((long)addr >> (BITS_PER_LONG - 1)) & LONG_MAX);
499 
500 	return (void __user *)(addr & ~mask);
501 }
502 
503 static inline void __user *mask_user_address_isel(const void __user *ptr)
504 {
505 	unsigned long addr;
506 
507 	asm("cmplw %1, %2; iselgt %0, %2, %1" : "=r"(addr) : "r"(ptr), "r"(TASK_SIZE) : "cr0");
508 
509 	return (void __user *)addr;
510 }
511 
512 /* TASK_SIZE is a multiple of 128K for shifting by 17 to the right */
513 static inline void __user *mask_user_address_32(const void __user *ptr)
514 {
515 	unsigned long addr = (unsigned long)ptr;
516 	unsigned long mask = (unsigned long)((long)((TASK_SIZE >> 17) - 1 - (addr >> 17)) >> 31);
517 
518 	addr = (addr & ~mask) | (TASK_SIZE & mask);
519 
520 	return (void __user *)addr;
521 }
522 
523 static inline void __user *mask_user_address_fallback(const void __user *ptr)
524 {
525 	unsigned long addr = (unsigned long)ptr;
526 
527 	return (void __user *)(likely(addr < TASK_SIZE) ? addr : TASK_SIZE);
528 }
529 
530 static inline void __user *mask_user_address(const void __user *ptr)
531 {
532 #ifdef MODULES_VADDR
533 	const unsigned long border = MODULES_VADDR;
534 #else
535 	const unsigned long border = PAGE_OFFSET;
536 #endif
537 
538 	if (IS_ENABLED(CONFIG_PPC64))
539 		return mask_user_address_simple(ptr);
540 	if (IS_ENABLED(CONFIG_E500))
541 		return mask_user_address_isel(ptr);
542 	if (TASK_SIZE <= UL(SZ_2G) && border >= UL(SZ_2G))
543 		return mask_user_address_simple(ptr);
544 	if (IS_ENABLED(CONFIG_PPC_BARRIER_NOSPEC))
545 		return mask_user_address_32(ptr);
546 	return mask_user_address_fallback(ptr);
547 }
548 
549 static __always_inline void __user *__masked_user_access_begin(const void __user *p,
550 							       unsigned long dir)
551 {
552 	void __user *ptr = mask_user_address(p);
553 
554 	might_fault();
555 	allow_user_access(ptr, dir);
556 
557 	return ptr;
558 }
559 
560 #define masked_user_access_begin(p) __masked_user_access_begin(p, KUAP_READ_WRITE)
561 #define masked_user_read_access_begin(p) __masked_user_access_begin(p, KUAP_READ)
562 #define masked_user_write_access_begin(p) __masked_user_access_begin(p, KUAP_WRITE)
563 
564 #define arch_unsafe_get_user(x, p, e) do {			\
565 	__long_type(*(p)) __gu_val;				\
566 	__typeof__(*(p)) __user *__gu_addr = (p);		\
567 								\
568 	__get_user_size_goto(__gu_val, __gu_addr, sizeof(*(p)), e); \
569 	(x) = (__typeof__(*(p)))__gu_val;			\
570 } while (0)
571 
572 #define arch_unsafe_put_user(x, p, e)				\
573 	__put_user_size_goto((__typeof__(*(p)))(x), (p), sizeof(*(p)), e)
574 
575 #define unsafe_copy_from_user(d, s, l, e) \
576 do {											\
577 	u8 *_dst = (u8 *)(d);								\
578 	const u8 __user *_src = (const u8 __user *)(s);					\
579 	size_t _len = (l);								\
580 	int _i;										\
581 											\
582 	for (_i = 0; _i < (_len & ~(sizeof(u64) - 1)); _i += sizeof(u64))		\
583 		unsafe_get_user(*(u64 *)(_dst + _i), (u64 __user *)(_src + _i), e);	\
584 	if (_len & 4) {									\
585 		unsafe_get_user(*(u32 *)(_dst + _i), (u32 __user *)(_src + _i), e);	\
586 		_i += 4;								\
587 	}										\
588 	if (_len & 2) {									\
589 		unsafe_get_user(*(u16 *)(_dst + _i), (u16 __user *)(_src + _i), e);	\
590 		_i += 2;								\
591 	}										\
592 	if (_len & 1)									\
593 		unsafe_get_user(*(u8 *)(_dst + _i), (u8 __user *)(_src + _i), e);	\
594 } while (0)
595 
596 #define unsafe_copy_to_user(d, s, l, e) \
597 do {									\
598 	u8 __user *_dst = (u8 __user *)(d);				\
599 	const u8 *_src = (const u8 *)(s);				\
600 	size_t _len = (l);						\
601 	int _i;								\
602 									\
603 	for (_i = 0; _i < (_len & ~(sizeof(u64) - 1)); _i += sizeof(u64))	\
604 		unsafe_put_user(*(u64 *)(_src + _i), (u64 __user *)(_dst + _i), e); \
605 	if (_len & 4) {							\
606 		unsafe_put_user(*(u32*)(_src + _i), (u32 __user *)(_dst + _i), e); \
607 		_i += 4;						\
608 	}								\
609 	if (_len & 2) {							\
610 		unsafe_put_user(*(u16*)(_src + _i), (u16 __user *)(_dst + _i), e); \
611 		_i += 2;						\
612 	}								\
613 	if (_len & 1) \
614 		unsafe_put_user(*(u8*)(_src + _i), (u8 __user *)(_dst + _i), e); \
615 } while (0)
616 
617 #define arch_get_kernel_nofault(dst, src, type, err_label)		\
618 	__get_user_size_goto(*((type *)(dst)),				\
619 		(__force type __user *)(src), sizeof(type), err_label)
620 
621 #define arch_put_kernel_nofault(dst, src, type, err_label)		\
622 	__put_user_size_goto(*((type *)(src)),				\
623 		(__force type __user *)(dst), sizeof(type), err_label)
624 
625 #endif	/* _ARCH_POWERPC_UACCESS_H */
626