blob: 1480f307a4749f69e1199da2c03c1b41410084d4 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef __H8300_UACCESS_H
2#define __H8300_UACCESS_H
3
4/*
5 * User space memory access functions
6 */
7#include <linux/sched.h>
8#include <linux/mm.h>
9#include <linux/string.h>
10
11#include <asm/segment.h>
12
13#define VERIFY_READ 0
14#define VERIFY_WRITE 1
15
16/* We let the MMU do all checking */
17#define access_ok(type, addr, size) __access_ok((unsigned long)addr,size)
18static inline int __access_ok(unsigned long addr, unsigned long size)
19{
20#define RANGE_CHECK_OK(addr, size, lower, upper) \
21 (((addr) >= (lower)) && (((addr) + (size)) < (upper)))
22
23 extern unsigned long _ramend;
24 return(RANGE_CHECK_OK(addr, size, 0L, (unsigned long)&_ramend));
25}
26
27/* this function will go away soon - use access_ok() instead */
28static inline int __deprecated verify_area(int type, const void *addr, unsigned long size)
29{
30 return access_ok(type,addr,size)?0:-EFAULT;
31}
32
33/*
34 * The exception table consists of pairs of addresses: the first is the
35 * address of an instruction that is allowed to fault, and the second is
36 * the address at which the program should continue. No registers are
37 * modified, so it is entirely up to the continuation code to figure out
38 * what to do.
39 *
40 * All the routines below use bits of fixup code that are out of line
41 * with the main instruction path. This means when everything is well,
42 * we don't even have to jump over them. Further, they do not intrude
43 * on our cache or tlb entries.
44 */
45
46struct exception_table_entry
47{
48 unsigned long insn, fixup;
49};
50
51/* Returns 0 if exception not found and fixup otherwise. */
52extern unsigned long search_exception_table(unsigned long);
53
54
55/*
56 * These are the main single-value transfer routines. They automatically
57 * use the right size if we just have the right pointer type.
58 */
59
60#define put_user(x, ptr) \
61({ \
62 int __pu_err = 0; \
63 typeof(*(ptr)) __pu_val = (x); \
64 switch (sizeof (*(ptr))) { \
65 case 1: \
66 case 2: \
67 case 4: \
68 *(ptr) = (__pu_val); \
69 break; \
70 case 8: \
71 memcpy(ptr, &__pu_val, sizeof (*(ptr))); \
72 break; \
73 default: \
74 __pu_err = __put_user_bad(); \
75 break; \
76 } \
77 __pu_err; \
78})
79#define __put_user(x, ptr) put_user(x, ptr)
80
81extern int __put_user_bad(void);
82
83/*
84 * Tell gcc we read from memory instead of writing: this is because
85 * we do not write to any memory gcc knows about, so there are no
86 * aliasing issues.
87 */
88
89#define __ptr(x) ((unsigned long *)(x))
90
91/*
92 * Tell gcc we read from memory instead of writing: this is because
93 * we do not write to any memory gcc knows about, so there are no
94 * aliasing issues.
95 */
96
97#define get_user(x, ptr) \
98({ \
99 int __gu_err = 0; \
100 typeof(*(ptr)) __gu_val = 0; \
101 switch (sizeof(*(ptr))) { \
102 case 1: \
103 case 2: \
104 case 4: \
105 __gu_val = *(ptr); \
106 break; \
107 case 8: \
108 memcpy(&__gu_val, ptr, sizeof (*(ptr))); \
109 break; \
110 default: \
111 __gu_val = 0; \
112 __gu_err = __get_user_bad(); \
113 break; \
114 } \
115 (x) = __gu_val; \
116 __gu_err; \
117})
118#define __get_user(x, ptr) get_user(x, ptr)
119
120extern int __get_user_bad(void);
121
122#define copy_from_user(to, from, n) (memcpy(to, from, n), 0)
123#define copy_to_user(to, from, n) (memcpy(to, from, n), 0)
124
125#define __copy_from_user(to, from, n) copy_from_user(to, from, n)
126#define __copy_to_user(to, from, n) copy_to_user(to, from, n)
127#define __copy_to_user_inatomic __copy_to_user
128#define __copy_from_user_inatomic __copy_from_user
129
130#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
131
132#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
133
134/*
135 * Copy a null terminated string from userspace.
136 */
137
138static inline long
139strncpy_from_user(char *dst, const char *src, long count)
140{
141 char *tmp;
142 strncpy(dst, src, count);
143 for (tmp = dst; *tmp && count > 0; tmp++, count--)
144 ;
145 return(tmp - dst); /* DAVIDM should we count a NUL ? check getname */
146}
147
148/*
149 * Return the size of a string (including the ending 0)
150 *
151 * Return 0 on exception, a value greater than N if too long
152 */
153static inline long strnlen_user(const char *src, long n)
154{
155 return(strlen(src) + 1); /* DAVIDM make safer */
156}
157
158#define strlen_user(str) strnlen_user(str, 32767)
159
160/*
161 * Zero Userspace
162 */
163
164static inline unsigned long
165clear_user(void *to, unsigned long n)
166{
167 memset(to, 0, n);
168 return 0;
169}
170
171#endif /* _H8300_UACCESS_H */