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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 2009 PetaLogix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (C) 2007 LynuxWorks, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * License.  See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^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/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * int __strncpy_user(char *to, char *from, int len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *  -EFAULT  for an exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  *  len      if we hit the buffer limit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *  bytes copied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) .globl __strncpy_user;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) .type  __strncpy_user, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) .align 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) __strncpy_user:
^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) 	 * r5 - to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	 * r6 - from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	 * r7 - len
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	 * r3 - temp count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	 * r4 - temp val
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	beqid	r7,3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	addik	r3,r7,0		/* temp_count = len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	lbu	r4,r6,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	beqid	r4,2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	sb	r4,r5,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	addik	r5,r5,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	addik	r6,r6,1		/* delay slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	addik	r3,r3,-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	bnei	r3,1b		/* break on len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	rsubk	r3,r3,r7	/* temp_count = len - temp_count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	rtsd	r15,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	.size   __strncpy_user, . - __strncpy_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	.section	.fixup, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	.align	2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	brid	3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	addik	r3,r0, -EFAULT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	.section	__ex_table, "a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	.word	1b,4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)  * int __strnlen_user(char __user *str, int maxlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)  * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)  *  0 on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  *  maxlen + 1  if no NUL byte found within maxlen bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)  *  size of the string (including NUL byte)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) .globl __strnlen_user;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) .type  __strnlen_user, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) .align 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) __strnlen_user:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	beqid	r6,3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	addik	r3,r6,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	lbu	r4,r5,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	beqid	r4,2f		/* break on NUL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	addik	r3,r3,-1	/* delay slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	bneid	r3,1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	addik	r5,r5,1		/* delay slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	addik	r3,r3,-1	/* for break on len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	rsubk	r3,r3,r6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	rtsd	r15,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	.size   __strnlen_user, . - __strnlen_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	.section	.fixup,"ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	brid	3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	addk	r3,r0,r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	.section	__ex_table,"a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	.word	1b,4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) /* Loop unrolling for __copy_tofrom_user */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define COPY(offset)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 1:	lwi	r4 , r6, 0x0000 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 2:	lwi	r19, r6, 0x0004 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 3:	lwi	r20, r6, 0x0008 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 4:	lwi	r21, r6, 0x000C + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 5:	lwi	r22, r6, 0x0010 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 6:	lwi	r23, r6, 0x0014 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 7:	lwi	r24, r6, 0x0018 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 8:	lwi	r25, r6, 0x001C + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 9:	swi	r4 , r5, 0x0000 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 10:	swi	r19, r5, 0x0004 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 11:	swi	r20, r5, 0x0008 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 12:	swi	r21, r5, 0x000C + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 13:	swi	r22, r5, 0x0010 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 14:	swi	r23, r5, 0x0014 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 15:	swi	r24, r5, 0x0018 + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 16:	swi	r25, r5, 0x001C + offset;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	.section __ex_table,"a";		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	.word	1b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	.word	2b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	.word	3b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	.word	4b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	.word	5b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	.word	6b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	.word	7b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	.word	8b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	.word	9b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	.word	10b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	.word	11b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	.word	12b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	.word	13b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	.word	14b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	.word	15b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	.word	16b, 33f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define COPY_80(offset)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	COPY(0x00 + offset);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	COPY(0x20 + offset);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	COPY(0x40 + offset);\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	COPY(0x60 + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)  * int __copy_tofrom_user(char *to, char *from, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)  * Return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)  *   0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)  *   number of not copied bytes on error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .globl __copy_tofrom_user;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .type  __copy_tofrom_user, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .align 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) __copy_tofrom_user:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	 * r5 - to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	 * r6 - from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	 * r7, r3 - count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	 * r4 - tempval
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	beqid	r7, 0f /* zero size is not likely */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	or	r3, r5, r6 /* find if is any to/from unaligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	or	r3, r3, r7 /* find if count is unaligned */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	andi	r3, r3, 0x3 /* mask last 3 bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	bneid	r3, bu1 /* if r3 is not zero then byte copying */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	or	r3, r0, r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	rsubi	r3, r7, PAGE_SIZE /* detect PAGE_SIZE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	beqid	r3, page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	or	r3, r0, r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) w1:	lw	r4, r6, r3 /* at least one 4 byte copy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) w2:	sw	r4, r5, r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	addik	r7, r7, -4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	bneid	r7, w1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	addik	r3, r3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	addik	r3, r7, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	rtsd	r15, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	.section	__ex_table,"a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	.word	w1, 0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	.word	w2, 0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) .align 4 /* Alignment is important to keep icache happy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) page:	/* Create room on stack and save registers for storign values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	addik   r1, r1, -40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	swi	r5, r1, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	swi	r6, r1, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	swi	r7, r1, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	swi	r19, r1, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	swi	r20, r1, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	swi	r21, r1, 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	swi	r22, r1, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	swi	r23, r1, 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	swi	r24, r1, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	swi	r25, r1, 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) loop:	/* r4, r19, r20, r21, r22, r23, r24, r25 are used for storing values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	/* Loop unrolling to get performance boost */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	COPY_80(0x000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	COPY_80(0x080);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	COPY_80(0x100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	COPY_80(0x180);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	/* copy loop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	addik   r6, r6, 0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	addik   r7, r7, -0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	bneid   r7, loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	addik   r5, r5, 0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	/* Restore register content */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	lwi	r5, r1, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	lwi	r6, r1, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	lwi	r7, r1, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	lwi	r19, r1, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	lwi	r20, r1, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	lwi	r21, r1, 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	lwi	r22, r1, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	lwi	r23, r1, 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	lwi	r24, r1, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	lwi	r25, r1, 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	addik   r1, r1, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	/* return back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	addik	r3, r0, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	rtsd	r15, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) /* Fault case - return temp count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 33:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	addik	r3, r7, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	/* Restore register content */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	lwi	r5, r1, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	lwi	r6, r1, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	lwi	r7, r1, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	lwi	r19, r1, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	lwi	r20, r1, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	lwi	r21, r1, 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	lwi	r22, r1, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	lwi	r23, r1, 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	lwi	r24, r1, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	lwi	r25, r1, 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	addik   r1, r1, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	/* return back */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	rtsd	r15, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .align 4 /* Alignment is important to keep icache happy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) bu1:	lbu	r4,r6,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) bu2:	sb	r4,r5,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	addik	r7,r7,-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	bneid	r7,bu1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	addik	r3,r3,1		/* delay slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	addik	r3,r7,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	rtsd	r15,8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	.size   __copy_tofrom_user, . - __copy_tofrom_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	.section	__ex_table,"a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	.word	bu1, 0b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	.word	bu2, 0b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	.text