]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/dirq-ia32-ux.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / dirq-ia32-ux.cpp
1 INTERFACE[ia32,amd64,ux]:
2 #include "std_macros.h"
3 #include "types.h"
4
5 IMPLEMENTATION[ia32,amd64,ux]:
6
7 #include <cassert>
8
9 #include "cpu_lock.h"
10 #include "globalconfig.h"
11 #include "globals.h"
12 #include "irq.h"
13 #include "logdefs.h"
14 #include "std_macros.h"
15 #include "thread.h"
16 #include "timer.h"
17
18 // screen spinner for debugging purposes
19 static inline void irq_spinners(int irqnum)
20 {
21 #ifdef CONFIG_IRQ_SPINNER
22   Unsigned16 *p = (Unsigned16 *)Mem_layout::Adap_vram_cga_beg;
23   p += (20 + current_cpu()) * 80 + irqnum;
24   if (p < (Unsigned16 *)Mem_layout::Adap_vram_cga_end)
25     (*p)++;
26 #else
27   (void)irqnum;
28 #endif
29 }
30
31 /** Hardware interrupt entry point.  Calls corresponding Dirq instance's
32     Dirq::hit() method.
33     @param irqobj hardware-interrupt object
34  */
35 extern "C" FIASCO_FASTCALL
36 void
37 irq_interrupt(Mword _irqobj, Mword ip)
38 {
39   Mword irqobj = (Smword)((Signed32)_irqobj);
40   Thread::assert_irq_entry();
41
42   CNT_IRQ;
43   (void)ip;
44
45   // we're entered with disabled irqs
46   Irq_base *i = (Irq_base*)irqobj;
47   i->log();
48   irq_spinners(i->pin());
49   i->hit(0);
50 }
51