Linux-2.6.12-rc2
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / asm-h8300 / uaccess.h
1 #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)
18 static 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 */
28 static 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
46 struct exception_table_entry
47 {
48 unsigned long insn, fixup;
49 };
50
51 /* Returns 0 if exception not found and fixup otherwise. */
52 extern 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
81 extern 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
120 extern 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
138 static inline long
139 strncpy_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 */
153 static 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
164 static inline unsigned long
165 clear_user(void *to, unsigned long n)
166 {
167 memset(to, 0, n);
168 return 0;
169 }
170
171 #endif /* _H8300_UACCESS_H */