2 * User address space access functions.
3 * The non inlined parts of asm-i386/uaccess.h are here.
5 * Copyright 1997 Andi Kleen <ak@muc.de>
6 * Copyright 1997 Linus Torvalds
8 #include <linux/config.h>
10 #include <linux/highmem.h>
11 #include <linux/blkdev.h>
12 #include <linux/module.h>
13 #include <asm/uaccess.h>
16 static inline int __movsl_is_ok(unsigned long a1
, unsigned long a2
, unsigned long n
)
18 #ifdef CONFIG_X86_INTEL_USERCOPY
19 if (n
>= 64 && ((a1
^ a2
) & movsl_mask
.mask
))
24 #define movsl_is_ok(a1,a2,n) \
25 __movsl_is_ok((unsigned long)(a1),(unsigned long)(a2),(n))
28 * Copy a null terminated string from userspace.
31 #define __do_strncpy_from_user(dst,src,count,res) \
33 int __d0, __d1, __d2; \
35 __asm__ __volatile__( \
40 " testb %%al,%%al\n" \
46 ".section .fixup,\"ax\"\n" \
50 ".section __ex_table,\"a\"\n" \
54 : "=d"(res), "=c"(count), "=&a" (__d0), "=&S" (__d1), \
56 : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
61 * __strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking.
62 * @dst: Destination address, in kernel space. This buffer must be at
63 * least @count bytes long.
64 * @src: Source address, in user space.
65 * @count: Maximum number of bytes to copy, including the trailing NUL.
67 * Copies a NUL-terminated string from userspace to kernel space.
68 * Caller must check the specified block with access_ok() before calling
71 * On success, returns the length of the string (not including the trailing
74 * If access to userspace fails, returns -EFAULT (some data may have been
77 * If @count is smaller than the length of the string, copies @count bytes
81 __strncpy_from_user(char *dst
, const char __user
*src
, long count
)
84 __do_strncpy_from_user(dst
, src
, count
, res
);
89 * strncpy_from_user: - Copy a NUL terminated string from userspace.
90 * @dst: Destination address, in kernel space. This buffer must be at
91 * least @count bytes long.
92 * @src: Source address, in user space.
93 * @count: Maximum number of bytes to copy, including the trailing NUL.
95 * Copies a NUL-terminated string from userspace to kernel space.
97 * On success, returns the length of the string (not including the trailing
100 * If access to userspace fails, returns -EFAULT (some data may have been
103 * If @count is smaller than the length of the string, copies @count bytes
104 * and returns @count.
107 strncpy_from_user(char *dst
, const char __user
*src
, long count
)
110 if (access_ok(VERIFY_READ
, src
, 1))
111 __do_strncpy_from_user(dst
, src
, count
, res
);
120 #define __do_clear_user(addr,size) \
124 __asm__ __volatile__( \
129 ".section .fixup,\"ax\"\n" \
130 "3: lea 0(%2,%0,4),%0\n" \
133 ".section __ex_table,\"a\"\n" \
138 : "=&c"(size), "=&D" (__d0) \
139 : "r"(size & 3), "0"(size / 4), "1"(addr), "a"(0)); \
143 * clear_user: - Zero a block of memory in user space.
144 * @to: Destination address, in user space.
145 * @n: Number of bytes to zero.
147 * Zero a block of memory in user space.
149 * Returns number of bytes that could not be cleared.
150 * On success, this will be zero.
153 clear_user(void __user
*to
, unsigned long n
)
156 if (access_ok(VERIFY_WRITE
, to
, n
))
157 __do_clear_user(to
, n
);
162 * __clear_user: - Zero a block of memory in user space, with less checking.
163 * @to: Destination address, in user space.
164 * @n: Number of bytes to zero.
166 * Zero a block of memory in user space. Caller must check
167 * the specified block with access_ok() before calling this function.
169 * Returns number of bytes that could not be cleared.
170 * On success, this will be zero.
173 __clear_user(void __user
*to
, unsigned long n
)
175 __do_clear_user(to
, n
);
180 * strlen_user: - Get the size of a string in user space.
181 * @s: The string to measure.
182 * @n: The maximum valid length
184 * Get the size of a NUL-terminated string in user space.
186 * Returns the size of the string INCLUDING the terminating NUL.
187 * On exception, returns 0.
188 * If the string is too long, returns a value greater than @n.
190 long strnlen_user(const char __user
*s
, long n
)
192 unsigned long mask
= -__addr_ok(s
);
193 unsigned long res
, tmp
;
197 __asm__
__volatile__(
206 ".section .fixup,\"ax\"\n"
207 "2: xorl %%eax,%%eax\n"
212 ".section __ex_table,\"a\"\n"
216 :"=r" (n
), "=D" (s
), "=a" (res
), "=c" (tmp
)
217 :"0" (n
), "1" (s
), "2" (0), "3" (mask
)
222 #ifdef CONFIG_X86_INTEL_USERCOPY
224 __copy_user_intel(void __user
*to
, const void *from
, unsigned long size
)
227 __asm__
__volatile__(
229 "1: movl 32(%4), %%eax\n"
232 "2: movl 64(%4), %%eax\n"
234 "3: movl 0(%4), %%eax\n"
235 "4: movl 4(%4), %%edx\n"
236 "5: movl %%eax, 0(%3)\n"
237 "6: movl %%edx, 4(%3)\n"
238 "7: movl 8(%4), %%eax\n"
239 "8: movl 12(%4),%%edx\n"
240 "9: movl %%eax, 8(%3)\n"
241 "10: movl %%edx, 12(%3)\n"
242 "11: movl 16(%4), %%eax\n"
243 "12: movl 20(%4), %%edx\n"
244 "13: movl %%eax, 16(%3)\n"
245 "14: movl %%edx, 20(%3)\n"
246 "15: movl 24(%4), %%eax\n"
247 "16: movl 28(%4), %%edx\n"
248 "17: movl %%eax, 24(%3)\n"
249 "18: movl %%edx, 28(%3)\n"
250 "19: movl 32(%4), %%eax\n"
251 "20: movl 36(%4), %%edx\n"
252 "21: movl %%eax, 32(%3)\n"
253 "22: movl %%edx, 36(%3)\n"
254 "23: movl 40(%4), %%eax\n"
255 "24: movl 44(%4), %%edx\n"
256 "25: movl %%eax, 40(%3)\n"
257 "26: movl %%edx, 44(%3)\n"
258 "27: movl 48(%4), %%eax\n"
259 "28: movl 52(%4), %%edx\n"
260 "29: movl %%eax, 48(%3)\n"
261 "30: movl %%edx, 52(%3)\n"
262 "31: movl 56(%4), %%eax\n"
263 "32: movl 60(%4), %%edx\n"
264 "33: movl %%eax, 56(%3)\n"
265 "34: movl %%edx, 60(%3)\n"
271 "35: movl %0, %%eax\n"
276 "36: movl %%eax, %0\n"
279 ".section .fixup,\"ax\"\n"
280 "101: lea 0(%%eax,%0,4),%0\n"
283 ".section __ex_table,\"a\"\n"
324 : "=&c"(size
), "=&D" (d0
), "=&S" (d1
)
325 : "1"(to
), "2"(from
), "0"(size
)
326 : "eax", "edx", "memory");
331 __copy_user_zeroing_intel(void *to
, const void __user
*from
, unsigned long size
)
334 __asm__
__volatile__(
336 "0: movl 32(%4), %%eax\n"
339 "1: movl 64(%4), %%eax\n"
341 "2: movl 0(%4), %%eax\n"
342 "21: movl 4(%4), %%edx\n"
343 " movl %%eax, 0(%3)\n"
344 " movl %%edx, 4(%3)\n"
345 "3: movl 8(%4), %%eax\n"
346 "31: movl 12(%4),%%edx\n"
347 " movl %%eax, 8(%3)\n"
348 " movl %%edx, 12(%3)\n"
349 "4: movl 16(%4), %%eax\n"
350 "41: movl 20(%4), %%edx\n"
351 " movl %%eax, 16(%3)\n"
352 " movl %%edx, 20(%3)\n"
353 "10: movl 24(%4), %%eax\n"
354 "51: movl 28(%4), %%edx\n"
355 " movl %%eax, 24(%3)\n"
356 " movl %%edx, 28(%3)\n"
357 "11: movl 32(%4), %%eax\n"
358 "61: movl 36(%4), %%edx\n"
359 " movl %%eax, 32(%3)\n"
360 " movl %%edx, 36(%3)\n"
361 "12: movl 40(%4), %%eax\n"
362 "71: movl 44(%4), %%edx\n"
363 " movl %%eax, 40(%3)\n"
364 " movl %%edx, 44(%3)\n"
365 "13: movl 48(%4), %%eax\n"
366 "81: movl 52(%4), %%edx\n"
367 " movl %%eax, 48(%3)\n"
368 " movl %%edx, 52(%3)\n"
369 "14: movl 56(%4), %%eax\n"
370 "91: movl 60(%4), %%edx\n"
371 " movl %%eax, 56(%3)\n"
372 " movl %%edx, 60(%3)\n"
378 "5: movl %0, %%eax\n"
386 ".section .fixup,\"ax\"\n"
387 "9: lea 0(%%eax,%0,4),%0\n"
390 " xorl %%eax,%%eax\n"
396 ".section __ex_table,\"a\"\n"
419 : "=&c"(size
), "=&D" (d0
), "=&S" (d1
)
420 : "1"(to
), "2"(from
), "0"(size
)
421 : "eax", "edx", "memory");
426 * Leave these declared but undefined. They should not be any references to
430 __copy_user_zeroing_intel(void *to
, const void __user
*from
, unsigned long size
);
432 __copy_user_intel(void __user
*to
, const void *from
, unsigned long size
);
433 #endif /* CONFIG_X86_INTEL_USERCOPY */
435 /* Generic arbitrary sized copy. */
436 #define __copy_user(to,from,size) \
438 int __d0, __d1, __d2; \
439 __asm__ __volatile__( \
455 ".section .fixup,\"ax\"\n" \
458 "3: lea 0(%3,%0,4),%0\n" \
461 ".section __ex_table,\"a\"\n" \
467 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \
468 : "3"(size), "0"(size), "1"(to), "2"(from) \
472 #define __copy_user_zeroing(to,from,size) \
474 int __d0, __d1, __d2; \
475 __asm__ __volatile__( \
491 ".section .fixup,\"ax\"\n" \
494 "3: lea 0(%3,%0,4),%0\n" \
497 " xorl %%eax,%%eax\n" \
503 ".section __ex_table,\"a\"\n" \
509 : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2) \
510 : "3"(size), "0"(size), "1"(to), "2"(from) \
515 unsigned long __copy_to_user_ll(void __user
*to
, const void *from
, unsigned long n
)
517 BUG_ON((long) n
< 0);
518 #ifndef CONFIG_X86_WP_WORKS_OK
519 if (unlikely(boot_cpu_data
.wp_works_ok
== 0) &&
520 ((unsigned long )to
) < TASK_SIZE
) {
522 * CPU does not honor the WP bit when writing
523 * from supervisory mode, and due to preemption or SMP,
524 * the page tables can change at any time.
525 * Do it manually. Manfred <manfred@colorfullife.com>
528 unsigned long offset
= ((unsigned long)to
)%PAGE_SIZE
;
529 unsigned long len
= PAGE_SIZE
- offset
;
538 down_read(¤t
->mm
->mmap_sem
);
539 retval
= get_user_pages(current
, current
->mm
,
540 (unsigned long )to
, 1, 1, 0, &pg
, NULL
);
542 if (retval
== -ENOMEM
&& current
->pid
== 1) {
543 up_read(¤t
->mm
->mmap_sem
);
544 blk_congestion_wait(WRITE
, HZ
/50);
549 up_read(¤t
->mm
->mmap_sem
);
553 maddr
= kmap_atomic(pg
, KM_USER0
);
554 memcpy(maddr
+ offset
, from
, len
);
555 kunmap_atomic(maddr
, KM_USER0
);
556 set_page_dirty_lock(pg
);
558 up_read(¤t
->mm
->mmap_sem
);
567 if (movsl_is_ok(to
, from
, n
))
568 __copy_user(to
, from
, n
);
570 n
= __copy_user_intel(to
, from
, n
);
575 __copy_from_user_ll(void *to
, const void __user
*from
, unsigned long n
)
578 if (movsl_is_ok(to
, from
, n
))
579 __copy_user_zeroing(to
, from
, n
);
581 n
= __copy_user_zeroing_intel(to
, from
, n
);
586 * copy_to_user: - Copy a block of data into user space.
587 * @to: Destination address, in user space.
588 * @from: Source address, in kernel space.
589 * @n: Number of bytes to copy.
591 * Context: User context only. This function may sleep.
593 * Copy data from kernel space to user space.
595 * Returns number of bytes that could not be copied.
596 * On success, this will be zero.
599 copy_to_user(void __user
*to
, const void *from
, unsigned long n
)
602 BUG_ON((long) n
< 0);
603 if (access_ok(VERIFY_WRITE
, to
, n
))
604 n
= __copy_to_user(to
, from
, n
);
607 EXPORT_SYMBOL(copy_to_user
);
610 * copy_from_user: - Copy a block of data from user space.
611 * @to: Destination address, in kernel space.
612 * @from: Source address, in user space.
613 * @n: Number of bytes to copy.
615 * Context: User context only. This function may sleep.
617 * Copy data from user space to kernel space.
619 * Returns number of bytes that could not be copied.
620 * On success, this will be zero.
622 * If some data could not be copied, this function will pad the copied
623 * data to the requested size using zero bytes.
626 copy_from_user(void *to
, const void __user
*from
, unsigned long n
)
629 BUG_ON((long) n
< 0);
630 if (access_ok(VERIFY_READ
, from
, n
))
631 n
= __copy_from_user(to
, from
, n
);
636 EXPORT_SYMBOL(copy_from_user
);