]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/64/entry-native.S
update
[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    sys_ipc_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         .bss
212         .space  4096
213         .global dbf_stack_top
214 dbf_stack_top:
215