]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ux/ipi-ux.cpp
59a695509ab8f675414c540fbcbd9883ce28b03c
[l4.git] / kernel / fiasco / src / kern / ux / ipi-ux.cpp
1 INTERFACE [mp]:
2
3 EXTENSION class Ipi
4 {
5 private:
6   Unsigned32 _lcpu;
7
8 public:
9   enum Message { Request = 'r', Global_request = 'g', Debug = 'd' };
10 };
11
12 //---------------------------------------------------------------------------
13 IMPLEMENTATION[!mp]:
14
15 //---------------------------------------------------------------------------
16 IMPLEMENTATION[mp]:
17
18 #include <cstdio>
19
20 #include "cpu.h"
21 #include "pic.h"
22
23 PUBLIC inline
24 Ipi::Ipi() : _lcpu(~0)
25 {}
26
27 IMPLEMENT
28 void
29 Ipi::init()
30 {
31   _lcpu = current_cpu();
32   Pic::setup_ipi(_lcpu, Cpu::cpus.cpu(_lcpu).phys_id());
33 }
34
35 PUBLIC static inline NEEDS[<cstdio>]
36 void
37 Ipi::eoi(Message)
38 {
39 }
40
41 PUBLIC static inline NEEDS[<cstdio>, "pic.h"]
42 void
43 Ipi::send(Message m, unsigned from_cpu, unsigned to_cpu)
44 {
45   printf("Sending IPI:%d to cpu%d\n", m, _lcpu);
46   Pic::send_ipi(_lcpu, m);
47 }
48
49 PUBLIC static inline NEEDS[<cstdio>, "cpu.h", "pic.h"]
50 void
51 Ipi::bcast(Message m, unsigned from_cpu)
52 {
53   printf("Bcast IPI:%d\n", m);
54   for (unsigned i = 0; i < Config::Max_num_cpus; ++i)
55     if (Cpu::online(i))
56       Pic::send_ipi(i, m);
57 }
58
59 PUBLIC static
60 unsigned long
61 Ipi::gate(unsigned char data)
62 {
63   Message m = (Message)data;
64
65   switch (m)
66     {
67       case Global_request: return APIC_IRQ_BASE + 2;
68       case Request:        return APIC_IRQ_BASE - 1;
69       case Debug:          return APIC_IRQ_BASE - 2;
70       default:
71          printf("Unknown request: %c(%d)\n", m, m);
72          break;
73     }
74   return ~0UL;
75 }