2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
20 #include <palacios/vmcs.h>
21 #include <palacios/vmx_lowlevel.h>
22 #include <palacios/vmm.h>
23 #include <palacios/vmx.h>
24 #include <palacios/vm_guest_mem.h>
25 #include <palacios/vmm_ctrl_regs.h>
26 #include <palacios/vmm_lowlevel.h>
28 static void inline translate_v3_seg_to_access(struct v3_segment * v3_seg,
29 struct vmcs_segment_access * access)
31 access->type = v3_seg->type;
32 access->desc_type = v3_seg->system;
33 access->dpl = v3_seg->dpl;
34 access->present = v3_seg->present;
35 access->avail = v3_seg->avail;
36 access->long_mode = v3_seg->long_mode;
37 access->db = v3_seg->db;
38 access->granularity = v3_seg->granularity;
41 static void inline translate_access_to_v3_seg(struct vmcs_segment_access * access,
42 struct v3_segment * v3_seg)
44 v3_seg->type = access->type;
45 v3_seg->system = access->desc_type;
46 v3_seg->dpl = access->dpl;
47 v3_seg->present = access->present;
48 v3_seg->avail = access->avail;
49 v3_seg->long_mode = access->long_mode;
50 v3_seg->db = access->db;
51 v3_seg->granularity = access->granularity;
55 static int inline check_vmcs_write(vmcs_field_t field, addr_t val)
58 ret = vmcs_write(field, val);
60 if (ret != VMX_SUCCESS) {
61 PrintError("VMWRITE error on %s!: %d\n", v3_vmcs_field_to_str(field), ret);
68 static int inline check_vmcs_read(vmcs_field_t field, void * val)
71 ret = vmcs_read(field, val);
73 if (ret != VMX_SUCCESS) {
74 PrintError("VMREAD error on %s!: %d\n", v3_vmcs_field_to_str(field), ret);
80 // static const char * v3_vmcs_field_to_str(vmcs_field_t field);
82 //extern char * exception_names;
84 // Ignores "HIGH" addresses - 32 bit only for now
87 int v3_update_vmcs_guest_state(struct guest_info * info)
91 vmx_ret |= check_vmcs_write(VMCS_GUEST_RIP, info->rip);
92 vmx_ret |= check_vmcs_write(VMCS_GUEST_RSP, info->vm_regs.rsp);
95 vmx_ret |= check_vmcs_write(VMCS_GUEST_CR0, info->ctrl_regs.cr0);
96 vmx_ret |= check_vmcs_write(VMCS_CR0_READ_SHDW, info->shdw_pg_state.guest_cr0);
97 vmx_ret |= check_vmcs_write(VMCS_GUEST_CR3, info->ctrl_regs.cr3);
98 vmx_ret |= check_vmcs_write(VMCS_GUEST_CR4, info->ctrl_regs.cr4);
99 vmx_ret |= check_vmcs_write(VMCS_GUEST_DR7, info->dbg_regs.dr7);
101 vmx_ret |= check_vmcs_write(VMCS_GUEST_RFLAGS, info->ctrl_regs.rflags);
102 if (((struct vmx_data *)info->vmm_data)->ia32e_avail) {
103 vmx_ret |= check_vmcs_write(VMCS_GUEST_EFER, info->ctrl_regs.efer);
107 /*** Write VMCS Segments ***/
108 struct vmcs_segment_access access;
110 memset(&access, 0, sizeof(access));
113 translate_v3_seg_to_access(&(info->segments.cs), &access);
115 vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_BASE, info->segments.cs.base);
116 vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_SELECTOR, info->segments.cs.selector);
117 vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_LIMIT, info->segments.cs.limit);
118 vmx_ret |= check_vmcs_write(VMCS_GUEST_CS_ACCESS, access.value);
121 memset(&access, 0, sizeof(access));
122 translate_v3_seg_to_access(&(info->segments.ss), &access);
124 vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_BASE, info->segments.ss.base);
125 vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_SELECTOR, info->segments.ss.selector);
126 vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_LIMIT, info->segments.ss.limit);
127 vmx_ret |= check_vmcs_write(VMCS_GUEST_SS_ACCESS, access.value);
130 memset(&access, 0, sizeof(access));
131 translate_v3_seg_to_access(&(info->segments.ds), &access);
133 vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_BASE, info->segments.ds.base);
134 vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_SELECTOR, info->segments.ds.selector);
135 vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_LIMIT, info->segments.ds.limit);
136 vmx_ret |= check_vmcs_write(VMCS_GUEST_DS_ACCESS, access.value);
140 memset(&access, 0, sizeof(access));
141 translate_v3_seg_to_access(&(info->segments.es), &access);
143 vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_BASE, info->segments.es.base);
144 vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_SELECTOR, info->segments.es.selector);
145 vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_LIMIT, info->segments.es.limit);
146 vmx_ret |= check_vmcs_write(VMCS_GUEST_ES_ACCESS, access.value);
149 memset(&access, 0, sizeof(access));
150 translate_v3_seg_to_access(&(info->segments.fs), &access);
152 vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_BASE, info->segments.fs.base);
153 vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_SELECTOR, info->segments.fs.selector);
154 vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_LIMIT, info->segments.fs.limit);
155 vmx_ret |= check_vmcs_write(VMCS_GUEST_FS_ACCESS, access.value);
158 memset(&access, 0, sizeof(access));
159 translate_v3_seg_to_access(&(info->segments.gs), &access);
161 vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_BASE, info->segments.gs.base);
162 vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_SELECTOR, info->segments.gs.selector);
163 vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_LIMIT, info->segments.gs.limit);
164 vmx_ret |= check_vmcs_write(VMCS_GUEST_GS_ACCESS, access.value);
167 memset(&access, 0, sizeof(access));
168 translate_v3_seg_to_access(&(info->segments.ldtr), &access);
170 vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_BASE, info->segments.ldtr.base);
171 vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_SELECTOR, info->segments.ldtr.selector);
172 vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_LIMIT, info->segments.ldtr.limit);
173 vmx_ret |= check_vmcs_write(VMCS_GUEST_LDTR_ACCESS, access.value);
176 memset(&access, 0, sizeof(access));
177 translate_v3_seg_to_access(&(info->segments.tr), &access);
179 vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_BASE, info->segments.tr.base);
180 vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_SELECTOR, info->segments.tr.selector);
181 vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_LIMIT, info->segments.tr.limit);
182 vmx_ret |= check_vmcs_write(VMCS_GUEST_TR_ACCESS, access.value);
186 vmx_ret |= check_vmcs_write(VMCS_GUEST_GDTR_BASE, info->segments.gdtr.base);
187 vmx_ret |= check_vmcs_write(VMCS_GUEST_GDTR_LIMIT, info->segments.gdtr.limit);
190 vmx_ret |= check_vmcs_write(VMCS_GUEST_IDTR_BASE, info->segments.idtr.base);
191 vmx_ret |= check_vmcs_write(VMCS_GUEST_IDTR_LIMIT, info->segments.idtr.limit);
197 int v3_update_vmcs_ctrl_fields(struct guest_info * info) {
199 struct vmx_data * arch_data = (struct vmx_data *)(info->vmm_data);
201 vmx_ret |= check_vmcs_write(VMCS_PIN_CTRLS, arch_data->pin_ctrls.value);
202 vmx_ret |= check_vmcs_write(VMCS_PROC_CTRLS, arch_data->pri_proc_ctrls.value);
204 if (arch_data->pri_proc_ctrls.sec_ctrls) {
205 vmx_ret |= check_vmcs_write(VMCS_SEC_PROC_CTRLS, arch_data->sec_proc_ctrls.value);
208 vmx_ret |= check_vmcs_write(VMCS_EXIT_CTRLS, arch_data->exit_ctrls.value);
209 vmx_ret |= check_vmcs_write(VMCS_ENTRY_CTRLS, arch_data->entry_ctrls.value);
214 int v3_update_vmcs_host_state(struct guest_info * info) {
217 struct vmx_data * arch_data = (struct vmx_data *)(info->vmm_data);
218 struct v3_msr tmp_msr;
220 __asm__ __volatile__ ( "movq %%cr0, %0; "
224 vmx_ret |= check_vmcs_write(VMCS_HOST_CR0, tmp);
227 __asm__ __volatile__ ( "movq %%cr3, %0; "
231 vmx_ret |= check_vmcs_write(VMCS_HOST_CR3, tmp);
234 __asm__ __volatile__ ( "movq %%cr4, %0; "
238 vmx_ret |= check_vmcs_write(VMCS_HOST_CR4, tmp);
242 vmx_ret |= check_vmcs_write(VMCS_HOST_GDTR_BASE, arch_data->host_state.gdtr.base);
243 vmx_ret |= check_vmcs_write(VMCS_HOST_IDTR_BASE, arch_data->host_state.idtr.base);
244 vmx_ret |= check_vmcs_write(VMCS_HOST_TR_BASE, arch_data->host_state.tr.base);
246 #define FS_BASE_MSR 0xc0000100
247 #define GS_BASE_MSR 0xc0000101
250 v3_get_msr(FS_BASE_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
251 vmx_ret |= check_vmcs_write(VMCS_HOST_FS_BASE, tmp_msr.value);
254 v3_get_msr(GS_BASE_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
255 vmx_ret |= check_vmcs_write(VMCS_HOST_GS_BASE, tmp_msr.value);
259 __asm__ __volatile__ ( "movq %%cs, %0; "
263 vmx_ret |= check_vmcs_write(VMCS_HOST_CS_SELECTOR, tmp);
265 __asm__ __volatile__ ( "movq %%ss, %0; "
269 vmx_ret |= check_vmcs_write(VMCS_HOST_SS_SELECTOR, tmp);
271 __asm__ __volatile__ ( "movq %%ds, %0; "
275 vmx_ret |= check_vmcs_write(VMCS_HOST_DS_SELECTOR, tmp);
277 __asm__ __volatile__ ( "movq %%es, %0; "
281 vmx_ret |= check_vmcs_write(VMCS_HOST_ES_SELECTOR, tmp);
283 __asm__ __volatile__ ( "movq %%fs, %0; "
287 vmx_ret |= check_vmcs_write(VMCS_HOST_FS_SELECTOR, tmp);
289 __asm__ __volatile__ ( "movq %%gs, %0; "
293 vmx_ret |= check_vmcs_write(VMCS_HOST_GS_SELECTOR, tmp);
295 vmx_ret |= check_vmcs_write(VMCS_HOST_TR_SELECTOR, arch_data->host_state.tr.selector);
298 #define SYSENTER_CS_MSR 0x00000174
299 #define SYSENTER_ESP_MSR 0x00000175
300 #define SYSENTER_EIP_MSR 0x00000176
303 v3_get_msr(SYSENTER_CS_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
304 vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_CS, tmp_msr.lo);
307 v3_get_msr(SYSENTER_ESP_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
308 vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_ESP, tmp_msr.value);
311 v3_get_msr(SYSENTER_EIP_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
312 vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_EIP, tmp_msr.value);
318 int v3_load_vmcs_guest_state(struct guest_info * info)
323 check_vmcs_read(VMCS_GUEST_RIP, &(info->rip));
324 check_vmcs_read(VMCS_GUEST_RSP, &(info->vm_regs.rsp));
326 check_vmcs_read(VMCS_GUEST_CR0, &(info->ctrl_regs.cr0));
327 check_vmcs_read(VMCS_CR0_READ_SHDW, &(info->shdw_pg_state.guest_cr0));
328 check_vmcs_read(VMCS_GUEST_CR3, &(info->ctrl_regs.cr3));
329 check_vmcs_read(VMCS_GUEST_CR4, &(info->ctrl_regs.cr4));
330 check_vmcs_read(VMCS_GUEST_DR7, &(info->dbg_regs.dr7));
332 check_vmcs_read(VMCS_GUEST_RFLAGS, &(info->ctrl_regs.rflags));
333 if (((struct vmx_data *)info->vmm_data)->ia32e_avail) {
334 check_vmcs_read(VMCS_GUEST_EFER, &(info->ctrl_regs.efer));
337 // JRL: Add error checking
339 struct vmcs_segment_access access;
340 memset(&access, 0, sizeof(access));
343 check_vmcs_read(VMCS_GUEST_CS_BASE, &(info->segments.cs.base));
344 check_vmcs_read(VMCS_GUEST_CS_SELECTOR, &(info->segments.cs.selector));
345 check_vmcs_read(VMCS_GUEST_CS_LIMIT, &(info->segments.cs.limit));
346 check_vmcs_read(VMCS_GUEST_CS_ACCESS, &(access.value));
348 translate_access_to_v3_seg(&access, &(info->segments.cs));
351 check_vmcs_read(VMCS_GUEST_SS_BASE, &(info->segments.ss.base));
352 check_vmcs_read(VMCS_GUEST_SS_SELECTOR, &(info->segments.ss.selector));
353 check_vmcs_read(VMCS_GUEST_SS_LIMIT, &(info->segments.ss.limit));
354 check_vmcs_read(VMCS_GUEST_SS_ACCESS, &(access.value));
356 translate_access_to_v3_seg(&access, &(info->segments.ss));
359 check_vmcs_read(VMCS_GUEST_DS_BASE, &(info->segments.ds.base));
360 check_vmcs_read(VMCS_GUEST_DS_SELECTOR, &(info->segments.ds.selector));
361 check_vmcs_read(VMCS_GUEST_DS_LIMIT, &(info->segments.ds.limit));
362 check_vmcs_read(VMCS_GUEST_DS_ACCESS, &(access.value));
364 translate_access_to_v3_seg(&access, &(info->segments.ds));
367 check_vmcs_read(VMCS_GUEST_ES_BASE, &(info->segments.es.base));
368 check_vmcs_read(VMCS_GUEST_ES_SELECTOR, &(info->segments.es.selector));
369 check_vmcs_read(VMCS_GUEST_ES_LIMIT, &(info->segments.es.limit));
370 check_vmcs_read(VMCS_GUEST_ES_ACCESS, &(access.value));
372 translate_access_to_v3_seg(&access, &(info->segments.es));
375 check_vmcs_read(VMCS_GUEST_FS_BASE, &(info->segments.fs.base));
376 check_vmcs_read(VMCS_GUEST_FS_SELECTOR, &(info->segments.fs.selector));
377 check_vmcs_read(VMCS_GUEST_FS_LIMIT, &(info->segments.fs.limit));
378 check_vmcs_read(VMCS_GUEST_FS_ACCESS, &(access.value));
380 translate_access_to_v3_seg(&access, &(info->segments.fs));
383 check_vmcs_read(VMCS_GUEST_GS_BASE, &(info->segments.gs.base));
384 check_vmcs_read(VMCS_GUEST_GS_SELECTOR, &(info->segments.gs.selector));
385 check_vmcs_read(VMCS_GUEST_GS_LIMIT, &(info->segments.gs.limit));
386 check_vmcs_read(VMCS_GUEST_GS_ACCESS, &(access.value));
388 translate_access_to_v3_seg(&access, &(info->segments.gs));
391 check_vmcs_read(VMCS_GUEST_LDTR_BASE, &(info->segments.ldtr.base));
392 check_vmcs_read(VMCS_GUEST_LDTR_SELECTOR, &(info->segments.ldtr.selector));
393 check_vmcs_read(VMCS_GUEST_LDTR_LIMIT, &(info->segments.ldtr.limit));
394 check_vmcs_read(VMCS_GUEST_LDTR_ACCESS, &(access.value));
396 translate_access_to_v3_seg(&access, &(info->segments.ldtr));
399 check_vmcs_read(VMCS_GUEST_TR_BASE, &(info->segments.tr.base));
400 check_vmcs_read(VMCS_GUEST_TR_SELECTOR, &(info->segments.tr.selector));
401 check_vmcs_read(VMCS_GUEST_TR_LIMIT, &(info->segments.tr.limit));
402 check_vmcs_read(VMCS_GUEST_TR_ACCESS, &(access.value));
404 translate_access_to_v3_seg(&access, &(info->segments.tr));
407 check_vmcs_read(VMCS_GUEST_GDTR_BASE, &(info->segments.gdtr.base));
408 check_vmcs_read(VMCS_GUEST_GDTR_LIMIT, &(info->segments.gdtr.limit));
411 check_vmcs_read(VMCS_GUEST_IDTR_BASE, &(info->segments.idtr.base));
412 check_vmcs_read(VMCS_GUEST_IDTR_LIMIT, &(info->segments.idtr.limit));
417 static inline void print_vmcs_field(vmcs_field_t vmcs_index) {
418 int len = v3_vmcs_get_field_len(vmcs_index);
421 if (vmcs_read(vmcs_index, &val) != VMX_SUCCESS) {
422 PrintError("VMCS_READ error for %s\n", v3_vmcs_field_to_str(vmcs_index));
427 PrintDebug("\t%s: 0x%.4x\n", v3_vmcs_field_to_str(vmcs_index), (uint16_t)val);
428 } else if (len == 4) {
429 PrintDebug("\t%s: 0x%.8x\n", v3_vmcs_field_to_str(vmcs_index), (uint32_t)val);
430 } else if (len == 8) {
431 PrintDebug("\t%s: 0x%p\n", v3_vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
437 static void print_guest_state()
439 PrintDebug("VMCS_GUEST_STATE\n");
440 print_vmcs_field(VMCS_GUEST_RIP);
441 print_vmcs_field(VMCS_GUEST_RSP);
442 print_vmcs_field(VMCS_GUEST_RFLAGS);
443 print_vmcs_field(VMCS_GUEST_CR0);
444 print_vmcs_field(VMCS_GUEST_CR3);
445 print_vmcs_field(VMCS_GUEST_CR4);
446 print_vmcs_field(VMCS_GUEST_DR7);
451 PrintDebug(" ==> CS\n");
452 print_vmcs_field(VMCS_GUEST_CS_SELECTOR);
453 print_vmcs_field(VMCS_GUEST_CS_BASE);
454 print_vmcs_field(VMCS_GUEST_CS_LIMIT);
455 print_vmcs_field(VMCS_GUEST_CS_ACCESS);
457 PrintDebug(" ==> SS\n");
458 print_vmcs_field(VMCS_GUEST_SS_SELECTOR);
459 print_vmcs_field(VMCS_GUEST_SS_BASE);
460 print_vmcs_field(VMCS_GUEST_SS_LIMIT);
461 print_vmcs_field(VMCS_GUEST_SS_ACCESS);
463 PrintDebug(" ==> DS\n");
464 print_vmcs_field(VMCS_GUEST_DS_SELECTOR);
465 print_vmcs_field(VMCS_GUEST_DS_BASE);
466 print_vmcs_field(VMCS_GUEST_DS_LIMIT);
467 print_vmcs_field(VMCS_GUEST_DS_ACCESS);
469 PrintDebug(" ==> ES\n");
470 print_vmcs_field(VMCS_GUEST_ES_SELECTOR);
471 print_vmcs_field(VMCS_GUEST_ES_BASE);
472 print_vmcs_field(VMCS_GUEST_ES_LIMIT);
473 print_vmcs_field(VMCS_GUEST_ES_ACCESS);
475 PrintDebug(" ==> FS\n");
476 print_vmcs_field(VMCS_GUEST_FS_SELECTOR);
477 print_vmcs_field(VMCS_GUEST_FS_BASE);
478 print_vmcs_field(VMCS_GUEST_FS_LIMIT);
479 print_vmcs_field(VMCS_GUEST_FS_ACCESS);
481 PrintDebug(" ==> GS\n");
482 print_vmcs_field(VMCS_GUEST_GS_SELECTOR);
483 print_vmcs_field(VMCS_GUEST_GS_BASE);
484 print_vmcs_field(VMCS_GUEST_GS_LIMIT);
485 print_vmcs_field(VMCS_GUEST_GS_ACCESS);
487 PrintDebug(" ==> LDTR\n");
488 print_vmcs_field(VMCS_GUEST_LDTR_SELECTOR);
489 print_vmcs_field(VMCS_GUEST_LDTR_BASE);
490 print_vmcs_field(VMCS_GUEST_LDTR_LIMIT);
491 print_vmcs_field(VMCS_GUEST_LDTR_ACCESS);
493 PrintDebug(" ==> TR\n");
494 print_vmcs_field(VMCS_GUEST_TR_SELECTOR);
495 print_vmcs_field(VMCS_GUEST_TR_BASE);
496 print_vmcs_field(VMCS_GUEST_TR_LIMIT);
497 print_vmcs_field(VMCS_GUEST_TR_ACCESS);
499 PrintDebug(" ==> GDTR\n");
500 print_vmcs_field(VMCS_GUEST_GDTR_BASE);
501 print_vmcs_field(VMCS_GUEST_GDTR_LIMIT);
503 PrintDebug(" ==> IDTR\n");
504 print_vmcs_field(VMCS_GUEST_IDTR_BASE);
505 print_vmcs_field(VMCS_GUEST_IDTR_LIMIT);
509 print_vmcs_field(VMCS_GUEST_DBG_CTL);
511 print_vmcs_field(VMCS_GUEST_DBG_CTL_HIGH);
513 print_vmcs_field(VMCS_GUEST_SYSENTER_CS);
514 print_vmcs_field(VMCS_GUEST_SYSENTER_ESP);
515 print_vmcs_field(VMCS_GUEST_SYSENTER_EIP);
517 print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL);
519 print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH);
522 print_vmcs_field(VMCS_GUEST_SMBASE);
525 PrintDebug("GUEST_NON_REGISTER_STATE\n");
527 print_vmcs_field(VMCS_GUEST_ACTIVITY_STATE);
528 print_vmcs_field(VMCS_GUEST_INT_STATE);
529 print_vmcs_field(VMCS_GUEST_PENDING_DBG_EXCP);
533 static void print_host_state()
535 PrintDebug("VMCS_HOST_STATE\n");
537 print_vmcs_field(VMCS_HOST_RIP);
538 print_vmcs_field(VMCS_HOST_RSP);
539 print_vmcs_field(VMCS_HOST_CR0);
540 print_vmcs_field(VMCS_HOST_CR3);
541 print_vmcs_field(VMCS_HOST_CR4);
544 print_vmcs_field(VMCS_HOST_CS_SELECTOR);
545 print_vmcs_field(VMCS_HOST_SS_SELECTOR);
546 print_vmcs_field(VMCS_HOST_DS_SELECTOR);
547 print_vmcs_field(VMCS_HOST_ES_SELECTOR);
548 print_vmcs_field(VMCS_HOST_FS_SELECTOR);
549 print_vmcs_field(VMCS_HOST_GS_SELECTOR);
550 print_vmcs_field(VMCS_HOST_TR_SELECTOR);
553 print_vmcs_field(VMCS_HOST_FS_BASE);
554 print_vmcs_field(VMCS_HOST_GS_BASE);
555 print_vmcs_field(VMCS_HOST_TR_BASE);
556 print_vmcs_field(VMCS_HOST_GDTR_BASE);
557 print_vmcs_field(VMCS_HOST_IDTR_BASE);
560 print_vmcs_field(VMCS_HOST_SYSENTER_CS);
561 print_vmcs_field(VMCS_HOST_SYSENTER_ESP);
562 print_vmcs_field(VMCS_HOST_SYSENTER_EIP);
564 print_vmcs_field(VMCS_HOST_PERF_GLOBAL_CTRL);
566 print_vmcs_field(VMCS_HOST_PERF_GLOBAL_CTRL_HIGH);
571 static void print_exec_ctrls() {
572 PrintDebug("VMCS_EXEC_CTRL_FIELDS\n");
573 print_vmcs_field(VMCS_PIN_CTRLS);
574 print_vmcs_field(VMCS_PROC_CTRLS);
575 print_vmcs_field(VMCS_SEC_PROC_CTRLS);
577 print_vmcs_field(VMCS_EXCP_BITMAP);
578 print_vmcs_field(VMCS_PG_FAULT_ERR_MASK);
579 print_vmcs_field(VMCS_PG_FAULT_ERR_MATCH);
581 print_vmcs_field(VMCS_IO_BITMAP_A_ADDR);
583 print_vmcs_field(VMCS_IO_BITMAP_A_ADDR_HIGH);
585 print_vmcs_field(VMCS_IO_BITMAP_B_ADDR);
587 print_vmcs_field(VMCS_IO_BITMAP_B_ADDR_HIGH);
590 print_vmcs_field(VMCS_TSC_OFFSET);
592 print_vmcs_field(VMCS_TSC_OFFSET_HIGH);
597 print_vmcs_field(VMCS_CR0_MASK);
598 print_vmcs_field(VMCS_CR0_READ_SHDW);
599 print_vmcs_field(VMCS_CR4_MASK);
600 print_vmcs_field(VMCS_CR4_READ_SHDW);
602 print_vmcs_field(VMCS_CR3_TGT_CNT);
603 print_vmcs_field(VMCS_CR3_TGT_VAL_0);
604 print_vmcs_field(VMCS_CR3_TGT_VAL_1);
605 print_vmcs_field(VMCS_CR3_TGT_VAL_2);
606 print_vmcs_field(VMCS_CR3_TGT_VAL_3);
610 print_vmcs_field(VMCS_APIC_ACCESS_ADDR);
612 print_vmcs_field(VMCS_APIC_ACCESS_ADDR_HIGH);
615 print_vmcs_field(VMCS_VAPIC_ADDR);
617 print_vmcs_field(VMCS_VAPIC_ADDR_HIGH);
620 print_vmcs_field(VMCS_TPR_THRESHOLD);
622 print_vmcs_field(VMCS_MSR_BITMAP);
624 print_vmcs_field(VMCS_MSR_BITMAP_HIGH);
627 print_vmcs_field(VMCS_EXEC_PTR);
629 print_vmcs_field(VMCS_EXEC_PTR_HIGH);
634 static void print_exit_ctrls() {
635 PrintDebug("VMCS_EXIT_CTRLS\n");
637 print_vmcs_field(VMCS_EXIT_CTRLS);
640 print_vmcs_field(VMCS_EXIT_MSR_STORE_CNT);
641 print_vmcs_field(VMCS_EXIT_MSR_STORE_ADDR);
643 print_vmcs_field(VMCS_EXIT_MSR_STORE_ADDR_HIGH);
646 print_vmcs_field(VMCS_EXIT_MSR_LOAD_CNT);
647 print_vmcs_field(VMCS_EXIT_MSR_LOAD_ADDR);
649 print_vmcs_field(VMCS_EXIT_MSR_LOAD_ADDR_HIGH);
655 static void print_entry_ctrls() {
656 PrintDebug("VMCS_ENTRY_CTRLS\n");
658 print_vmcs_field(VMCS_ENTRY_CTRLS);
660 print_vmcs_field(VMCS_ENTRY_MSR_LOAD_CNT);
661 print_vmcs_field(VMCS_ENTRY_MSR_LOAD_ADDR);
663 print_vmcs_field(VMCS_ENTRY_MSR_LOAD_ADDR_HIGH);
666 print_vmcs_field(VMCS_ENTRY_INT_INFO);
667 print_vmcs_field(VMCS_ENTRY_EXCP_ERR);
668 print_vmcs_field(VMCS_ENTRY_INSTR_LEN);
674 static void print_exit_info() {
675 PrintDebug("VMCS_EXIT_INFO\n");
677 print_vmcs_field(VMCS_EXIT_REASON);
678 print_vmcs_field(VMCS_EXIT_QUAL);
680 print_vmcs_field(VMCS_EXIT_INT_INFO);
681 print_vmcs_field(VMCS_EXIT_INT_ERR);
683 print_vmcs_field(VMCS_IDT_VECTOR_INFO);
684 print_vmcs_field(VMCS_IDT_VECTOR_ERR);
686 print_vmcs_field(VMCS_EXIT_INSTR_LEN);
688 print_vmcs_field(VMCS_GUEST_LINEAR_ADDR);
689 print_vmcs_field(VMCS_EXIT_INSTR_INFO);
691 print_vmcs_field(VMCS_IO_RCX);
692 print_vmcs_field(VMCS_IO_RSI);
693 print_vmcs_field(VMCS_IO_RDI);
694 print_vmcs_field(VMCS_IO_RIP);
697 print_vmcs_field(VMCS_INSTR_ERR);
700 void v3_print_vmcs() {
702 print_vmcs_field(VMCS_LINK_PTR);
704 print_vmcs_field(VMCS_LINK_PTR_HIGH);
722 * Returns the field length in bytes
724 int v3_vmcs_get_field_len(vmcs_field_t field) {
726 /* 16 bit Control Fields */
727 case VMCS_GUEST_ES_SELECTOR:
728 case VMCS_GUEST_CS_SELECTOR:
729 case VMCS_GUEST_SS_SELECTOR:
730 case VMCS_GUEST_DS_SELECTOR:
731 case VMCS_GUEST_FS_SELECTOR:
732 case VMCS_GUEST_GS_SELECTOR:
733 case VMCS_GUEST_LDTR_SELECTOR:
734 case VMCS_GUEST_TR_SELECTOR:
735 case VMCS_HOST_ES_SELECTOR:
736 case VMCS_HOST_CS_SELECTOR:
737 case VMCS_HOST_SS_SELECTOR:
738 case VMCS_HOST_DS_SELECTOR:
739 case VMCS_HOST_FS_SELECTOR:
740 case VMCS_HOST_GS_SELECTOR:
741 case VMCS_HOST_TR_SELECTOR:
744 /* 32 bit Control Fields */
746 case VMCS_PROC_CTRLS:
747 case VMCS_SEC_PROC_CTRLS:
748 case VMCS_EXCP_BITMAP:
749 case VMCS_PG_FAULT_ERR_MASK:
750 case VMCS_PG_FAULT_ERR_MATCH:
751 case VMCS_CR3_TGT_CNT:
752 case VMCS_EXIT_CTRLS:
753 case VMCS_EXIT_MSR_STORE_CNT:
754 case VMCS_EXIT_MSR_LOAD_CNT:
755 case VMCS_ENTRY_CTRLS:
756 case VMCS_ENTRY_MSR_LOAD_CNT:
757 case VMCS_ENTRY_INT_INFO:
758 case VMCS_ENTRY_EXCP_ERR:
759 case VMCS_ENTRY_INSTR_LEN:
760 case VMCS_TPR_THRESHOLD:
762 case VMCS_EXIT_REASON:
763 case VMCS_EXIT_INT_INFO:
764 case VMCS_EXIT_INT_ERR:
765 case VMCS_IDT_VECTOR_INFO:
766 case VMCS_IDT_VECTOR_ERR:
767 case VMCS_EXIT_INSTR_LEN:
768 case VMCS_EXIT_INSTR_INFO:
769 case VMCS_GUEST_ES_LIMIT:
770 case VMCS_GUEST_CS_LIMIT:
771 case VMCS_GUEST_SS_LIMIT:
772 case VMCS_GUEST_DS_LIMIT:
773 case VMCS_GUEST_FS_LIMIT:
774 case VMCS_GUEST_GS_LIMIT:
775 case VMCS_GUEST_LDTR_LIMIT:
776 case VMCS_GUEST_TR_LIMIT:
777 case VMCS_GUEST_GDTR_LIMIT:
778 case VMCS_GUEST_IDTR_LIMIT:
779 case VMCS_GUEST_ES_ACCESS:
780 case VMCS_GUEST_CS_ACCESS:
781 case VMCS_GUEST_SS_ACCESS:
782 case VMCS_GUEST_DS_ACCESS:
783 case VMCS_GUEST_FS_ACCESS:
784 case VMCS_GUEST_GS_ACCESS:
785 case VMCS_GUEST_LDTR_ACCESS:
786 case VMCS_GUEST_TR_ACCESS:
787 case VMCS_GUEST_INT_STATE:
788 case VMCS_GUEST_ACTIVITY_STATE:
789 case VMCS_GUEST_SMBASE:
790 case VMCS_GUEST_SYSENTER_CS:
791 case VMCS_HOST_SYSENTER_CS:
795 /* high bits of variable width fields
796 * We can probably just delete most of these....
798 case VMCS_IO_BITMAP_A_ADDR_HIGH:
799 case VMCS_IO_BITMAP_B_ADDR_HIGH:
800 case VMCS_MSR_BITMAP_HIGH:
801 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
802 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
803 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
804 case VMCS_EXEC_PTR_HIGH:
805 case VMCS_TSC_OFFSET_HIGH:
806 case VMCS_VAPIC_ADDR_HIGH:
807 case VMCS_APIC_ACCESS_ADDR_HIGH:
808 case VMCS_LINK_PTR_HIGH:
809 case VMCS_GUEST_DBG_CTL_HIGH:
810 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
811 case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
814 /* Natural Width Control Fields */
815 case VMCS_IO_BITMAP_A_ADDR:
816 case VMCS_IO_BITMAP_B_ADDR:
817 case VMCS_MSR_BITMAP:
818 case VMCS_EXIT_MSR_STORE_ADDR:
819 case VMCS_EXIT_MSR_LOAD_ADDR:
820 case VMCS_ENTRY_MSR_LOAD_ADDR:
822 case VMCS_TSC_OFFSET:
823 case VMCS_VAPIC_ADDR:
824 case VMCS_APIC_ACCESS_ADDR:
826 case VMCS_GUEST_DBG_CTL:
827 case VMCS_GUEST_PERF_GLOBAL_CTRL:
828 case VMCS_HOST_PERF_GLOBAL_CTRL:
831 case VMCS_CR0_READ_SHDW:
832 case VMCS_CR4_READ_SHDW:
833 case VMCS_CR3_TGT_VAL_0:
834 case VMCS_CR3_TGT_VAL_1:
835 case VMCS_CR3_TGT_VAL_2:
836 case VMCS_CR3_TGT_VAL_3:
842 case VMCS_GUEST_LINEAR_ADDR:
846 case VMCS_GUEST_ES_BASE:
847 case VMCS_GUEST_CS_BASE:
848 case VMCS_GUEST_SS_BASE:
849 case VMCS_GUEST_DS_BASE:
850 case VMCS_GUEST_FS_BASE:
851 case VMCS_GUEST_GS_BASE:
852 case VMCS_GUEST_LDTR_BASE:
853 case VMCS_GUEST_TR_BASE:
854 case VMCS_GUEST_GDTR_BASE:
855 case VMCS_GUEST_IDTR_BASE:
859 case VMCS_GUEST_RFLAGS:
860 case VMCS_GUEST_PENDING_DBG_EXCP:
861 case VMCS_GUEST_SYSENTER_ESP:
862 case VMCS_GUEST_SYSENTER_EIP:
866 case VMCS_HOST_FS_BASE:
867 case VMCS_HOST_GS_BASE:
868 case VMCS_HOST_TR_BASE:
869 case VMCS_HOST_GDTR_BASE:
870 case VMCS_HOST_IDTR_BASE:
871 case VMCS_HOST_SYSENTER_ESP:
872 case VMCS_HOST_SYSENTER_EIP:
875 return sizeof(addr_t);
878 PrintError("Invalid VMCS field\n");
894 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
895 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
896 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
897 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
898 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
899 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
900 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
901 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
902 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
903 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
904 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
905 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
906 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
907 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
908 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
909 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
910 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
911 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
912 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
913 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
914 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
915 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
916 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
917 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
918 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
919 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
920 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
921 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
922 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
923 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
924 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
925 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
926 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
927 static const char VMCS_APIC_ACCESS_ADDR_STR[] = "APIC_ACCESS_ADDR";
928 static const char VMCS_APIC_ACCESS_ADDR_HIGH_STR[] = "APIC_ACCESS_ADDR_HIGH";
929 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
930 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
931 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
932 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
933 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
934 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
935 static const char VMCS_HOST_PERF_GLOBAL_CTRL_STR[] = "HOST_PERF_GLOBAL_CTRL";
936 static const char VMCS_HOST_PERF_GLOBAL_CTRL_HIGH_STR[] = "HOST_PERF_GLOBAL_CTRL_HIGH";
937 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
938 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
939 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
940 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
941 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
942 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
943 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
944 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
945 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
946 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
947 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
948 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
949 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
950 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
951 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
952 static const char VMCS_SEC_PROC_CTRLS_STR[] = "VMCS_SEC_PROC_CTRLS";
953 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
954 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
955 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
956 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
957 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
958 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
959 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
960 static const char VMCS_EXIT_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
961 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
962 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
963 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
964 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
965 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
966 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
967 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
968 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
969 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
970 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
971 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
972 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
973 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
974 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
975 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
976 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
977 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
978 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
979 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
980 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
981 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
982 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
983 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
984 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
985 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
986 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
987 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
988 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
989 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
990 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
991 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
992 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
993 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
994 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
995 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
996 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
997 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
998 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
999 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
1000 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
1001 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
1002 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
1003 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
1004 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
1005 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
1006 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
1007 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
1008 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
1009 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
1010 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
1011 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
1012 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
1013 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
1014 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
1015 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
1016 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
1017 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
1018 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
1019 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
1020 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
1021 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
1022 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
1023 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
1024 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
1025 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
1026 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
1027 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
1028 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
1029 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
1033 const char * v3_vmcs_field_to_str(vmcs_field_t field) {
1035 case VMCS_GUEST_ES_SELECTOR:
1036 return VMCS_GUEST_ES_SELECTOR_STR;
1037 case VMCS_GUEST_CS_SELECTOR:
1038 return VMCS_GUEST_CS_SELECTOR_STR;
1039 case VMCS_GUEST_SS_SELECTOR:
1040 return VMCS_GUEST_SS_SELECTOR_STR;
1041 case VMCS_GUEST_DS_SELECTOR:
1042 return VMCS_GUEST_DS_SELECTOR_STR;
1043 case VMCS_GUEST_FS_SELECTOR:
1044 return VMCS_GUEST_FS_SELECTOR_STR;
1045 case VMCS_GUEST_GS_SELECTOR:
1046 return VMCS_GUEST_GS_SELECTOR_STR;
1047 case VMCS_GUEST_LDTR_SELECTOR:
1048 return VMCS_GUEST_LDTR_SELECTOR_STR;
1049 case VMCS_GUEST_TR_SELECTOR:
1050 return VMCS_GUEST_TR_SELECTOR_STR;
1051 case VMCS_HOST_ES_SELECTOR:
1052 return VMCS_HOST_ES_SELECTOR_STR;
1053 case VMCS_HOST_CS_SELECTOR:
1054 return VMCS_HOST_CS_SELECTOR_STR;
1055 case VMCS_HOST_SS_SELECTOR:
1056 return VMCS_HOST_SS_SELECTOR_STR;
1057 case VMCS_HOST_DS_SELECTOR:
1058 return VMCS_HOST_DS_SELECTOR_STR;
1059 case VMCS_HOST_FS_SELECTOR:
1060 return VMCS_HOST_FS_SELECTOR_STR;
1061 case VMCS_HOST_GS_SELECTOR:
1062 return VMCS_HOST_GS_SELECTOR_STR;
1063 case VMCS_HOST_TR_SELECTOR:
1064 return VMCS_HOST_TR_SELECTOR_STR;
1065 case VMCS_IO_BITMAP_A_ADDR:
1066 return VMCS_IO_BITMAP_A_ADDR_STR;
1067 case VMCS_IO_BITMAP_A_ADDR_HIGH:
1068 return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
1069 case VMCS_IO_BITMAP_B_ADDR:
1070 return VMCS_IO_BITMAP_B_ADDR_STR;
1071 case VMCS_IO_BITMAP_B_ADDR_HIGH:
1072 return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
1073 case VMCS_MSR_BITMAP:
1074 return VMCS_MSR_BITMAP_STR;
1075 case VMCS_MSR_BITMAP_HIGH:
1076 return VMCS_MSR_BITMAP_HIGH_STR;
1077 case VMCS_EXIT_MSR_STORE_ADDR:
1078 return VMCS_EXIT_MSR_STORE_ADDR_STR;
1079 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
1080 return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
1081 case VMCS_EXIT_MSR_LOAD_ADDR:
1082 return VMCS_EXIT_MSR_LOAD_ADDR_STR;
1083 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
1084 return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
1085 case VMCS_ENTRY_MSR_LOAD_ADDR:
1086 return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
1087 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
1088 return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
1090 return VMCS_EXEC_PTR_STR;
1091 case VMCS_EXEC_PTR_HIGH:
1092 return VMCS_EXEC_PTR_HIGH_STR;
1093 case VMCS_TSC_OFFSET:
1094 return VMCS_TSC_OFFSET_STR;
1095 case VMCS_TSC_OFFSET_HIGH:
1096 return VMCS_TSC_OFFSET_HIGH_STR;
1097 case VMCS_VAPIC_ADDR:
1098 return VMCS_VAPIC_ADDR_STR;
1099 case VMCS_VAPIC_ADDR_HIGH:
1100 return VMCS_VAPIC_ADDR_HIGH_STR;
1101 case VMCS_APIC_ACCESS_ADDR:
1102 return VMCS_APIC_ACCESS_ADDR_STR;
1103 case VMCS_APIC_ACCESS_ADDR_HIGH:
1104 return VMCS_APIC_ACCESS_ADDR_HIGH_STR;
1106 return VMCS_LINK_PTR_STR;
1107 case VMCS_LINK_PTR_HIGH:
1108 return VMCS_LINK_PTR_HIGH_STR;
1109 case VMCS_GUEST_DBG_CTL:
1110 return VMCS_GUEST_DBG_CTL_STR;
1111 case VMCS_GUEST_DBG_CTL_HIGH:
1112 return VMCS_GUEST_DBG_CTL_HIGH_STR;
1113 case VMCS_GUEST_PERF_GLOBAL_CTRL:
1114 return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
1115 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
1116 return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
1117 case VMCS_HOST_PERF_GLOBAL_CTRL:
1118 return VMCS_HOST_PERF_GLOBAL_CTRL_STR;
1119 case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
1120 return VMCS_HOST_PERF_GLOBAL_CTRL_HIGH_STR;
1121 case VMCS_PIN_CTRLS:
1122 return VMCS_PIN_CTRLS_STR;
1123 case VMCS_PROC_CTRLS:
1124 return VMCS_PROC_CTRLS_STR;
1125 case VMCS_EXCP_BITMAP:
1126 return VMCS_EXCP_BITMAP_STR;
1127 case VMCS_PG_FAULT_ERR_MASK:
1128 return VMCS_PG_FAULT_ERR_MASK_STR;
1129 case VMCS_PG_FAULT_ERR_MATCH:
1130 return VMCS_PG_FAULT_ERR_MATCH_STR;
1131 case VMCS_CR3_TGT_CNT:
1132 return VMCS_CR3_TGT_CNT_STR;
1133 case VMCS_EXIT_CTRLS:
1134 return VMCS_EXIT_CTRLS_STR;
1135 case VMCS_EXIT_MSR_STORE_CNT:
1136 return VMCS_EXIT_MSR_STORE_CNT_STR;
1137 case VMCS_EXIT_MSR_LOAD_CNT:
1138 return VMCS_EXIT_MSR_LOAD_CNT_STR;
1139 case VMCS_ENTRY_CTRLS:
1140 return VMCS_ENTRY_CTRLS_STR;
1141 case VMCS_ENTRY_MSR_LOAD_CNT:
1142 return VMCS_ENTRY_MSR_LOAD_CNT_STR;
1143 case VMCS_ENTRY_INT_INFO:
1144 return VMCS_ENTRY_INT_INFO_STR;
1145 case VMCS_ENTRY_EXCP_ERR:
1146 return VMCS_ENTRY_EXCP_ERR_STR;
1147 case VMCS_ENTRY_INSTR_LEN:
1148 return VMCS_ENTRY_INSTR_LEN_STR;
1149 case VMCS_TPR_THRESHOLD:
1150 return VMCS_TPR_THRESHOLD_STR;
1151 case VMCS_SEC_PROC_CTRLS:
1152 return VMCS_SEC_PROC_CTRLS_STR;
1153 case VMCS_INSTR_ERR:
1154 return VMCS_INSTR_ERR_STR;
1155 case VMCS_EXIT_REASON:
1156 return VMCS_EXIT_REASON_STR;
1157 case VMCS_EXIT_INT_INFO:
1158 return VMCS_EXIT_INT_INFO_STR;
1159 case VMCS_EXIT_INT_ERR:
1160 return VMCS_EXIT_INT_ERR_STR;
1161 case VMCS_IDT_VECTOR_INFO:
1162 return VMCS_IDT_VECTOR_INFO_STR;
1163 case VMCS_IDT_VECTOR_ERR:
1164 return VMCS_IDT_VECTOR_ERR_STR;
1165 case VMCS_EXIT_INSTR_LEN:
1166 return VMCS_EXIT_INSTR_LEN_STR;
1167 case VMCS_EXIT_INSTR_INFO:
1168 return VMCS_EXIT_INSTR_INFO_STR;
1169 case VMCS_GUEST_ES_LIMIT:
1170 return VMCS_GUEST_ES_LIMIT_STR;
1171 case VMCS_GUEST_CS_LIMIT:
1172 return VMCS_GUEST_CS_LIMIT_STR;
1173 case VMCS_GUEST_SS_LIMIT:
1174 return VMCS_GUEST_SS_LIMIT_STR;
1175 case VMCS_GUEST_DS_LIMIT:
1176 return VMCS_GUEST_DS_LIMIT_STR;
1177 case VMCS_GUEST_FS_LIMIT:
1178 return VMCS_GUEST_FS_LIMIT_STR;
1179 case VMCS_GUEST_GS_LIMIT:
1180 return VMCS_GUEST_GS_LIMIT_STR;
1181 case VMCS_GUEST_LDTR_LIMIT:
1182 return VMCS_GUEST_LDTR_LIMIT_STR;
1183 case VMCS_GUEST_TR_LIMIT:
1184 return VMCS_GUEST_TR_LIMIT_STR;
1185 case VMCS_GUEST_GDTR_LIMIT:
1186 return VMCS_GUEST_GDTR_LIMIT_STR;
1187 case VMCS_GUEST_IDTR_LIMIT:
1188 return VMCS_GUEST_IDTR_LIMIT_STR;
1189 case VMCS_GUEST_ES_ACCESS:
1190 return VMCS_GUEST_ES_ACCESS_STR;
1191 case VMCS_GUEST_CS_ACCESS:
1192 return VMCS_GUEST_CS_ACCESS_STR;
1193 case VMCS_GUEST_SS_ACCESS:
1194 return VMCS_GUEST_SS_ACCESS_STR;
1195 case VMCS_GUEST_DS_ACCESS:
1196 return VMCS_GUEST_DS_ACCESS_STR;
1197 case VMCS_GUEST_FS_ACCESS:
1198 return VMCS_GUEST_FS_ACCESS_STR;
1199 case VMCS_GUEST_GS_ACCESS:
1200 return VMCS_GUEST_GS_ACCESS_STR;
1201 case VMCS_GUEST_LDTR_ACCESS:
1202 return VMCS_GUEST_LDTR_ACCESS_STR;
1203 case VMCS_GUEST_TR_ACCESS:
1204 return VMCS_GUEST_TR_ACCESS_STR;
1205 case VMCS_GUEST_INT_STATE:
1206 return VMCS_GUEST_INT_STATE_STR;
1207 case VMCS_GUEST_ACTIVITY_STATE:
1208 return VMCS_GUEST_ACTIVITY_STATE_STR;
1209 case VMCS_GUEST_SMBASE:
1210 return VMCS_GUEST_SMBASE_STR;
1211 case VMCS_GUEST_SYSENTER_CS:
1212 return VMCS_GUEST_SYSENTER_CS_STR;
1213 case VMCS_HOST_SYSENTER_CS:
1214 return VMCS_HOST_SYSENTER_CS_STR;
1216 return VMCS_CR0_MASK_STR;
1218 return VMCS_CR4_MASK_STR;
1219 case VMCS_CR0_READ_SHDW:
1220 return VMCS_CR0_READ_SHDW_STR;
1221 case VMCS_CR4_READ_SHDW:
1222 return VMCS_CR4_READ_SHDW_STR;
1223 case VMCS_CR3_TGT_VAL_0:
1224 return VMCS_CR3_TGT_VAL_0_STR;
1225 case VMCS_CR3_TGT_VAL_1:
1226 return VMCS_CR3_TGT_VAL_1_STR;
1227 case VMCS_CR3_TGT_VAL_2:
1228 return VMCS_CR3_TGT_VAL_2_STR;
1229 case VMCS_CR3_TGT_VAL_3:
1230 return VMCS_CR3_TGT_VAL_3_STR;
1231 case VMCS_EXIT_QUAL:
1232 return VMCS_EXIT_QUAL_STR;
1234 return VMCS_IO_RCX_STR;
1236 return VMCS_IO_RSI_STR;
1238 return VMCS_IO_RDI_STR;
1240 return VMCS_IO_RIP_STR;
1241 case VMCS_GUEST_LINEAR_ADDR:
1242 return VMCS_GUEST_LINEAR_ADDR_STR;
1243 case VMCS_GUEST_CR0:
1244 return VMCS_GUEST_CR0_STR;
1245 case VMCS_GUEST_CR3:
1246 return VMCS_GUEST_CR3_STR;
1247 case VMCS_GUEST_CR4:
1248 return VMCS_GUEST_CR4_STR;
1249 case VMCS_GUEST_ES_BASE:
1250 return VMCS_GUEST_ES_BASE_STR;
1251 case VMCS_GUEST_CS_BASE:
1252 return VMCS_GUEST_CS_BASE_STR;
1253 case VMCS_GUEST_SS_BASE:
1254 return VMCS_GUEST_SS_BASE_STR;
1255 case VMCS_GUEST_DS_BASE:
1256 return VMCS_GUEST_DS_BASE_STR;
1257 case VMCS_GUEST_FS_BASE:
1258 return VMCS_GUEST_FS_BASE_STR;
1259 case VMCS_GUEST_GS_BASE:
1260 return VMCS_GUEST_GS_BASE_STR;
1261 case VMCS_GUEST_LDTR_BASE:
1262 return VMCS_GUEST_LDTR_BASE_STR;
1263 case VMCS_GUEST_TR_BASE:
1264 return VMCS_GUEST_TR_BASE_STR;
1265 case VMCS_GUEST_GDTR_BASE:
1266 return VMCS_GUEST_GDTR_BASE_STR;
1267 case VMCS_GUEST_IDTR_BASE:
1268 return VMCS_GUEST_IDTR_BASE_STR;
1269 case VMCS_GUEST_DR7:
1270 return VMCS_GUEST_DR7_STR;
1271 case VMCS_GUEST_RSP:
1272 return VMCS_GUEST_RSP_STR;
1273 case VMCS_GUEST_RIP:
1274 return VMCS_GUEST_RIP_STR;
1275 case VMCS_GUEST_RFLAGS:
1276 return VMCS_GUEST_RFLAGS_STR;
1277 case VMCS_GUEST_PENDING_DBG_EXCP:
1278 return VMCS_GUEST_PENDING_DBG_EXCP_STR;
1279 case VMCS_GUEST_SYSENTER_ESP:
1280 return VMCS_GUEST_SYSENTER_ESP_STR;
1281 case VMCS_GUEST_SYSENTER_EIP:
1282 return VMCS_GUEST_SYSENTER_EIP_STR;
1284 return VMCS_HOST_CR0_STR;
1286 return VMCS_HOST_CR3_STR;
1288 return VMCS_HOST_CR4_STR;
1289 case VMCS_HOST_FS_BASE:
1290 return VMCS_HOST_FS_BASE_STR;
1291 case VMCS_HOST_GS_BASE:
1292 return VMCS_HOST_GS_BASE_STR;
1293 case VMCS_HOST_TR_BASE:
1294 return VMCS_HOST_TR_BASE_STR;
1295 case VMCS_HOST_GDTR_BASE:
1296 return VMCS_HOST_GDTR_BASE_STR;
1297 case VMCS_HOST_IDTR_BASE:
1298 return VMCS_HOST_IDTR_BASE_STR;
1299 case VMCS_HOST_SYSENTER_ESP:
1300 return VMCS_HOST_SYSENTER_ESP_STR;
1301 case VMCS_HOST_SYSENTER_EIP:
1302 return VMCS_HOST_SYSENTER_EIP_STR;
1304 return VMCS_HOST_RSP_STR;
1306 return VMCS_HOST_RIP_STR;