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)
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.
10 #include <l4/mag/server/input_driver>
12 #include <l4/re/namespace>
15 #include <l4/re/error_helper>
16 #include <l4/re/util/cap_alloc>
17 #include <l4/cxx/exceptions>
21 namespace Mag_server {
23 using L4Re::Util::Auto_cap;
29 L4Re::Event_buffer *_ev;
30 L4Re::Event_buffer::Event *e;
32 explicit Iter() : _ev(0), e(0) {}
33 explicit Iter(L4Re::Event_buffer *ev) : _ev(ev), e(_ev->next()) {}
41 bool operator != (Iter const &o) const
44 L4Re::Event_buffer::Event *operator -> () const { return e; }
45 L4Re::Event_buffer::Event &operator * () const { return *e; }
51 Emit(User_state *u) : u(u) {}
52 void operator () (L4Re::Event_buffer::Event const &e) const
53 { u->handle_event(e); }
56 class Input_driver_lxproxy : public Input_driver
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;
63 L4Re::Event_buffer _ev;
67 Input_driver_lxproxy() : Input_driver("L4Linux Proxy") {}
72 _ev_ds = L4Re::Util::cap_alloc.alloc<L4Re::Dataspace>();
73 _ev_irq = L4Re::Util::cap_alloc.alloc<L4::Irq>();
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));
83 _ev = L4Re::Event_buffer(_ev_ds_m.get(), _ev_ds->size());
84 printf("LXDD: buffer @%p\n", _ev_ds_m.get());
89 printf("could not find linux proxy input\n");
98 //Motion_merger<Ax> mm;
100 mm.process/*<L4Re::Event_buffer::Event>*/(Iter(&_ev), Iter(), Emit(_core->user_state()));
104 static Input_driver_lxproxy _lxpinput;