Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | |
3 | * License. See the file "COPYING" in the main directory of this archive | |
4 | * for more details. | |
5 | * | |
b1bac373 SH |
6 | * Copyright (C) 1996, 1998, 1999, 2004 by Ralf Baechle |
7 | * Copyright (C) 1999 Silicon Graphics, Inc. | |
8 | * Copyright (C) 2011 MIPS Technologies, Inc. | |
1da177e4 LT |
9 | */ |
10 | #include <asm/asm.h> | |
048eb582 | 11 | #include <asm/asm-offsets.h> |
1da177e4 LT |
12 | #include <asm/regdef.h> |
13 | ||
14 | #define EX(insn,reg,addr,handler) \ | |
15 | 9: insn reg, addr; \ | |
16 | .section __ex_table,"a"; \ | |
17 | PTR 9b, handler; \ | |
18 | .previous | |
19 | ||
20 | /* | |
21 | * Return the size of a string (including the ending 0) | |
22 | * | |
23 | * Return 0 for error | |
24 | */ | |
5cc49497 MC |
25 | .macro __BUILD_STRLEN_ASM func |
26 | LEAF(__strlen_\func\()_asm) | |
1da177e4 LT |
27 | LONG_L v0, TI_ADDR_LIMIT($28) # pointer ok? |
28 | and v0, a0 | |
5cc49497 | 29 | bnez v0, .Lfault\@ |
1da177e4 | 30 | |
1da177e4 | 31 | move v0, a0 |
05397054 | 32 | .ifeqs "\func", "kernel" |
5cc49497 | 33 | 1: EX(lbu, v1, (v0), .Lfault\@) |
05397054 MC |
34 | .else |
35 | 1: EX(lbue, v1, (v0), .Lfault\@) | |
36 | .endif | |
1da177e4 | 37 | PTR_ADDIU v0, 1 |
b1bac373 | 38 | bnez v1, 1b |
1da177e4 LT |
39 | PTR_SUBU v0, a0 |
40 | jr ra | |
5cc49497 | 41 | END(__strlen_\func\()_asm) |
1da177e4 | 42 | |
5cc49497 | 43 | .Lfault\@: move v0, zero |
1da177e4 | 44 | jr ra |
5cc49497 MC |
45 | .endm |
46 | ||
05397054 MC |
47 | #ifndef CONFIG_EVA |
48 | /* Set aliases */ | |
49 | .global __strlen_user_asm | |
05397054 | 50 | .set __strlen_user_asm, __strlen_kernel_asm |
05397054 MC |
51 | #endif |
52 | ||
53 | __BUILD_STRLEN_ASM kernel | |
54 | ||
55 | #ifdef CONFIG_EVA | |
56 | ||
57 | .set push | |
58 | .set eva | |
5cc49497 | 59 | __BUILD_STRLEN_ASM user |
05397054 MC |
60 | .set pop |
61 | #endif |