Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


initial SVM guest running
[palacios.git] / palacios / include / geekos / vmcb.h
1 #ifndef __VMCB_H
2 #define __VMCB_H
3
4 #include <geekos/ktypes.h>
5
6
7 #define VMCB_CTRL_AREA_OFFSET                   0x0
8 #define VMCB_STATE_SAVE_AREA_OFFSET             0x400
9
10
11 #define GET_VMCB_CTRL_AREA(page)         (page + VMCB_CTRL_AREA_OFFSET)
12 #define GET_VMCB_SAVE_STATE_AREA(page)   (page + VMCB_STATE_SAVE_AREA_OFFSET)
13
14
15 #if __TINYC__
16 #define PACKED
17 #else
18 #define PACKED __attribute__((packed))
19 #endif
20
21
22 typedef void vmcb_t;
23
24
25 union Ctrl_Registers {
26   ushort_t bitmap                PACKED;
27   struct {
28     uint_t cr0        : 1        PACKED;
29     uint_t cr1        : 1        PACKED;
30     uint_t cr2        : 1        PACKED;
31     uint_t cr3        : 1        PACKED;
32     uint_t cr4        : 1        PACKED;
33     uint_t cr5        : 1        PACKED;
34     uint_t cr6        : 1        PACKED;
35     uint_t cr7        : 1        PACKED;
36     uint_t cr8        : 1        PACKED;
37     uint_t cr9        : 1        PACKED;
38     uint_t cr10       : 1        PACKED;
39     uint_t cr11       : 1        PACKED;
40     uint_t cr12       : 1        PACKED;
41     uint_t cr13       : 1        PACKED;
42     uint_t cr14       : 1        PACKED;
43     uint_t cr15       : 1        PACKED;
44   } crs;
45 };
46
47
48 union Debug_Registers {
49   ushort_t bitmap                PACKED;
50   struct {
51     uint_t dr0        : 1        PACKED;
52     uint_t dr1        : 1        PACKED;
53     uint_t dr2        : 1        PACKED;
54     uint_t dr3        : 1        PACKED;
55     uint_t dr4        : 1        PACKED;
56     uint_t dr5        : 1        PACKED;
57     uint_t dr6        : 1        PACKED;
58     uint_t dr7        : 1        PACKED;
59     uint_t dr8        : 1        PACKED;
60     uint_t dr9        : 1        PACKED;
61     uint_t dr10       : 1        PACKED;
62     uint_t dr11       : 1        PACKED;
63     uint_t dr12       : 1        PACKED;
64     uint_t dr13       : 1        PACKED;
65     uint_t dr14       : 1        PACKED;
66     uint_t dr15       : 1        PACKED;
67   } drs;
68 };
69
70
71 union Exception_Vectors {
72   uint_t bitmap                  PACKED;
73   struct {
74     uint_t ex0         : 1        PACKED;
75     uint_t ex1         : 1        PACKED;
76     uint_t ex2         : 1        PACKED;
77     uint_t ex3         : 1        PACKED;
78     uint_t ex4         : 1        PACKED;
79     uint_t ex5         : 1        PACKED;
80     uint_t ex6         : 1        PACKED;
81     uint_t ex7         : 1        PACKED;
82     uint_t ex8         : 1        PACKED;
83     uint_t ex9         : 1        PACKED;
84     uint_t ex10        : 1        PACKED;
85     uint_t ex11        : 1        PACKED;
86     uint_t ex12        : 1        PACKED;
87     uint_t ex13        : 1        PACKED;
88     uint_t ex14        : 1        PACKED;
89     uint_t ex15        : 1        PACKED;
90     uint_t ex16        : 1        PACKED;
91     uint_t ex17        : 1        PACKED;
92     uint_t ex18        : 1        PACKED;
93     uint_t ex19        : 1        PACKED;
94     uint_t ex20        : 1        PACKED;
95     uint_t ex21        : 1        PACKED;
96     uint_t ex22        : 1        PACKED;
97     uint_t ex23        : 1        PACKED;
98     uint_t ex24        : 1        PACKED;
99     uint_t ex25        : 1        PACKED;
100     uint_t ex26        : 1        PACKED;
101     uint_t ex27        : 1        PACKED;
102     uint_t ex28        : 1        PACKED;
103     uint_t ex29        : 1        PACKED;
104     uint_t ex30        : 1        PACKED;
105     uint_t ex31        : 1        PACKED;
106   } exceptions;
107 };
108
109
110 union Instr_Intercepts {
111   uint_t bitmap                  PACKED;
112   struct {
113     uint_t INTR        : 1        PACKED;
114     uint_t NMI         : 1        PACKED;
115     uint_t SMI         : 1        PACKED;
116     uint_t INIT        : 1        PACKED;
117     uint_t VINTR       : 1        PACKED;
118     uint_t CR0         : 1        PACKED;
119     uint_t RD_IDTR     : 1        PACKED;
120     uint_t RD_GDTR     : 1        PACKED;
121     uint_t RD_LDTR     : 1        PACKED;
122     uint_t RD_TR       : 1        PACKED;
123     uint_t WR_IDTR     : 1        PACKED;
124     uint_t WR_GDTR     : 1        PACKED;
125     uint_t WR_LDTR     : 1        PACKED;
126     uint_t WR_TR       : 1        PACKED;
127     uint_t RDTSC       : 1        PACKED;
128     uint_t RDPMC       : 1        PACKED;
129     uint_t PUSHF       : 1        PACKED;
130     uint_t POPF        : 1        PACKED;
131     uint_t CPUID       : 1        PACKED;
132     uint_t RSM         : 1        PACKED;
133     uint_t IRET        : 1        PACKED;
134     uint_t INTn        : 1        PACKED;
135     uint_t INVD        : 1        PACKED;
136     uint_t PAUSE       : 1        PACKED;
137     uint_t HLT         : 1        PACKED;
138     uint_t INVPLG      : 1        PACKED;
139     uint_t INVPLGA     : 1        PACKED;
140     uint_t IOIO_PROT   : 1        PACKED;
141     uint_t MSR_PROT    : 1        PACKED;
142     uint_t task_switch : 1        PACKED;
143     uint_t FERR_FREEZE : 1        PACKED;
144     uint_t shutdown_evts: 1       PACKED;
145   } instrs;
146 };
147
148 union SVM_Instr_Intercepts { 
149   uint_t bitmap                  PACKED;
150   struct {
151     uint_t VMRUN      : 1         PACKED;
152     uint_t VMMCALL    : 1         PACKED;
153     uint_t VMLOAD     : 1         PACKED;
154     uint_t VMSAVE     : 1         PACKED;
155     uint_t STGI       : 1         PACKED;
156     uint_t CLGI       : 1         PACKED;
157     uint_t SKINIT     : 1         PACKED;
158     uint_t RDTSCP     : 1         PACKED;
159     uint_t ICEBP      : 1         PACKED;
160     uint_t WBINVD     : 1         PACKED;
161     uint_t MONITOR    : 1         PACKED;
162     uint_t MWAIT_always : 1       PACKED;
163     uint_t MWAIT_if_armed : 1     PACKED;
164     uint_t reserved  : 19         PACKED;  // Should be 0
165   } instrs;
166 };
167
168
169 union Guest_Control {
170   uint_t bitmap                  PACKED;
171   struct {
172     uchar_t V_TPR                 PACKED;
173     uint_t V_IRQ      : 1         PACKED;
174     uint_t rsvd1      : 7         PACKED;  // Should be 0
175     uint_t V_INTR_PRIO : 4        PACKED;
176     uint_t V_IGN_TPR  : 1         PACKED;
177     uint_t rsvd2      : 3         PACKED;  // Should be 0
178     uint_t V_INTR_MASKING : 1     PACKED;
179     uint_t rsvd3      : 7         PACKED;  // Should be 0
180     uchar_t V_INTR_VECTOR         PACKED;
181     uint_t rsvd4      : 24        PACKED;  // Should be 0
182   } ctrls;
183 };
184
185
186
187 typedef struct VMCB_Control_Area {
188   // offset 0x0
189   union Ctrl_Registers cr_reads         PACKED;
190   union Ctrl_Registers cr_writes        PACKED;
191   union Debug_Registers dr_reads        PACKED;
192   union Debug_Registers dr_writes       PACKED;
193   union Exception_Vectors exceptions    PACKED;
194   union Instr_Intercepts instrs         PACKED;
195   union SVM_Instr_Intercepts svm_instrs PACKED;
196
197   uchar_t rsvd1[44]                     PACKED;  // Should be 0
198
199   // offset 0x040
200   ullong_t IOPM_BASE_PA                 PACKED;
201   ullong_t MSRPM_BASE_PA                PACKED;
202   ullong_t TSC_OFFSET                   PACKED;
203
204   uint_t guest_ASID                     PACKED;
205   uchar_t TLB_CONTROL                   PACKED;
206
207   uchar_t rsvd2[3]                      PACKED;  // Should be 0
208
209   union Guest_Control guest_ctrl        PACKED;
210   
211   uint_t interrupt_shadow  : 1          PACKED;
212   uint_t rsvd3             : 31         PACKED;  // Should be 0
213   uint_t rsvd4                          PACKED;  // Should be 0
214
215   ullong_t exit_code                    PACKED;
216   ullong_t exit_info1                   PACKED;
217   ullong_t exit_info2                   PACKED;
218
219   /* This could be a typo in the manual....
220    * It doesn't actually say that there is a reserved bit
221    * But it does say that the EXITINTINFO field is in bits 63-1
222    * ALL other occurances mention a 1 bit reserved field
223    */
224   uint_t rsvd5             : 1          PACKED;
225   ullong_t exit_int_info   : 63         PACKED;
226   /* ** */
227
228   uint_t NP_ENABLE         : 1          PACKED;
229   ullong_t rsvd6           : 63         PACKED;  // Should be 0 
230
231   uchar_t rsvd7[16]                     PACKED;  // Should be 0
232
233   // Offset 0xA8
234   ullong_t EVENTINJ                     PACKED;
235
236
237   /* This could be a typo in the manual....
238    * It doesn't actually say that there is a reserved bit
239    * But it does say that the EXITINTINFO field is in bits 63-1
240    * ALL other occurances mention a 1 bit reserved field
241    */
242   uint_t rsvd8              : 1         PACKED;
243   ullong_t N_CR3            : 63        PACKED;
244   /* ** */
245
246   uint_t LBR_VIRTUALIZATION_ENABLE : 1  PACKED;
247   ullong_t rsvd9            : 63        PACKED;   // Should be 0
248
249 } vmcb_ctrl_t;
250
251
252
253
254
255
256 struct vmcb_selector {
257   ushort_t selector                   PACKED;
258
259   /* These attributes are basically a direct map of the attribute fields of a segment desc.
260    * The segment limit in the middle is removed and the fields are pused together
261    * There IS empty space at the end... See AMD Arch vol3, sect. 4.7.1,  pg 78
262    */
263   union {
264     ushort_t raw                      PACKED;
265     struct {
266       uint_t type              : 4    PACKED; // segment type, [see Intel vol. 3b, sect. 3.4.5.1 (because I have the books)]
267       uint_t S                 : 1    PACKED; // System=0, code/data=1
268       uint_t dpl               : 2    PACKED; // priviledge level, corresonds to protection ring
269       uint_t P                 : 1    PACKED; // present flag
270       uint_t avl               : 1    PACKED; // available for use by system software
271       uint_t L                 : 1    PACKED; // long mode (64 bit?)
272       uint_t db                : 1    PACKED; // default op size (0=16 bit seg, 1=32 bit seg)
273       uint_t G                 : 1    PACKED; // Granularity, (0=bytes, 1=4k)      
274     } fields;
275   } attrib;
276   uint_t  limit                       PACKED;
277   ullong_t base                       PACKED;
278 };
279
280
281 typedef struct VMCB_State_Save_Area {
282   struct vmcb_selector es            PACKED; // only lower 32 bits of base are implemented
283   struct vmcb_selector cs            PACKED; // only lower 32 bits of base are implemented
284   struct vmcb_selector ss            PACKED; // only lower 32 bits of base are implemented
285   struct vmcb_selector ds            PACKED; // only lower 32 bits of base are implemented
286   struct vmcb_selector fs            PACKED; 
287   struct vmcb_selector gs            PACKED; 
288
289   struct vmcb_selector gdtr          PACKED; // selector+attrib are reserved, only lower 16 bits of limit are implemented
290   struct vmcb_selector ldtr          PACKED; 
291   struct vmcb_selector idtr          PACKED; // selector+attrib are reserved, only lower 16 bits of limit are implemented
292   struct vmcb_selector tr            PACKED; 
293
294   uchar_t rsvd1[43]                  PACKED;
295
296   //offset 0x0cb
297   uchar_t cpl                        PACKED; // if the guest is real-mode then the CPL is forced to 0
298                                              // if the guest is virtual-mode then the CPL is forced to 3
299
300   uint_t rsvd2                       PACKED;
301
302   // offset 0x0d0
303   ullong_t efer                      PACKED;
304
305   uchar_t rsvd3[112]                 PACKED;
306   
307   //offset 0x148
308   ullong_t cr4                       PACKED;
309   ullong_t cr3                       PACKED;
310   ullong_t cr0                       PACKED;
311   ullong_t dr7                       PACKED;
312   ullong_t dr6                       PACKED;
313   ullong_t rflags                    PACKED;
314   ullong_t rip                       PACKED;
315
316   uchar_t rsvd4[88]                  PACKED;
317   
318   //offset 0x1d8
319   ullong_t rsp                       PACKED;
320
321   uchar_t rsvd5[24]                  PACKED;
322
323   //offset 0x1f8
324   ullong_t rax                       PACKED;
325   ullong_t star                      PACKED;
326   ullong_t lstar                     PACKED;
327   ullong_t cstar                     PACKED;
328   ullong_t sfmask                    PACKED;
329   ullong_t KernelGsBase              PACKED;
330   ullong_t sysenter_cs               PACKED;
331   ullong_t sysenter_esp              PACKED;
332   ullong_t sysenter_eip              PACKED;
333   ullong_t cr2                       PACKED;
334
335
336   uchar_t rsvd6[32]                  PACKED;
337
338   //offset 0x268
339   ullong_t g_pat                     PACKED; // Guest PAT                     
340                                              //   -- only used if nested paging is enabled
341   ullong_t dbgctl                    PACKED; // Guest DBGCTL MSR               
342                                              //   -- only used if the LBR registers are virtualized
343   ullong_t br_from                   PACKED; // Guest LastBranchFromIP MSR
344                                              //   -- only used if the LBR registers are virtualized
345   ullong_t br_to                     PACKED; // Guest LastBranchToIP MSR   
346                                              //   -- only used if the LBR registers are virtualized
347   ullong_t lastexcpfrom              PACKED; // Guest LastExceptionFromIP MSR
348                                              //   -- only used if the LBR registers are virtualized
349   ullong_t lastexcpto                PACKED; // Guest LastExceptionToIP MSR 
350                                              //   -- only used if the LBR registers are virtualized
351
352 } vmcb_saved_state_t;
353
354
355
356
357 #endif