diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 16:43:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 16:43:24 -0400 |
commit | a3da5bf84a97d48cfaf66c6842470fc403da5121 (patch) | |
tree | cdf66c0cff8c61eedd60601fc9dffdd1ed39b880 /arch/x86/lib/getuser.S | |
parent | 3b23e665b68387f5ee7b21f7b75ceea4d9acae4a (diff) | |
parent | d59fdcf2ac501de99c3dfb452af5e254d4342886 (diff) |
Merge branch 'x86/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (821 commits)
x86: make 64bit hpet_set_mapping to use ioremap too, v2
x86: get x86_phys_bits early
x86: max_low_pfn_mapped fix #4
x86: change _node_to_cpumask_ptr to return const ptr
x86: I/O APIC: remove an IRQ2-mask hack
x86: fix numaq_tsc_disable calling
x86, e820: remove end_user_pfn
x86: max_low_pfn_mapped fix, #3
x86: max_low_pfn_mapped fix, #2
x86: max_low_pfn_mapped fix, #1
x86_64: fix delayed signals
x86: remove conflicting nx6325 and nx6125 quirks
x86: Recover timer_ack lost in the merge of the NMI watchdog
x86: I/O APIC: Never configure IRQ2
x86: L-APIC: Always fully configure IRQ0
x86: L-APIC: Set IRQ0 as edge-triggered
x86: merge dwarf2 headers
x86: use AS_CFI instead of UNWIND_INFO
x86: use ignore macro instead of hash comment
x86: use matching CFI_ENDPROC
...
Diffstat (limited to 'arch/x86/lib/getuser.S')
-rw-r--r-- | arch/x86/lib/getuser.S | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/arch/x86/lib/getuser.S b/arch/x86/lib/getuser.S new file mode 100644 index 000000000000..ad374003742f --- /dev/null +++ b/arch/x86/lib/getuser.S | |||
@@ -0,0 +1,104 @@ | |||
1 | /* | ||
2 | * __get_user functions. | ||
3 | * | ||
4 | * (C) Copyright 1998 Linus Torvalds | ||
5 | * (C) Copyright 2005 Andi Kleen | ||
6 | * (C) Copyright 2008 Glauber Costa | ||
7 | * | ||
8 | * These functions have a non-standard call interface | ||
9 | * to make them more efficient, especially as they | ||
10 | * return an error value in addition to the "real" | ||
11 | * return value. | ||
12 | */ | ||
13 | |||
14 | /* | ||
15 | * __get_user_X | ||
16 | * | ||
17 | * Inputs: %[r|e]ax contains the address. | ||
18 | * The register is modified, but all changes are undone | ||
19 | * before returning because the C code doesn't know about it. | ||
20 | * | ||
21 | * Outputs: %[r|e]ax is error code (0 or -EFAULT) | ||
22 | * %[r|e]dx contains zero-extended value | ||
23 | * | ||
24 | * | ||
25 | * These functions should not modify any other registers, | ||
26 | * as they get called from within inline assembly. | ||
27 | */ | ||
28 | |||
29 | #include <linux/linkage.h> | ||
30 | #include <asm/dwarf2.h> | ||
31 | #include <asm/page.h> | ||
32 | #include <asm/errno.h> | ||
33 | #include <asm/asm-offsets.h> | ||
34 | #include <asm/thread_info.h> | ||
35 | #include <asm/asm.h> | ||
36 | |||
37 | .text | ||
38 | ENTRY(__get_user_1) | ||
39 | CFI_STARTPROC | ||
40 | GET_THREAD_INFO(%_ASM_DX) | ||
41 | cmp TI_addr_limit(%_ASM_DX),%_ASM_AX | ||
42 | jae bad_get_user | ||
43 | 1: movzb (%_ASM_AX),%edx | ||
44 | xor %eax,%eax | ||
45 | ret | ||
46 | CFI_ENDPROC | ||
47 | ENDPROC(__get_user_1) | ||
48 | |||
49 | ENTRY(__get_user_2) | ||
50 | CFI_STARTPROC | ||
51 | add $1,%_ASM_AX | ||
52 | jc bad_get_user | ||
53 | GET_THREAD_INFO(%_ASM_DX) | ||
54 | cmp TI_addr_limit(%_ASM_DX),%_ASM_AX | ||
55 | jae bad_get_user | ||
56 | 2: movzwl -1(%_ASM_AX),%edx | ||
57 | xor %eax,%eax | ||
58 | ret | ||
59 | CFI_ENDPROC | ||
60 | ENDPROC(__get_user_2) | ||
61 | |||
62 | ENTRY(__get_user_4) | ||
63 | CFI_STARTPROC | ||
64 | add $3,%_ASM_AX | ||
65 | jc bad_get_user | ||
66 | GET_THREAD_INFO(%_ASM_DX) | ||
67 | cmp TI_addr_limit(%_ASM_DX),%_ASM_AX | ||
68 | jae bad_get_user | ||
69 | 3: mov -3(%_ASM_AX),%edx | ||
70 | xor %eax,%eax | ||
71 | ret | ||
72 | CFI_ENDPROC | ||
73 | ENDPROC(__get_user_4) | ||
74 | |||
75 | #ifdef CONFIG_X86_64 | ||
76 | ENTRY(__get_user_8) | ||
77 | CFI_STARTPROC | ||
78 | add $7,%_ASM_AX | ||
79 | jc bad_get_user | ||
80 | GET_THREAD_INFO(%_ASM_DX) | ||
81 | cmp TI_addr_limit(%_ASM_DX),%_ASM_AX | ||
82 | jae bad_get_user | ||
83 | 4: movq -7(%_ASM_AX),%_ASM_DX | ||
84 | xor %eax,%eax | ||
85 | ret | ||
86 | CFI_ENDPROC | ||
87 | ENDPROC(__get_user_8) | ||
88 | #endif | ||
89 | |||
90 | bad_get_user: | ||
91 | CFI_STARTPROC | ||
92 | xor %edx,%edx | ||
93 | mov $(-EFAULT),%_ASM_AX | ||
94 | ret | ||
95 | CFI_ENDPROC | ||
96 | END(bad_get_user) | ||
97 | |||
98 | .section __ex_table,"a" | ||
99 | _ASM_PTR 1b,bad_get_user | ||
100 | _ASM_PTR 2b,bad_get_user | ||
101 | _ASM_PTR 3b,bad_get_user | ||
102 | #ifdef CONFIG_X86_64 | ||
103 | _ASM_PTR 4b,bad_get_user | ||
104 | #endif | ||