xref: /openbmc/linux/tools/virtio/linux/uaccess.h (revision e9c4962c)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
261d0b5a4SRusty Russell #ifndef UACCESS_H
361d0b5a4SRusty Russell #define UACCESS_H
461d0b5a4SRusty Russell 
5ea9156fbSMark Rutland #include <linux/compiler.h>
6ea9156fbSMark Rutland 
7ea9156fbSMark Rutland extern void *__user_addr_min, *__user_addr_max;
861d0b5a4SRusty Russell 
961d0b5a4SRusty Russell #define put_user(x, ptr)					\
1061d0b5a4SRusty Russell ({								\
1161d0b5a4SRusty Russell 	typeof(ptr) __pu_ptr = (ptr);				\
12*e9c4962cSShunsuke Mie 	__chk_user_ptr(__pu_ptr);				\
13ea9156fbSMark Rutland 	WRITE_ONCE(*(__pu_ptr), x);				\
1461d0b5a4SRusty Russell 	0;							\
1561d0b5a4SRusty Russell })
1661d0b5a4SRusty Russell 
1761d0b5a4SRusty Russell #define get_user(x, ptr)					\
1861d0b5a4SRusty Russell ({								\
1961d0b5a4SRusty Russell 	typeof(ptr) __pu_ptr = (ptr);				\
20*e9c4962cSShunsuke Mie 	__chk_user_ptr(__pu_ptr);				\
21ea9156fbSMark Rutland 	x = READ_ONCE(*(__pu_ptr));				\
2261d0b5a4SRusty Russell 	0;							\
2361d0b5a4SRusty Russell })
2461d0b5a4SRusty Russell 
volatile_memcpy(volatile char * to,const volatile char * from,unsigned long n)2561d0b5a4SRusty Russell static void volatile_memcpy(volatile char *to, const volatile char *from,
2661d0b5a4SRusty Russell 			    unsigned long n)
2761d0b5a4SRusty Russell {
2861d0b5a4SRusty Russell 	while (n--)
2961d0b5a4SRusty Russell 		*(to++) = *(from++);
3061d0b5a4SRusty Russell }
3161d0b5a4SRusty Russell 
copy_from_user(void * to,const void __user volatile * from,unsigned long n)3261d0b5a4SRusty Russell static inline int copy_from_user(void *to, const void __user volatile *from,
3361d0b5a4SRusty Russell 				 unsigned long n)
3461d0b5a4SRusty Russell {
3561d0b5a4SRusty Russell 	volatile_memcpy(to, from, n);
3661d0b5a4SRusty Russell 	return 0;
3761d0b5a4SRusty Russell }
3861d0b5a4SRusty Russell 
copy_to_user(void __user volatile * to,const void * from,unsigned long n)3961d0b5a4SRusty Russell static inline int copy_to_user(void __user volatile *to, const void *from,
4061d0b5a4SRusty Russell 			       unsigned long n)
4161d0b5a4SRusty Russell {
4261d0b5a4SRusty Russell 	volatile_memcpy(to, from, n);
4361d0b5a4SRusty Russell 	return 0;
4461d0b5a4SRusty Russell }
4561d0b5a4SRusty Russell #endif /* UACCESS_H */
46