]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - sys/i386/linux/linux_locore.s
- Copy stable/10@296371 to releng/10.3 in preparation for 10.3-RC1
[FreeBSD/releng/10.3.git] / sys / i386 / linux / linux_locore.s
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.s"
9
10 /*
11  * To avoid excess stack frame the signal trampoline code emulates
12  * the 'call' instruction.
13  */
14 NON_GPROF_ENTRY(linux_sigcode)
15         movl    %esp, %ebx                      /* preserve sigframe */
16         call .getip0
17 .getip0:
18         popl    %eax
19         add     $.startsigcode-.getip0, %eax    /* ret address */
20         push    %eax
21         jmp     *LINUX_SIGF_HANDLER(%ebx)
22 .startsigcode:
23         popl    %eax                            /* gcc unwind code need this */
24         movl    $LINUX_SYS_linux_sigreturn,%eax /* linux_sigreturn() */
25         int     $0x80                           /* enter kernel with args */
26 .endsigcode:
27 0:      jmp     0b
28
29 NON_GPROF_ENTRY(linux_rt_sigcode)
30         leal    LINUX_RT_SIGF_UC(%esp),%ebx     /* linux ucp */
31         leal    LINUX_RT_SIGF_SC(%ebx),%ecx     /* linux sigcontext */
32         movl    %esp, %edi
33         call    .getip1
34 .getip1:
35         popl    %eax
36         add     $.startrtsigcode-.getip1, %eax  /* ret address */
37         push    %eax
38         jmp     *LINUX_RT_SIGF_HANDLER(%edi)
39 .startrtsigcode:
40         movl    $LINUX_SYS_linux_rt_sigreturn,%eax   /* linux_rt_sigreturn() */
41         int     $0x80                           /* enter kernel with args */
42 .endrtsigcode:
43 0:      jmp     0b
44
45 NON_GPROF_ENTRY(linux_vsyscall)
46 .startvsyscall:
47         int $0x80
48         ret
49 .endvsyscall:
50
51 #if 0
52         .section .note.Linux, "a",@note
53         .long 2f - 1f           /* namesz */
54         .balign 4
55         .long 4f - 3f           /* descsz */
56         .long 0
57 1:
58         .asciz "Linux"
59 2:
60         .balign 4
61 3:
62         .long LINUX_VERSION_CODE
63 4:
64         .balign 4
65         .previous
66 #endif
67
68 #define do_cfa_expr(offset)                                             \
69         .byte 0x0f;                     /* DW_CFA_def_cfa_expression */ \
70         .uleb128 11f-10f;               /*   length */                  \
71 10:     .byte 0x74;                     /*     DW_OP_breg4 */           \
72         .sleb128 offset;                /*      offset */               \
73         .byte 0x06;                     /*     DW_OP_deref */           \
74 11:
75
76
77         /* CIE */
78         .section .eh_frame,"a",@progbits
79 .LSTARTFRAMEDLSI1:
80         .long .LENDCIEDLSI1-.LSTARTCIEDLSI1
81 .LSTARTCIEDLSI1:
82         .long 0                                 /* CIE ID */
83         .byte 1                                 /* Version number */
84         .string "zRS"                           /* NULL-terminated
85                                                  * augmentation string
86                                                  */
87         .uleb128 1                              /* Code alignment factor */
88         .sleb128 -4                             /* Data alignment factor */
89         .byte 8                                 /* Return address
90                                                  * register column
91                                                  */
92         .uleb128 1                              /* Augmentation value length */
93         .byte 0x1b                              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
94         .byte 0                                 /* DW_CFA_nop */
95         .align 4
96 .LENDCIEDLSI1:
97
98         /* FDE */
99         .long .LENDFDEDLSI1-.LSTARTFDEDLSI1     /* Length FDE */
100 .LSTARTFDEDLSI1:
101         .long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
102         .long .startsigcode-.                   /* PC-relative start address */
103         .long .endsigcode-.startsigcode
104         .uleb128 0                              /* Augmentation */
105         do_cfa_expr(LINUX_SIGF_SC-8)
106         .align 4
107 .LENDFDEDLSI1:
108
109         .long .LENDFDEDLSI2-.LSTARTFDEDLSI2     /* Length FDE */
110 .LSTARTFDEDLSI2:
111         .long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1 /* CIE pointer */
112         .long .startrtsigcode-.                 /* PC-relative start address */
113         .long .endrtsigcode-.startrtsigcode
114         .uleb128 0                              /* Augmentation */
115         do_cfa_expr(LINUX_RT_SIGF_SC-4+LINUX_SC_ESP)
116         .align 4
117 .LENDFDEDLSI2:
118         .previous
119
120         .section .eh_frame,"a",@progbits
121 .LSTARTFRAMEDLSI2:
122         .long .LENDCIEDLSI2-.LSTARTCIEDLSI2
123 .LSTARTCIEDLSI2:
124         .long 0                                 /* CIE ID */
125         .byte 1                                 /* Version number */
126         .string "zR"                            /* NULL-terminated
127                                                  * augmentation string
128                                                  */
129         .uleb128 1                              /* Code alignment factor */
130         .sleb128 -4                             /* Data alignment factor */
131         .byte 8                                 /* Return address register column */
132         .uleb128 1                              /* Augmentation value length */
133         .byte 0x1b                              /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
134         .byte 0x0c                              /* DW_CFA_def_cfa */
135         .uleb128 4
136         .uleb128 4
137         .byte 0x88                              /* DW_CFA_offset, column 0x8 */
138         .uleb128 1
139         .align 4
140 .LENDCIEDLSI2:
141         .long .LENDFDEDLSI3-.LSTARTFDEDLSI3 /* Length FDE */
142 .LSTARTFDEDLSI3:
143         .long .LSTARTFDEDLSI3-.LSTARTFRAMEDLSI2 /* CIE pointer */
144         .long .startvsyscall-.                  /* PC-relative start address */
145         .long .endvsyscall-.startvsyscall
146         .uleb128 0
147         .align 4
148 .LENDFDEDLSI3:
149         .previous