1*f21037fbSjsg /* $OpenBSD: uaccess.h,v 1.7 2022/02/01 04:09:14 jsg Exp $ */
27f4dd379Sjsg /*
37f4dd379Sjsg * Copyright (c) 2015 Mark Kettenis
47f4dd379Sjsg *
57f4dd379Sjsg * Permission to use, copy, modify, and distribute this software for any
67f4dd379Sjsg * purpose with or without fee is hereby granted, provided that the above
77f4dd379Sjsg * copyright notice and this permission notice appear in all copies.
87f4dd379Sjsg *
97f4dd379Sjsg * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
107f4dd379Sjsg * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
117f4dd379Sjsg * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
127f4dd379Sjsg * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
137f4dd379Sjsg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
147f4dd379Sjsg * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
157f4dd379Sjsg * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
167f4dd379Sjsg */
177f4dd379Sjsg
187f4dd379Sjsg #ifndef _LINUX_UACCESS_H
197f4dd379Sjsg #define _LINUX_UACCESS_H
207f4dd379Sjsg
2117bbd696Sjsg #include <sys/param.h>
227f4dd379Sjsg #include <sys/systm.h>
2317bbd696Sjsg #include <uvm/uvm_extern.h>
2417bbd696Sjsg
257f4dd379Sjsg #include <linux/sched.h>
267f4dd379Sjsg
277f4dd379Sjsg static inline unsigned long
__copy_to_user(void * to,const void * from,unsigned long len)28*f21037fbSjsg __copy_to_user(void *to, const void *from, unsigned long len)
297f4dd379Sjsg {
307f4dd379Sjsg if (copyout(from, to, len))
317f4dd379Sjsg return len;
327f4dd379Sjsg return 0;
337f4dd379Sjsg }
347f4dd379Sjsg
357f4dd379Sjsg static inline unsigned long
copy_to_user(void * to,const void * from,unsigned long len)36*f21037fbSjsg copy_to_user(void *to, const void *from, unsigned long len)
377f4dd379Sjsg {
387f4dd379Sjsg return __copy_to_user(to, from, len);
397f4dd379Sjsg }
407f4dd379Sjsg
417f4dd379Sjsg static inline unsigned long
__copy_from_user(void * to,const void * from,unsigned long len)42*f21037fbSjsg __copy_from_user(void *to, const void *from, unsigned long len)
437f4dd379Sjsg {
447f4dd379Sjsg if (copyin(from, to, len))
457f4dd379Sjsg return len;
467f4dd379Sjsg return 0;
477f4dd379Sjsg }
487f4dd379Sjsg
497f4dd379Sjsg static inline unsigned long
copy_from_user(void * to,const void * from,unsigned long len)50*f21037fbSjsg copy_from_user(void *to, const void *from, unsigned long len)
517f4dd379Sjsg {
527f4dd379Sjsg return __copy_from_user(to, from, len);
537f4dd379Sjsg }
547f4dd379Sjsg
557f4dd379Sjsg #define get_user(x, ptr) -copyin(ptr, &(x), sizeof(x))
567f4dd379Sjsg #define put_user(x, ptr) ({ \
577f4dd379Sjsg __typeof((x)) __tmp = (x); \
587f4dd379Sjsg -copyout(&(__tmp), ptr, sizeof(__tmp)); \
597f4dd379Sjsg })
607f4dd379Sjsg #define __get_user(x, ptr) get_user((x), (ptr))
617f4dd379Sjsg #define __put_user(x, ptr) put_user((x), (ptr))
627f4dd379Sjsg
637f4dd379Sjsg #define unsafe_put_user(x, ptr, err) ({ \
647f4dd379Sjsg __typeof((x)) __tmp = (x); \
657f4dd379Sjsg if (copyout(&(__tmp), ptr, sizeof(__tmp)) != 0) \
667f4dd379Sjsg goto err; \
677f4dd379Sjsg })
687f4dd379Sjsg
697f4dd379Sjsg static inline int
access_ok(const void * addr,unsigned long size)70c349dbc7Sjsg access_ok(const void *addr, unsigned long size)
717f4dd379Sjsg {
7217bbd696Sjsg vaddr_t startva = (vaddr_t)addr;
7317bbd696Sjsg vaddr_t endva = ((vaddr_t)addr) + size;
7417bbd696Sjsg return (startva >= VM_MIN_ADDRESS && endva >= VM_MIN_ADDRESS) &&
7517bbd696Sjsg (startva <= VM_MAXUSER_ADDRESS && endva <= VM_MAXUSER_ADDRESS);
767f4dd379Sjsg }
777f4dd379Sjsg
78c349dbc7Sjsg #define user_access_begin(addr, size) access_ok(addr, size)
79c349dbc7Sjsg #define user_access_end()
80c349dbc7Sjsg
81ad8b1aafSjsg #define user_write_access_begin(addr, size) access_ok(addr, size)
82ad8b1aafSjsg #define user_write_access_end()
83ad8b1aafSjsg
847f4dd379Sjsg #if defined(__i386__) || defined(__amd64__)
857f4dd379Sjsg
867f4dd379Sjsg static inline void
pagefault_disable(void)877f4dd379Sjsg pagefault_disable(void)
887f4dd379Sjsg {
8988125e6aSkettenis curcpu()->ci_inatomic++;
9088125e6aSkettenis KASSERT(curcpu()->ci_inatomic > 0);
917f4dd379Sjsg }
927f4dd379Sjsg
937f4dd379Sjsg static inline void
pagefault_enable(void)947f4dd379Sjsg pagefault_enable(void)
957f4dd379Sjsg {
9688125e6aSkettenis KASSERT(curcpu()->ci_inatomic > 0);
9788125e6aSkettenis curcpu()->ci_inatomic--;
987f4dd379Sjsg }
997f4dd379Sjsg
1007f4dd379Sjsg static inline int
pagefault_disabled(void)1017f4dd379Sjsg pagefault_disabled(void)
1027f4dd379Sjsg {
1037f4dd379Sjsg return curcpu()->ci_inatomic;
1047f4dd379Sjsg }
1057f4dd379Sjsg
1067f4dd379Sjsg static inline unsigned long
__copy_to_user_inatomic(void * to,const void * from,unsigned long len)107*f21037fbSjsg __copy_to_user_inatomic(void *to, const void *from, unsigned long len)
1087f4dd379Sjsg {
1097f4dd379Sjsg struct cpu_info *ci = curcpu();
1107f4dd379Sjsg int inatomic = ci->ci_inatomic;
1117f4dd379Sjsg int error;
1127f4dd379Sjsg
1137f4dd379Sjsg ci->ci_inatomic = 1;
1147f4dd379Sjsg error = copyout(from, to, len);
1157f4dd379Sjsg ci->ci_inatomic = inatomic;
1167f4dd379Sjsg
1177f4dd379Sjsg return (error ? len : 0);
1187f4dd379Sjsg }
1197f4dd379Sjsg
1207f4dd379Sjsg static inline unsigned long
__copy_from_user_inatomic(void * to,const void * from,unsigned long len)121*f21037fbSjsg __copy_from_user_inatomic(void *to, const void *from, unsigned long len)
1227f4dd379Sjsg {
1237f4dd379Sjsg struct cpu_info *ci = curcpu();
1247f4dd379Sjsg int inatomic = ci->ci_inatomic;
1257f4dd379Sjsg int error;
1267f4dd379Sjsg
1277f4dd379Sjsg ci->ci_inatomic = 1;
1287f4dd379Sjsg error = copyin(from, to, len);
1297f4dd379Sjsg ci->ci_inatomic = inatomic;
1307f4dd379Sjsg
1317f4dd379Sjsg return (error ? len : 0);
1327f4dd379Sjsg }
1337f4dd379Sjsg
1347f4dd379Sjsg static inline unsigned long
__copy_from_user_inatomic_nocache(void * to,const void * from,unsigned long len)135*f21037fbSjsg __copy_from_user_inatomic_nocache(void *to, const void *from, unsigned long len)
1367f4dd379Sjsg {
1377f4dd379Sjsg return __copy_from_user_inatomic(to, from, len);
1387f4dd379Sjsg }
1397f4dd379Sjsg
1407f4dd379Sjsg #endif /* defined(__i386__) || defined(__amd64__) */
1417f4dd379Sjsg
1427f4dd379Sjsg #endif
143