xref: /freebsd/sys/amd64/linux32/linux32_locore.asm (revision dd41de95a84d979615a2ef11df6850622bf6184e)
1/* $FreeBSD$ */
2
3#include "linux32_assym.h"			/* system definitions */
4#include <machine/asmacros.h>			/* miscellaneous asm macros */
5
6#include <amd64/linux32/linux32_syscall.h>	/* system call numbers */
7
8.data
9
10	.globl linux_platform
11linux_platform:
12	.asciz "i686"
13
14.text
15.code32
16
17/*
18 * To avoid excess stack frame the signal trampoline code emulates
19 * the 'call' instruction.
20 */
21ENTRY(linux32_sigcode)
22	movl	%esp, %ebx			/* preserve sigframe */
23	call .getip0
24.getip0:
25	popl	%eax
26	add	$.startsigcode-.getip0, %eax	/* ret address */
27	push	%eax
28	jmp	*LINUX_SIGF_HANDLER(%ebx)
29.startsigcode:
30	popl	%eax
31	movl	$LINUX32_SYS_linux_sigreturn,%eax	/* linux_sigreturn() */
32	int	$0x80				/* enter kernel with args */
33.endsigcode:
340:	jmp	0b
35
36ENTRY(linux32_rt_sigcode)
37	leal	LINUX_RT_SIGF_UC(%esp),%ebx	/* linux ucp */
38	leal	LINUX_RT_SIGF_SC(%ebx),%ecx	/* linux sigcontext */
39	movl	%esp, %edi
40	call	.getip1
41.getip1:
42	popl	%eax
43	add	$.startrtsigcode-.getip1, %eax	/* ret address */
44	push	%eax
45	jmp	*LINUX_RT_SIGF_HANDLER(%edi)
46.startrtsigcode:
47	movl	$LINUX32_SYS_linux_rt_sigreturn,%eax   /* linux_rt_sigreturn() */
48	int	$0x80				/* enter kernel with args */
49.endrtsigcode:
500:	jmp	0b
51
52ENTRY(linux32_vsyscall)
53.startvsyscall:
54	int $0x80
55	ret
56.endvsyscall:
57
58#if 0
59	.section .note.Linux, "a",@note
60	.long 2f - 1f		/* namesz */
61	.balign 4
62	.long 4f - 3f		/* descsz */
63	.long 0
641:
65	.asciz "Linux"
662:
67	.balign 4
683:
69	.long LINUX_VERSION_CODE
704:
71	.balign 4
72	.previous
73#endif
74
75#define do_cfa_expr(offset)						\
76	.byte 0x0f;			/* DW_CFA_def_cfa_expression */	\
77	.uleb128 11f-10f;		/*   length */			\
7810:	.byte 0x74;			/*     DW_OP_breg4 */		\
79	.sleb128 offset;		/*      offset */		\
80	.byte 0x06;			/*     DW_OP_deref */		\
8111:
82
83
84	/* CIE */
85	.section .eh_frame,"a",@progbits
86.LSTARTFRAMEDLSI1:
87	.long .LENDCIEDLSI1-.LSTARTCIEDLSI1
88.LSTARTCIEDLSI1:
89	.long 0					/* CIE ID */
90	.byte 1					/* Version number */
91	.string "zRS"				/* NULL-terminated
92						 * augmentation string
93						 */
94	.uleb128 1				/* Code alignment factor */
95	.sleb128 -4				/* Data alignment factor */
96	.byte 8					/* Return address
97						 * register column
98						 */
99	.uleb128 1				/* Augmentation value length */
100	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
101	.byte 0					/* DW_CFA_nop */
102	.align 4
103.LENDCIEDLSI1:
104
105	/* FDE */
106	.long .LENDFDEDLSI1-.LSTARTFDEDLSI1	/* Length FDE */
107.LSTARTFDEDLSI1:
108	.long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
109	.long .startsigcode-.			/* PC-relative start address */
110	.long .endsigcode-.startsigcode
111	.uleb128 0				/* Augmentation */
112	do_cfa_expr(LINUX_SIGF_SC-8)
113	.align 4
114.LENDFDEDLSI1:
115
116	.long .LENDFDEDLSI2-.LSTARTFDEDLSI2	/* Length FDE */
117.LSTARTFDEDLSI2:
118	.long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1	/* CIE pointer */
119	.long .startrtsigcode-.			/* PC-relative start address */
120	.long .endrtsigcode-.startrtsigcode
121	.uleb128 0				/* Augmentation */
122	do_cfa_expr(LINUX_RT_SIGF_SC-4+LINUX_SC_ESP)
123	.align 4
124.LENDFDEDLSI2:
125	.previous
126
127	.section .eh_frame,"a",@progbits
128.LSTARTFRAMEDLSI2:
129	.long .LENDCIEDLSI2-.LSTARTCIEDLSI2
130.LSTARTCIEDLSI2:
131	.long 0					/* CIE ID */
132	.byte 1					/* Version number */
133	.string "zR"				/* NULL-terminated
134						 * augmentation string
135						 */
136	.uleb128 1				/* Code alignment factor */
137	.sleb128 -4				/* Data alignment factor */
138	.byte 8					/* Return address register column */
139	.uleb128 1				/* Augmentation value length */
140	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
141	.byte 0x0c				/* DW_CFA_def_cfa */
142	.uleb128 4
143	.uleb128 4
144	.byte 0x88				/* DW_CFA_offset, column 0x8 */
145	.uleb128 1
146	.align 4
147.LENDCIEDLSI2:
148	.long .LENDFDEDLSI3-.LSTARTFDEDLSI3 /* Length FDE */
149.LSTARTFDEDLSI3:
150	.long .LSTARTFDEDLSI3-.LSTARTFRAMEDLSI2 /* CIE pointer */
151	.long .startvsyscall-.			/* PC-relative start address */
152	.long .endvsyscall-.startvsyscall
153	.uleb128 0
154	.align 4
155.LENDFDEDLSI3:
156	.previous
157