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.


code restructuring
[palacios.git] / palacios / include / palacios / vmcs.h
1 #ifndef __VMCS_H
2 #define __VMCS_H
3
4 #include <palacios/vmm_types.h>
5
6
7 /* 16 bit guest state */
8 #define VMCS_GUEST_ES_SELECTOR  0x00000800
9 #define VMCS_GUEST_CS_SELECTOR  0x00000802
10 #define VMCS_GUEST_SS_SELECTOR  0x00000804
11 #define VMCS_GUEST_DS_SELECTOR  0x00000806
12 #define VMCS_GUEST_FS_SELECTOR  0x00000808
13 #define VMCS_GUEST_GS_SELECTOR  0x0000080A
14 #define VMCS_GUEST_LDTR_SELECTOR  0x0000080C
15 #define VMCS_GUEST_TR_SELECTOR  0x0000080E
16
17 /* 16 bit host state */
18 #define VMCS_HOST_ES_SELECTOR 0x00000C00
19 #define VMCS_HOST_CS_SELECTOR 0x00000C02
20 #define VMCS_HOST_SS_SELECTOR 0x00000C04
21 #define VMCS_HOST_DS_SELECTOR 0x00000C06
22 #define VMCS_HOST_FS_SELECTOR 0x00000C08
23 #define VMCS_HOST_GS_SELECTOR 0x00000C0A
24 #define VMCS_HOST_TR_SELECTOR 0x00000C0C
25
26 /* 64 bit control fields */
27 #define IO_BITMAP_A_ADDR             0x00002000
28 #define IO_BITMAP_A_ADDR_HIGH        0x00002001
29 #define IO_BITMAP_B_ADDR             0x00002002
30 #define IO_BITMAP_B_ADDR_HIGH        0x00002003
31 // Only with "Use MSR Bitmaps" enabled
32 #define MSR_BITMAPS                  0x00002004
33 #define MSR_BITMAPS_HIGH             0x00002005
34 //
35 #define VM_EXIT_MSR_STORE_ADDR       0x00002006
36 #define VM_EXIT_MSR_STORE_ADDR_HIGH  0x00002007
37 #define VM_EXIT_MSR_LOAD_ADDR        0x00002008
38 #define VM_EXIT_MSR_LOAD_ADDR_HIGH   0x00002009
39 #define VM_ENTRY_MSR_LOAD_ADDR       0x0000200A
40 #define VM_ENTRY_MSR_LOAD_ADDR_HIGH  0x0000200B
41 #define VMCS_EXEC_PTR                0x0000200C
42 #define VMCS_EXEC_PTR_HIGH           0x0000200D
43 #define TSC_OFFSET                   0x00002010
44 #define TSC_OFFSET_HIGH              0x00002011
45 // Only with "Use TPR Shadow" enabled
46 #define VIRT_APIC_PAGE_ADDR          0x00002012  
47 #define VIRT_APIC_PAGE_ADDR_HIGH     0x00002013
48 //
49
50
51 /* 64 bit guest state fields */
52 #define VMCS_LINK_PTR                0x00002800
53 #define VMCS_LINK_PTR_HIGH           0x00002801
54 #define GUEST_IA32_DEBUGCTL          0x00002802
55 #define GUEST_IA32_DEBUGCTL_HIGH     0x00002803
56
57
58 /* 32 bit control fields */
59 #define PIN_VM_EXEC_CTRLS            0x00004000
60 #define PROC_VM_EXEC_CTRLS           0x00004002
61 #define EXCEPTION_BITMAP             0x00004004
62 #define PAGE_FAULT_ERROR_MASK        0x00004006
63 #define PAGE_FAULT_ERROR_MATCH       0x00004008
64 #define CR3_TARGET_COUNT             0x0000400A
65 #define VM_EXIT_CTRLS                0x0000400C
66 #define VM_EXIT_MSR_STORE_COUNT      0x0000400E
67 #define VM_EXIT_MSR_LOAD_COUNT       0x00004010
68 #define VM_ENTRY_CTRLS               0x00004012
69 #define VM_ENTRY_MSR_LOAD_COUNT      0x00004014
70 #define VM_ENTRY_INT_INFO_FIELD      0x00004016
71 #define VM_ENTRY_EXCEPTION_ERROR     0x00004018
72 #define VM_ENTRY_INSTR_LENGTH        0x0000401A
73 // Only with "Use TPR Shadow" Enabled
74 #define TPR_THRESHOLD                0x0000401C
75 //
76
77
78 /* 32 bit Read Only data fields */
79 #define VM_INSTR_ERROR               0x00004400
80 #define EXIT_REASON                  0x00004402
81 #define VM_EXIT_INT_INFO             0x00004404
82 #define VM_EXIT_INT_ERROR            0x00004406
83 #define IDT_VECTOR_INFO              0x00004408
84 #define IDT_VECTOR_ERROR             0x0000440A
85 #define VM_EXIT_INSTR_LENGTH         0x0000440C
86 #define VMX_INSTR_INFO               0x0000440E
87
88 /* 32 bit Guest state fields */
89 #define GUEST_ES_LIMIT               0x00004800
90 #define GUEST_CS_LIMIT               0x00004802
91 #define GUEST_SS_LIMIT               0x00004804
92 #define GUEST_DS_LIMIT               0x00004806
93 #define GUEST_FS_LIMIT               0x00004808
94 #define GUEST_GS_LIMIT               0x0000480A
95 #define GUEST_LDTR_LIMIT             0x0000480C
96 #define GUEST_TR_LIMIT               0x0000480E
97 #define GUEST_GDTR_LIMIT             0x00004810
98 #define GUEST_IDTR_LIMIT             0x00004812
99 #define GUEST_ES_ACCESS              0x00004814
100 #define GUEST_CS_ACCESS              0x00004816
101 #define GUEST_SS_ACCESS              0x00004818
102 #define GUEST_DS_ACCESS              0x0000481A
103 #define GUEST_FS_ACCESS              0x0000481C
104 #define GUEST_GS_ACCESS              0x0000481E
105 #define GUEST_LDTR_ACCESS            0x00004820
106 #define GUEST_TR_ACCESS              0x00004822
107 #define GUEST_INT_STATE              0x00004824
108 #define GUEST_ACTIVITY_STATE         0x00004826
109 #define GUEST_SMBASE                 0x00004828
110 #define GUEST_IA32_SYSENTER_CS       0x0000482A
111
112
113 /* 32 bit host state field */
114 #define HOST_IA32_SYSENTER_CS        0x00004C00
115
116 /* Natural Width Control Fields */
117 #define CR0_GUEST_HOST_MASK          0x00006000
118 #define CR4_GUEST_HOST_MASK          0x00006002
119 #define CR0_READ_SHADOW              0x00006004
120 #define CR4_READ_SHADOW              0x00006006
121 #define CR3_TARGET_VALUE_0           0x00006008
122 #define CR3_TARGET_VALUE_1           0x0000600A
123 #define CR3_TARGET_VALUE_2           0x0000600C
124 #define CR3_TARGET_VALUE_3           0x0000600E
125
126
127 /* Natural Width Read Only Fields */
128 #define EXIT_QUALIFICATION           0x00006400
129 #define IO_RCX                       0x00006402
130 #define IO_RSI                       0x00006404
131 #define IO_RDI                       0x00006406
132 #define IO_RIP                       0x00006408
133 #define GUEST_LINEAR_ADDR            0x0000640A
134
135 /* Natural Width Guest State Fields */
136 #define GUEST_CR0                    0x00006800
137 #define GUEST_CR3                    0x00006802
138 #define GUEST_CR4                    0x00006804
139 #define GUEST_ES_BASE                0x00006806
140 #define GUEST_CS_BASE                0x00006808
141 #define GUEST_SS_BASE                0x0000680A
142 #define GUEST_DS_BASE                0x0000680C
143 #define GUEST_FS_BASE                0x0000680E
144 #define GUEST_GS_BASE                0x00006810
145 #define GUEST_LDTR_BASE              0x00006812
146 #define GUEST_TR_BASE                0x00006814
147 #define GUEST_GDTR_BASE              0x00006816
148 #define GUEST_IDTR_BASE              0x00006818
149 #define GUEST_DR7                    0x0000681A
150 #define GUEST_RSP                    0x0000681C
151 #define GUEST_RIP                    0x0000681E
152 #define GUEST_RFLAGS                 0x00006820
153 #define GUEST_PENDING_DEBUG_EXCS     0x00006822
154 #define GUEST_IA32_SYSENTER_ESP      0x00006824
155 #define GUEST_IA32_SYSENTER_EIP      0x00006826
156
157
158 /* Natural Width Host State Fields */
159 #define HOST_CR0                     0x00006C00
160 #define HOST_CR3                     0x00006C02
161 #define HOST_CR4                     0x00006C04
162 #define HOST_FS_BASE                 0x00006C06
163 #define HOST_GS_BASE                 0x00006C08
164 #define HOST_TR_BASE                 0x00006C0A
165 #define HOST_GDTR_BASE               0x00006C0C
166 #define HOST_IDTR_BASE               0x00006C0E
167 #define HOST_IA32_SYSENTER_ESP       0x00006C10
168 #define HOST_IA32_SYSENTER_EIP       0x00006C12
169 #define HOST_RSP                     0x00006C14
170 #define HOST_RIP                     0x00006C16
171
172 /* Pin Based VM Execution Controls */
173 /* INTEL MANUAL: 20-10 vol 3B */
174 #define EXTERNAL_INTERRUPT_EXITING   0x00000001
175 #define NMI_EXITING                  0x00000008
176 #define VIRTUAL_NMIS                 0x00000020
177
178
179 /* Processor Based VM Execution Controls */
180 /* INTEL MANUAL: 20-11 vol. 3B */ 
181 #define INTERRUPT_WINDOWS_EXIT   0x00000004
182 #define USE_TSC_OFFSETTING       0x00000008
183 #define HLT_EXITING              0x00000080
184 #define INVLPG_EXITING           0x00000200
185 #define MWAIT_EXITING            0x00000400
186 #define RDPMC_EXITING            0x00000800
187 #define RDTSC_EXITING            0x00001000
188 #define CR8_LOAD_EXITING         0x00080000
189 #define CR8_STORE_EXITING        0x00100000
190 #define USE_TPR_SHADOW           0x00200000
191 #define NMI_WINDOW_EXITING       0x00400000
192 #define MOVDR_EXITING            0x00800000
193 #define UNCONDITION_IO_EXITING   0x01000000
194 #define USE_IO_BITMAPS           0x02000000
195 #define USE_MSR_BITMAPS          0x10000000
196 #define MONITOR_EXITING          0x20000000
197 #define PAUSE_EXITING            0x40000000
198
199 /* VM-Exit Controls */
200 /* INTEL MANUAL: 20-16 vol. 3B */
201 #define HOST_ADDR_SPACE_SIZE     0x00000200
202 #define ACK_IRQ_ON_EXIT          0x00008000
203
204 // Exit Reasons
205 #define VM_EXIT_REASON_INFO_EXCEPTION_OR_NMI 0
206 #define VM_EXIT_REASON_EXTERNAL_INTR         1
207 #define VM_EXIT_REASON_TRIPLE_FAULT          2
208 #define VM_EXIT_REASON_INIT_SIGNAL           3
209 #define VM_EXIT_REASON_STARTUP_IPI           4
210 #define VM_EXIT_REASON_IO_SMI                5
211 #define VM_EXIT_REASON_OTHER_SMI             6
212 #define VM_EXIT_REASON_INTR_WINDOW           7
213 #define VM_EXIT_REASON_NMI_WINDOW            8
214 #define VM_EXIT_REASON_TASK_SWITCH           9
215 #define VM_EXIT_REASON_CPUID                10
216 #define VM_EXIT_REASON_HLT                  12
217 #define VM_EXIT_REASON_INVD                 13
218 #define VM_EXIT_REASON_INVLPG               14
219 #define VM_EXIT_REASON_RDPMC                15
220 #define VM_EXIT_REASON_RDTSC                16
221 #define VM_EXIT_REASON_RSM                  17
222 #define VM_EXIT_REASON_VMCALL               18
223 #define VM_EXIT_REASON_VMCLEAR              19
224 #define VM_EXIT_REASON_VMLAUNCH             20
225 #define VM_EXIT_REASON_VMPTRLD              21
226 #define VM_EXIT_REASON_VMPTRST              22
227 #define VM_EXIT_REASON_VMREAD               23
228 #define VM_EXIT_REASON_VMRESUME             24
229 #define VM_EXIT_REASON_VMWRITE              25
230 #define VM_EXIT_REASON_VMXOFF               26
231 #define VM_EXIT_REASON_VMXON                27
232 #define VM_EXIT_REASON_CR_REG_ACCESSES      28
233 #define VM_EXIT_REASON_MOV_DR               29
234 #define VM_EXIT_REASON_IO_INSTR             30
235 #define VM_EXIT_REASON_RDMSR                31
236 #define VM_EXIT_REASON_WRMSR                32
237 #define VM_EXIT_REASON_ENTRY_FAIL_INVALID_GUEST_STATE     33
238 #define VM_EXIT_REASON_ENTRY_FAIL_MSR_LOAD                34
239 #define VM_EXIT_REASON_MWAIT                36
240 #define VM_EXIT_REASON_MONITOR              39
241 #define VM_EXIT_REASON_PAUSE                40
242 #define VM_EXIT_REASON_ENTRY_FAILURE_MACHINE_CHECK        41
243 #define VM_EXIT_REASON_TPR_BELOW_THRESHOLD                43
244
245
246 extern char *exception_names[];
247 extern char *exception_type_names[];
248
249
250
251
252 typedef void VMCS;
253
254
255 #if __TINYC__
256 #define PACKED
257 #else
258 #define PACKED __attribute__((packed))
259 #endif
260
261
262
263 /* VMCS Exit QUALIFICATIONs */
264 struct VMExitIOQual {
265   uint_t accessSize : 3     PACKED; // (0: 1 Byte ;; 1: 2 Bytes ;; 3: 4 Bytes)
266   uint_t dir        : 1     PACKED; // (0: Out ;; 1: In)
267   uint_t string     : 1     PACKED; // (0: not string ;; 1: string)
268   uint_t REP        : 1     PACKED; // (0: not REP ;; 1: REP)
269   uint_t opEnc      : 1     PACKED; // (0: DX ;; 1: immediate)
270   uint_t rsvd       : 9     PACKED; // Set to 0
271   uint_t port       : 16    PACKED; // IO Port Number
272 };
273
274
275
276 struct VMExitDBGQual {
277   uint_t B0         : 1     PACKED; // Breakpoint 0 condition met
278   uint_t B1         : 1     PACKED; // Breakpoint 1 condition met
279   uint_t B2         : 1     PACKED; // Breakpoint 2 condition met
280   uint_t B3         : 1     PACKED; // Breakpoint 3 condition met
281   uint_t rsvd       : 9     PACKED; // reserved to 0
282   uint_t BD         : 1     PACKED; // detected DBG reg access
283   uint_t BS         : 1     PACKED; // cause either single instr or taken branch
284 };
285
286
287 struct VMExitTSQual {
288   uint_t selector   : 16    PACKED; // selector of destination TSS 
289   uint_t rsvd       : 14    PACKED; // reserved to 0
290   uint_t src        : 2     PACKED; // (0: CALL ; 1: IRET ; 2: JMP ; 3: Task gate in IDT)
291 };
292
293 struct VMExitCRQual {
294   uint_t crID       : 4     PACKED; // cr number (0 for CLTS and LMSW) (bit 3 always 0, on 32bit)
295   uint_t accessType : 2     PACKED; // (0: MOV to CR ; 1: MOV from CR ; 2: CLTS ; 3: LMSW)
296   uint_t lmswOpType : 1     PACKED; // (0: register ; 1: memory)
297   uint_t rsvd1      : 1     PACKED; // reserved to 0
298   uint_t gpr        : 4     PACKED; // (0:RAX+[CLTS/LMSW], 1:RCX, 2:RDX, 3:RBX, 4:RSP, 5:RBP, 6:RSI, 6:RDI, 8-15:64bit regs)
299   uint_t rsvd2      : 4     PACKED; // reserved to 0
300   uint_t lmswSrc    : 16    PACKED; // src data for lmsw
301 };
302
303 struct VMExitMovDRQual {
304   uint_t regID      : 3     PACKED; // debug register number
305   uint_t rsvd1      : 1     PACKED; // reserved to 0
306   uint_t dir        : 1     PACKED; // (0: MOV to DR , 1: MOV from DR)
307   uint_t rsvd2      : 3     PACKED; // reserved to 0
308   uint_t gpr        : 4     PACKED; // (0:RAX, 1:RCX, 2:RDX, 3:RBX, 4:RSP, 5:RBP, 6:RSI, 6:RDI, 8-15:64bit regs)
309 };
310
311 /* End Exit Qualifications */
312
313 /* Exit Vector Info */
314 struct VMExitIntInfo {
315   uint_t nr         : 8     PACKED; // IRQ number, exception vector, NMI = 2 
316   uint_t type       : 3     PACKED; // (0: ext. IRQ , 2: NMI , 3: hw exception , 6: sw exception
317   uint_t errorCode  : 1     PACKED; // 1: error Code present
318   uint_t iret       : 1     PACKED; // something to do with NMIs and IRETs (Intel 3B, sec. 23.2.2) 
319   uint_t rsvd       : 18    PACKED; // always 0
320   uint_t valid      : 1     PACKED; // always 1 if valid
321 };
322
323
324
325
326 /*  End Exit Vector Info */
327
328
329
330
331 /* Segment Selector Access Rights (32 bits) */
332 /* INTEL Manual: 20-4 vol 3B */
333 union SegAccess {
334   struct {
335     uchar_t  type                PACKED;
336     uint_t   descType    : 1     PACKED; 
337     uint_t   dpl         : 2     PACKED;
338     uint_t   present     : 1     PACKED;
339     uchar_t  rsvd1               PACKED;
340     uint_t   avail       : 1    PACKED ;
341     uint_t   L           : 1    PACKED ; // CS only (64 bit active), reserved otherwise
342     uint_t   DB          : 1    PACKED ; 
343     uint_t   granularity : 1    PACKED ;
344     uint_t   unusable    : 1   PACKED  ; 
345     uint_t   rsvd2       : 15  PACKED ;
346   } as_fields;
347   uint_t as_dword;
348 };
349
350
351 struct VMCSSegment {
352   ushort_t selector   ; 
353   union SegAccess access;
354   uint_t limit        ; 
355   uint_t baseAddr     ; // should be 64 bits?
356 };
357
358
359
360 struct VMCSGuestStateArea {
361   /* (1) Guest State Area */
362   /* (1.1) Guest Register State */
363   uint_t cr0   ; // should be 64 bits?
364   uint_t cr3   ; // should be 64 bits?
365   uint_t cr4   ; // should be 64 bits?
366   uint_t dr7   ; // should be 64 bits?
367   uint_t rsp   ; // should be 64 bits?
368   uint_t rip   ; // should be 64 bits?
369   uint_t rflags   ; // should be 64 bits?
370   
371
372   struct VMCSSegment cs  ;
373   struct VMCSSegment ss  ;
374   struct VMCSSegment ds  ;
375   struct VMCSSegment es  ;
376   struct VMCSSegment fs  ;
377   struct VMCSSegment gs  ;
378   struct VMCSSegment ldtr  ;
379   struct VMCSSegment tr  ;
380
381   struct VMCSSegment gdtr  ;
382   struct VMCSSegment idtr ;
383
384   // MSRs
385   ullong_t dbg_ctrl     ; 
386   uint_t sysenter_cs    ;
387   ullong_t sysenter_esp   ; // should be 64 bits?
388   ullong_t sysenter_eip   ; // should be 64 bits?
389
390   uint_t smbase         ; 
391
392   /* (1.2) Guest Non-register State */
393   uint_t activity       ; /* (0=Active, 1=HLT, 2=Shutdown, 3=Wait-for-SIPI) 
394                                    (listed in MSR: IA32_VMX_MISC) */
395
396   uint_t interrupt_state  ; // see Table 20-3 (page 20-6) INTEL MANUAL 3B 
397
398   ullong_t pending_dbg_exceptions  ; // should be 64 bits?
399                                          /* Table 20-4 page 20-8 INTEL MANUAL 3B */
400
401   ullong_t vmcs_link   ; // should be set to 0xffffffff_ffffffff
402 };
403
404
405 int CopyOutVMCSGuestStateArea(struct VMCSGuestStateArea *p);
406 int CopyInVMCSGuestStateArea(struct VMCSGuestStateArea *p);
407
408
409
410 struct VMCSHostStateArea {
411   /* (2) Host State Area */
412   ullong_t cr0  ; // Should be 64 bits?
413   ullong_t cr3   ; // should be 64 bits?
414   ullong_t cr4   ; // should be 64 bits?
415   ullong_t rsp   ; // should be 64 bits?
416   ullong_t rip   ; // should be 64 bits?
417
418   ushort_t csSelector ;
419   ushort_t ssSelector ;
420   ushort_t dsSelector ;
421   ushort_t esSelector ;
422   ushort_t fsSelector ;
423   ushort_t gsSelector ;
424   ushort_t trSelector ;
425
426   ullong_t fsBaseAddr ; // Should be 64 bits?
427   ullong_t gsBaseAddr ; // Should be 64 bits?
428   ullong_t trBaseAddr ; // Should be 64 bits?
429   ullong_t gdtrBaseAddr ; // Should be 64 bits?
430   ullong_t idtrBaseAddr ; // Should be 64 bits?
431   
432
433   /* MSRs */
434   uint_t sysenter_cs ;
435   ullong_t sysenter_esp ; // Should be 64 bits?
436   ullong_t sysenter_eip ; // Should be 64 bits?
437
438 };
439
440 int CopyOutVMCSHostStateArea(struct VMCSHostStateArea *p);
441 int CopyInVMCSHostStateArea(struct VMCSHostStateArea *p);
442
443
444 struct VMCSExecCtrlFields {
445   uint_t pinCtrls ; // Table 20-5, Vol 3B. (pg. 20-10)
446   uint_t procCtrls ; // Table 20-6, Vol 3B. (pg. 20-11)
447   uint_t execBitmap ; 
448   uint_t pageFaultErrorMask ; 
449   uint_t pageFaultErrorMatch ;
450   uint_t ioBitmapA ; 
451   uint_t ioBitmapB ;
452   ullong_t tscOffset ;
453   uint_t cr0GuestHostMask ; // Should be 64 bits?
454   uint_t cr0ReadShadow ; // Should be 64 bits?
455   uint_t cr4GuestHostMask ; // Should be 64 bits?
456   uint_t cr4ReadShadow ; // Should be 64 bits?
457   uint_t cr3TargetValue0 ; // should be 64 bits?
458   uint_t cr3TargetValue1 ; // should be 64 bits?
459   uint_t cr3TargetValue2 ; // should be 64 bits?
460   uint_t cr3TargetValue3 ; // should be 64 bits?
461   uint_t cr3TargetCount ;
462
463
464
465   /* these fields enabled if "use TPR shadow"==1 */
466   /* may not need them */
467   ullong_t virtApicPageAddr ;
468   // uint_t virtApicPageAddrHigh 
469   uint_t tprThreshold ;
470   /**/
471
472   ullong_t MSRBitmapsBaseAddr;
473
474
475   ullong_t vmcsExecPtr ;
476
477 };
478
479 int CopyOutVMCSExecCtrlFields(struct VMCSExecCtrlFields *p);
480 int CopyInVMCSExecCtrlFields(struct VMCSExecCtrlFields *p);
481
482
483
484
485 struct VMCSExitCtrlFields {
486   uint_t exitCtrls ; // Table 20-7, Vol. 3B (pg. 20-16)
487   uint_t msrStoreCount ;
488   ullong_t msrStoreAddr ;
489   uint_t msrLoadCount ;
490   ullong_t msrLoadAddr ;
491 };
492
493 int CopyOutVMCSExitCtrlFields(struct VMCSExitCtrlFields *p);
494 int CopyInVMCSExitCtrlFields(struct VMCSExitCtrlFields *p);
495
496
497
498 struct VMCSEntryCtrlFields {
499   uint_t entryCtrls ; // Table 20-9, Vol. 3B (pg. 20-18) 
500   uint_t msrLoadCount ;
501   ullong_t msrLoadAddr ;
502   uint_t intInfo ; // Table 20-10, Vol. 3B (pg. 20-19)
503   uint_t exceptionErrorCode ;
504   uint_t instrLength ;
505 };
506
507
508 int CopyOutVMCSEntryCtrlFields(struct VMCSEntryCtrlFields *p);
509 int CopyInVMCSEntryCtrlFields(struct VMCSEntryCtrlFields *p);
510
511
512 struct VMCSExitInfoFields {
513   uint_t reason; // Table 20-11, Vol. 3B (pg. 20-20)
514   uint_t qualification ; // Should be 64 bits?
515   uint_t intInfo ;
516   uint_t intErrorCode ;
517   uint_t idtVectorInfo ;
518   uint_t idtVectorErrorCode ;
519   uint_t instrLength ;
520   ullong_t guestLinearAddr ; // Should be 64 bits?
521   uint_t instrInfo ;
522   ullong_t ioRCX ; // Should be 64 bits?
523   ullong_t ioRSI ; // Should be 64 bits?
524   ullong_t ioRDI ; // Should be 64 bits?
525   ullong_t ioRIP ; // Should be 64 bits?
526   uint_t instrErrorField ;
527
528 };
529
530
531 int CopyOutVMCSExitInfoFields(struct VMCSExitInfoFields *p);
532
533
534
535 struct VMCSData {
536   uint_t revision ;
537   uint_t abort    ;
538   uint_t exitCtrlFlags;
539   struct VMCSGuestStateArea guestStateArea ; 
540   struct VMCSHostStateArea hostStateArea ;
541   struct VMCSExecCtrlFields execCtrlFields ;
542   struct VMCSExitCtrlFields exitCtrlFields ;
543   struct VMCSEntryCtrlFields entryCtrlFields ;
544   struct VMCSExitInfoFields exitInfoFields ;
545 };
546
547
548 int CopyOutVMCSData(struct VMCSData *p);
549 int CopyInVMCSData(struct VMCSData *p);
550
551 struct VMXRegs {
552   uint_t edi;
553   uint_t esi;
554   uint_t ebp;
555   uint_t esp;
556   uint_t ebx;
557   uint_t edx;
558   uint_t ecx;
559   uint_t eax;
560 };
561   
562 void PrintTrace_VMX_Regs(struct VMXRegs *regs);
563 void PrintTrace_VMCSData(struct VMCSData * vmcs);
564 void PrintTrace_VMCSGuestStateArea(struct VMCSGuestStateArea * guestState);
565 void PrintTrace_VMCSHostStateArea(struct VMCSHostStateArea * hostState);
566 void PrintTrace_VMCSExecCtrlFields(struct VMCSExecCtrlFields * execCtrls);
567 void PrintTrace_VMCSExitCtrlFields(struct VMCSExitCtrlFields * exitCtrls);
568 void PrintTrace_VMCSEntryCtrlFields(struct VMCSEntryCtrlFields * entryCtrls);
569 void PrintTrace_VMCSExitInfoFields(struct VMCSExitInfoFields * exitInfo);
570 void PrintTrace_VMCSSegment(char * segname, struct VMCSSegment * seg, int abbr);
571
572 VMCS * CreateVMCS();
573 extern uint_t VMCS_WRITE();
574 extern uint_t VMCS_READ();
575
576 //uint_t VMCSRead(uint_t tag, void * val);
577
578
579 #include <palacios/vmcs_gen.h>
580
581 #endif