xref: /freebsd/sys/i386/linux/linux_locore.asm (revision ba279bcd6d75aa236bcb9ccf11aeb6f51a2f8514)
1/* $FreeBSD$ */
2
3#include "linux_assym.h"			/* system definitions */
4#include <machine/asmacros.h>			/* miscellaneous asm macros */
5
6#include <i386/linux/linux_syscall.h>		/* system call numbers */
7
8#include "assym.inc"
9
10	.data
11
12	.globl linux_platform
13linux_platform:
14	.asciz "i686"
15
16	.text
17
18ENTRY(__kernel_sigreturn)
19	movl	%esp, %ebx			/* sigframe for sigreturn */
20	call	*%edi				/* call signal handler */
21.startsigcode:
22	popl	%eax				/* gcc unwind code need this */
23	movl	$LINUX_SYS_linux_sigreturn, %eax
24	int	$0x80
25.endsigcode:
260:	jmp	0b
27
28ENTRY(__kernel_rt_sigreturn)
29	leal	LINUX_RT_SIGF_UC(%esp), %ebx	/* linux ucontext for rt_sigreturn */
30	call	*%edi				/* call signal handler */
31.startrtsigcode:
32	movl	$LINUX_SYS_linux_rt_sigreturn, %eax
33	int	$0x80
34.endrtsigcode:
350:	jmp	0b
36
37ENTRY(__kernel_vsyscall)
38.startvsyscall:
39	int $0x80
40	ret
41.endvsyscall:
42
43#if 0
44	.section .note.Linux, "a",@note
45	.long 2f - 1f		/* namesz */
46	.balign 4
47	.long 4f - 3f		/* descsz */
48	.long 0
491:
50	.asciz "Linux"
512:
52	.balign 4
533:
54	.long LINUX_VERSION_CODE
554:
56	.balign 4
57	.previous
58#endif
59
60#define do_cfa_expr(offset)						\
61	.byte 0x0f;			/* DW_CFA_def_cfa_expression */	\
62	.uleb128 11f-10f;		/*   length */			\
6310:	.byte 0x74;			/*     DW_OP_breg4 */		\
64	.sleb128 offset;		/*      offset */		\
65	.byte 0x06;			/*     DW_OP_deref */		\
6611:
67
68
69	/* CIE */
70	.section .eh_frame,"a",@progbits
71.LSTARTFRAMEDLSI1:
72	.long .LENDCIEDLSI1-.LSTARTCIEDLSI1
73.LSTARTCIEDLSI1:
74	.long 0					/* CIE ID */
75	.byte 1					/* Version number */
76	.string "zRS"				/* NULL-terminated
77						 * augmentation string
78						 */
79	.uleb128 1				/* Code alignment factor */
80	.sleb128 -4				/* Data alignment factor */
81	.byte 8					/* Return address
82						 * register column
83						 */
84	.uleb128 1				/* Augmentation value length */
85	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
86	.byte 0					/* DW_CFA_nop */
87	.align 4
88.LENDCIEDLSI1:
89
90	/* FDE */
91	.long .LENDFDEDLSI1-.LSTARTFDEDLSI1	/* Length FDE */
92.LSTARTFDEDLSI1:
93	.long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
94	.long .startsigcode-.			/* PC-relative start address */
95	.long .endsigcode-.startsigcode
96	.uleb128 0				/* Augmentation */
97	do_cfa_expr(LINUX_SIGF_SC-8)
98	.align 4
99.LENDFDEDLSI1:
100
101	.long .LENDFDEDLSI2-.LSTARTFDEDLSI2	/* Length FDE */
102.LSTARTFDEDLSI2:
103	.long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1	/* CIE pointer */
104	.long .startrtsigcode-.			/* PC-relative start address */
105	.long .endrtsigcode-.startrtsigcode
106	.uleb128 0				/* Augmentation */
107	do_cfa_expr(LINUX_RT_SIGF_SC-4+LINUX_SC_ESP)
108	.align 4
109.LENDFDEDLSI2:
110	.previous
111
112	.section .eh_frame,"a",@progbits
113.LSTARTFRAMEDLSI2:
114	.long .LENDCIEDLSI2-.LSTARTCIEDLSI2
115.LSTARTCIEDLSI2:
116	.long 0					/* CIE ID */
117	.byte 1					/* Version number */
118	.string "zR"				/* NULL-terminated
119						 * augmentation string
120						 */
121	.uleb128 1				/* Code alignment factor */
122	.sleb128 -4				/* Data alignment factor */
123	.byte 8					/* Return address register column */
124	.uleb128 1				/* Augmentation value length */
125	.byte 0x1b				/* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
126	.byte 0x0c				/* DW_CFA_def_cfa */
127	.uleb128 4
128	.uleb128 4
129	.byte 0x88				/* DW_CFA_offset, column 0x8 */
130	.uleb128 1
131	.align 4
132.LENDCIEDLSI2:
133	.long .LENDFDEDLSI3-.LSTARTFDEDLSI3 /* Length FDE */
134.LSTARTFDEDLSI3:
135	.long .LSTARTFDEDLSI3-.LSTARTFRAMEDLSI2 /* CIE pointer */
136	.long .startvsyscall-.			/* PC-relative start address */
137	.long .endvsyscall-.startvsyscall
138	.uleb128 0
139	.align 4
140.LENDFDEDLSI3:
141	.previous
142