Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


74418296b5b5ac6ea23c83716c8609b378641a60
[palacios.git] / kitten / arch / x86_64 / kernel / interrupts.c
1 #include <lwk/kernel.h>
2 #include <lwk/init.h>
3 #include <lwk/kallsyms.h>
4 #include <lwk/task.h>
5 #include <lwk/sched.h>
6 #include <lwk/timer.h>
7 #include <arch/desc.h>
8 #include <arch/idt_vectors.h>
9 #include <arch/show.h>
10 #include <arch/xcall.h>
11 #include <arch/i387.h>
12
13 idtvec_handler_t idtvec_table[NUM_IDT_ENTRIES];
14 static DEFINE_SPINLOCK(idtvec_table_lock);
15
16 extern void asm_idtvec_table(void);
17
18 void
19 do_unhandled_idt_vector(struct pt_regs *regs, unsigned int vector)
20 {
21         if ((vector >= IRQ0_VECTOR) && (vector <= IRQ15_VECTOR)) {
22                 printk(KERN_EMERG
23                        "Unhandled Interrupt! (vector=%u, isa_irq=%u)\n",
24                        vector, vector - IRQ0_VECTOR);
25         } else {
26                 printk(KERN_EMERG
27                        "Unhandled Interrupt! (vector=%u)\n", vector);
28         }
29 }
30
31 void
32 do_divide_error(struct pt_regs *regs, unsigned int vector)
33 {
34         printk("Divide Error Exception\n");
35         show_registers(regs);
36         while (1) {}
37 }
38
39 void
40 do_nmi(struct pt_regs *regs, unsigned int vector)
41 {
42         printk("NMI Exception\n");
43         show_registers(regs);
44         while (1) {}
45 }
46
47 void
48 do_int3(struct pt_regs *regs, unsigned int vector)
49 {
50         printk("INT3 Exception\n");
51         show_registers(regs);
52         while (1) {}
53 }
54
55 void
56 do_overflow(struct pt_regs *regs, unsigned int vector)
57 {
58         printk("Overflow Exception\n");
59         show_registers(regs);
60         while (1) {}
61 }
62
63 void
64 do_bounds(struct pt_regs *regs, unsigned int vector)
65 {
66         printk("Bounds Exception\n");
67         show_registers(regs);
68         while (1) {}
69 }
70
71 void
72 do_invalid_op(struct pt_regs *regs, unsigned int vector)
73 {
74         printk("Invalid Op Exception\n");
75         show_registers(regs);
76         while (1) {}
77 }
78
79 void
80 do_device_not_available(struct pt_regs *regs, unsigned int vector)
81 {
82         BUG_ON(current->arch.flags & TF_USED_FPU);
83         current->arch.flags |= TF_USED_FPU;
84         clts();
85         fpu_restore_state(current);
86 }
87
88 void
89 do_double_fault(struct pt_regs *regs, unsigned int vector)
90 {
91         printk("Double Fault Exception\n");
92         show_registers(regs);
93         while (1) {}
94 }
95
96 void
97 do_coproc_segment_overrun(struct pt_regs *regs, unsigned int vector)
98 {
99         printk("Coprocessor Segment Exception\n");
100         show_registers(regs);
101         while (1) {}
102 }
103
104 void
105 do_invalid_tss(struct pt_regs *regs, unsigned int vector)
106 {
107         printk("Invalid TSS Exception)\n");
108         show_registers(regs);
109         while (1) {}
110 }
111
112 void
113 do_segment_not_present(struct pt_regs *regs, unsigned int vector)
114 {
115         printk("Segment Not Present Exception\n");
116         show_registers(regs);
117         while (1) {}
118 }
119
120 void
121 do_stack_segment(struct pt_regs *regs, unsigned int vector)
122 {
123         printk("Stack Segment Exception\n");
124         show_registers(regs);
125         while (1) {}
126 }
127
128 void
129 do_general_protection(struct pt_regs *regs, unsigned int vector)
130 {
131         printk("General Protection Exception\n");
132         show_registers(regs);
133         while (1) {}
134 }
135
136 void
137 do_page_fault(struct pt_regs *regs, unsigned int vector)
138 {
139         printk("Page Fault Exception\n");
140         show_registers(regs);
141         while (1) {}
142 }
143
144 void
145 do_spurious_interrupt_bug(struct pt_regs *regs, unsigned int vector)
146 {
147         printk("Spurious Interrupt Exception\n");
148         show_registers(regs);
149         while (1) {}
150 }
151
152 void
153 do_coprocessor_error(struct pt_regs *regs, unsigned int vector)
154 {
155         printk("Coprocessor Error Exception\n");
156         show_registers(regs);
157         while (1) {}
158 }
159
160 void
161 do_alignment_check(struct pt_regs *regs, unsigned int vector)
162 {
163         printk("Alignment Check Exception\n");
164         show_registers(regs);
165         while (1) {}
166 }
167
168 void
169 do_machine_check(struct pt_regs *regs, unsigned int vector)
170 {
171         printk("Machine Check Exception\n");
172         show_registers(regs);
173         while (1) {}
174 }
175
176 void
177 do_simd_coprocessor_error(struct pt_regs *regs, unsigned int vector)
178 {
179         printk("SIMD Coprocessor Error Exception\n");
180         show_registers(regs);
181         while (1) {}
182 }
183
184 void
185 do_apic_timer(struct pt_regs *regs, unsigned int vector)
186 {
187         expire_timers();
188 }
189
190 void
191 do_apic_perf_counter(struct pt_regs *regs, unsigned int vector)
192 {
193         printk("APIC Perf. Counter Interrupt, vector=%u\n", vector);
194         show_registers(regs);
195         while (1) {}
196 }
197
198 void
199 do_apic_thermal(struct pt_regs *regs, unsigned int vector)
200 {
201         printk("APIC Thermal Interrupt, vector=%u\n", vector);
202         show_registers(regs);
203         while (1) {}
204 }
205
206 void
207 do_apic_error(struct pt_regs *regs, unsigned int vector)
208 {
209         printk("APIC Error Interrupt, vector=%u\n", vector);
210         show_registers(regs);
211         while (1) {}
212 }
213
214 void
215 do_apic_spurious(struct pt_regs *regs, unsigned int vector)
216 {
217         printk("APIC Spurious Interrupt, vector=%u\n", vector);
218         show_registers(regs);
219         while (1) {}
220 }
221
222 void
223 set_idtvec_handler(unsigned int vector, idtvec_handler_t handler)
224 {
225         char namebuf[KSYM_NAME_LEN+1];
226         unsigned long symsize, offset;
227         unsigned long irqstate;
228
229         ASSERT(vector < NUM_IDT_ENTRIES);
230
231         if (handler != &do_unhandled_idt_vector) {
232                 printk(KERN_DEBUG "IDT Vector %3u -> %s()\n",
233                         vector, kallsyms_lookup( (unsigned long)handler,
234                                                   &symsize, &offset, namebuf )
235                 );
236         }
237
238         spin_lock_irqsave(&idtvec_table_lock, irqstate);
239         idtvec_table[vector] = handler;
240         spin_unlock_irqrestore(&idtvec_table_lock, irqstate);
241 }
242
243 void
244 do_interrupt(struct pt_regs *regs, unsigned int vector)
245 {
246         idtvec_table[vector](regs, vector);
247         if (vector >= FIRST_EXTERNAL_VECTOR)
248                 lapic_ack_interrupt();
249 }
250
251 void __init
252 interrupts_init(void)
253 {
254         int vector;
255
256         /*
257          * Initialize the Interrupt Descriptor Table (IDT).
258          */
259         for (vector = 0; vector < NUM_IDT_ENTRIES; vector++) {
260                 void *asm_handler = (void *) (
261                   (unsigned long)(&asm_idtvec_table) + (vector * 16)
262                 );
263                 set_intr_gate(vector, asm_handler);
264                 set_idtvec_handler(vector, &do_unhandled_idt_vector);
265         }
266
267         /*
268          * Register handlers for the standard x86_64 interrupts & exceptions.
269          */
270         set_idtvec_handler( DIVIDE_ERROR_VECTOR,           &do_divide_error           );
271         set_idtvec_handler( NMI_VECTOR,                    &do_nmi                    );
272         set_idtvec_handler( INT3_VECTOR,                   &do_int3                   );
273         set_idtvec_handler( OVERFLOW_VECTOR,               &do_overflow               );
274         set_idtvec_handler( BOUNDS_VECTOR,                 &do_bounds                 );
275         set_idtvec_handler( INVALID_OP_VECTOR,             &do_invalid_op             );
276         set_idtvec_handler( DEVICE_NOT_AVAILABLE_VECTOR,   &do_device_not_available   );
277         set_idtvec_handler( DOUBLE_FAULT_VECTOR,           &do_double_fault           );
278         set_idtvec_handler( COPROC_SEGMENT_OVERRUN_VECTOR, &do_coproc_segment_overrun );
279         set_idtvec_handler( INVALID_TSS_VECTOR,            &do_invalid_tss            );
280         set_idtvec_handler( SEGMENT_NOT_PRESENT_VECTOR,    &do_segment_not_present    );
281         set_idtvec_handler( STACK_SEGMENT_VECTOR,          &do_stack_segment          );
282         set_idtvec_handler( GENERAL_PROTECTION_VECTOR,     &do_general_protection     );
283         set_idtvec_handler( PAGE_FAULT_VECTOR,             &do_page_fault             );
284         set_idtvec_handler( SPURIOUS_INTERRUPT_BUG_VECTOR, &do_spurious_interrupt_bug );
285         set_idtvec_handler( COPROCESSOR_ERROR_VECTOR,      &do_coprocessor_error      );
286         set_idtvec_handler( ALIGNMENT_CHECK_VECTOR,        &do_alignment_check        );
287         set_idtvec_handler( MACHINE_CHECK_VECTOR,          &do_machine_check          );
288         set_idtvec_handler( SIMD_COPROCESSOR_ERROR_VECTOR, &do_simd_coprocessor_error );
289
290         /*
291          * Register handlers for all of the local APIC vectors.
292          */
293         set_idtvec_handler( APIC_TIMER_VECTOR,        &do_apic_timer        );
294         set_idtvec_handler( APIC_PERF_COUNTER_VECTOR, &do_apic_perf_counter );
295         set_idtvec_handler( APIC_THERMAL_VECTOR,      &do_apic_thermal      );
296         set_idtvec_handler( APIC_ERROR_VECTOR,        &do_apic_error        );
297         set_idtvec_handler( APIC_SPURIOUS_VECTOR,     &do_apic_spurious     );
298
299         /*
300          * Register handlers for inter-CPU interrupts (cross calls).
301          */
302         set_idtvec_handler( XCALL_FUNCTION_VECTOR,   &arch_xcall_function_interrupt   );
303         set_idtvec_handler( XCALL_RESCHEDULE_VECTOR, &arch_xcall_reschedule_interrupt );
304 }
305
306