Commit 053970542f049d3e30dc4be6eb19e92ff1f70f00
Committed by
Ralf Baechle
1 parent
5cc494972a
Exists in
master
and in
13 other branches
MIPS: lib: strlen_user: Add EVA support
In non-EVA mode, strlen_user* aliases are used for the strlen_kernel* symbols since the code is identical. In EVA mode, new strlen_user* symbols are used which use the EVA specific instructions to load values from userspace. Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Showing 2 changed files with 24 additions and 0 deletions Side-by-side Diff
arch/mips/kernel/mips_ksyms.c
... | ... | @@ -20,6 +20,8 @@ |
20 | 20 | const char *__from, long __len); |
21 | 21 | extern long __strncpy_from_user_asm(char *__to, const char *__from, |
22 | 22 | long __len); |
23 | +extern long __strlen_kernel_nocheck_asm(const char *s); | |
24 | +extern long __strlen_kernel_asm(const char *s); | |
23 | 25 | extern long __strlen_user_nocheck_asm(const char *s); |
24 | 26 | extern long __strlen_user_asm(const char *s); |
25 | 27 | extern long __strnlen_kernel_nocheck_asm(const char *s); |
... | ... | @@ -48,6 +50,8 @@ |
48 | 50 | EXPORT_SYMBOL(__bzero); |
49 | 51 | EXPORT_SYMBOL(__strncpy_from_user_nocheck_asm); |
50 | 52 | EXPORT_SYMBOL(__strncpy_from_user_asm); |
53 | +EXPORT_SYMBOL(__strlen_kernel_nocheck_asm); | |
54 | +EXPORT_SYMBOL(__strlen_kernel_asm); | |
51 | 55 | EXPORT_SYMBOL(__strlen_user_nocheck_asm); |
52 | 56 | EXPORT_SYMBOL(__strlen_user_asm); |
53 | 57 | EXPORT_SYMBOL(__strnlen_kernel_nocheck_asm); |
arch/mips/lib/strlen_user.S
... | ... | @@ -30,7 +30,11 @@ |
30 | 30 | |
31 | 31 | FEXPORT(__strlen_\func\()_nocheck_asm) |
32 | 32 | move v0, a0 |
33 | +.ifeqs "\func", "kernel" | |
33 | 34 | 1: EX(lbu, v1, (v0), .Lfault\@) |
35 | +.else | |
36 | +1: EX(lbue, v1, (v0), .Lfault\@) | |
37 | +.endif | |
34 | 38 | PTR_ADDIU v0, 1 |
35 | 39 | bnez v1, 1b |
36 | 40 | PTR_SUBU v0, a0 |
37 | 41 | |
... | ... | @@ -41,5 +45,21 @@ |
41 | 45 | jr ra |
42 | 46 | .endm |
43 | 47 | |
48 | +#ifndef CONFIG_EVA | |
49 | + /* Set aliases */ | |
50 | + .global __strlen_user_asm | |
51 | + .global __strlen_user_nocheck_asm | |
52 | + .set __strlen_user_asm, __strlen_kernel_asm | |
53 | + .set __strlen_user_nocheck_asm, __strlen_kernel_nocheck_asm | |
54 | +#endif | |
55 | + | |
56 | +__BUILD_STRLEN_ASM kernel | |
57 | + | |
58 | +#ifdef CONFIG_EVA | |
59 | + | |
60 | + .set push | |
61 | + .set eva | |
44 | 62 | __BUILD_STRLEN_ASM user |
63 | + .set pop | |
64 | +#endif |