123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- * Copyright (C) 2009 Michal Simek <monstr@monstr.eu>
- * Copyright (C) 2009 PetaLogix
- * Copyright (C) 2007 LynuxWorks, Inc.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
- * for more details.
- */
- #include <linux/errno.h>
- #include <linux/linkage.h>
- /*
- * int __strncpy_user(char *to, char *from, int len);
- *
- * Returns:
- * -EFAULT for an exception
- * len if we hit the buffer limit
- * bytes copied
- */
- .text
- .globl __strncpy_user;
- .align 4;
- __strncpy_user:
- /*
- * r5 - to
- * r6 - from
- * r7 - len
- * r3 - temp count
- * r4 - temp val
- */
- addik r3,r7,0 /* temp_count = len */
- beqi r3,3f
- 1:
- lbu r4,r6,r0
- sb r4,r5,r0
- addik r3,r3,-1
- beqi r3,2f /* break on len */
- addik r5,r5,1
- bneid r4,1b
- addik r6,r6,1 /* delay slot */
- addik r3,r3,1 /* undo "temp_count--" */
- 2:
- rsubk r3,r3,r7 /* temp_count = len - temp_count */
- 3:
- rtsd r15,8
- nop
- .section .fixup, "ax"
- .align 2
- 4:
- brid 3b
- addik r3,r0, -EFAULT
- .section __ex_table, "a"
- .word 1b,4b
- /*
- * int __strnlen_user(char __user *str, int maxlen);
- *
- * Returns:
- * 0 on error
- * maxlen + 1 if no NUL byte found within maxlen bytes
- * size of the string (including NUL byte)
- */
- .text
- .globl __strnlen_user;
- .align 4;
- __strnlen_user:
- addik r3,r6,0
- beqi r3,3f
- 1:
- lbu r4,r5,r0
- beqid r4,2f /* break on NUL */
- addik r3,r3,-1 /* delay slot */
- bneid r3,1b
- addik r5,r5,1 /* delay slot */
- addik r3,r3,-1 /* for break on len */
- 2:
- rsubk r3,r3,r6
- 3:
- rtsd r15,8
- nop
- .section .fixup,"ax"
- 4:
- brid 3b
- addk r3,r0,r0
- .section __ex_table,"a"
- .word 1b,4b
- /*
- * int __copy_tofrom_user(char *to, char *from, int len)
- * Return:
- * 0 on success
- * number of not copied bytes on error
- */
- .text
- .globl __copy_tofrom_user;
- .align 4;
- __copy_tofrom_user:
- /*
- * r5 - to
- * r6 - from
- * r7, r3 - count
- * r4 - tempval
- */
- addik r3,r7,0
- beqi r3,3f
- 1:
- lbu r4,r6,r0
- addik r6,r6,1
- 2:
- sb r4,r5,r0
- addik r3,r3,-1
- bneid r3,1b
- addik r5,r5,1 /* delay slot */
- 3:
- rtsd r15,8
- nop
- .section __ex_table,"a"
- .word 1b,3b,2b,3b
|