2 * (c) 2013-2014 Alexander Warg <warg@os.inf.tu-dresden.de>
3 * economic rights: Technische Universität Dresden (Germany)
5 * This file is part of TUD:OS and distributed under the terms of the
6 * GNU General Public License 2.
7 * Please see the COPYING-GPL-2 file for details.
11 #include <l4/re/dataspace>
12 #include <l4/util/util.h>
14 #include "mmio_device.h"
17 class Ds_handler : public Vmm::Mmio_device
19 L4::Cap<L4Re::Dataspace> _ds;
21 bool access(l4_addr_t pfa, l4_addr_t offset, Vmm::Cpu vcpu,
22 L4::Cap<L4::Task> vm_task, l4_addr_t min, l4_addr_t max)
26 res = _ds->map(offset + _offset,
27 vcpu.pf_write() ? L4Re::Dataspace::Map_rw : 0,
28 pfa, min, max, vm_task);
31 unsigned char ps = L4_PAGESHIFT;
33 if (l4_trunc_size(pfa, L4_SUPERPAGESHIFT) >= min
34 && l4_round_size(pfa, L4_SUPERPAGESHIFT) <= max)
35 ps = L4_SUPERPAGESHIFT;
37 res = L4Re::chksys(vm_task->map(L4Re::This_task,
38 l4_fpage(l4_trunc_size(_local_start + offset, ps),
41 ? L4_FPAGE_RWX : L4_FPAGE_RX),
42 l4_trunc_size(pfa, ps)));
47 Err().printf("cannot handle VM memory access @ %lx ip=%lx r=%ld\n",
48 pfa, vcpu->r.ip, res);
55 l4_addr_t _local_start;
59 explicit Ds_handler(L4::Cap<L4Re::Dataspace> ds,
60 l4_addr_t local_start,
63 : _ds(ds), _offset(offset)
65 , _local_start(local_start)
70 L4Re::chksys(L4Re::Env::env()->rm()->attach(&_local_start,
73 : L4Re::chksys(ds->size()),
75 | L4Re::Rm::Eager_map,
76 L4::Ipc::make_cap_rw(ds),
77 offset, L4_SUPERPAGESHIFT));