e2aaf3de8a4282a0fce239ec07b371b864a8487f
[linux-3.10.git] / arch / x86_64 / ia32 / vsyscall-syscall.S
1 /*
2  * Code for the vsyscall page.  This version uses the syscall instruction.
3  */
4
5 #include <asm/ia32_unistd.h>
6 #include <asm/offset.h>
7 #include <asm/segment.h>
8
9         .text
10         .section .text.vsyscall,"ax"
11         .globl __kernel_vsyscall
12         .type __kernel_vsyscall,@function
13 __kernel_vsyscall:
14 .LSTART_vsyscall:
15         push    %ebp
16 .Lpush_ebp:
17         movl    %ecx, %ebp
18         syscall
19         movl    $__USER32_DS, %ecx
20         movl    %ecx, %ss
21         movl    %ebp, %ecx
22         popl    %ebp
23 .Lpop_ebp:
24         ret
25 .LEND_vsyscall:
26         .size __kernel_vsyscall,.-.LSTART_vsyscall
27
28         .section .eh_frame,"a",@progbits
29 .LSTARTFRAME:
30         .long .LENDCIE-.LSTARTCIE
31 .LSTARTCIE:
32         .long 0                 /* CIE ID */
33         .byte 1                 /* Version number */
34         .string "zR"            /* NUL-terminated augmentation string */
35         .uleb128 1              /* Code alignment factor */
36         .sleb128 -4             /* Data alignment factor */
37         .byte 8                 /* Return address register column */
38         .uleb128 1              /* Augmentation value length */
39         .byte 0x1b              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
40         .byte 0x0c              /* DW_CFA_def_cfa */
41         .uleb128 4
42         .uleb128 4
43         .byte 0x88              /* DW_CFA_offset, column 0x8 */
44         .uleb128 1
45         .align 4
46 .LENDCIE:
47
48         .long .LENDFDE1-.LSTARTFDE1     /* Length FDE */
49 .LSTARTFDE1:
50         .long .LSTARTFDE1-.LSTARTFRAME  /* CIE pointer */
51         .long .LSTART_vsyscall-.        /* PC-relative start address */
52         .long .LEND_vsyscall-.LSTART_vsyscall
53         .uleb128 0                      /* Augmentation length */
54         /* What follows are the instructions for the table generation.
55            We have to record all changes of the stack pointer.  */
56         .byte 0x40 + .Lpush_ebp-.LSTART_vsyscall /* DW_CFA_advance_loc */
57         .byte 0x0e              /* DW_CFA_def_cfa_offset */
58         .uleb128 8
59         .byte 0x85, 0x02        /* DW_CFA_offset %ebp -8 */
60         .byte 0x40 + .Lpop_ebp-.Lpush_ebp /* DW_CFA_advance_loc */
61         .byte 0xc5              /* DW_CFA_restore %ebp */
62         .byte 0x0e              /* DW_CFA_def_cfa_offset */
63         .uleb128 4
64         .align 4
65 .LENDFDE1:
66
67 #define SYSCALL_ENTER_KERNEL    syscall
68 #include "vsyscall-sigreturn.S"