]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kern/ia32/vm.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / vm.cpp
1 INTERFACE:
2
3 #include "task.h"
4
5 class Vm : public Task
6 {
7 public:
8   explicit Vm(Ram_quota *q) : Task(q, Caps::mem() | Caps::obj()) {}
9   int resume_vcpu(Context *, Vcpu_state *, bool) = 0;
10 };
11
12 template< typename VM >
13 struct Vm_allocator
14 {
15   static Kmem_slab_t<VM> a;
16 };
17
18 template<typename VM>
19 Kmem_slab_t<VM> Vm_allocator<VM>::a("Vm");
20
21
22 // ------------------------------------------------------------------------
23 INTERFACE [obj_space_virt]:
24
25 #include "obj_space_phys_util.h"
26
27 EXTENSION class Vm : Obj_space_phys<Vm>
28 {
29 public:
30   typedef Obj_space_phys<Vm> Vm_obj_space;
31   using Task::ram_quota;
32   static Ram_quota *ram_quota(Vm_obj_space const *obj_sp)
33   { return static_cast<Vm const *>(obj_sp)->ram_quota(); }
34
35   bool v_lookup(Obj_space::V_pfn const &virt, Obj_space::Phys_addr *phys,
36                 Obj_space::Page_order *size, Obj_space::Attr *attribs);
37
38   L4_fpage::Rights v_delete(Obj_space::V_pfn virt, Order size,
39                             L4_fpage::Rights page_attribs);
40   Obj_space::Status v_insert(Obj_space::Phys_addr phys,
41                              Obj_space::V_pfn const &virt,
42                              Order size,
43                              Obj_space::Attr page_attribs);
44
45   Obj_space::Capability lookup(Cap_index virt);
46   Obj_space::V_pfn obj_map_max_address() const;
47   void caps_free();
48 };
49
50
51 // ------------------------------------------------------------------------
52 IMPLEMENTATION:
53
54 PUBLIC inline
55 Page_number
56 Vm::mem_space_map_max_address() const
57 { return Page_number(1UL << (MWORD_BITS - Mem_space::Page_shift)); }
58
59 PUBLIC static
60 template< typename VM >
61 Slab_cache *
62 Vm::allocator()
63 { return &Vm_allocator<VM>::a; }
64
65 // ------------------------------------------------------------------------
66 IMPLEMENTATION [ia32]:
67
68 PROTECTED static inline
69 bool
70 Vm::is_64bit()
71 { return false; }
72
73 // ------------------------------------------------------------------------
74 IMPLEMENTATION [amd64]:
75
76 PROTECTED static inline
77 bool
78 Vm::is_64bit()
79 { return true; }
80
81
82 //----------------------------------------------------------------------------
83 IMPLEMENTATION [obj_space_virt]:
84
85 //
86 // Utilities for map<Generic_obj_space> and unmap<Generic_obj_space>
87 //
88
89 IMPLEMENT
90 void __attribute__((__flatten__))
91 Vm::caps_free()
92 { Vm_obj_space::caps_free(); }
93
94 IMPLEMENT
95 inline
96 bool __attribute__((__flatten__))
97 Vm::v_lookup(Obj_space::V_pfn const &virt, Obj_space::Phys_addr *phys,
98              Obj_space::Page_order *size, Obj_space::Attr *attribs)
99 { return Vm_obj_space::v_lookup(virt, phys, size, attribs); }
100
101 IMPLEMENT
102 inline __attribute__((__flatten__))
103 Obj_space::Capability __attribute__((__flatten__))
104 Vm::lookup(Cap_index virt)
105 { return Vm_obj_space::lookup(virt); }
106
107 IMPLEMENT
108 inline __attribute__((__flatten__))
109 L4_fpage::Rights __attribute__((__flatten__))
110 Vm::v_delete(Obj_space::V_pfn virt, Obj_space::Page_order size,
111              L4_fpage::Rights page_attribs)
112 { return Vm_obj_space::v_delete(virt, size, page_attribs); }
113
114 IMPLEMENT
115 inline __attribute__((__flatten__))
116 Obj_space::Status __attribute__((__flatten__))
117 Vm::v_insert(Obj_space::Phys_addr phys, Obj_space::V_pfn const &virt,
118              Obj_space::Page_order size, Obj_space::Attr page_attribs)
119 { return (Obj_space::Status)Vm_obj_space::v_insert(phys, virt, size, page_attribs); }
120
121 IMPLEMENT
122 inline __attribute__((__flatten__))
123 Obj_space::V_pfn
124 Vm::obj_map_max_address() const
125 { return Vm_obj_space::obj_map_max_address(); }
126
127 // ------------------------------------------------------------------------------
128 IMPLEMENTATION [obj_space_virt && debug]:
129
130 PUBLIC static inline
131 Vm *
132 Vm::get_space(Vm_obj_space *base)
133 { return static_cast<Vm*>(base); }
134
135 PUBLIC virtual
136 Vm::Vm_obj_space::Entry *
137 Vm::jdb_lookup_cap(Cap_index index)
138 { return Vm_obj_space::jdb_lookup_cap(index); }
139
140 // ------------------------------------------------------------------------------
141 IMPLEMENTATION [obj_space_virt && !debug]:
142
143 PUBLIC static inline
144 Vm *
145 Vm::get_space(Vm_obj_space *)
146 { return 0; }