]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/mag/plugins/input_lxdd/input_lxdd.cc
39bf8a5b6d6cc02dd6776490e6728db9aef18a92
[l4.git] / l4 / pkg / mag / plugins / input_lxdd / input_lxdd.cc
1 /*
2  * (c) 2010 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3  *          Alexander Warg <warg@os.inf.tu-dresden.de>
4  *     economic rights: Technische Universität Dresden (Germany)
5  *
6  * This file is part of TUD:OS and distributed under the terms of the
7  * GNU General Public License 2.
8  * Please see the COPYING-GPL-2 file for details.
9  */
10 #include <l4/mag/server/input_driver>
11
12 #include <l4/re/namespace>
13 #include <l4/re/rm>
14 #include <l4/re/env>
15 #include <l4/re/error_helper>
16 #include <l4/re/util/cap_alloc>
17 #include <l4/cxx/exceptions>
18
19 #include <cstdio>
20
21 namespace Mag_server {
22
23 using L4Re::Util::Auto_cap;
24 using L4Re::chksys;
25
26
27 struct Iter
28 {
29   L4Re::Event_buffer *_ev;
30   L4Re::Event_buffer::Event *e;
31
32   explicit Iter() : _ev(0), e(0) {}
33   explicit Iter(L4Re::Event_buffer *ev) : _ev(ev), e(_ev->next()) {}
34
35   Iter operator ++ ()
36   {
37     e = _ev->next();
38     return *this;
39   }
40
41   bool operator != (Iter const &o) const
42   { return e != o.e; }
43
44   L4Re::Event_buffer::Event *operator -> () const { return e; }
45   L4Re::Event_buffer::Event &operator * () const { return *e; }
46 };
47
48 struct Emit
49 {
50   User_state *u;
51   Emit(User_state *u) : u(u) {}
52   void operator () (L4Re::Event_buffer::Event const &e) const
53   { u->handle_event(e); }
54 };
55
56 class Input_driver_lxproxy : public Input_driver
57 {
58 private:
59   Auto_cap<L4Re::Dataspace>::Cap _ev_ds;
60   Auto_cap<L4::Irq>::Cap _ev_irq;
61   L4Re::Rm::Auto_region<void *> _ev_ds_m;
62
63   L4Re::Event_buffer _ev;
64
65 public:
66
67   Input_driver_lxproxy() : Input_driver("L4Linux Proxy") {}
68   int probe()
69   {
70     try
71       {
72         _ev_ds = L4Re::Util::cap_alloc.alloc<L4Re::Dataspace>();
73         _ev_irq = L4Re::Util::cap_alloc.alloc<L4::Irq>();
74
75         L4Re::Env const *e = L4Re::Env::env();
76         L4::Cap<L4Re::Namespace> input_ns
77           = chkcap(e->get_cap<L4Re::Namespace>("ev"), "getting ev namespace", 0);
78         chksys(input_ns->query("ev_buf", _ev_ds.get()));
79         chksys(input_ns->query("ev_irq", _ev_irq.get()));
80         chksys(e->rm()->attach(&_ev_ds_m, _ev_ds->size(), L4Re::Rm::Search_addr,
81               _ev_ds.get(), 0, L4_PAGESHIFT));
82
83         _ev = L4Re::Event_buffer(_ev_ds_m.get(), _ev_ds->size());
84         printf("LXDD: buffer @%p\n", _ev_ds_m.get());
85         return 0;
86       }
87     catch (...)
88       {
89         printf("could not find linux proxy input\n");
90       }
91     return 1;
92   }
93
94   void poll_events()
95   {
96     enum { Ax = 10 };
97
98     //Motion_merger<Ax> mm;
99     Motion_fwd mm;
100     mm.process/*<L4Re::Event_buffer::Event>*/(Iter(&_ev), Iter(), Emit(_core->user_state()));
101   }
102 };
103
104 static Input_driver_lxproxy _lxpinput;
105 }