diff options
author | Jonas Bonn <jonas@southpole.se> | 2012-05-25 02:24:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-25 11:17:43 -0400 |
commit | 603d6637aeb9a14cd0087d7c24c3777bfa51fcbf (patch) | |
tree | 8b86e31d3d0a9d88b12629c27d2607d6e1420ac8 /arch | |
parent | ece78b7df734726e790dcab207f463401ff80440 (diff) |
openrisc: use generic strncpy_from_user
As per commits 2922585b9329 ("lib: Sparc's strncpy_from_user is generic
enough, move under lib/") and 92ae03f2ef99 ("x86: merge 32/64-bit
versions of 'strncpy_from_user()' and speed it up"), and corresponding
discussion on linux-arch.
Signed-off-by: Jonas Bonn <jonas@southpole.se>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/openrisc/Kconfig | 1 | ||||
-rw-r--r-- | arch/openrisc/include/asm/uaccess.h | 10 | ||||
-rw-r--r-- | arch/openrisc/lib/string.S | 52 |
3 files changed, 4 insertions, 59 deletions
diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig index 4932247d078a..065623215c58 100644 --- a/arch/openrisc/Kconfig +++ b/arch/openrisc/Kconfig | |||
@@ -19,6 +19,7 @@ config OPENRISC | |||
19 | select GENERIC_CPU_DEVICES | 19 | select GENERIC_CPU_DEVICES |
20 | select GENERIC_ATOMIC64 | 20 | select GENERIC_ATOMIC64 |
21 | select GENERIC_CLOCKEVENTS | 21 | select GENERIC_CLOCKEVENTS |
22 | select GENERIC_STRNCPY_FROM_USER | ||
22 | 23 | ||
23 | config MMU | 24 | config MMU |
24 | def_bool y | 25 | def_bool y |
diff --git a/arch/openrisc/include/asm/uaccess.h b/arch/openrisc/include/asm/uaccess.h index f5abaa0ffc38..04b93de92636 100644 --- a/arch/openrisc/include/asm/uaccess.h +++ b/arch/openrisc/include/asm/uaccess.h | |||
@@ -313,14 +313,10 @@ clear_user(void *addr, unsigned long size) | |||
313 | return size; | 313 | return size; |
314 | } | 314 | } |
315 | 315 | ||
316 | extern int __strncpy_from_user(char *dst, const char *src, long count); | 316 | #define user_addr_max() \ |
317 | (segment_eq(get_fs(), USER_DS) ? TASK_SIZE : ~0UL) | ||
317 | 318 | ||
318 | static inline long strncpy_from_user(char *dst, const char *src, long count) | 319 | extern long strncpy_from_user(char *dest, const char __user *src, long count); |
319 | { | ||
320 | if (access_ok(VERIFY_READ, src, 1)) | ||
321 | return __strncpy_from_user(dst, src, count); | ||
322 | return -EFAULT; | ||
323 | } | ||
324 | 320 | ||
325 | /* | 321 | /* |
326 | * Return the size of a string (including the ending 0) | 322 | * Return the size of a string (including the ending 0) |
diff --git a/arch/openrisc/lib/string.S b/arch/openrisc/lib/string.S index 465f04bc7deb..8ceb11ebafb9 100644 --- a/arch/openrisc/lib/string.S +++ b/arch/openrisc/lib/string.S | |||
@@ -104,58 +104,6 @@ __clear_user: | |||
104 | .long 9b, 99b // write fault | 104 | .long 9b, 99b // write fault |
105 | .previous | 105 | .previous |
106 | 106 | ||
107 | /* | ||
108 | * long strncpy_from_user(char *dst, const char *src, long count) | ||
109 | * | ||
110 | * | ||
111 | */ | ||
112 | .global __strncpy_from_user | ||
113 | __strncpy_from_user: | ||
114 | l.addi r1,r1,-16 | ||
115 | l.sw 0(r1),r6 | ||
116 | l.sw 4(r1),r5 | ||
117 | l.sw 8(r1),r4 | ||
118 | l.sw 12(r1),r3 | ||
119 | |||
120 | l.addi r11,r5,0 | ||
121 | 2: l.sfeq r5,r0 | ||
122 | l.bf 1f | ||
123 | l.addi r5,r5,-1 | ||
124 | 8: l.lbz r6,0(r4) | ||
125 | l.sfeq r6,r0 | ||
126 | l.bf 1f | ||
127 | 9: l.sb 0(r3),r6 | ||
128 | l.addi r3,r3,1 | ||
129 | l.j 2b | ||
130 | l.addi r4,r4,1 | ||
131 | 1: | ||
132 | l.lwz r6,0(r1) | ||
133 | l.addi r5,r5,1 | ||
134 | l.sub r11,r11,r5 // r11 holds the return value | ||
135 | |||
136 | l.lwz r6,0(r1) | ||
137 | l.lwz r5,4(r1) | ||
138 | l.lwz r4,8(r1) | ||
139 | l.lwz r3,12(r1) | ||
140 | l.jr r9 | ||
141 | l.addi r1,r1,16 | ||
142 | |||
143 | .section .fixup, "ax" | ||
144 | 99: | ||
145 | l.movhi r11,hi(-EFAULT) | ||
146 | l.ori r11,r11,lo(-EFAULT) | ||
147 | |||
148 | l.lwz r6,0(r1) | ||
149 | l.lwz r5,4(r1) | ||
150 | l.lwz r4,8(r1) | ||
151 | l.lwz r3,12(r1) | ||
152 | l.jr r9 | ||
153 | l.addi r1,r1,16 | ||
154 | .previous | ||
155 | |||
156 | .section __ex_table, "a" | ||
157 | .long 8b, 99b // read fault | ||
158 | .previous | ||
159 | 107 | ||
160 | /* | 108 | /* |
161 | * extern int __strnlen_user(const char *str, long len, unsigned long top); | 109 | * extern int __strnlen_user(const char *str, long len, unsigned long top); |