import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / i386 / 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:      %eax contains the address
16  *
17  * Outputs:     %eax is error code (0 or -EFAULT)
18  *              %edx contains zero-extended value
19  *
20  * These functions should not modify any other registers,
21  * as they get called from within inline assembly.
22  */
23
24 addr_limit = 12
25
26 .text
27 .align 4
28 .globl __get_user_1
29 __get_user_1:
30         movl %esp,%edx
31         andl $0xffffe000,%edx
32         cmpl addr_limit(%edx),%eax
33         jae bad_get_user
34 1:      movzbl (%eax),%edx
35         xorl %eax,%eax
36         ret
37
38 .align 4
39 .globl __get_user_2
40 __get_user_2:
41         addl $1,%eax
42         movl %esp,%edx
43         jc bad_get_user
44         andl $0xffffe000,%edx
45         cmpl addr_limit(%edx),%eax
46         jae bad_get_user
47 2:      movzwl -1(%eax),%edx
48         xorl %eax,%eax
49         ret
50
51 .align 4
52 .globl __get_user_4
53 __get_user_4:
54         addl $3,%eax
55         movl %esp,%edx
56         jc bad_get_user
57         andl $0xffffe000,%edx
58         cmpl addr_limit(%edx),%eax
59         jae bad_get_user
60 3:      movl -3(%eax),%edx
61         xorl %eax,%eax
62         ret
63
64 bad_get_user:
65         xorl %edx,%edx
66         movl $-14,%eax
67         ret
68
69 .section __ex_table,"a"
70         .long 1b,bad_get_user
71         .long 2b,bad_get_user
72         .long 3b,bad_get_user
73 .previous