Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #ifndef __ASM_CSKY_UACCESS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #define __ASM_CSKY_UACCESS_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * User space memory access functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/version.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/segment.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) static inline int access_ok(const void *addr, unsigned long size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	unsigned long limit = current_thread_info()->addr_limit.seg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	return (((unsigned long)addr < limit) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 		((unsigned long)(addr + size) < limit));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #define __addr_ok(addr) (access_ok(addr, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) extern int __put_user_bad(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * Tell gcc we read from memory instead of writing: this is because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * we do not write to any memory gcc knows about, so there are no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  * aliasing issues.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * These are the main single-value transfer routines.  They automatically
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  * use the right size if we just have the right pointer type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40)  * This gets kind of ugly. We want to return _two_ values in "get_user()"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  * and yet we don't want to do any pointers, because that is too much
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * of a performance impact. Thus we have a few rather ugly macros here,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * and hide all the ugliness from the user.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45)  * The "__xxx" versions of the user access functions are versions that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)  * do not verify the address space, that must have been done previously
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47)  * with a separate "access_ok()" call (this is used when we do multiple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  * accesses to the same area of user memory).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  * As we use the same address space for kernel and user data on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * Ckcore, we can just do these as direct assignments.  (Of course, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  * exception handling means that it's no longer "just"...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #define put_user(x, ptr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	__put_user_check((x), (ptr), sizeof(*(ptr)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) #define __put_user(x, ptr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	__put_user_nocheck((x), (ptr), sizeof(*(ptr)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) #define __ptr(x) ((unsigned long *)(x))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define get_user(x, ptr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	__get_user_check((x), (ptr), sizeof(*(ptr)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) #define __get_user(x, ptr) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	__get_user_nocheck((x), (ptr), sizeof(*(ptr)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #define __put_user_nocheck(x, ptr, size)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) ({									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	long __pu_err = 0;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	typeof(*(ptr)) *__pu_addr = (ptr);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	typeof(*(ptr)) __pu_val = (typeof(*(ptr)))(x);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	if (__pu_addr)							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		__put_user_size(__pu_val, (__pu_addr), (size),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 				__pu_err);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	__pu_err;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) #define __put_user_check(x, ptr, size)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) ({									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	long __pu_err = -EFAULT;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	typeof(*(ptr)) *__pu_addr = (ptr);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	typeof(*(ptr)) __pu_val = (typeof(*(ptr)))(x);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	if (access_ok(__pu_addr, size) && __pu_addr)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		__put_user_size(__pu_val, __pu_addr, (size), __pu_err);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	__pu_err;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) #define __put_user_size(x, ptr, size, retval)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) do {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	retval = 0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	switch (size) {                                 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	case 1:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		__put_user_asm_b(x, ptr, retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	case 2:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		__put_user_asm_h(x, ptr, retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	case 4:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		__put_user_asm_w(x, ptr, retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	case 8:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 		__put_user_asm_64(x, ptr, retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	default:					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		__put_user_bad();			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	}	                                        \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)  * We don't tell gcc that we are accessing memory, but this is OK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)  * because we do not write to any memory gcc knows about, so there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)  * are no aliasing issues.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)  * Note that PC at a fault is the address *after* the faulting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)  * instruction.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define __put_user_asm_b(x, ptr, err)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) do {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	int errcode;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	asm volatile(					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	"1:     stb   %1, (%2,0)	\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	"       br    3f		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	"2:     mov   %0, %3		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	"       br    3f		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	".section __ex_table, \"a\"	\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	".align   2			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	".long    1b,2b			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	".previous			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	"3:				\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	: "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	: "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	: "memory");					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define __put_user_asm_h(x, ptr, err)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) do {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	int errcode;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	asm volatile(					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	"1:     sth   %1, (%2,0)	\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	"       br    3f		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	"2:     mov   %0, %3		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	"       br    3f		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	".section __ex_table, \"a\"	\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	".align   2			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	".long    1b,2b			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	".previous			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	"3:				\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	: "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	: "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	: "memory");					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define __put_user_asm_w(x, ptr, err)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) do {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	int errcode;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	asm volatile(					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	"1:     stw   %1, (%2,0)	\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	"       br    3f		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	"2:     mov   %0, %3		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	"       br    3f		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	".section __ex_table,\"a\"	\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	".align   2			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	".long    1b, 2b		\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	".previous			\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	"3:				\n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	: "=r"(err), "=r"(x), "=r"(ptr), "=r"(errcode)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	: "0"(err), "1"(x), "2"(ptr), "3"(-EFAULT)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	: "memory");					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define __put_user_asm_64(x, ptr, err)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	int tmp;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	int errcode;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	typeof(*(ptr))src = (typeof(*(ptr)))x;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	typeof(*(ptr))*psrc = &src;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	asm volatile(						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	"     ldw     %3, (%1, 0)     \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	"1:   stw     %3, (%2, 0)     \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	"     ldw     %3, (%1, 4)     \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	"2:   stw     %3, (%2, 4)     \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	"     br      4f              \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	"3:   mov     %0, %4          \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	"     br      4f              \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	".section __ex_table, \"a\"   \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	".align   2                   \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	".long    1b, 3b              \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	".long    2b, 3b              \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	".previous                    \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	"4:                           \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	: "=r"(err), "=r"(psrc), "=r"(ptr),			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	  "=r"(tmp), "=r"(errcode)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	: "0"(err), "1"(psrc), "2"(ptr), "3"(0), "4"(-EFAULT)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	: "memory");						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define __get_user_nocheck(x, ptr, size)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) ({								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	long  __gu_err;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	__get_user_size(x, (ptr), (size), __gu_err);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	__gu_err;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) #define __get_user_check(x, ptr, size)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) ({								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	int __gu_err = -EFAULT;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	const __typeof__(*(ptr)) __user *__gu_ptr = (ptr);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	if (access_ok(__gu_ptr, size) && __gu_ptr)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		__get_user_size(x, __gu_ptr, size, __gu_err);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	__gu_err;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define __get_user_size(x, ptr, size, retval)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	switch (size) {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	case 1:							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		__get_user_asm_common((x), ptr, "ldb", retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		break;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	case 2:							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		__get_user_asm_common((x), ptr, "ldh", retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		break;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	case 4:							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		__get_user_asm_common((x), ptr, "ldw", retval);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		break;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	default:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		x = 0;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		(retval) = __get_user_bad();			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #define __get_user_asm_common(x, ptr, ins, err)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) do {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	int errcode;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	asm volatile(						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	"1:   " ins " %1, (%4,0)	\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	"       br    3f		\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	/* Fix up codes */					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	"2:     mov   %0, %2		\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	"       movi  %1, 0		\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	"       br    3f		\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	".section __ex_table,\"a\"      \n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	".align   2			\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	".long    1b, 2b		\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	".previous			\n"			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	"3:				\n" 			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	: "=r"(err), "=r"(x), "=r"(errcode)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	: "0"(0), "r"(ptr), "2"(-EFAULT)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	: "memory");						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) extern int __get_user_bad(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define ___copy_to_user(to, from, n)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) do {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	int w0, w1, w2, w3;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	asm volatile(					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	"0:     cmpnei  %1, 0           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	"       bf      8f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	"       mov     %3, %1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	"       or      %3, %2          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	"       andi    %3, 3           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	"       cmpnei  %3, 0           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	"       bf      1f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	"       br      5f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	"1:     cmplti  %0, 16          \n" /* 4W */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	"       bt      3f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	"       ldw     %3, (%2, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	"       ldw     %4, (%2, 4)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	"       ldw     %5, (%2, 8)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	"       ldw     %6, (%2, 12)    \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	"2:     stw     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	"9:     stw     %4, (%1, 4)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	"10:    stw     %5, (%1, 8)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	"11:    stw     %6, (%1, 12)    \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	"       addi    %2, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	"       addi    %1, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	"       subi    %0, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	"       br      1b              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	"3:     cmplti  %0, 4           \n" /* 1W */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	"       bt      5f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	"       ldw     %3, (%2, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	"4:     stw     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	"       addi    %2, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	"       addi    %1, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	"       subi    %0, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	"       br      3b              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	"5:     cmpnei  %0, 0           \n"  /* 1B */   \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	"       bf      13f             \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	"       ldb     %3, (%2, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	"6:     stb     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	"       addi    %2,  1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	"       addi    %1,  1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	"       subi    %0,  1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	"       br      5b              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	"7:     subi	%0,  4          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	"8:     subi	%0,  4          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	"12:    subi	%0,  4          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	"       br      13f             \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	".section __ex_table, \"a\"     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	".align   2                     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	".long    2b, 13f               \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	".long    4b, 13f               \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	".long    6b, 13f               \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	".long    9b, 12b               \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	".long   10b, 8b                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	".long   11b, 7b                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	".previous                      \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	"13:                            \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	: "=r"(n), "=r"(to), "=r"(from), "=r"(w0),	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	  "=r"(w1), "=r"(w2), "=r"(w3)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	: "0"(n), "1"(to), "2"(from)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	: "memory");					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #define ___copy_from_user(to, from, n)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) do {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	int tmp;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	int nsave;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	asm volatile(					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	"0:     cmpnei  %1, 0           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	"       bf      7f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	"       mov     %3, %1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	"       or      %3, %2          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	"       andi    %3, 3           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	"       cmpnei  %3, 0           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	"       bf      1f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	"       br      5f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	"1:     cmplti  %0, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	"       bt      3f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	"2:     ldw     %3, (%2, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	"10:    ldw     %4, (%2, 4)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	"       stw     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	"       stw     %4, (%1, 4)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	"11:    ldw     %3, (%2, 8)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	"12:    ldw     %4, (%2, 12)    \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	"       stw     %3, (%1, 8)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	"       stw     %4, (%1, 12)    \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	"       addi    %2, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	"       addi    %1, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	"       subi    %0, 16          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	"       br      1b              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	"3:     cmplti  %0, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	"       bt      5f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	"4:     ldw     %3, (%2, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	"       stw     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 	"       addi    %2, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	"       addi    %1, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	"       subi    %0, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	"       br      3b              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	"5:     cmpnei  %0, 0           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	"       bf      7f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	"6:     ldb     %3, (%2, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	"       stb     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	"       addi    %2,  1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	"       addi    %1,  1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	"       subi    %0,  1          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	"       br      5b              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	"8:     stw     %3, (%1, 0)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	"       subi    %0, 4           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	"       bf      7f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	"9:     subi    %0, 8           \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	"       bf      7f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	"13:    stw     %3, (%1, 8)     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	"       subi    %0, 12          \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	"       bf      7f              \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	".section __ex_table, \"a\"     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	".align   2                     \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	".long    2b, 7f                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	".long    4b, 7f                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	".long    6b, 7f                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	".long   10b, 8b                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	".long   11b, 9b                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	".long   12b,13b                \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	".previous                      \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	"7:                             \n"		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	: "=r"(n), "=r"(to), "=r"(from), "=r"(nsave),	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	  "=r"(tmp)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	: "0"(n), "1"(to), "2"(from)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	: "memory");					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) unsigned long raw_copy_from_user(void *to, const void *from, unsigned long n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) unsigned long raw_copy_to_user(void *to, const void *from, unsigned long n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) unsigned long clear_user(void *to, unsigned long n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) unsigned long __clear_user(void __user *to, unsigned long n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) long strncpy_from_user(char *dst, const char *src, long count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) long __strncpy_from_user(char *dst, const char *src, long count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)  * Return the size of a string (including the ending 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)  * Return 0 on exception, a value greater than N if too long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) long strnlen_user(const char *src, long n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) #define strlen_user(str) strnlen_user(str, 32767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) struct exception_table_entry {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	unsigned long insn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	unsigned long nextinsn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) extern int fixup_exception(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) #endif /* __ASM_CSKY_UACCESS_H */