x86/asm/irq: Stop relying on magic JMP behavior for early_idt_handlers
[deliverable/linux.git] / arch / x86 / lib / putuser.S
CommitLineData
1da177e4
LT
1/*
2 * __put_user functions.
3 *
4 * (C) Copyright 2005 Linus Torvalds
5cbbc3b1
GC
5 * (C) Copyright 2005 Andi Kleen
6 * (C) Copyright 2008 Glauber Costa
1da177e4
LT
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 */
00e065ea
JB
13#include <linux/linkage.h>
14#include <asm/dwarf2.h>
1da177e4 15#include <asm/thread_info.h>
5cbbc3b1 16#include <asm/errno.h>
2528de43 17#include <asm/asm.h>
63bcff2a 18#include <asm/smap.h>
1da177e4
LT
19
20
21/*
22 * __put_user_X
23 *
24 * Inputs: %eax[:%edx] contains the data
25 * %ecx contains the address
26 *
27 * Outputs: %eax is error code (0 or -EFAULT)
28 *
29 * These functions should not modify any other registers,
30 * as they get called from within inline assembly.
31 */
32
00e065ea 33#define ENTER CFI_STARTPROC ; \
2528de43 34 GET_THREAD_INFO(%_ASM_BX)
63bcff2a
PA
35#define EXIT ASM_CLAC ; \
36 ret ; \
00e065ea 37 CFI_ENDPROC
1da177e4
LT
38
39.text
00e065ea 40ENTRY(__put_user_1)
1da177e4 41 ENTER
2528de43 42 cmp TI_addr_limit(%_ASM_BX),%_ASM_CX
1da177e4 43 jae bad_put_user
63bcff2a 44 ASM_STAC
2528de43 451: movb %al,(%_ASM_CX)
efea505d 46 xor %eax,%eax
1da177e4 47 EXIT
00e065ea 48ENDPROC(__put_user_1)
1da177e4 49
00e065ea 50ENTRY(__put_user_2)
1da177e4 51 ENTER
2528de43
GC
52 mov TI_addr_limit(%_ASM_BX),%_ASM_BX
53 sub $1,%_ASM_BX
54 cmp %_ASM_BX,%_ASM_CX
1da177e4 55 jae bad_put_user
63bcff2a 56 ASM_STAC
2528de43 572: movw %ax,(%_ASM_CX)
efea505d 58 xor %eax,%eax
1da177e4 59 EXIT
00e065ea 60ENDPROC(__put_user_2)
1da177e4 61
00e065ea 62ENTRY(__put_user_4)
1da177e4 63 ENTER
2528de43
GC
64 mov TI_addr_limit(%_ASM_BX),%_ASM_BX
65 sub $3,%_ASM_BX
66 cmp %_ASM_BX,%_ASM_CX
1da177e4 67 jae bad_put_user
63bcff2a 68 ASM_STAC
2528de43 693: movl %eax,(%_ASM_CX)
efea505d 70 xor %eax,%eax
1da177e4 71 EXIT
00e065ea 72ENDPROC(__put_user_4)
1da177e4 73
00e065ea 74ENTRY(__put_user_8)
1da177e4 75 ENTER
2528de43
GC
76 mov TI_addr_limit(%_ASM_BX),%_ASM_BX
77 sub $7,%_ASM_BX
78 cmp %_ASM_BX,%_ASM_CX
1da177e4 79 jae bad_put_user
63bcff2a 80 ASM_STAC
5cbbc3b1
GC
814: mov %_ASM_AX,(%_ASM_CX)
82#ifdef CONFIG_X86_32
2528de43 835: movl %edx,4(%_ASM_CX)
5cbbc3b1 84#endif
efea505d 85 xor %eax,%eax
1da177e4 86 EXIT
00e065ea 87ENDPROC(__put_user_8)
1da177e4
LT
88
89bad_put_user:
268cf048 90 CFI_STARTPROC
5cbbc3b1 91 movl $-EFAULT,%eax
1da177e4 92 EXIT
00e065ea 93END(bad_put_user)
1da177e4 94
a53a96e5
PA
95 _ASM_EXTABLE(1b,bad_put_user)
96 _ASM_EXTABLE(2b,bad_put_user)
97 _ASM_EXTABLE(3b,bad_put_user)
98 _ASM_EXTABLE(4b,bad_put_user)
5cbbc3b1 99#ifdef CONFIG_X86_32
a53a96e5 100 _ASM_EXTABLE(5b,bad_put_user)
5cbbc3b1 101#endif
This page took 0.721615 seconds and 5 git commands to generate.