1 /* MN10300 Userspace accessor functions
3 * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd.
4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public Licence
9 * as published by the Free Software Foundation; either version
10 * 2 of the Licence, or (at your option) any later version.
12 #include <linux/string.h>
13 #include <linux/uaccess.h>
16 __generic_copy_to_user(void *to, const void *from, unsigned long n)
18 if (access_ok(VERIFY_WRITE, to, n))
19 __copy_user(to, from, n);
24 __generic_copy_from_user(void *to, const void *from, unsigned long n)
26 if (access_ok(VERIFY_READ, from, n))
27 __copy_user_zeroing(to, from, n);
34 * Copy a null terminated string from userspace.
36 #define __do_strncpy_from_user(dst, src, count, res) \
56 " .section .fixup,\"ax\"\n" \
61 " .section __ex_table,\"a\"\n" \
66 :"=&r"(res), "=r"(count), "=&r"(w) \
67 :"i"(-EFAULT), "1"(count), "a"(src), "a"(dst) \
72 __strncpy_from_user(char *dst, const char *src, long count)
75 __do_strncpy_from_user(dst, src, count, res);
80 strncpy_from_user(char *dst, const char *src, long count)
83 if (access_ok(VERIFY_READ, src, 1))
84 __do_strncpy_from_user(dst, src, count, res);
90 * Clear a userspace memory
92 #define __do_clear_user(addr, size) \
99 "0: movbu %1,(%3,%2)\n" \
106 ".section .fixup,\"ax\"\n" \
109 ".section __ex_table,\"a\"\n" \
113 : "+r"(size), "=&r"(w) \
114 : "a"(addr), "d"(0) \
119 __clear_user(void *to, unsigned long n)
121 __do_clear_user(to, n);
126 clear_user(void *to, unsigned long n)
128 if (access_ok(VERIFY_WRITE, to, n))
129 __do_clear_user(to, n);
134 * Return the size of a string (including the ending 0)
136 * Return 0 on exception, a value greater than N if too long
138 long strnlen_user(const char *s, long n)
140 unsigned long res, w;
145 if (n < 0 || n + (u_long) s > current_thread_info()->addr_limit.seg)
146 n = current_thread_info()->addr_limit.seg - (u_long)s;
151 "1: movbu (%0,%3),%1\n"
158 ".section .fixup,\"ax\"\n"
161 ".section __ex_table,\"a\"\n"
166 :"0"(0), "a"(s), "r"(n)