1*22ce4affSfengbojiang/* $FreeBSD$ */
2*22ce4affSfengbojiang
3*22ce4affSfengbojiang#include "linux_assym.h"			/* system definitions */
4*22ce4affSfengbojiang#include <machine/asmacros.h>			/* miscellaneous asm macros */
5*22ce4affSfengbojiang
6*22ce4affSfengbojiang#include <amd64/linux/linux_syscall.h>		/* system call numbers */
7*22ce4affSfengbojiang
8*22ce4affSfengbojiang	.data
9*22ce4affSfengbojiang
10*22ce4affSfengbojiang	.globl linux_platform
11*22ce4affSfengbojianglinux_platform:
12*22ce4affSfengbojiang	.asciz "x86_64"
13*22ce4affSfengbojiang
14*22ce4affSfengbojiang
15*22ce4affSfengbojiang	.text
16*22ce4affSfengbojiang/*
17*22ce4affSfengbojiang * To avoid excess stack frame the signal trampoline code emulates
18*22ce4affSfengbojiang * the 'call' instruction.
19*22ce4affSfengbojiang */
20*22ce4affSfengbojiangNON_GPROF_ENTRY(linux_rt_sigcode)
21*22ce4affSfengbojiang	movq	%rsp, %rbx			/* preserve sigframe */
22*22ce4affSfengbojiang	call	.getip
23*22ce4affSfengbojiang.getip:
24*22ce4affSfengbojiang	popq	%rax
25*22ce4affSfengbojiang	add	$.startrtsigcode-.getip, %rax	/* ret address */
26*22ce4affSfengbojiang	pushq	%rax
27*22ce4affSfengbojiang	jmp	*LINUX_RT_SIGF_HANDLER(%rbx)
28*22ce4affSfengbojiang.startrtsigcode:
29*22ce4affSfengbojiang	movq	$LINUX_SYS_linux_rt_sigreturn,%rax   /* linux_rt_sigreturn() */
30*22ce4affSfengbojiang	syscall					/* enter kernel with args */
31*22ce4affSfengbojiang	hlt
32*22ce4affSfengbojiang.endrtsigcode:
33*22ce4affSfengbojiang0:	jmp	0b
34*22ce4affSfengbojiang
35*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_clock_gettime)
36*22ce4affSfengbojiang	movq	$LINUX_SYS_linux_clock_gettime,%rax
37*22ce4affSfengbojiang	syscall
38*22ce4affSfengbojiang	ret
39*22ce4affSfengbojiang.weak clock_gettime
40*22ce4affSfengbojiang.set clock_gettime, __vdso_clock_gettime
41*22ce4affSfengbojiang
42*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_time)
43*22ce4affSfengbojiang	movq	$LINUX_SYS_linux_time,%rax
44*22ce4affSfengbojiang	syscall
45*22ce4affSfengbojiang	ret
46*22ce4affSfengbojiang.weak time
47*22ce4affSfengbojiang.set time, __vdso_time
48*22ce4affSfengbojiang
49*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_gettimeofday)
50*22ce4affSfengbojiang	movq	$LINUX_SYS_gettimeofday,%rax
51*22ce4affSfengbojiang	syscall
52*22ce4affSfengbojiang	ret
53*22ce4affSfengbojiang.weak gettimeofday
54*22ce4affSfengbojiang.set gettimeofday, __vdso_gettimeofday
55*22ce4affSfengbojiang
56*22ce4affSfengbojiangNON_GPROF_ENTRY(__vdso_getcpu)
57*22ce4affSfengbojiang	movq	$-38,%rax	/* not implemented */
58*22ce4affSfengbojiang	ret
59*22ce4affSfengbojiang.weak getcpu
60*22ce4affSfengbojiang.set getcpu, __vdso_getcpu
61*22ce4affSfengbojiang
62*22ce4affSfengbojiang#if 0
63*22ce4affSfengbojiang	.section .note.Linux, "a",@note
64*22ce4affSfengbojiang	.long 2f - 1f		/* namesz */
65*22ce4affSfengbojiang	.balign 4
66*22ce4affSfengbojiang	.long 4f - 3f		/* descsz */
67*22ce4affSfengbojiang	.long 0
68*22ce4affSfengbojiang1:
69*22ce4affSfengbojiang	.asciz "Linux"
70*22ce4affSfengbojiang2:
71*22ce4affSfengbojiang	.balign 4
72*22ce4affSfengbojiang3:
73*22ce4affSfengbojiang	.long LINUX_VERSION_CODE
74*22ce4affSfengbojiang4:
75*22ce4affSfengbojiang	.balign 4
76*22ce4affSfengbojiang	.previous
77*22ce4affSfengbojiang#endif
78*22ce4affSfengbojiang
79*22ce4affSfengbojiang	.section .eh_frame,"a",@progbits
80*22ce4affSfengbojiang.LSTARTFRAMEDLSI0:
81*22ce4affSfengbojiang	.long .LENDCIEDLSI0-.LSTARTCIEDLSI0
82*22ce4affSfengbojiang.LSTARTCIEDLSI0:
83*22ce4affSfengbojiang	.long 0					/* CIE ID */
84*22ce4affSfengbojiang	.byte 1					/* Version number */
85*22ce4affSfengbojiang	.string "zR"				/* NULL-terminated
86*22ce4affSfengbojiang						 * augmentation string
87*22ce4affSfengbojiang						 */
88*22ce4affSfengbojiang	.uleb128 1				/* Code alignment factor */
89*22ce4affSfengbojiang	.sleb128 -4				/* Data alignment factor */
90*22ce4affSfengbojiang	.byte 8					/* Return address register column */
91*22ce4affSfengbojiang	.uleb128 1				/* Augmentation value length */
92*22ce4affSfengbojiang	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
93*22ce4affSfengbojiang	.byte 0x0c				/* DW_CFA_def_cfa */
94*22ce4affSfengbojiang	.uleb128 4
95*22ce4affSfengbojiang	.uleb128 4
96*22ce4affSfengbojiang	.byte 0x88				/* DW_CFA_offset, column 0x8 */
97*22ce4affSfengbojiang	.uleb128 1
98*22ce4affSfengbojiang	.align 4
99*22ce4affSfengbojiang.LENDCIEDLSI0:
100*22ce4affSfengbojiang	.long .LENDFDEDLSI0-.LSTARTFDEDLSI0	/* Length FDE */
101*22ce4affSfengbojiang.LSTARTFDEDLSI0:
102*22ce4affSfengbojiang	.long .LSTARTFDEDLSI0-.LSTARTFRAMEDLSI0	/* CIE pointer */
103*22ce4affSfengbojiang	.long .startrtsigcode-.			/* PC-relative start address */
104*22ce4affSfengbojiang	.long .endrtsigcode-.startrtsigcode
105*22ce4affSfengbojiang	.uleb128 0
106*22ce4affSfengbojiang	.align 4
107*22ce4affSfengbojiang.LENDFDEDLSI0:
108*22ce4affSfengbojiang	.previous
109