]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - sys/amd64/linux32/linux32_locore.s
- Copy stable/10@296371 to releng/10.3 in preparation for 10.3-RC1
[FreeBSD/releng/10.3.git] / sys / amd64 / linux32 / linux32_locore.s
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
11 linux_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  */
21 NON_GPROF_ENTRY(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:
34 0:      jmp     0b
35
36 NON_GPROF_ENTRY(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:
50 0:      jmp     0b
51
52 NON_GPROF_ENTRY(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
64 1:
65         .asciz "Linux"
66 2:
67         .balign 4
68 3:
69         .long LINUX_VERSION_CODE
70 4:
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 */                  \
78 10:     .byte 0x74;                     /*     DW_OP_breg4 */           \
79         .sleb128 offset;                /*      offset */               \
80         .byte 0x06;                     /*     DW_OP_deref */           \
81 11:
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