xref: /openbsd-src/sys/dev/pci/drm/include/linux/uaccess.h (revision f21037fb31a97ab687fd459fba40bcca5336b831)
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