Commit 053970542f049d3e30dc4be6eb19e92ff1f70f00

Authored by Markos Chandras
Committed by Ralf Baechle
1 parent 5cc494972a

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