^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