]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/vmm/server/src/irq_server.h
update
[l4.git] / l4 / pkg / vmm / server / src / irq_server.h
1 #pragma once
2
3 #include <l4/cxx/ipc_server>
4 #include "gic.h"
5
6 struct Irq_svr : L4::Server_object, Gic::Irq_array::Eoi_handler
7 {
8   Irq_svr() : gic(0) {}
9
10   explicit Irq_svr(Gic::Dist *gic, unsigned irq) : gic(gic), irq(irq)
11   {
12     gic->spi(irq).set_eoi(this);
13   }
14
15   void gic_bind(Gic::Dist *gic, unsigned irq)
16   {
17     this->gic = gic;
18     this->irq = irq;
19     gic->spi(irq).set_eoi(this);
20   }
21
22   int dispatch(l4_umword_t, L4::Ipc::Iostream &)
23   {
24     gic->inject_spi(irq, vmm_current_cpu_id);
25     return 0;
26   }
27
28   void eoi()
29   {
30     L4::cap_reinterpret_cast<L4::Irq>(obj_cap())->unmask();
31   }
32
33   Gic::Dist *gic;
34   unsigned irq;
35 };