]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/x86/entry/vdso/vdso32/system_call.S
Merge remote-tracking branch 'at91/at91-next'
[karo-tx-linux.git] / arch / x86 / entry / vdso / vdso32 / system_call.S
1 /*
2  * Code for the vDSO.  This version uses the old int $0x80 method.
3 */
4
5 #include <asm/dwarf2.h>
6 #include <asm/cpufeature.h>
7 #include <asm/alternative-asm.h>
8
9 /*
10  * First get the common code for the sigreturn entry points.
11  * This must come first.
12  */
13 #include "sigreturn.S"
14
15         .text
16         .globl __kernel_vsyscall
17         .type __kernel_vsyscall,@function
18         ALIGN
19 __kernel_vsyscall:
20         CFI_STARTPROC
21         /*
22          * Reshuffle regs so that all of any of the entry instructions
23          * will preserve enough state.
24          */
25         pushl   %edx
26         CFI_ADJUST_CFA_OFFSET   4
27         CFI_REL_OFFSET          edx, 0
28         pushl   %ecx
29         CFI_ADJUST_CFA_OFFSET   4
30         CFI_REL_OFFSET          ecx, 0
31         movl    %esp, %ecx
32
33 #ifdef CONFIG_X86_64
34         /* If SYSENTER (Intel) or SYSCALL32 (AMD) is available, use it. */
35         ALTERNATIVE_2 "", "sysenter", X86_FEATURE_SYSENTER32, \
36                           "syscall",  X86_FEATURE_SYSCALL32
37 #else
38         ALTERNATIVE "", "sysenter", X86_FEATURE_SEP
39 #endif
40
41         /* Enter using int $0x80 */
42         movl    (%esp), %ecx
43         int     $0x80
44 GLOBAL(int80_landing_pad)
45
46         /* Restore ECX and EDX in case they were clobbered. */
47         popl    %ecx
48         CFI_RESTORE             ecx
49         CFI_ADJUST_CFA_OFFSET   -4
50         popl    %edx
51         CFI_RESTORE             edx
52         CFI_ADJUST_CFA_OFFSET   -4
53         ret
54         CFI_ENDPROC
55
56         .size __kernel_vsyscall,.-__kernel_vsyscall
57         .previous