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