80 #ifdef CONFIG_NSC |
80 #ifdef CONFIG_NSC |
81 #define access_ok(type, addr, size) (1) |
81 #define access_ok(type, addr, size) (1) |
82 #else |
82 #else |
83 #define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) |
83 #define access_ok(type, addr, size) (likely(__range_not_ok(addr, size) == 0)) |
84 #endif |
84 #endif |
|
85 |
85 /* |
86 /* |
86 * The exception table consists of pairs of addresses: the first is the |
87 * The exception table consists of pairs of addresses: the first is the |
87 * address of an instruction that is allowed to fault, and the second is |
88 * address of an instruction that is allowed to fault, and the second is |
88 * the address at which the program should continue. No registers are |
89 * the address at which the program should continue. No registers are |
89 * modified, so it is entirely up to the continuation code to figure out |
90 * modified, so it is entirely up to the continuation code to figure out |
161 #define get_user(x, ptr) \ |
162 #define get_user(x, ptr) \ |
162 ({ \ |
163 ({ \ |
163 int __ret_gu; \ |
164 int __ret_gu; \ |
164 unsigned long __val_gu; \ |
165 unsigned long __val_gu; \ |
165 __chk_user_ptr(ptr); \ |
166 __chk_user_ptr(ptr); \ |
|
167 might_fault(); \ |
166 switch (sizeof(*(ptr))) { \ |
168 switch (sizeof(*(ptr))) { \ |
167 case 1: \ |
169 case 1: \ |
168 __get_user_x(1, __ret_gu, __val_gu, ptr); \ |
170 __get_user_x(1, __ret_gu, __val_gu, ptr); \ |
169 break; \ |
171 break; \ |
170 case 2: \ |
172 case 2: \ |
181 break; \ |
183 break; \ |
182 } \ |
184 } \ |
183 (x) = (__typeof__(*(ptr)))__val_gu; \ |
185 (x) = (__typeof__(*(ptr)))__val_gu; \ |
184 __ret_gu; \ |
186 __ret_gu; \ |
185 }) |
187 }) |
186 #endif |
188 #endif /* NSC */ |
187 |
189 |
188 #define __put_user_x(size, x, ptr, __ret_pu) \ |
190 #define __put_user_x(size, x, ptr, __ret_pu) \ |
189 asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ |
191 asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ |
190 :"0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") |
192 :"0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") |
191 |
193 |
241 * @ptr must have pointer-to-simple-variable type, and @x must be assignable |
243 * @ptr must have pointer-to-simple-variable type, and @x must be assignable |
242 * to the result of dereferencing @ptr. |
244 * to the result of dereferencing @ptr. |
243 * |
245 * |
244 * Returns zero on success, or -EFAULT on error. |
246 * Returns zero on success, or -EFAULT on error. |
245 */ |
247 */ |
246 |
|
247 #ifdef CONFIG_NSC |
248 #ifdef CONFIG_NSC |
248 #define put_user(x,ptr) ({ *(ptr) = x; 0;}) |
249 #define put_user(x,ptr) ({ *(ptr) = x; 0;}) |
249 #else |
250 #else |
250 #define put_user(x, ptr) \ |
251 #define put_user(x, ptr) \ |
251 ({ \ |
252 ({ \ |
252 int __ret_pu; \ |
253 int __ret_pu; \ |
253 __typeof__(*(ptr)) __pu_val; \ |
254 __typeof__(*(ptr)) __pu_val; \ |
254 __chk_user_ptr(ptr); \ |
255 __chk_user_ptr(ptr); \ |
|
256 might_fault(); \ |
255 __pu_val = x; \ |
257 __pu_val = x; \ |
256 switch (sizeof(*(ptr))) { \ |
258 switch (sizeof(*(ptr))) { \ |
257 case 1: \ |
259 case 1: \ |
258 __put_user_x(1, __pu_val, ptr, __ret_pu); \ |
260 __put_user_x(1, __pu_val, ptr, __ret_pu); \ |
259 break; \ |
261 break; \ |
270 __put_user_x(X, __pu_val, ptr, __ret_pu); \ |
272 __put_user_x(X, __pu_val, ptr, __ret_pu); \ |
271 break; \ |
273 break; \ |
272 } \ |
274 } \ |
273 __ret_pu; \ |
275 __ret_pu; \ |
274 }) |
276 }) |
275 #endif |
277 #endif /* NSC */ |
276 |
278 |
277 #define __put_user_size(x, ptr, size, retval, errret) \ |
279 #define __put_user_size(x, ptr, size, retval, errret) \ |
278 do { \ |
280 do { \ |
279 retval = 0; \ |
281 retval = 0; \ |
280 __chk_user_ptr(ptr); \ |
282 __chk_user_ptr(ptr); \ |
360 : "=r" (err), ltype(x) \ |
362 : "=r" (err), ltype(x) \ |
361 : "m" (__m(addr)), "i" (errret), "0" (err)) |
363 : "m" (__m(addr)), "i" (errret), "0" (err)) |
362 |
364 |
363 #define __put_user_nocheck(x, ptr, size) \ |
365 #define __put_user_nocheck(x, ptr, size) \ |
364 ({ \ |
366 ({ \ |
365 long __pu_err; \ |
367 int __pu_err; \ |
366 __put_user_size((x), (ptr), (size), __pu_err, -EFAULT); \ |
368 __put_user_size((x), (ptr), (size), __pu_err, -EFAULT); \ |
367 __pu_err; \ |
369 __pu_err; \ |
368 }) |
370 }) |
369 |
371 |
370 #define __get_user_nocheck(x, ptr, size) \ |
372 #define __get_user_nocheck(x, ptr, size) \ |
371 ({ \ |
373 ({ \ |
372 long __gu_err; \ |
374 int __gu_err; \ |
373 unsigned long __gu_val; \ |
375 unsigned long __gu_val; \ |
374 __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ |
376 __get_user_size(__gu_val, (ptr), (size), __gu_err, -EFAULT); \ |
375 (x) = (__force __typeof__(*(ptr)))__gu_val; \ |
377 (x) = (__force __typeof__(*(ptr)))__gu_val; \ |
376 __gu_err; \ |
378 __gu_err; \ |
377 }) |
379 }) |