]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/vmm/server/src/arm_hyp.h
update
[l4.git] / l4 / pkg / vmm / server / src / arm_hyp.h
1 #pragma once
2
3 #include <l4/sys/l4int.h>
4 #include <l4/sys/vcpu.h>
5 #include <l4/sys/irq>
6 #include <l4/cxx/bitfield>
7
8 namespace Vmm {
9 namespace Arm {
10
11 class Hsr
12 {
13 public:
14   Hsr() = default;
15   explicit Hsr(l4_uint32_t ec) : _raw(ec) {}
16   l4_uint32_t _raw;
17
18   l4_uint32_t raw() const { return _raw; }
19
20   CXX_BITFIELD_MEMBER(26, 31, ec, _raw);
21   CXX_BITFIELD_MEMBER(25, 25, il, _raw);
22   CXX_BITFIELD_MEMBER(24, 24, cv, _raw);
23   CXX_BITFIELD_MEMBER(20, 23, cond, _raw);
24
25   /** \pre ec == 0x01 */
26   CXX_BITFIELD_MEMBER( 0,  0, wfe_trapped, _raw);
27
28   CXX_BITFIELD_MEMBER(17, 19, mcr_opc2, _raw);
29   CXX_BITFIELD_MEMBER(16, 19, mcrr_opc1, _raw);
30   CXX_BITFIELD_MEMBER(14, 16, mcr_opc1, _raw);
31   CXX_BITFIELD_MEMBER(10, 13, mcr_crn, _raw);
32   CXX_BITFIELD_MEMBER(10, 13, mcrr_rt2, _raw);
33   CXX_BITFIELD_MEMBER( 5,  8, mcr_rt, _raw);
34   CXX_BITFIELD_MEMBER( 1,  4, mcr_crm, _raw);
35   CXX_BITFIELD_MEMBER( 0,  0, mcr_read, _raw);
36
37   CXX_BITFIELD_MEMBER(12, 19, ldc_imm, _raw);
38   CXX_BITFIELD_MEMBER( 5,  8, ldc_rn, _raw);
39   CXX_BITFIELD_MEMBER( 4,  4, ldc_offset_form, _raw);
40   CXX_BITFIELD_MEMBER( 1,  3, ldc_addressing_mode, _raw);
41
42   CXX_BITFIELD_MEMBER( 5,  5, cpt_simd, _raw);
43   CXX_BITFIELD_MEMBER( 0,  3, cpt_cpnr, _raw);
44
45   CXX_BITFIELD_MEMBER( 0,  3, bxj_rm, _raw);
46
47   CXX_BITFIELD_MEMBER( 0, 15, svc_imm, _raw);
48
49   CXX_BITFIELD_MEMBER(24, 24, pf_isv, _raw);
50   CXX_BITFIELD_MEMBER(22, 23, pf_sas, _raw);
51   CXX_BITFIELD_MEMBER(21, 21, pf_sse, _raw);
52   CXX_BITFIELD_MEMBER(16, 19, pf_srt, _raw);
53   CXX_BITFIELD_MEMBER( 9,  9, pf_ea, _raw);
54   CXX_BITFIELD_MEMBER( 8,  8, pf_cache_maint, _raw);
55   CXX_BITFIELD_MEMBER( 7,  7, pf_s1ptw, _raw);
56   CXX_BITFIELD_MEMBER( 6,  6, pf_write, _raw);
57   CXX_BITFIELD_MEMBER( 0,  5, pf_fsc, _raw);
58 };
59
60 namespace Gic_h {
61
62   struct Hcr
63   {
64     l4_uint32_t raw;
65     Hcr() = default;
66     explicit Hcr(l4_uint32_t v) : raw(v) {}
67     CXX_BITFIELD_MEMBER(  0,  0, en, raw);
68     CXX_BITFIELD_MEMBER(  1,  1, uie, raw);
69     CXX_BITFIELD_MEMBER(  2,  2, lr_en_pie, raw);
70     CXX_BITFIELD_MEMBER(  3,  3, n_pie, raw);
71     CXX_BITFIELD_MEMBER(  4,  4, vgrp0_eie, raw);
72     CXX_BITFIELD_MEMBER(  5,  5, vgrp0_die, raw);
73     CXX_BITFIELD_MEMBER(  6,  6, vgrp1_eie, raw);
74     CXX_BITFIELD_MEMBER(  7,  7, vgrp1_die, raw);
75     CXX_BITFIELD_MEMBER( 27, 31, eoi_cnt, raw);
76   };
77
78   struct Vtr
79   {
80     l4_uint32_t raw;
81     Vtr() = default;
82     explicit Vtr(l4_uint32_t v) : raw(v) {}
83     CXX_BITFIELD_MEMBER(  0,  5, list_regs, raw);
84     CXX_BITFIELD_MEMBER( 26, 28, pre_bits, raw);
85     CXX_BITFIELD_MEMBER( 29, 31, pri_bits, raw);
86   };
87
88   struct Vmcr
89   {
90     l4_uint32_t raw;
91     Vmcr() = default;
92     explicit Vmcr(l4_uint32_t v) : raw(v) {}
93     CXX_BITFIELD_MEMBER(  0,  0, grp0_en, raw);
94     CXX_BITFIELD_MEMBER(  1,  1, grp1_en, raw);
95     CXX_BITFIELD_MEMBER(  2,  2, ack_ctl, raw);
96     CXX_BITFIELD_MEMBER(  3,  3, fiq_en, raw);
97     CXX_BITFIELD_MEMBER(  4,  4, cbpr, raw);
98     CXX_BITFIELD_MEMBER(  9,  9, vem, raw);
99     CXX_BITFIELD_MEMBER( 18, 20, abp, raw);
100     CXX_BITFIELD_MEMBER( 21, 23, bp, raw);
101     CXX_BITFIELD_MEMBER( 27, 31, pri_mask, raw);
102   };
103
104   struct Misr
105   {
106     l4_uint32_t raw;
107     Misr() = default;
108     explicit Misr(l4_uint32_t v) : raw(v) {}
109     CXX_BITFIELD_MEMBER(  0,  0, eoi, raw);
110     CXX_BITFIELD_MEMBER(  1,  1, u, raw);
111     CXX_BITFIELD_MEMBER(  2,  2, lrenp, raw);
112     CXX_BITFIELD_MEMBER(  3,  3, np, raw);
113     CXX_BITFIELD_MEMBER(  4,  4, grp0_e, raw);
114     CXX_BITFIELD_MEMBER(  5,  5, grp0_d, raw);
115     CXX_BITFIELD_MEMBER(  6,  6, grp1_e, raw);
116     CXX_BITFIELD_MEMBER(  7,  7, grp1_d, raw);
117   };
118
119   struct Lr
120   {
121     enum State
122     {
123       Empty              = 0,
124       Pending            = 1,
125       Active             = 2,
126       Active_and_pending = 3
127     };
128
129     l4_uint32_t raw;
130     Lr() = default;
131     explicit Lr(l4_uint32_t v) : raw(v) {}
132     CXX_BITFIELD_MEMBER(  0,  9, vid, raw);
133     CXX_BITFIELD_MEMBER( 10, 19, pid, raw);
134     CXX_BITFIELD_MEMBER( 10, 12, cpuid, raw);
135     CXX_BITFIELD_MEMBER( 19, 19, eoi, raw);
136     CXX_BITFIELD_MEMBER( 23, 27, prio, raw);
137     CXX_BITFIELD_MEMBER( 28, 29, state, raw);
138     CXX_BITFIELD_MEMBER( 28, 28, pending, raw);
139     CXX_BITFIELD_MEMBER( 29, 29, active, raw);
140     CXX_BITFIELD_MEMBER( 30, 30, grp1, raw);
141     CXX_BITFIELD_MEMBER( 31, 31, hw, raw);
142   };
143 }
144
145 struct State
146 {
147   struct Per_mode_regs
148   {
149     l4_umword_t sp;
150     l4_umword_t lr;
151     l4_umword_t spsr;
152   };
153
154   struct Regs
155   {
156     l4_uint32_t hcr;
157
158     l4_uint64_t ttbr0;
159     l4_uint64_t ttbr1;
160     l4_uint32_t ttbcr;
161     l4_uint32_t sctlr;
162     l4_uint32_t dacr;
163     l4_uint32_t fcseidr;
164     l4_uint32_t contextidr;
165
166     Per_mode_regs svc;
167   };
168
169   template< unsigned LREGS >
170   struct Gic_t
171   {
172     Gic_h::Hcr hcr;
173     Gic_h::Vtr vtr;
174     Gic_h::Vmcr vmcr;
175     Gic_h::Misr misr;
176     l4_uint32_t eisr[2];
177     l4_uint32_t elsr[2];
178     l4_uint32_t apr;
179     Gic_h::Lr lr[LREGS];
180   };
181
182   typedef Gic_t<4> Gic;
183
184   Regs vm_regs;
185   Regs host_regs;
186   Gic  gic;
187
188   l4_uint64_t cntvoff;
189
190   l4_uint64_t cntv_cval;
191   l4_uint32_t cntkctl;
192   l4_uint32_t cntv_ctl;
193 };
194
195 inline State *
196 vm_state(l4_vcpu_state_t *vcpu)
197 {
198   return reinterpret_cast<State *>(reinterpret_cast<char *>(vcpu) + 0x400);
199 }
200 }
201 }