]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/64/entry-native.S
Inital import
[l4.git] / kernel / fiasco / src / kern / ia32 / 64 / entry-native.S
1
2 #include "config_tcbsize.h"
3 #include "config_gdt.h"
4 #include "globalconfig.h"
5 #include "idt_init.h"
6 #include <low_level.h>
7 #include "regdefs.h"
8 #include "shortcut.h"
9 #include "tcboffset.h"
10
11         .p2align 4
12         .globl  entry_vec01_debug
13 entry_vec01_debug:
14 /* XXX we have to check single step bug */
15 1:      push    $(0)
16         push    $(1)
17         push    %rax
18         push    %rcx
19         push    %rdx
20         push    %rbx
21         mov     %cr2,%rax
22         push    %rax
23         push    %rbp
24         push    %rsi
25         push    %rdi
26         push    %r8
27         push    %r9
28         push    %r10
29         push    %r11
30         push    %r12
31         push    %r13
32         push    %r14
33         push    %r15
34         jmp     slowtraps
35
36
37         .p2align(4)
38         .globl  entry_vec08_dbf
39 entry_vec08_dbf:
40         push    $(0)
41         push    $(8)
42         push    %rax
43         push    %rcx
44         push    %rdx
45         push    %rbx
46         mov     %cr2,%rax
47         push    %rax
48         push    %rbp
49         push    %rsi
50         push    %rdi
51         push    %r8
52         push    %r9
53         push    %r10
54         push    %r11
55         push    %r12
56         push    %r13
57         push    %r14
58         push    %r15
59         mov     %rsp,%rdi               // 1st arg: trap state
60         call    thread_handle_double_fault
61         jmp     entry_vec08_dbf
62
63
64         .p2align(4)
65         .globl  entry_vec0a_invalid_tss
66 entry_vec0a_invalid_tss:
67         andq    $0xffffffffffffbfff, 24(%rsp)
68         add     $8, %rsp                        /* skip error code */
69         iretq
70
71 /* PPro spurious interrupt bug: 
72  * See "Pentium Pro Processor Specification Update / January 1999"
73  * Erratum "Virtual Wire mode through local APIC may cause int 15"
74  * This exception can be silently ignored */
75         .p2align(4)
76         .globl  entry_vec0f_apic_spurious_interrupt_bug
77 entry_vec0f_apic_spurious_interrupt_bug:
78         incl    apic_spurious_interrupt_bug_cnt
79         iretq
80
81
82 /* XXX has to be fixed */
83 /* APIC error interrupt */
84         .p2align(4)
85         .globl  entry_apic_error_interrupt
86 entry_apic_error_interrupt:
87         cld
88         SAVE_SCRATCH
89         lea     SCRATCH_REGISTER_SIZE(%rsp), %rdi
90         call    apic_error_interrupt
91         RESTORE_SCRATCH
92         iretq
93
94 /* Intel Architecture Software Developer's Manual Volume 3,
95  * Advanced Programmable Interrupt Controller (APIC):
96  * Spurious Interrupt: "If at the time the INTA cycle is issued, the
97  * interupt that was to be dispensed has become masked (programmed by
98  * software), the local APIC will deliver a spurious-interrupt vector." */
99         .p2align(4)
100         .globl  entry_apic_spurious_interrupt
101 entry_apic_spurious_interrupt:
102         incl    apic_spurious_interrupt_cnt
103         iretq
104
105         .p2align(4)
106         .global entry_int_apic_ignore
107 entry_int_apic_ignore:
108         push    %rcx
109         push    %rdx
110         mov     apic_io_base, %rcx
111         mov     0xf0(%rcx), %edx
112         movl    $0, 0xb0(%rcx)
113         pop     %rdx
114         pop     %rcx
115         iretq
116
117 #if defined(CONFIG_JDB)
118
119         .p2align(4)
120         .global entry_syscall_log
121         .global entry_sys_fast_ipc_log
122 entry_syscall_log:
123 entry_sys_fast_ipc_log:
124         mov     %rsp,%r15               /* save user rsp */
125         mov     syscall_rsp0, %rsp      /* get address of kernel stack */
126         pop     %rsp                    /* set kernel stack */                  
127
128         push    $(GDT_DATA_USER | SEL_PL_U)     /* fake user ss */
129         push    %r15                            /* save user rsp */
130         push    %r11                            /* save user rflags */
131         push    $(GDT_CODE_USER | SEL_PL_U)     /* fake user cs */
132         push    %rcx                            /* save user rip */
133         
134         cld
135         SAVE_STATE_SYSEXIT
136         ESP_TO_TCB_AT %rbx
137         RESET_THREAD_CANCEL_AT %rbx
138
139         call    *syscall_table
140 in_slow_ipc5:
141         RESTORE_STATE_SYSEXIT
142         
143         pop     %rcx                            /* load user rsp */
144         add     $8,%rsp                         /* through away cs */
145         pop     %r11                            /* load user rflags */
146         pop     %r15                            /* load user rsp */
147         add     $8,%rsp                         /* through away ss */
148         
149         mov     %r15,%rsp                       /* restore user rsp */
150         sysretq
151
152         .globl  in_slow_ipc5
153
154 #endif // CONFIG_JDB
155
156
157 #if (defined (CONFIG_JDB_LOGGING) || !defined(CONFIG_ASSEMBLER_IPC_SHORTCUT))
158         .p2align(4)
159         .global entry_syscall_c
160         .global entry_sys_fast_ipc_c
161 entry_syscall_c:
162 entry_sys_fast_ipc_c:
163         mov     %rsp,%r15               /* save user rsp */
164         mov     syscall_rsp0,%rsp       /* get address of kernel stack */
165         pop     %rsp                    /* set kernel stack */
166
167         push    $(GDT_DATA_USER | SEL_PL_U)     /* fake user ss */
168         push    %r15                            /* save user rsp */
169         push    %r11                            /* save user rflags */
170         push    $(GDT_CODE_USER | SEL_PL_U)     /* fake user cs */
171         push    %rcx                            /* save user rip */
172
173         cld
174         SAVE_STATE_SYSEXIT
175         ESP_TO_TCB_AT %rbx
176         RESET_THREAD_CANCEL_AT %rbx
177         
178         call    ipc_short_cut_wrapper
179 in_sc_ipc2:
180         RESTORE_STATE_SYSEXIT
181         
182         pop     %rcx                            /* load user rsp */
183         add     $8,%rsp                         /* through away cs */
184         pop     %r11                            /* load user rflags */
185         pop     %r15                            /* load user rsp */
186         add     $8,%rsp                         /* through away ss */
187         
188         mov     %r15,%rsp                       /* restore user rsp */
189         sysretq
190         
191         .globl  in_sc_ipc2
192 #endif
193
194         .bss
195         .align  8
196         .globl syscall_rsp0
197 syscall_rsp0:
198         .space  8                               /* address of esp0 in tss */
199         .text
200
201         .p2align(4)
202         .globl  leave_from_sysenter_by_iret
203 leave_from_sysenter_by_iret:
204         ESP_TO_TCB_AT %rbx
205         RESET_THREAD_IPC_MASK_AT %rbx
206         RESTORE_STATE
207         pop     %rax
208         orq     $EFLAGS_IF, 8(%rsp)
209         iretq
210
211 #ifdef CONFIG_SVM
212         .p2align(4)
213         .globl  resume_vm
214 resume_vm:
215         
216         // save callee saved regs
217         push    %rbx
218         push    %r12
219         push    %r13
220         push    %r14
221         push    %r15
222         push    %rbp
223
224         mov     %rdi, %rax      // first arg goes to rax for vm*
225         push    %rsi            // store pointer to register struct
226
227         clgi
228
229         sti
230         nop
231
232         // restore guest GP regs
233         mov       8(%rsi), %rdx
234         mov      16(%rsi), %rcx
235         mov      24(%rsi), %rdi
236         mov      32(%rsi), %r8
237         mov      40(%rsi), %r9
238         mov      48(%rsi), %rbx
239         mov      56(%rsi), %rbp
240         mov      64(%rsi), %r10
241         mov      72(%rsi), %r11
242         mov      80(%rsi), %r12
243         mov      88(%rsi), %r13
244         mov      96(%rsi), %r14
245         mov     104(%rsi), %r15
246         mov        (%rsi), %rsi
247
248         // TODO: Debugregs
249
250         // rax used as implicit operand for vm* instructions
251         vmload
252         vmrun
253         vmsave
254
255         push    %rsi
256         mov     8(%rsp), %rsi   // get previously saved register struct pointer
257
258         mov     %rdx,   8(%rsi) // save guest GP registers
259         mov     %rcx,  16(%rsi)
260         mov     %rdi,  24(%rsi)
261         mov     %r8,   32(%rsi)
262         mov     %r9,   40(%rsi)
263         mov     %rbx,  48(%rsi)
264         mov     %rbp,  56(%rsi)
265         mov     %r10,  64(%rsi)
266         mov     %r11,  72(%rsi)
267         mov     %r12,  80(%rsi)
268         mov     %r13,  88(%rsi)
269         mov     %r14,  96(%rsi)
270         mov     %r15, 104(%rsi)
271
272         mov     (%rsp), %rdx      // guest rsi to rdx
273         mov     %rdx, (%rsi)      // store in regs structure
274
275         cli
276         nop
277         stgi
278
279         add     $16, %rsp
280         
281         // restore callee saved registers
282         pop     %rbp
283         pop     %r15
284         pop     %r14
285         pop     %r13
286         pop     %r12
287         pop     %rbx
288
289         ret
290 #endif
291
292
293         .bss
294         .space  4096
295         .global dbf_stack_top
296 dbf_stack_top:
297