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/uaccess.h>
15 __generic_copy_to_user(void *to
, const void *from
, unsigned long n
)
17 if (access_ok(VERIFY_WRITE
, to
, n
))
18 __copy_user(to
, from
, n
);
23 __generic_copy_from_user(void *to
, const void *from
, unsigned long n
)
25 if (access_ok(VERIFY_READ
, from
, n
))
26 __copy_user_zeroing(to
, from
, n
);
33 * Copy a null terminated string from userspace.
35 #define __do_strncpy_from_user(dst, src, count, res) \
55 " .section .fixup,\"ax\"\n" \
60 " .section __ex_table,\"a\"\n" \
65 :"=&r"(res), "=r"(count), "=&r"(w) \
66 :"i"(-EFAULT), "1"(count), "a"(src), "a"(dst) \
71 __strncpy_from_user(char *dst
, const char *src
, long count
)
74 __do_strncpy_from_user(dst
, src
, count
, res
);
79 strncpy_from_user(char *dst
, const char *src
, long count
)
82 if (access_ok(VERIFY_READ
, src
, 1))
83 __do_strncpy_from_user(dst
, src
, count
, res
);
89 * Clear a userspace memory
91 #define __do_clear_user(addr, size) \
98 "0: movbu %1,(%3,%2)\n" \
105 ".section .fixup,\"ax\"\n" \
108 ".section __ex_table,\"a\"\n" \
112 : "+r"(size), "=&r"(w) \
113 : "a"(addr), "d"(0) \
118 __clear_user(void *to
, unsigned long n
)
120 __do_clear_user(to
, n
);
125 clear_user(void *to
, unsigned long n
)
127 if (access_ok(VERIFY_WRITE
, to
, n
))
128 __do_clear_user(to
, n
);
133 * Return the size of a string (including the ending 0)
135 * Return 0 on exception, a value greater than N if too long
137 long strnlen_user(const char *s
, long n
)
139 unsigned long res
, w
;
144 if (n
< 0 || n
+ (u_long
) s
> current_thread_info()->addr_limit
.seg
)
145 n
= current_thread_info()->addr_limit
.seg
- (u_long
)s
;
150 "1: movbu (%0,%3),%1\n"
157 ".section .fixup,\"ax\"\n"
160 ".section __ex_table,\"a\"\n"
165 :"0"(0), "a"(s
), "r"(n
)