linux32_locore.s revision 293514
1133819Stjr/* $FreeBSD: stable/10/sys/amd64/linux32/linux32_locore.s 293514 2016-01-09 15:44:38Z dchagin $ */
2133819Stjr
3133819Stjr#include "linux32_assym.h"			/* system definitions */
4133819Stjr#include <machine/asmacros.h>			/* miscellaneous asm macros */
5133819Stjr
6133819Stjr#include <amd64/linux32/linux32_syscall.h>	/* system call numbers */
7133819Stjr
8133819Stjr.text
9133819Stjr.code32
10133819Stjr
11293514Sdchagin/*
12293514Sdchagin * To avoid excess stack frame the signal trampoline code emulates
13293514Sdchagin * the 'call' instruction.
14293514Sdchagin */
15293514SdchaginNON_GPROF_ENTRY(linux32_sigcode)
16293514Sdchagin	movl	%esp, %ebx			/* preserve sigframe */
17293514Sdchagin	call .getip0
18293514Sdchagin.getip0:
19293514Sdchagin	popl	%eax
20293514Sdchagin	add	$.startsigcode-.getip0, %eax	/* ret address */
21293514Sdchagin	push	%eax
22293514Sdchagin	jmp	*LINUX_SIGF_HANDLER(%ebx)
23293514Sdchagin.startsigcode:
24293514Sdchagin	popl	%eax
25133819Stjr	movl	$LINUX_SYS_linux_sigreturn,%eax	/* linux_sigreturn() */
26133819Stjr	int	$0x80				/* enter kernel with args */
27293514Sdchagin.endsigcode:
28133819Stjr0:	jmp	0b
29293514Sdchagin
30293514SdchaginNON_GPROF_ENTRY(linux32_rt_sigcode)
31133819Stjr	leal	LINUX_RT_SIGF_UC(%esp),%ebx	/* linux ucp */
32182849Skib	leal	LINUX_RT_SIGF_SC(%ebx),%ecx	/* linux sigcontext */
33293514Sdchagin	movl	%esp, %edi
34293514Sdchagin	call	.getip1
35293514Sdchagin.getip1:
36293514Sdchagin	popl	%eax
37293514Sdchagin	add	$.startrtsigcode-.getip1, %eax	/* ret address */
38293514Sdchagin	push	%eax
39293514Sdchagin	jmp	*LINUX_RT_SIGF_HANDLER(%edi)
40293514Sdchagin.startrtsigcode:
41133819Stjr	movl	$LINUX_SYS_linux_rt_sigreturn,%eax   /* linux_rt_sigreturn() */
42133819Stjr	int	$0x80				/* enter kernel with args */
43293514Sdchagin.endrtsigcode:
44133819Stjr0:	jmp	0b
45133819Stjr
46293514SdchaginNON_GPROF_ENTRY(linux32_vsyscall)
47293514Sdchagin.startvsyscall:
48293514Sdchagin	int $0x80
49293514Sdchagin	ret
50293514Sdchagin.endvsyscall:
51293514Sdchagin
52293514Sdchagin
53293514Sdchagin	.section .note.Linux, "a",@note
54293514Sdchagin	.long 2f - 1f		/* namesz */
55293514Sdchagin	.balign 4
56293514Sdchagin	.long 4f - 3f		/* descsz */
57293514Sdchagin	.long 0
58293514Sdchagin1:
59293514Sdchagin	.asciz "Linux"
60293514Sdchagin2:
61293514Sdchagin	.balign 4
62293514Sdchagin3:
63293514Sdchagin	.long LINUX_VERSION_CODE
64293514Sdchagin4:
65293514Sdchagin	.balign 4
66293514Sdchagin	.previous
67293514Sdchagin
68293514Sdchagin
69293514Sdchagin#define do_cfa_expr(offset)                                             \
70293514Sdchagin	.byte 0x0f;			/* DW_CFA_def_cfa_expression */ \
71293514Sdchagin	.uleb128 11f-10f;		/*   length */                  \
72293514Sdchagin10:	.byte 0x74;			/*     DW_OP_breg4 */           \
73293514Sdchagin	.sleb128 offset;		/*      offset */               \
74293514Sdchagin	.byte 0x06;			/*     DW_OP_deref */           \
75293514Sdchagin11:
76293514Sdchagin
77293514Sdchagin
78293514Sdchagin	/* CIE */
79293514Sdchagin	.section .eh_frame,"a",@progbits
80293514Sdchagin.LSTARTFRAMEDLSI1:
81293514Sdchagin	.long .LENDCIEDLSI1-.LSTARTCIEDLSI1
82293514Sdchagin.LSTARTCIEDLSI1:
83293514Sdchagin	.long 0					/* CIE ID */
84293514Sdchagin	.byte 1					/* Version number */
85293514Sdchagin	.string "zRS"				/* NULL-terminated
86293514Sdchagin						 * augmentation string
87293514Sdchagin						 */
88293514Sdchagin	.uleb128 1				/* Code alignment factor */
89293514Sdchagin	.sleb128 -4				/* Data alignment factor */
90293514Sdchagin	.byte 8					/* Return address
91293514Sdchagin						 * register column
92293514Sdchagin						 */
93293514Sdchagin	.uleb128 1				/* Augmentation value length */
94293514Sdchagin	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
95293514Sdchagin	.byte 0					/* DW_CFA_nop */
96293514Sdchagin	.align 4
97293514Sdchagin.LENDCIEDLSI1:
98293514Sdchagin
99293514Sdchagin	/* FDE */
100293514Sdchagin	.long .LENDFDEDLSI1-.LSTARTFDEDLSI1	/* Length FDE */
101293514Sdchagin.LSTARTFDEDLSI1:
102293514Sdchagin	.long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
103293514Sdchagin	.long .startsigcode-.			/* PC-relative start address */
104293514Sdchagin	.long .endsigcode-.startsigcode
105293514Sdchagin	.uleb128 0				/* Augmentation */
106293514Sdchagin	do_cfa_expr(LINUX_SIGF_SC-8)
107293514Sdchagin	.align 4
108293514Sdchagin.LENDFDEDLSI1:
109293514Sdchagin
110293514Sdchagin	.long .LENDFDEDLSI2-.LSTARTFDEDLSI2	/* Length FDE */
111293514Sdchagin.LSTARTFDEDLSI2:
112293514Sdchagin	.long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1	/* CIE pointer */
113293514Sdchagin	.long .startrtsigcode-.			/* PC-relative start address */
114293514Sdchagin	.long .endrtsigcode-.startrtsigcode
115293514Sdchagin	.uleb128 0				/* Augmentation */
116293514Sdchagin	do_cfa_expr(LINUX_RT_SIGF_SC-4+LINUX_SC_ESP)
117293514Sdchagin	.align 4
118293514Sdchagin.LENDFDEDLSI2:
119293514Sdchagin	.previous
120293514Sdchagin
121293514Sdchagin	.section .eh_frame,"a",@progbits
122293514Sdchagin.LSTARTFRAMEDLSI2:
123293514Sdchagin	.long .LENDCIEDLSI2-.LSTARTCIEDLSI2
124293514Sdchagin.LSTARTCIEDLSI2:
125293514Sdchagin	.long 0					/* CIE ID */
126293514Sdchagin	.byte 1					/* Version number */
127293514Sdchagin	.string "zR"				/* NULL-terminated
128293514Sdchagin						 * augmentation string
129293514Sdchagin						 */
130293514Sdchagin	.uleb128 1				/* Code alignment factor */
131293514Sdchagin	.sleb128 -4				/* Data alignment factor */
132293514Sdchagin	.byte 8					/* Return address register column */
133293514Sdchagin	.uleb128 1				/* Augmentation value length */
134293514Sdchagin	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
135293514Sdchagin	.byte 0x0c				/* DW_CFA_def_cfa */
136293514Sdchagin	.uleb128 4
137293514Sdchagin	.uleb128 4
138293514Sdchagin	.byte 0x88				/* DW_CFA_offset, column 0x8 */
139293514Sdchagin	.uleb128 1
140293514Sdchagin	.align 4
141293514Sdchagin.LENDCIEDLSI2:
142293514Sdchagin	.long .LENDFDEDLSI3-.LSTARTFDEDLSI3 /* Length FDE */
143293514Sdchagin.LSTARTFDEDLSI3:
144293514Sdchagin	.long .LSTARTFDEDLSI3-.LSTARTFRAMEDLSI2 /* CIE pointer */
145293514Sdchagin	.long .startvsyscall-.			/* PC-relative start address */
146293514Sdchagin	.long .endvsyscall-.startvsyscall
147293514Sdchagin	.uleb128 0
148293514Sdchagin	.align 4
149293514Sdchagin.LENDFDEDLSI3:
150293514Sdchagin	.previous
151