ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / x86_64 / lib / getuser.S
1 /*
2  * __get_user functions.
3  *
4  * (C) Copyright 1998 Linus Torvalds
5  *
6  * These functions have a non-standard call interface
7  * to make them more efficient, especially as they
8  * return an error value in addition to the "real"
9  * return value.
10  */
11
12 /*
13  * __get_user_X
14  *
15  * Inputs:      %rax contains the address
16  *
17  * Outputs:     %rax is error code (0 or -EFAULT)
18  *              %rdx contains zero-extended value
19  * 
20  * %rbx is destroyed.
21  *
22  * These functions should not modify any other registers,
23  * as they get called from within inline assembly.
24  */
25
26 #include <linux/linkage.h>
27 #include <asm/page.h>
28 #include <asm/errno.h>
29 #include <asm/offset.h>
30 #include <asm/thread_info.h>
31
32         .text
33         .p2align 4
34 .globl __get_user_1
35 __get_user_1:   
36         GET_THREAD_INFO(%rbx)
37         cmpq threadinfo_addr_limit(%rbx),%rax
38         jae bad_get_user
39 1:      movzb (%rax),%edx
40         xorq %rax,%rax
41         ret
42
43         .p2align 4
44 .globl __get_user_2
45 __get_user_2:
46         GET_THREAD_INFO(%rbx) 
47         addq $1,%rax
48         jc bad_get_user
49         cmpq threadinfo_addr_limit(%rbx),%rax 
50         jae      bad_get_user
51 2:      movzwl -1(%rax),%edx
52         xorq %rax,%rax
53         ret
54
55         .p2align 4
56 .globl __get_user_4
57 __get_user_4:
58         GET_THREAD_INFO(%rbx) 
59         addq $3,%rax
60         jc bad_get_user
61         cmpq threadinfo_addr_limit(%rbx),%rax 
62         jae bad_get_user
63 3:      movl -3(%rax),%edx
64         xorq %rax,%rax
65         ret
66
67         .p2align 4
68 .globl __get_user_8
69 __get_user_8:
70         GET_THREAD_INFO(%rbx) 
71         addq $7,%rax
72         jc bad_get_user
73         cmpq threadinfo_addr_limit(%rbx),%rax
74         jae     bad_get_user
75 4:      movq -7(%rax),%rdx
76         xorq %rax,%rax
77         ret
78
79 ENTRY(bad_get_user)
80 bad_get_user:
81         xorq %rdx,%rdx
82         movq $(-EFAULT),%rax
83         ret
84
85 .section __ex_table,"a"
86         .quad 1b,bad_get_user
87         .quad 2b,bad_get_user
88         .quad 3b,bad_get_user
89         .quad 4b,bad_get_user
90 .previous