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"
70