1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /*
- * Copy to/from userspace with optional address space checking.
- *
- * Copyright 2004-2006 Atmel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
- #include <asm/page.h>
- #include <asm/thread_info.h>
- #include <asm/processor.h>
- #include <asm/asm.h>
- .text
- .align 1
- .global strnlen_user
- .type strnlen_user, "function"
- strnlen_user:
- branch_if_kernel r8, __strnlen_user
- sub r8, r11, 1
- add r8, r12
- retcs 0
- brmi adjust_length /* do a closer inspection */
- .global __strnlen_user
- .type __strnlen_user, "function"
- __strnlen_user:
- mov r10, r12
- 10: ld.ub r8, r12++
- cp.w r8, 0
- breq 2f
- sub r11, 1
- brne 10b
- sub r12, -1
- 2: sub r12, r10
- retal r12
- .type adjust_length, "function"
- adjust_length:
- cp.w r12, 0 /* addr must always be < TASK_SIZE */
- retmi 0
- pushm lr
- lddpc lr, _task_size
- sub r11, lr, r12
- mov r9, r11
- call __strnlen_user
- cp.w r12, r9
- brgt 1f
- popm pc
- 1: popm pc, r12=0
- .align 2
- _task_size:
- .long TASK_SIZE
- .section .fixup, "ax"
- .align 1
- 19: retal 0
- .section __ex_table, "a"
- .align 2
- .long 10b, 19b
|