3 #include <l4/re/dataspace>
4 #include <l4/util/util.h>
6 #include "arm_mmio_device.h"
8 class Ds_handler : public Vmm::Mmio_device
10 L4::Cap<L4Re::Dataspace> _ds;
12 bool access(l4_addr_t pfa, l4_addr_t offset, l4_vcpu_state_t *vcpu,
13 L4::Cap<L4::Task> vm_task, l4_addr_t min, l4_addr_t max)
15 Vmm::Arm::Hsr hsr(vcpu->r.err);
18 res = _ds->map(offset + _offset,
19 hsr.pf_write() ? L4Re::Dataspace::Map_rw : 0,
20 pfa, min, max, vm_task);
23 unsigned char ps = L4_PAGESHIFT;
25 if (l4_trunc_size(pfa, L4_SUPERPAGESHIFT) >= min
26 && l4_round_size(pfa, L4_SUPERPAGESHIFT) <= max)
27 ps = L4_SUPERPAGESHIFT;
29 res = L4Re::chksys(vm_task->map(L4Re::This_task,
30 l4_fpage(l4_trunc_size(_local_start + offset, ps),
33 ? L4_FPAGE_RWX : L4_FPAGE_RX),
34 l4_trunc_size(pfa, ps)));
39 Err().printf("cannot handle VM memory access @ %lx ip=%lx r=%ld\n",
40 pfa, vcpu->r.ip, res);
47 l4_addr_t _local_start;
51 explicit Ds_handler(L4::Cap<L4Re::Dataspace> ds,
52 l4_addr_t local_start,
55 : _ds(ds), _offset(offset)
57 , _local_start(local_start)
62 L4Re::chksys(L4Re::Env::env()->rm()->attach(&_local_start,
65 : L4Re::chksys(ds->size()),
67 | L4Re::Rm::Eager_map,
68 ds, offset, L4_SUPERPAGESHIFT));