arch/x86/include/asm/uaccess.h
changeset 2 d1f6d8b6f81c
parent 0 aa628870c1d3
equal deleted inserted replaced
1:0056487c491e 2:d1f6d8b6f81c
    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 })