]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/vmm/server/src/generic_guest.h
Update
[l4.git] / l4 / pkg / vmm / server / src / generic_guest.h
1 /*
2  * Copyright (C) 2015 Kernkonzept GmbH.
3  * Author(s): Sarah Hoffmann <sarah.hoffmann@kernkonzept.com>
4  *
5  * This file is distributed under the terms of the GNU General Public
6  * License, version 2.  Please see the COPYING-GPL-2 file for details.
7  */
8 #pragma once
9
10 #include <l4/re/dataspace>
11 #include <l4/re/util/br_manager>
12 #include <l4/re/util/object_registry>
13 #include <l4/l4virtio/virtqueue>
14
15 #include "device_tree.h"
16 #include "ds_mmio_mapper.h"
17 #include "ram_ds.h"
18 #include "vm_memmap.h"
19 #include "vcpu.h"
20
21 namespace Vmm {
22
23 class Generic_guest
24 {
25 public:
26     explicit Generic_guest(L4::Cap<L4Re::Dataspace> ram, l4_addr_t vm_base = ~0UL);
27
28     virtual ~Generic_guest() = default;
29
30     Cpu create_cpu();
31
32     Device_tree device_tree() const
33     { return Device_tree(_ram.access(_device_tree)); }
34
35     bool has_device_tree() const
36     { return _device_tree.is_valid(); }
37
38 protected:
39     void load_device_tree_at(char const *src, l4_addr_t base, l4_size_t padding);
40     l4_size_t load_ramdisk_at(char const *ram_disk, l4_addr_t offset);
41
42     void handle_ipc(l4_msgtag_t tag, l4_umword_t label, l4_utcb_t *utcb)
43     {
44       l4_msgtag_t r = _registry.dispatch(tag, label, utcb);
45       if (r.label() != -L4_ENOREPLY)
46         l4_ipc_send(L4_INVALID_CAP | L4_SYSF_REPLY, utcb, r,
47                     L4_IPC_SEND_TIMEOUT_0);
48     }
49
50     bool handle_mmio(l4_uint32_t pfa, Cpu vcpu)
51     {
52       Vm_mem::const_iterator f = _memmap.find(pfa);
53       if (f == _memmap.end())
54         return false;
55
56       return f->second->access(pfa, pfa - f->first.start,
57                                vcpu, _task.get(),
58                                f->first.start, f->first.end);
59     }
60
61     L4Re::Util::Br_manager _bm;
62     L4Re::Util::Object_registry _registry;
63     Vm_mem _memmap;
64     Ram_ds _ram;
65     L4Re::Util::Auto_cap<L4::Task>::Cap _task;
66     L4virtio::Ptr<void> _device_tree;
67
68 private:
69     Ds_handler _ram_pf_handler;
70 };
71
72 } // namespace