aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-03-12 00:15:31 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-03-12 00:15:31 +0000
commitee53d3b8685245febda44ac761877871ec4cd0f4 (patch)
tree67e5392c3f16c0716b3ca8356cd93cd244b58d4b /xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h
parent7c2ffc6c5043e0a49fbe1b81f9da465ec68a9e64 (diff)
downloadxen-ee53d3b8685245febda44ac761877871ec4cd0f4.tar.gz
xen-ee53d3b8685245febda44ac761877871ec4cd0f4.tar.bz2
xen-ee53d3b8685245febda44ac761877871ec4cd0f4.zip
bitkeeper revision 1.122.1.5 (3e6e7c23wQxW8Ugs0UKsqigrHkcXQg)
mkbuildtree: new file .del-hypervisor-ifs~86b59453fcfcbc0d: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs .del-usercopy.c~a4e3819a4723317b: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/usercopy.c .del-sys_i386.c~ad2d4399a2d28db9: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/sys_i386.c .del-strstr.c~a59de40cfa231931: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/strstr.c .del-semaphore.c~e68c48eef7115b45: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c .del-pageattr.c~f12f3a2d4d9a5533: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/pageattr.c .del-old-checksum.c~f071ac0bcd5b2d9a: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/old-checksum.c .del-mmx.c~c322b85572d0e637: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/mmx.c .del-memcpy.c~40a930c62e045f5: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/memcpy.c .del-iodebug.c~23f7b78313546ddc: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/iodebug.c .del-getuser.S~b9140bdb7786f6dc: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/getuser.S .del-extable.c~d3064107fd4524e5: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/extable.c .del-dec_and_lock.c~702a868529eefccf: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/dec_and_lock.c .del-checksum.S~a821c465832e250c: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/checksum.S .del-xor.h~998f147781a971b7: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/xor.h .del-vga.h~45c4f65abf0d3704: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/vga.h .del-user.h~dd2c2e4cf89a81: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/user.h .del-unistd.h~33920ed4177b943c: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/unistd.h .del-unaligned.h~535ed3d510980f67: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/unaligned.h .del-ucontext.h~217079ee95a5eb94: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ucontext.h .del-uaccess.h~3681b94ef8d5a0f4: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h .del-types.h~c4fb05b781c9652c: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/types.h .del-tlb.h~6ad1bd639fc9d921: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/tlb.h .del-timex.h~51d9b0c83c732bcc: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/timex.h .del-termios.h~ccfbd8bcc37ae57d: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/termios.h .del-termbits.h~438385b2cd8fd6b0: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/termbits.h .del-string.h~673ad5d9e7f34adc: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/string.h .del-string-486.h~365fff788bc1adf5: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/string-486.h .del-statfs.h~65d9b1d7c4114f2e: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/statfs.h .del-stat.h~c1aa8136a8e00c11: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/stat.h .del-spinlock.h~ec9397b86265414c: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/spinlock.h .del-softirq.h~587d767979e60f4a: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/softirq.h .del-sockios.h~30f6e946644b28a4: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sockios.h .del-socket.h~4b1ff6de54a2e75: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/socket.h .del-smplock.h~d5ea37028dfc0796: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/smplock.h .del-signal.h~bff6ca682e48d282: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/signal.h .del-siginfo.h~6e147c4b81453d48: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/siginfo.h .del-sigcontext.h~15a1460eea0fc80d: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sigcontext.h .del-shmparam.h~97d1aa6d272dd55c: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/shmparam.h .del-shmbuf.h~d92a8c2e377edd83: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/shmbuf.h .del-setup.h~4250896c3e302c1d: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/setup.h .del-serial.h~584ec6aaea6b0efc: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/serial.h .del-sembuf.h~4fc6c36d718bc878: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sembuf.h .del-semaphore.h~90a0e3df1d186e71: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/semaphore.h .del-ptrace.c~5c3f8d1f817aa462: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/ptrace.c .del-init_task.c~319ec38b798d3c7c: Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/init_task.c .del-scatterlist.h~1988430d982706fb: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/scatterlist.h .del-rwsem.h~548d272fd25fd023: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/rwsem.h .del-rwlock.h~75a3e9a0d5b70d88: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/rwlock.h .del-resource.h~4ac2e8ff9316f133: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/resource.h .del-posix_types.h~14d068cffd4b8776: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/posix_types.h .del-poll.h~15c1158844d735b: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/poll.h .del-parport.h~ce6ec6eea26a26f: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/parport.h .del-param.h~1fcb86dbbfaae433: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/param.h .del-namei.h~f25c9c58c76cddf4: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/namei.h .del-mtrr.h~375ef594799aeb34: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mtrr.h .del-msr.h~cbf3b3e52c9bed91: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/msr.h .del-msgbuf.h~ab21bfe6a970c7d6: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/msgbuf.h .del-mpspec.h~9a3c3e9cda38bf43: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mpspec.h .del-module.h~e271946131c6cf33: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/module.h .del-mmx.h~bc63c7c24adb85ea: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mmx.h .del-mman.h~43ec3a0326f0d774: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mman.h .del-mca_dma.h~a4e495084d965428: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mca_dma.h .del-mc146818rtc.h~d7e968dbd77bc13a: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mc146818rtc.h .del-math_emu.h~fba78190435e5abd: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/math_emu.h .del-locks.h~e022163a8c6f92: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/locks.h .del-linux_logo.h~2034953cfe415a: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/linux_logo.h .del-ldt.h~191ca1efbffba82a: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ldt.h .del-kmap_types.h~517fab0f9758f3b: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/kmap_types.h .del-keyboard.h~b2a7fe4183f53eb0: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/keyboard.h .del-ipcbuf.h~cee91af271f4ead9: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ipcbuf.h .del-ipc.h~f6063a09bec6a01e: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ipc.h .del-ioctls.h~cc185671abf46a0a: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ioctls.h .del-ioctl.h~8603eb7a7f9acbad: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ioctl.h .del-io_apic.h~9f66b09afe289021: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/io_apic.h .del-init.h~9d30d474b845bc1: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/init.h .del-ide.h~805c47c1a5ebf196: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ide.h .del-i387.h~3b360e96fea6fe7: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/i387.h .del-hdreg.h~c4bbd6ffab3763d6: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hdreg.h .del-hardirq.h~9b375250fe601395: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hardirq.h .del-floppy.h~d6f10807cbe15906: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/floppy.h .del-fcntl.h~ee3e644a21150dde: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/fcntl.h .del-errno.h~bab55cfe5c4ff883: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/errno.h .del-elf.h~af645629b45e7fe7: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/elf.h .del-dma.h~938dff3f930de2e4: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/dma.h .del-div64.h~aa6562c04bfaf412: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/div64.h .del-delay.h~e3ba89df403d5622: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/delay.h .del-debugreg.h~b3975b26e222b6c3: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/debugreg.h .del-current.h~800e8314ee81c074: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/current.h .del-cpufeature.h~89666e396b49acdd: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/cpufeature.h .del-checksum.h~82af6c19c8cc4ff3: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/checksum.h .del-cache.h~694ef1ffd8450db4: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/cache.h .del-byteorder.h~f14ceb3575444d8a: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/byteorder.h .del-boot.h~83206c92a8649e3f: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/boot.h .del-bitops.h~e3c609f48d6cdb91: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/bitops.h .del-atomic.h~328669154749bfad: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/atomic.h .del-apicdef.h~2f13a4cfaa79d855: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/apicdef.h .del-apic.h~2690e76edadb6a8: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/apic.h .del-a.out.h~b638f33fa82e889d: Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/a.out.h
Diffstat (limited to 'xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h')
-rw-r--r--xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h606
1 files changed, 0 insertions, 606 deletions
diff --git a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h b/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h
deleted file mode 100644
index ecc6693352..0000000000
--- a/xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h
+++ /dev/null
@@ -1,606 +0,0 @@
-#ifndef __i386_UACCESS_H
-#define __i386_UACCESS_H
-
-/*
- * User space memory access functions
- */
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/prefetch.h>
-#include <asm/page.h>
-
-#define VERIFY_READ 0
-#define VERIFY_WRITE 1
-
-/*
- * The fs value determines whether argument validity checking should be
- * performed or not. If get_fs() == USER_DS, checking is performed, with
- * get_fs() == KERNEL_DS, checking is bypassed.
- *
- * For historical reasons, these macros are grossly misnamed.
- */
-
-#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
-
-
-#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)
-#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)
-
-#define get_ds() (KERNEL_DS)
-#define get_fs() (current->addr_limit)
-#define set_fs(x) (current->addr_limit = (x))
-
-#define segment_eq(a,b) ((a).seg == (b).seg)
-
-extern int __verify_write(const void *, unsigned long);
-
-#define __addr_ok(addr) ((unsigned long)(addr) < (current->addr_limit.seg))
-
-/*
- * Uhhuh, this needs 33-bit arithmetic. We have a carry..
- */
-#define __range_ok(addr,size) ({ \
- unsigned long flag,sum; \
- asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \
- :"=&r" (flag), "=r" (sum) \
- :"1" (addr),"g" ((int)(size)),"g" (current->addr_limit.seg)); \
- flag; })
-
-#ifdef CONFIG_X86_WP_WORKS_OK
-
-#define access_ok(type,addr,size) (__range_ok(addr,size) == 0)
-
-#else
-
-#define access_ok(type,addr,size) ( (__range_ok(addr,size) == 0) && \
- ((type) == VERIFY_READ || boot_cpu_data.wp_works_ok || \
- segment_eq(get_fs(),KERNEL_DS) || \
- __verify_write((void *)(addr),(size))))
-
-#endif
-
-static inline int verify_area(int type, const void * addr, unsigned long size)
-{
- return access_ok(type,addr,size) ? 0 : -EFAULT;
-}
-
-
-/*
- * 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;
-};
-
-/* Returns 0 if exception not found and fixup otherwise. */
-extern unsigned long search_exception_table(unsigned long);
-
-
-/*
- * These are the main single-value transfer routines. They automatically
- * use the right size if we just have the right pointer type.
- *
- * This gets kind of ugly. We want to return _two_ values in "get_user()"
- * and yet we don't want to do any pointers, because that is too much
- * of a performance impact. Thus we have a few rather ugly macros here,
- * and hide all the uglyness from the user.
- *
- * The "__xxx" versions of the user access functions are versions that
- * do not verify the address space, that must have been done previously
- * with a separate "access_ok()" call (this is used when we do multiple
- * accesses to the same area of user memory).
- */
-
-extern void __get_user_1(void);
-extern void __get_user_2(void);
-extern void __get_user_4(void);
-
-#define __get_user_x(size,ret,x,ptr) \
- __asm__ __volatile__("call __get_user_" #size \
- :"=a" (ret),"=d" (x) \
- :"0" (ptr))
-
-/* Careful: we have to cast the result to the type of the pointer for sign reasons */
-#define get_user(x,ptr) \
-({ int __ret_gu,__val_gu; \
- switch(sizeof (*(ptr))) { \
- case 1: __get_user_x(1,__ret_gu,__val_gu,ptr); break; \
- case 2: __get_user_x(2,__ret_gu,__val_gu,ptr); break; \
- case 4: __get_user_x(4,__ret_gu,__val_gu,ptr); break; \
- default: __get_user_x(X,__ret_gu,__val_gu,ptr); break; \
- } \
- (x) = (__typeof__(*(ptr)))__val_gu; \
- __ret_gu; \
-})
-
-extern void __put_user_1(void);
-extern void __put_user_2(void);
-extern void __put_user_4(void);
-extern void __put_user_8(void);
-
-extern void __put_user_bad(void);
-
-#define put_user(x,ptr) \
- __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-
-#define __get_user(x,ptr) \
- __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
-#define __put_user(x,ptr) \
- __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr)))
-
-#define __put_user_nocheck(x,ptr,size) \
-({ \
- long __pu_err; \
- __put_user_size((x),(ptr),(size),__pu_err); \
- __pu_err; \
-})
-
-
-#define __put_user_check(x,ptr,size) \
-({ \
- long __pu_err = -EFAULT; \
- __typeof__(*(ptr)) *__pu_addr = (ptr); \
- if (access_ok(VERIFY_WRITE,__pu_addr,size)) \
- __put_user_size((x),__pu_addr,(size),__pu_err); \
- __pu_err; \
-})
-
-#define __put_user_u64(x, addr, err) \
- __asm__ __volatile__( \
- "1: movl %%eax,0(%2)\n" \
- "2: movl %%edx,4(%2)\n" \
- "3:\n" \
- ".section .fixup,\"ax\"\n" \
- "4: movl %3,%0\n" \
- " jmp 3b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 1b,4b\n" \
- " .long 2b,4b\n" \
- ".previous" \
- : "=r"(err) \
- : "A" (x), "r" (addr), "i"(-EFAULT), "0"(err))
-
-#define __put_user_size(x,ptr,size,retval) \
-do { \
- retval = 0; \
- switch (size) { \
- case 1: __put_user_asm(x,ptr,retval,"b","b","iq"); break; \
- case 2: __put_user_asm(x,ptr,retval,"w","w","ir"); break; \
- case 4: __put_user_asm(x,ptr,retval,"l","","ir"); break; \
- case 8: __put_user_u64(x,ptr,retval); break; \
- default: __put_user_bad(); \
- } \
-} while (0)
-
-struct __large_struct { unsigned long buf[100]; };
-#define __m(x) (*(struct __large_struct *)(x))
-
-/*
- * Tell gcc we read from memory instead of writing: this is because
- * we do not write to any memory gcc knows about, so there are no
- * aliasing issues.
- */
-#define __put_user_asm(x, addr, err, itype, rtype, ltype) \
- __asm__ __volatile__( \
- "1: mov"itype" %"rtype"1,%2\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: movl %3,%0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 1b,3b\n" \
- ".previous" \
- : "=r"(err) \
- : ltype (x), "m"(__m(addr)), "i"(-EFAULT), "0"(err))
-
-
-#define __get_user_nocheck(x,ptr,size) \
-({ \
- long __gu_err, __gu_val; \
- __get_user_size(__gu_val,(ptr),(size),__gu_err); \
- (x) = (__typeof__(*(ptr)))__gu_val; \
- __gu_err; \
-})
-
-extern long __get_user_bad(void);
-
-#define __get_user_size(x,ptr,size,retval) \
-do { \
- retval = 0; \
- switch (size) { \
- case 1: __get_user_asm(x,ptr,retval,"b","b","=q"); break; \
- case 2: __get_user_asm(x,ptr,retval,"w","w","=r"); break; \
- case 4: __get_user_asm(x,ptr,retval,"l","","=r"); break; \
- default: (x) = __get_user_bad(); \
- } \
-} while (0)
-
-#define __get_user_asm(x, addr, err, itype, rtype, ltype) \
- __asm__ __volatile__( \
- "1: mov"itype" %2,%"rtype"1\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: movl %3,%0\n" \
- " xor"itype" %"rtype"1,%"rtype"1\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 1b,3b\n" \
- ".previous" \
- : "=r"(err), ltype (x) \
- : "m"(__m(addr)), "i"(-EFAULT), "0"(err))
-
-
-/*
- * Copy To/From Userspace
- */
-
-/* Generic arbitrary sized copy. */
-#define __copy_user(to,from,size) \
-do { \
- int __d0, __d1; \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- " movl %3,%0\n" \
- "1: rep; movsb\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: lea 0(%3,%0,4),%0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,3b\n" \
- " .long 1b,2b\n" \
- ".previous" \
- : "=&c"(size), "=&D" (__d0), "=&S" (__d1) \
- : "r"(size & 3), "0"(size / 4), "1"(to), "2"(from) \
- : "memory"); \
-} while (0)
-
-#define __copy_user_zeroing(to,from,size) \
-do { \
- int __d0, __d1; \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- " movl %3,%0\n" \
- "1: rep; movsb\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: lea 0(%3,%0,4),%0\n" \
- "4: pushl %0\n" \
- " pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " rep; stosb\n" \
- " popl %%eax\n" \
- " popl %0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,3b\n" \
- " .long 1b,4b\n" \
- ".previous" \
- : "=&c"(size), "=&D" (__d0), "=&S" (__d1) \
- : "r"(size & 3), "0"(size / 4), "1"(to), "2"(from) \
- : "memory"); \
-} while (0)
-
-/* We let the __ versions of copy_from/to_user inline, because they're often
- * used in fast paths and have only a small space overhead.
- */
-static inline unsigned long
-__generic_copy_from_user_nocheck(void *to, const void *from, unsigned long n)
-{
- __copy_user_zeroing(to,from,n);
- return n;
-}
-
-static inline unsigned long
-__generic_copy_to_user_nocheck(void *to, const void *from, unsigned long n)
-{
- __copy_user(to,from,n);
- return n;
-}
-
-
-/* Optimize just a little bit when we know the size of the move. */
-#define __constant_copy_user(to, from, size) \
-do { \
- int __d0, __d1; \
- switch (size & 3) { \
- default: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1:\n" \
- ".section .fixup,\"ax\"\n" \
- "2: shl $2,%0\n" \
- " jmp 1b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,2b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- case 1: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1: movsb\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: shl $2,%0\n" \
- "4: incl %0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,3b\n" \
- " .long 1b,4b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- case 2: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1: movsw\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: shl $2,%0\n" \
- "4: addl $2,%0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,3b\n" \
- " .long 1b,4b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- case 3: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1: movsw\n" \
- "2: movsb\n" \
- "3:\n" \
- ".section .fixup,\"ax\"\n" \
- "4: shl $2,%0\n" \
- "5: addl $2,%0\n" \
- "6: incl %0\n" \
- " jmp 3b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,4b\n" \
- " .long 1b,5b\n" \
- " .long 2b,6b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- } \
-} while (0)
-
-/* Optimize just a little bit when we know the size of the move. */
-#define __constant_copy_user_zeroing(to, from, size) \
-do { \
- int __d0, __d1; \
- switch (size & 3) { \
- default: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1:\n" \
- ".section .fixup,\"ax\"\n" \
- "2: pushl %0\n" \
- " pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " rep; stosl\n" \
- " popl %%eax\n" \
- " popl %0\n" \
- " shl $2,%0\n" \
- " jmp 1b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,2b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- case 1: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1: movsb\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: pushl %0\n" \
- " pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " rep; stosl\n" \
- " stosb\n" \
- " popl %%eax\n" \
- " popl %0\n" \
- " shl $2,%0\n" \
- " incl %0\n" \
- " jmp 2b\n" \
- "4: pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " stosb\n" \
- " popl %%eax\n" \
- " incl %0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,3b\n" \
- " .long 1b,4b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- case 2: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1: movsw\n" \
- "2:\n" \
- ".section .fixup,\"ax\"\n" \
- "3: pushl %0\n" \
- " pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " rep; stosl\n" \
- " stosw\n" \
- " popl %%eax\n" \
- " popl %0\n" \
- " shl $2,%0\n" \
- " addl $2,%0\n" \
- " jmp 2b\n" \
- "4: pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " stosw\n" \
- " popl %%eax\n" \
- " addl $2,%0\n" \
- " jmp 2b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,3b\n" \
- " .long 1b,4b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- case 3: \
- __asm__ __volatile__( \
- "0: rep; movsl\n" \
- "1: movsw\n" \
- "2: movsb\n" \
- "3:\n" \
- ".section .fixup,\"ax\"\n" \
- "4: pushl %0\n" \
- " pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " rep; stosl\n" \
- " stosw\n" \
- " stosb\n" \
- " popl %%eax\n" \
- " popl %0\n" \
- " shl $2,%0\n" \
- " addl $3,%0\n" \
- " jmp 2b\n" \
- "5: pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " stosw\n" \
- " stosb\n" \
- " popl %%eax\n" \
- " addl $3,%0\n" \
- " jmp 2b\n" \
- "6: pushl %%eax\n" \
- " xorl %%eax,%%eax\n" \
- " stosb\n" \
- " popl %%eax\n" \
- " incl %0\n" \
- " jmp 3b\n" \
- ".previous\n" \
- ".section __ex_table,\"a\"\n" \
- " .align 4\n" \
- " .long 0b,4b\n" \
- " .long 1b,5b\n" \
- " .long 2b,6b\n" \
- ".previous" \
- : "=c"(size), "=&S" (__d0), "=&D" (__d1)\
- : "1"(from), "2"(to), "0"(size/4) \
- : "memory"); \
- break; \
- } \
-} while (0)
-
-unsigned long __generic_copy_to_user(void *, const void *, unsigned long);
-unsigned long __generic_copy_from_user(void *, const void *, unsigned long);
-
-static inline unsigned long
-__constant_copy_to_user(void *to, const void *from, unsigned long n)
-{
- prefetch(from);
- if (access_ok(VERIFY_WRITE, to, n))
- __constant_copy_user(to,from,n);
- return n;
-}
-
-static inline unsigned long
-__constant_copy_from_user(void *to, const void *from, unsigned long n)
-{
- if (access_ok(VERIFY_READ, from, n))
- __constant_copy_user_zeroing(to,from,n);
- else
- memset(to, 0, n);
- return n;
-}
-
-static inline unsigned long
-__constant_copy_to_user_nocheck(void *to, const void *from, unsigned long n)
-{
- __constant_copy_user(to,from,n);
- return n;
-}
-
-static inline unsigned long
-__constant_copy_from_user_nocheck(void *to, const void *from, unsigned long n)
-{
- __constant_copy_user_zeroing(to,from,n);
- return n;
-}
-
-#define copy_to_user(to,from,n) \
- (__builtin_constant_p(n) ? \
- __constant_copy_to_user((to),(from),(n)) : \
- __generic_copy_to_user((to),(from),(n)))
-
-#define copy_from_user(to,from,n) \
- (__builtin_constant_p(n) ? \
- __constant_copy_from_user((to),(from),(n)) : \
- __generic_copy_from_user((to),(from),(n)))
-
-#define __copy_to_user(to,from,n) \
- (__builtin_constant_p(n) ? \
- __constant_copy_to_user_nocheck((to),(from),(n)) : \
- __generic_copy_to_user_nocheck((to),(from),(n)))
-
-#define __copy_from_user(to,from,n) \
- (__builtin_constant_p(n) ? \
- __constant_copy_from_user_nocheck((to),(from),(n)) : \
- __generic_copy_from_user_nocheck((to),(from),(n)))
-
-long strncpy_from_user(char *dst, const char *src, long count);
-long __strncpy_from_user(char *dst, const char *src, long count);
-#define strlen_user(str) strnlen_user(str, ~0UL >> 1)
-long strnlen_user(const char *str, long n);
-unsigned long clear_user(void *mem, unsigned long len);
-unsigned long __clear_user(void *mem, unsigned long len);
-
-#endif /* __i386_UACCESS_H */