| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | 
							- /*
 
-  *  arch/arm/include/asm/uaccess.h
 
-  *
 
-  * This program is free software; you can redistribute it and/or modify
 
-  * it under the terms of the GNU General Public License version 2 as
 
-  * published by the Free Software Foundation.
 
-  */
 
- #ifndef _ASMARM_UACCESS_H
 
- #define _ASMARM_UACCESS_H
 
- /*
 
-  * User space memory access functions
 
-  */
 
- #include <linux/string.h>
 
- #include <linux/thread_info.h>
 
- #include <asm/errno.h>
 
- #include <asm/memory.h>
 
- #include <asm/domain.h>
 
- #include <asm/unified.h>
 
- #include <asm/compiler.h>
 
- #define VERIFY_READ 0
 
- #define VERIFY_WRITE 1
 
- /*
 
-  * The exception table consists of pairs of addresses: the first is the
 
-  * address of an instruction that is allowed to fault, and the second is
 
-  * the address at which the program should continue.  No registers are
 
-  * modified, so it is entirely up to the continuation code to figure out
 
-  * what to do.
 
-  *
 
-  * All the routines below use bits of fixup code that are out of line
 
-  * with the main instruction path.  This means when everything is well,
 
-  * we don't even have to jump over them.  Further, they do not intrude
 
-  * on our cache or tlb entries.
 
-  */
 
- struct exception_table_entry
 
- {
 
- 	unsigned long insn, fixup;
 
- };
 
- extern int fixup_exception(struct pt_regs *regs);
 
- /*
 
-  * These two are intentionally not defined anywhere - if the kernel
 
-  * code generates any references to them, that's a bug.
 
-  */
 
- extern int __get_user_bad(void);
 
- extern int __put_user_bad(void);
 
- /*
 
-  * Note that this is actually 0x1,0000,0000
 
-  */
 
- #define KERNEL_DS	0x00000000
 
- #define get_ds()	(KERNEL_DS)
 
- #ifdef CONFIG_MMU
 
- #define USER_DS		TASK_SIZE
 
- #define get_fs()	(current_thread_info()->addr_limit)
 
- static inline void set_fs(mm_segment_t fs)
 
- {
 
- 	current_thread_info()->addr_limit = fs;
 
- 	modify_domain(DOMAIN_KERNEL, fs ? DOMAIN_CLIENT : DOMAIN_MANAGER);
 
- }
 
- #define segment_eq(a,b)	((a) == (b))
 
- #define __addr_ok(addr) ({ \
 
- 	unsigned long flag; \
 
- 	__asm__("cmp %2, %0; movlo %0, #0" \
 
- 		: "=&r" (flag) \
 
- 		: "0" (current_thread_info()->addr_limit), "r" (addr) \
 
- 		: "cc"); \
 
- 	(flag == 0); })
 
- /* We use 33-bit arithmetic here... */
 
- #define __range_ok(addr,size) ({ \
 
- 	unsigned long flag, roksum; \
 
- 	__chk_user_ptr(addr);	\
 
- 	__asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
 
- 		: "=&r" (flag), "=&r" (roksum) \
 
- 		: "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
 
- 		: "cc"); \
 
- 	flag; })
 
- /*
 
-  * Single-value transfer routines.  They automatically use the right
 
-  * size if we just have the right pointer type.  Note that the functions
 
-  * which read from user space (*get_*) need to take care not to leak
 
-  * kernel data even if the calling code is buggy and fails to check
 
-  * the return value.  This means zeroing out the destination variable
 
-  * or buffer on error.  Normally this is done out of line by the
 
-  * fixup code, but there are a few places where it intrudes on the
 
-  * main code path.  When we only write to user space, there is no
 
-  * problem.
 
-  */
 
- extern int __get_user_1(void *);
 
- extern int __get_user_2(void *);
 
- extern int __get_user_4(void *);
 
- #define __GUP_CLOBBER_1	"lr", "cc"
 
- #ifdef CONFIG_CPU_USE_DOMAINS
 
- #define __GUP_CLOBBER_2	"ip", "lr", "cc"
 
- #else
 
- #define __GUP_CLOBBER_2 "lr", "cc"
 
- #endif
 
- #define __GUP_CLOBBER_4	"lr", "cc"
 
- #define __get_user_x(__r2,__p,__e,__l,__s)				\
 
- 	   __asm__ __volatile__ (					\
 
- 		__asmeq("%0", "r0") __asmeq("%1", "r2")			\
 
- 		__asmeq("%3", "r1")					\
 
 
  |