x86: use _ASM_PTR instead of explicit word-size pointers.
[linux-2.6/mini2440.git] / arch / x86 / lib / getuser_64.S
blobe33388419b7b235cbb0eb20a02c2c708f58a69cf
1 /*
2  * __get_user functions.
3  *
4  * (C) Copyright 1998 Linus Torvalds
5  * (C) Copyright 2005 Andi Kleen
6  *
7  * These functions have a non-standard call interface
8  * to make them more efficient, especially as they
9  * return an error value in addition to the "real"
10  * return value.
11  */
14  * __get_user_X
15  *
16  * Inputs:      %rax contains the address.
17  *              The register is modified, but all changes are undone
18  *              before returning because the C code doesn't know about it.
19  *
20  * Outputs:     %rax is error code (0 or -EFAULT)
21  *              %rdx contains zero-extended value
22  * 
23  *
24  * These functions should not modify any other registers,
25  * as they get called from within inline assembly.
26  */
28 #include <linux/linkage.h>
29 #include <asm/dwarf2.h>
30 #include <asm/page.h>
31 #include <asm/errno.h>
32 #include <asm/asm-offsets.h>
33 #include <asm/thread_info.h>
34 #include <asm/asm.h>
36         .text
37 ENTRY(__get_user_1)
38         CFI_STARTPROC
39         GET_THREAD_INFO(%_ASM_DX)
40         cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
41         jae bad_get_user
42 1:      movzb (%_ASM_AX),%edx
43         xor %eax,%eax
44         ret
45         CFI_ENDPROC
46 ENDPROC(__get_user_1)
48 ENTRY(__get_user_2)
49         CFI_STARTPROC
50         add $1,%_ASM_AX
51         jc bad_get_user
52         GET_THREAD_INFO(%_ASM_DX)
53         cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
54         jae bad_get_user
55 2:      movzwl -1(%_ASM_AX),%edx
56         xor %eax,%eax
57         ret
58         CFI_ENDPROC
59 ENDPROC(__get_user_2)
61 ENTRY(__get_user_4)
62         CFI_STARTPROC
63         add $3,%_ASM_AX
64         jc bad_get_user
65         GET_THREAD_INFO(%_ASM_DX)
66         cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
67         jae bad_get_user
68 3:      mov -3(%_ASM_AX),%edx
69         xor %eax,%eax
70         ret
71         CFI_ENDPROC
72 ENDPROC(__get_user_4)
74 ENTRY(__get_user_8)
75         CFI_STARTPROC
76         add $7,%_ASM_AX
77         jc bad_get_user
78         GET_THREAD_INFO(%_ASM_DX)
79         cmp TI_addr_limit(%_ASM_DX),%_ASM_AX
80         jae     bad_get_user
81 4:      movq -7(%_ASM_AX),%_ASM_DX
82         xor %eax,%eax
83         ret
84         CFI_ENDPROC
85 ENDPROC(__get_user_8)
87 bad_get_user:
88         CFI_STARTPROC
89         xor %edx,%edx
90         mov $(-EFAULT),%_ASM_AX
91         ret
92         CFI_ENDPROC
93 END(bad_get_user)
95 .section __ex_table,"a"
96         _ASM_PTR 1b,bad_get_user
97         _ASM_PTR 2b,bad_get_user
98         _ASM_PTR 3b,bad_get_user
99         _ASM_PTR 4b,bad_get_user
100 .previous