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