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>
32 static int inline check_vmcs_write(vmcs_field_t field, addr_t val) {
34 ret = vmcs_write(field, val);
36 if (ret != VMX_SUCCESS) {
37 PrintError("VMWRITE error on %s!: %d\n", v3_vmcs_field_to_str(field), ret);
44 static int inline check_vmcs_read(vmcs_field_t field, void * val) {
46 ret = vmcs_read(field, val);
48 if (ret != VMX_SUCCESS) {
49 PrintError("VMREAD error on %s!: %d\n", v3_vmcs_field_to_str(field), ret);
61 typedef enum { ES = 0,
70 IDTR = 18} vmcs_seg_offsets_t;
72 typedef enum {BASE = VMCS_GUEST_ES_BASE,
73 LIMIT = VMCS_GUEST_ES_LIMIT,
74 ACCESS = VMCS_GUEST_ES_ACCESS,
75 SELECTOR = VMCS_GUEST_ES_SELECTOR } vmcs_seg_bases_t;
79 static int v3_read_vmcs_segment(struct v3_segment * seg, vmcs_seg_offsets_t seg_type) {
80 vmcs_field_t selector = VMCS_GUEST_ES_SELECTOR + seg_type;
81 vmcs_field_t base = VMCS_GUEST_ES_BASE + seg_type;
82 vmcs_field_t limit = VMCS_GUEST_ES_LIMIT + seg_type;
83 vmcs_field_t access = VMCS_GUEST_ES_ACCESS + seg_type;
84 struct vmcs_segment vmcs_seg;
86 memset(&vmcs_seg, 0, sizeof(struct vmcs_segment));
88 check_vmcs_read(limit, &(vmcs_seg.limit));
89 check_vmcs_read(base, &(vmcs_seg.base));
91 if ((seg_type != GDTR) && (seg_type != IDTR)) {
92 check_vmcs_read(selector, &(vmcs_seg.selector));
93 check_vmcs_read(access, &(vmcs_seg.access.val));
96 v3_vmxseg_to_seg(&vmcs_seg, seg);
101 static int v3_write_vmcs_segment(struct v3_segment * seg, vmcs_seg_offsets_t seg_type) {
102 vmcs_field_t selector = VMCS_GUEST_ES_SELECTOR + seg_type;
103 vmcs_field_t base = VMCS_GUEST_ES_BASE + seg_type;
104 vmcs_field_t limit = VMCS_GUEST_ES_LIMIT + seg_type;
105 vmcs_field_t access = VMCS_GUEST_ES_ACCESS + seg_type;
106 struct vmcs_segment vmcs_seg;
108 v3_seg_to_vmxseg(seg, &vmcs_seg);
110 check_vmcs_write(limit, vmcs_seg.limit);
111 check_vmcs_write(base, vmcs_seg.base);
113 if ((seg_type != GDTR) && (seg_type != IDTR)) {
114 check_vmcs_write(access, vmcs_seg.access.val);
115 check_vmcs_write(selector, vmcs_seg.selector);
121 int v3_read_vmcs_segments(struct v3_segments * segs) {
122 v3_read_vmcs_segment(&(segs->cs), CS);
123 v3_read_vmcs_segment(&(segs->ds), DS);
124 v3_read_vmcs_segment(&(segs->es), ES);
125 v3_read_vmcs_segment(&(segs->fs), FS);
126 v3_read_vmcs_segment(&(segs->gs), GS);
127 v3_read_vmcs_segment(&(segs->ss), SS);
128 v3_read_vmcs_segment(&(segs->ldtr), LDTR);
129 v3_read_vmcs_segment(&(segs->gdtr), GDTR);
130 v3_read_vmcs_segment(&(segs->idtr), IDTR);
131 v3_read_vmcs_segment(&(segs->tr), TR);
136 int v3_write_vmcs_segments(struct v3_segments * segs) {
137 v3_write_vmcs_segment(&(segs->cs), CS);
138 v3_write_vmcs_segment(&(segs->ds), DS);
139 v3_write_vmcs_segment(&(segs->es), ES);
140 v3_write_vmcs_segment(&(segs->fs), FS);
141 v3_write_vmcs_segment(&(segs->gs), GS);
142 v3_write_vmcs_segment(&(segs->ss), SS);
143 v3_write_vmcs_segment(&(segs->ldtr), LDTR);
144 v3_write_vmcs_segment(&(segs->gdtr), GDTR);
145 v3_write_vmcs_segment(&(segs->idtr), IDTR);
146 v3_write_vmcs_segment(&(segs->tr), TR);
152 void v3_vmxseg_to_seg(struct vmcs_segment * vmcs_seg, struct v3_segment * seg) {
153 memset(seg, 0, sizeof(struct v3_segment));
155 seg->selector = vmcs_seg->selector;
156 seg->limit = vmcs_seg->limit;
157 seg->base = vmcs_seg->base;
159 seg->type = vmcs_seg->access.type;
160 seg->system = vmcs_seg->access.desc_type;
161 seg->dpl = vmcs_seg->access.dpl;
162 seg->present = vmcs_seg->access.present;
163 seg->avail = vmcs_seg->access.avail;
164 seg->long_mode = vmcs_seg->access.long_mode;
165 seg->db = vmcs_seg->access.db;
166 seg->granularity = vmcs_seg->access.granularity;
167 seg->unusable = vmcs_seg->access.unusable;
171 void v3_seg_to_vmxseg(struct v3_segment * seg, struct vmcs_segment * vmcs_seg) {
172 memset(vmcs_seg, 0, sizeof(struct vmcs_segment));
174 vmcs_seg->selector = seg->selector;
175 vmcs_seg->limit = seg->limit;
176 vmcs_seg->base = seg->base;
178 vmcs_seg->access.type = seg->type;
179 vmcs_seg->access.desc_type = seg->system;
180 vmcs_seg->access.dpl = seg->dpl;
181 vmcs_seg->access.present = seg->present;
182 vmcs_seg->access.avail = seg->avail;
183 vmcs_seg->access.long_mode = seg->long_mode;
184 vmcs_seg->access.db = seg->db;
185 vmcs_seg->access.granularity = seg->granularity;
186 vmcs_seg->access.unusable = seg->unusable;
192 int v3_update_vmcs_ctrl_fields(struct guest_info * info) {
194 struct vmx_data * arch_data = (struct vmx_data *)(info->vmm_data);
196 vmx_ret |= check_vmcs_write(VMCS_PIN_CTRLS, arch_data->pin_ctrls.value);
197 vmx_ret |= check_vmcs_write(VMCS_PROC_CTRLS, arch_data->pri_proc_ctrls.value);
199 if (arch_data->pri_proc_ctrls.sec_ctrls) {
200 vmx_ret |= check_vmcs_write(VMCS_SEC_PROC_CTRLS, arch_data->sec_proc_ctrls.value);
203 vmx_ret |= check_vmcs_write(VMCS_EXIT_CTRLS, arch_data->exit_ctrls.value);
204 vmx_ret |= check_vmcs_write(VMCS_ENTRY_CTRLS, arch_data->entry_ctrls.value);
205 vmx_ret |= check_vmcs_write(VMCS_EXCP_BITMAP, arch_data->excp_bmap.value);
207 if (info->shdw_pg_mode == NESTED_PAGING) {
208 vmx_ret |= check_vmcs_write(VMCS_EPT_PTR, info->direct_map_pt);
219 int v3_vmx_save_vmcs(struct guest_info * info) {
220 struct vmx_data * vmx_info = (struct vmx_data *)(info->vmm_data);
223 check_vmcs_read(VMCS_GUEST_RIP, &(info->rip));
224 check_vmcs_read(VMCS_GUEST_RSP, &(info->vm_regs.rsp));
226 check_vmcs_read(VMCS_GUEST_CR0, &(info->ctrl_regs.cr0));
227 check_vmcs_read(VMCS_CR0_READ_SHDW, &(info->shdw_pg_state.guest_cr0));
228 check_vmcs_read(VMCS_GUEST_CR3, &(info->ctrl_regs.cr3));
229 check_vmcs_read(VMCS_GUEST_CR4, &(info->ctrl_regs.cr4));
230 check_vmcs_read(VMCS_CR4_READ_SHDW, &(vmx_info->guest_cr4));
231 check_vmcs_read(VMCS_GUEST_DR7, &(info->dbg_regs.dr7));
233 check_vmcs_read(VMCS_GUEST_RFLAGS, &(info->ctrl_regs.rflags));
236 check_vmcs_read(VMCS_GUEST_EFER, &(info->ctrl_regs.efer));
239 error = v3_read_vmcs_segments(&(info->segments));
245 int v3_vmx_restore_vmcs(struct guest_info * info) {
246 struct vmx_data * vmx_info = (struct vmx_data *)(info->vmm_data);
249 check_vmcs_write(VMCS_GUEST_RIP, info->rip);
250 check_vmcs_write(VMCS_GUEST_RSP, info->vm_regs.rsp);
252 check_vmcs_write(VMCS_GUEST_CR0, info->ctrl_regs.cr0);
253 check_vmcs_write(VMCS_CR0_READ_SHDW, info->shdw_pg_state.guest_cr0);
254 check_vmcs_write(VMCS_GUEST_CR3, info->ctrl_regs.cr3);
255 check_vmcs_write(VMCS_GUEST_CR4, info->ctrl_regs.cr4);
256 check_vmcs_write(VMCS_CR4_READ_SHDW, vmx_info->guest_cr4);
257 check_vmcs_write(VMCS_GUEST_DR7, info->dbg_regs.dr7);
259 check_vmcs_write(VMCS_GUEST_RFLAGS, info->ctrl_regs.rflags);
262 check_vmcs_write(VMCS_GUEST_EFER, info->ctrl_regs.efer);
263 check_vmcs_write(VMCS_ENTRY_CTRLS, vmx_info->entry_ctrls.value);
269 error = v3_write_vmcs_segments(&(info->segments));
277 int v3_update_vmcs_host_state(struct guest_info * info) {
280 struct v3_msr tmp_msr;
285 } __attribute__((packed)) tmp_seg;
288 __asm__ __volatile__ ( "movq %%cr0, %0; "
293 __asm__ __volatile__ ( "movl %%cr0, %0; "
298 vmx_ret |= check_vmcs_write(VMCS_HOST_CR0, tmp);
302 __asm__ __volatile__ ( "movq %%cr3, %0; "
307 __asm__ __volatile__ ( "movl %%cr3, %0; "
312 vmx_ret |= check_vmcs_write(VMCS_HOST_CR3, tmp);
316 __asm__ __volatile__ ( "movq %%cr4, %0; "
321 __asm__ __volatile__ ( "movl %%cr4, %0; "
326 vmx_ret |= check_vmcs_write(VMCS_HOST_CR4, tmp);
329 __asm__ __volatile__(
335 gdtr_base = tmp_seg.base;
336 vmx_ret |= check_vmcs_write(VMCS_HOST_GDTR_BASE, tmp_seg.base);
338 __asm__ __volatile__(
344 vmx_ret |= check_vmcs_write(VMCS_HOST_IDTR_BASE, tmp_seg.base);
346 __asm__ __volatile__(
352 vmx_ret |= check_vmcs_write(VMCS_HOST_TR_SELECTOR, tmp_seg.selector);
354 /* The GDTR *index* is bits 3-15 of the selector. */
356 struct tss_descriptor * desc = NULL;
357 desc = (struct tss_descriptor *)(gdtr_base + (8 * (tmp_seg.selector >> 3)));
359 tmp_seg.base = ((desc->base1) |
360 (desc->base2 << 16) |
361 (desc->base3 << 24) |
363 ((uint64_t)desc->base4 << 32)
369 vmx_ret |= check_vmcs_write(VMCS_HOST_TR_BASE, tmp_seg.base);
374 __asm__ __volatile__ ( "movq %%cs, %0; "
379 __asm__ __volatile__ ( "movl %%cs, %0; "
384 vmx_ret |= check_vmcs_write(VMCS_HOST_CS_SELECTOR, tmp);
387 __asm__ __volatile__ ( "movq %%ss, %0; "
392 __asm__ __volatile__ ( "movl %%ss, %0; "
397 vmx_ret |= check_vmcs_write(VMCS_HOST_SS_SELECTOR, tmp);
400 __asm__ __volatile__ ( "movq %%ds, %0; "
405 __asm__ __volatile__ ( "movl %%ds, %0; "
410 vmx_ret |= check_vmcs_write(VMCS_HOST_DS_SELECTOR, tmp);
413 __asm__ __volatile__ ( "movq %%es, %0; "
418 __asm__ __volatile__ ( "movl %%es, %0; "
423 vmx_ret |= check_vmcs_write(VMCS_HOST_ES_SELECTOR, tmp);
426 __asm__ __volatile__ ( "movq %%fs, %0; "
431 __asm__ __volatile__ ( "movl %%fs, %0; "
436 vmx_ret |= check_vmcs_write(VMCS_HOST_FS_SELECTOR, tmp);
439 __asm__ __volatile__ ( "movq %%gs, %0; "
444 __asm__ __volatile__ ( "movl %%gs, %0; "
449 vmx_ret |= check_vmcs_write(VMCS_HOST_GS_SELECTOR, tmp);
452 #define SYSENTER_CS_MSR 0x00000174
453 #define SYSENTER_ESP_MSR 0x00000175
454 #define SYSENTER_EIP_MSR 0x00000176
455 #define FS_BASE_MSR 0xc0000100
456 #define GS_BASE_MSR 0xc0000101
457 #define EFER_MSR 0xc0000080
461 v3_get_msr(SYSENTER_CS_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
462 vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_CS, tmp_msr.lo);
465 v3_get_msr(SYSENTER_ESP_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
466 vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_ESP, tmp_msr.value);
469 v3_get_msr(SYSENTER_EIP_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
470 vmx_ret |= check_vmcs_write(VMCS_HOST_SYSENTER_EIP, tmp_msr.value);
474 v3_get_msr(FS_BASE_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
475 vmx_ret |= check_vmcs_write(VMCS_HOST_FS_BASE, tmp_msr.value);
478 v3_get_msr(GS_BASE_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
479 vmx_ret |= check_vmcs_write(VMCS_HOST_GS_BASE, tmp_msr.value);
483 v3_get_msr(EFER_MSR, &(tmp_msr.hi), &(tmp_msr.lo));
484 vmx_ret |= check_vmcs_write(VMCS_HOST_EFER, tmp_msr.value);
486 // PERF GLOBAL CONTROL
491 // save STAR, LSTAR, FMASK, KERNEL_GS_BASE MSRs in MSR load/store area
507 static inline void print_vmcs_field(vmcs_field_t vmcs_index) {
508 int len = v3_vmcs_get_field_len(vmcs_index);
511 if (vmcs_read(vmcs_index, &val) != VMX_SUCCESS) {
512 PrintError("VMCS_READ error for %s\n", v3_vmcs_field_to_str(vmcs_index));
517 PrintDebug("\t%s: 0x%.4x\n", v3_vmcs_field_to_str(vmcs_index), (uint16_t)val);
518 } else if (len == 4) {
519 PrintDebug("\t%s: 0x%.8x\n", v3_vmcs_field_to_str(vmcs_index), (uint32_t)val);
520 } else if (len == 8) {
521 PrintDebug("\t%s: 0x%p\n", v3_vmcs_field_to_str(vmcs_index), (void *)(addr_t)val);
526 static void print_vmcs_segments() {
527 struct v3_segments segs;
529 v3_read_vmcs_segments(&segs);
530 v3_print_segments(&segs);
533 PrintDebug(" ==> CS\n");
534 print_vmcs_field(VMCS_GUEST_CS_SELECTOR);
535 print_vmcs_field(VMCS_GUEST_CS_BASE);
536 print_vmcs_field(VMCS_GUEST_CS_LIMIT);
537 print_vmcs_field(VMCS_GUEST_CS_ACCESS);
539 PrintDebug(" ==> SS\n");
540 print_vmcs_field(VMCS_GUEST_SS_SELECTOR);
541 print_vmcs_field(VMCS_GUEST_SS_BASE);
542 print_vmcs_field(VMCS_GUEST_SS_LIMIT);
543 print_vmcs_field(VMCS_GUEST_SS_ACCESS);
545 PrintDebug(" ==> DS\n");
546 print_vmcs_field(VMCS_GUEST_DS_SELECTOR);
547 print_vmcs_field(VMCS_GUEST_DS_BASE);
548 print_vmcs_field(VMCS_GUEST_DS_LIMIT);
549 print_vmcs_field(VMCS_GUEST_DS_ACCESS);
551 PrintDebug(" ==> ES\n");
552 print_vmcs_field(VMCS_GUEST_ES_SELECTOR);
553 print_vmcs_field(VMCS_GUEST_ES_BASE);
554 print_vmcs_field(VMCS_GUEST_ES_LIMIT);
555 print_vmcs_field(VMCS_GUEST_ES_ACCESS);
557 PrintDebug(" ==> FS\n");
558 print_vmcs_field(VMCS_GUEST_FS_SELECTOR);
559 print_vmcs_field(VMCS_GUEST_FS_BASE);
560 print_vmcs_field(VMCS_GUEST_FS_LIMIT);
561 print_vmcs_field(VMCS_GUEST_FS_ACCESS);
563 PrintDebug(" ==> GS\n");
564 print_vmcs_field(VMCS_GUEST_GS_SELECTOR);
565 print_vmcs_field(VMCS_GUEST_GS_BASE);
566 print_vmcs_field(VMCS_GUEST_GS_LIMIT);
567 print_vmcs_field(VMCS_GUEST_GS_ACCESS);
569 PrintDebug(" ==> LDTR\n");
570 print_vmcs_field(VMCS_GUEST_LDTR_SELECTOR);
571 print_vmcs_field(VMCS_GUEST_LDTR_BASE);
572 print_vmcs_field(VMCS_GUEST_LDTR_LIMIT);
573 print_vmcs_field(VMCS_GUEST_LDTR_ACCESS);
575 PrintDebug(" ==> TR\n");
576 print_vmcs_field(VMCS_GUEST_TR_SELECTOR);
577 print_vmcs_field(VMCS_GUEST_TR_BASE);
578 print_vmcs_field(VMCS_GUEST_TR_LIMIT);
579 print_vmcs_field(VMCS_GUEST_TR_ACCESS);
581 PrintDebug(" ==> GDTR\n");
582 print_vmcs_field(VMCS_GUEST_GDTR_BASE);
583 print_vmcs_field(VMCS_GUEST_GDTR_LIMIT);
585 PrintDebug(" ==> IDTR\n");
586 print_vmcs_field(VMCS_GUEST_IDTR_BASE);
587 print_vmcs_field(VMCS_GUEST_IDTR_LIMIT);
595 static void print_guest_state()
597 PrintDebug("VMCS_GUEST_STATE\n");
598 print_vmcs_field(VMCS_GUEST_RIP);
599 print_vmcs_field(VMCS_GUEST_RSP);
600 print_vmcs_field(VMCS_GUEST_RFLAGS);
601 print_vmcs_field(VMCS_GUEST_CR0);
602 print_vmcs_field(VMCS_GUEST_CR3);
603 print_vmcs_field(VMCS_GUEST_CR4);
604 print_vmcs_field(VMCS_GUEST_DR7);
607 print_vmcs_field(VMCS_GUEST_EFER);
609 print_vmcs_field(VMCS_GUEST_EFER_HIGH);
615 print_vmcs_segments();
619 print_vmcs_field(VMCS_GUEST_DBG_CTL);
621 print_vmcs_field(VMCS_GUEST_DBG_CTL_HIGH);
623 print_vmcs_field(VMCS_GUEST_SYSENTER_CS);
624 print_vmcs_field(VMCS_GUEST_SYSENTER_ESP);
625 print_vmcs_field(VMCS_GUEST_SYSENTER_EIP);
629 print_vmcs_field(VMCS_GUEST_PAT);
631 print_vmcs_field(VMCS_GUEST_PAT_HIGH);
634 //if load IA32_PERF_GLOBAL_CTRL
635 print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL);
637 print_vmcs_field(VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH);
640 print_vmcs_field(VMCS_GUEST_SMBASE);
645 PrintDebug("GUEST_NON_REGISTER_STATE\n");
647 print_vmcs_field(VMCS_GUEST_ACTIVITY_STATE);
648 print_vmcs_field(VMCS_GUEST_INT_STATE);
649 print_vmcs_field(VMCS_GUEST_PENDING_DBG_EXCP);
651 // if VMX preempt timer
652 print_vmcs_field(VMCS_PREEMPT_TIMER);
656 static void print_host_state()
658 PrintDebug("VMCS_HOST_STATE\n");
660 print_vmcs_field(VMCS_HOST_RIP);
661 print_vmcs_field(VMCS_HOST_RSP);
662 print_vmcs_field(VMCS_HOST_CR0);
663 print_vmcs_field(VMCS_HOST_CR3);
664 print_vmcs_field(VMCS_HOST_CR4);
669 print_vmcs_field(VMCS_HOST_EFER);
671 print_vmcs_field(VMCS_HOST_EFER_HIGH);
676 print_vmcs_field(VMCS_HOST_CS_SELECTOR);
677 print_vmcs_field(VMCS_HOST_SS_SELECTOR);
678 print_vmcs_field(VMCS_HOST_DS_SELECTOR);
679 print_vmcs_field(VMCS_HOST_ES_SELECTOR);
680 print_vmcs_field(VMCS_HOST_FS_SELECTOR);
681 print_vmcs_field(VMCS_HOST_GS_SELECTOR);
682 print_vmcs_field(VMCS_HOST_TR_SELECTOR);
685 print_vmcs_field(VMCS_HOST_FS_BASE);
686 print_vmcs_field(VMCS_HOST_GS_BASE);
687 print_vmcs_field(VMCS_HOST_TR_BASE);
688 print_vmcs_field(VMCS_HOST_GDTR_BASE);
689 print_vmcs_field(VMCS_HOST_IDTR_BASE);
692 print_vmcs_field(VMCS_HOST_SYSENTER_CS);
693 print_vmcs_field(VMCS_HOST_SYSENTER_ESP);
694 print_vmcs_field(VMCS_HOST_SYSENTER_EIP);
698 print_vmcs_field(VMCS_HOST_PAT);
700 print_vmcs_field(VMCS_HOST_PAT_HIGH);
703 // if load IA32_PERF_GLOBAL_CTRL
704 print_vmcs_field(VMCS_HOST_PERF_GLOBAL_CTRL);
706 print_vmcs_field(VMCS_HOST_PERF_GLOBAL_CTRL_HIGH);
711 static void print_exec_ctrls() {
712 PrintDebug("VMCS_EXEC_CTRL_FIELDS\n");
713 print_vmcs_field(VMCS_PIN_CTRLS);
714 print_vmcs_field(VMCS_PROC_CTRLS);
716 // if activate secondary controls
717 print_vmcs_field(VMCS_SEC_PROC_CTRLS);
719 print_vmcs_field(VMCS_EXCP_BITMAP);
720 print_vmcs_field(VMCS_PG_FAULT_ERR_MASK);
721 print_vmcs_field(VMCS_PG_FAULT_ERR_MATCH);
723 print_vmcs_field(VMCS_IO_BITMAP_A_ADDR);
725 print_vmcs_field(VMCS_IO_BITMAP_A_ADDR_HIGH);
728 print_vmcs_field(VMCS_IO_BITMAP_B_ADDR);
730 print_vmcs_field(VMCS_IO_BITMAP_B_ADDR_HIGH);
733 print_vmcs_field(VMCS_TSC_OFFSET);
735 print_vmcs_field(VMCS_TSC_OFFSET_HIGH);
740 print_vmcs_field(VMCS_CR0_MASK);
741 print_vmcs_field(VMCS_CR0_READ_SHDW);
742 print_vmcs_field(VMCS_CR4_MASK);
743 print_vmcs_field(VMCS_CR4_READ_SHDW);
745 print_vmcs_field(VMCS_CR3_TGT_CNT);
746 print_vmcs_field(VMCS_CR3_TGT_VAL_0);
747 print_vmcs_field(VMCS_CR3_TGT_VAL_1);
748 print_vmcs_field(VMCS_CR3_TGT_VAL_2);
749 print_vmcs_field(VMCS_CR3_TGT_VAL_3);
751 // Check max number of CR3 targets... may continue...
756 // if virtualize apic accesses
757 print_vmcs_field(VMCS_APIC_ACCESS_ADDR);
759 print_vmcs_field(VMCS_APIC_ACCESS_ADDR_HIGH);
763 print_vmcs_field(VMCS_VAPIC_ADDR);
765 print_vmcs_field(VMCS_VAPIC_ADDR_HIGH);
769 print_vmcs_field(VMCS_TPR_THRESHOLD);
772 // if use MSR bitmaps
773 print_vmcs_field(VMCS_MSR_BITMAP);
775 print_vmcs_field(VMCS_MSR_BITMAP_HIGH);
778 print_vmcs_field(VMCS_EXEC_PTR);
780 print_vmcs_field(VMCS_EXEC_PTR_HIGH);
786 static void print_ept_state() {
787 V3_Print("VMCS EPT INFO\n");
790 print_vmcs_field(VMCS_VPID);
792 print_vmcs_field(VMCS_EPT_PTR);
794 print_vmcs_field(VMCS_EPT_PTR_HIGH);
797 print_vmcs_field(VMCS_GUEST_PHYS_ADDR);
799 print_vmcs_field(VMCS_GUEST_PHYS_ADDR_HIGH);
804 print_vmcs_field(VMCS_GUEST_PDPTE0);
806 print_vmcs_field(VMCS_GUEST_PDPTE0_HIGH);
809 print_vmcs_field(VMCS_GUEST_PDPTE1);
811 print_vmcs_field(VMCS_GUEST_PDPTE1_HIGH);
814 print_vmcs_field(VMCS_GUEST_PDPTE2);
816 print_vmcs_field(VMCS_GUEST_PDPTE2_HIGH);
819 print_vmcs_field(VMCS_GUEST_PDPTE3);
821 print_vmcs_field(VMCS_GUEST_PDPTE3_HIGH);
829 static void print_exit_ctrls() {
830 PrintDebug("VMCS_EXIT_CTRLS\n");
832 print_vmcs_field(VMCS_EXIT_CTRLS);
835 print_vmcs_field(VMCS_EXIT_MSR_STORE_CNT);
836 print_vmcs_field(VMCS_EXIT_MSR_STORE_ADDR);
838 print_vmcs_field(VMCS_EXIT_MSR_STORE_ADDR_HIGH);
841 print_vmcs_field(VMCS_EXIT_MSR_LOAD_CNT);
842 print_vmcs_field(VMCS_EXIT_MSR_LOAD_ADDR);
844 print_vmcs_field(VMCS_EXIT_MSR_LOAD_ADDR_HIGH);
848 // if pause loop exiting
849 print_vmcs_field(VMCS_PLE_GAP);
850 print_vmcs_field(VMCS_PLE_WINDOW);
855 static void print_entry_ctrls() {
856 PrintDebug("VMCS_ENTRY_CTRLS\n");
858 print_vmcs_field(VMCS_ENTRY_CTRLS);
860 print_vmcs_field(VMCS_ENTRY_MSR_LOAD_CNT);
861 print_vmcs_field(VMCS_ENTRY_MSR_LOAD_ADDR);
863 print_vmcs_field(VMCS_ENTRY_MSR_LOAD_ADDR_HIGH);
866 print_vmcs_field(VMCS_ENTRY_INT_INFO);
867 print_vmcs_field(VMCS_ENTRY_EXCP_ERR);
868 print_vmcs_field(VMCS_ENTRY_INSTR_LEN);
874 static void print_exit_info() {
875 PrintDebug("VMCS_EXIT_INFO\n");
877 print_vmcs_field(VMCS_EXIT_REASON);
878 print_vmcs_field(VMCS_EXIT_QUAL);
880 print_vmcs_field(VMCS_EXIT_INT_INFO);
881 print_vmcs_field(VMCS_EXIT_INT_ERR);
883 print_vmcs_field(VMCS_IDT_VECTOR_INFO);
884 print_vmcs_field(VMCS_IDT_VECTOR_ERR);
886 print_vmcs_field(VMCS_EXIT_INSTR_LEN);
888 print_vmcs_field(VMCS_GUEST_LINEAR_ADDR);
889 print_vmcs_field(VMCS_EXIT_INSTR_INFO);
891 print_vmcs_field(VMCS_IO_RCX);
892 print_vmcs_field(VMCS_IO_RSI);
893 print_vmcs_field(VMCS_IO_RDI);
894 print_vmcs_field(VMCS_IO_RIP);
897 print_vmcs_field(VMCS_INSTR_ERR);
900 void v3_print_vmcs() {
902 print_vmcs_field(VMCS_LINK_PTR);
904 print_vmcs_field(VMCS_LINK_PTR_HIGH);
921 * Returns the field length in bytes
922 * It doesn't get much uglier than this... Thanks Intel
924 int v3_vmcs_get_field_len(vmcs_field_t field) {
925 struct vmcs_field_encoding * enc = (struct vmcs_field_encoding *)&field;
927 switch (enc->width) {
931 if (enc->access_type == 1) {
934 return sizeof(addr_t);
940 return sizeof(addr_t);
942 PrintError("Invalid VMCS field: 0x%x\n", field);
957 static const char VMCS_VPID_STR[] = "VPID";
958 static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR";
959 static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR";
960 static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR";
961 static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR";
962 static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR";
963 static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR";
964 static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR";
965 static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR";
966 static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR";
967 static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR";
968 static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR";
969 static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR";
970 static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR";
971 static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR";
972 static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR";
973 static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR";
974 static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH";
975 static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR";
976 static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH";
977 static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS";
978 static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH";
979 static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR";
980 static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH";
981 static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR";
982 static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH";
983 static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR";
984 static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH";
985 static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR";
986 static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH";
987 static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET";
988 static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH";
989 static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR";
990 static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH";
991 static const char VMCS_APIC_ACCESS_ADDR_STR[] = "APIC_ACCESS_ADDR";
992 static const char VMCS_APIC_ACCESS_ADDR_HIGH_STR[] = "APIC_ACCESS_ADDR_HIGH";
993 static const char VMCS_EPT_PTR_STR[] = "VMCS_EPT_PTR";
994 static const char VMCS_EPT_PTR_HIGH_STR[] = "VMCS_EPT_PTR_HIGH";
995 static const char VMCS_GUEST_PHYS_ADDR_STR[] = "VMCS_GUEST_PHYS_ADDR";
996 static const char VMCS_GUEST_PHYS_ADDR_HIGH_STR[] = "VMCS_GUEST_PHYS_ADDR_HIGH";
997 static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR";
998 static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH";
999 static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL";
1000 static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH";
1001 static const char VMCS_GUEST_PAT_STR[] = "GUEST_PAT";
1002 static const char VMCS_GUEST_PAT_HIGH_STR[] = "GUEST_PAT_HIGH";
1003 static const char VMCS_GUEST_EFER_STR[] = "GUEST_EFER";
1004 static const char VMCS_GUEST_EFER_HIGH_STR[] = "GUEST_EFER_HIGH";
1005 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL";
1006 static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH";
1007 static const char VMCS_GUEST_PDPTE0_STR[] = "GUEST_PDPTE0";
1008 static const char VMCS_GUEST_PDPTE0_HIGH_STR[] = "GUEST_PDPTE0_HIGH";
1009 static const char VMCS_GUEST_PDPTE1_STR[] = "GUEST_PDPTE1";
1010 static const char VMCS_GUEST_PDPTE1_HIGH_STR[] = "GUEST_PDPTE1_HIGH";
1011 static const char VMCS_GUEST_PDPTE2_STR[] = "GUEST_PDPTE2";
1012 static const char VMCS_GUEST_PDPTE2_HIGH_STR[] = "GUEST_PDPTE2_HIGH";
1013 static const char VMCS_GUEST_PDPTE3_STR[] = "GUEST_PDPTE3";
1014 static const char VMCS_GUEST_PDPTE3_HIGH_STR[] = "GUEST_PDPTE3_HIGH";
1015 static const char VMCS_HOST_PAT_STR[] = "HOST_PAT";
1016 static const char VMCS_HOST_PAT_HIGH_STR[] = "HOST_PAT_HIGH";
1017 static const char VMCS_HOST_EFER_STR[] = "VMCS_HOST_EFER";
1018 static const char VMCS_HOST_EFER_HIGH_STR[] = "VMCS_HOST_EFER_HIGH";
1019 static const char VMCS_HOST_PERF_GLOBAL_CTRL_STR[] = "HOST_PERF_GLOBAL_CTRL";
1020 static const char VMCS_HOST_PERF_GLOBAL_CTRL_HIGH_STR[] = "HOST_PERF_GLOBAL_CTRL_HIGH";
1021 static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS";
1022 static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS";
1023 static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP";
1024 static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK";
1025 static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH";
1026 static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT";
1027 static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS";
1028 static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT";
1029 static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT";
1030 static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS";
1031 static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT";
1032 static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD";
1033 static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR";
1034 static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH";
1035 static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD";
1036 static const char VMCS_SEC_PROC_CTRLS_STR[] = "VMCS_SEC_PROC_CTRLS";
1037 static const char VMCS_PLE_GAP_STR[] = "PLE_GAP";
1038 static const char VMCS_PLE_WINDOW_STR[] = "PLE_WINDOW";
1039 static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR";
1040 static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON";
1041 static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO";
1042 static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR";
1043 static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO";
1044 static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR";
1045 static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH";
1046 static const char VMCS_EXIT_INSTR_INFO_STR[] = "VMX_INSTR_INFO";
1047 static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT";
1048 static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT";
1049 static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT";
1050 static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT";
1051 static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT";
1052 static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT";
1053 static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT";
1054 static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT";
1055 static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT";
1056 static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT";
1057 static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS";
1058 static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS";
1059 static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS";
1060 static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS";
1061 static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS";
1062 static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS";
1063 static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS";
1064 static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS";
1065 static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE";
1066 static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE";
1067 static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE";
1068 static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS";
1069 static const char VMCS_PREEMPT_TIMER_STR[] = "PREEMPT_TIMER";
1070 static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS";
1071 static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK";
1072 static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK";
1073 static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW";
1074 static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW";
1075 static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0";
1076 static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1";
1077 static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2";
1078 static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3";
1079 static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION";
1080 static const char VMCS_IO_RCX_STR[] = "IO_RCX";
1081 static const char VMCS_IO_RSI_STR[] = "IO_RSI";
1082 static const char VMCS_IO_RDI_STR[] = "IO_RDI";
1083 static const char VMCS_IO_RIP_STR[] = "IO_RIP";
1084 static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR";
1085 static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0";
1086 static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3";
1087 static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4";
1088 static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE";
1089 static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE";
1090 static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE";
1091 static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE";
1092 static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE";
1093 static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE";
1094 static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE";
1095 static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE";
1096 static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE";
1097 static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE";
1098 static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7";
1099 static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP";
1100 static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP";
1101 static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS";
1102 static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS";
1103 static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP";
1104 static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP";
1105 static const char VMCS_HOST_CR0_STR[] = "HOST_CR0";
1106 static const char VMCS_HOST_CR3_STR[] = "HOST_CR3";
1107 static const char VMCS_HOST_CR4_STR[] = "HOST_CR4";
1108 static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE";
1109 static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE";
1110 static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE";
1111 static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE";
1112 static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE";
1113 static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP";
1114 static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP";
1115 static const char VMCS_HOST_RSP_STR[] = "HOST_RSP";
1116 static const char VMCS_HOST_RIP_STR[] = "HOST_RIP";
1120 const char * v3_vmcs_field_to_str(vmcs_field_t field) {
1123 return VMCS_VPID_STR;
1124 case VMCS_GUEST_ES_SELECTOR:
1125 return VMCS_GUEST_ES_SELECTOR_STR;
1126 case VMCS_GUEST_CS_SELECTOR:
1127 return VMCS_GUEST_CS_SELECTOR_STR;
1128 case VMCS_GUEST_SS_SELECTOR:
1129 return VMCS_GUEST_SS_SELECTOR_STR;
1130 case VMCS_GUEST_DS_SELECTOR:
1131 return VMCS_GUEST_DS_SELECTOR_STR;
1132 case VMCS_GUEST_FS_SELECTOR:
1133 return VMCS_GUEST_FS_SELECTOR_STR;
1134 case VMCS_GUEST_GS_SELECTOR:
1135 return VMCS_GUEST_GS_SELECTOR_STR;
1136 case VMCS_GUEST_LDTR_SELECTOR:
1137 return VMCS_GUEST_LDTR_SELECTOR_STR;
1138 case VMCS_GUEST_TR_SELECTOR:
1139 return VMCS_GUEST_TR_SELECTOR_STR;
1140 case VMCS_HOST_ES_SELECTOR:
1141 return VMCS_HOST_ES_SELECTOR_STR;
1142 case VMCS_HOST_CS_SELECTOR:
1143 return VMCS_HOST_CS_SELECTOR_STR;
1144 case VMCS_HOST_SS_SELECTOR:
1145 return VMCS_HOST_SS_SELECTOR_STR;
1146 case VMCS_HOST_DS_SELECTOR:
1147 return VMCS_HOST_DS_SELECTOR_STR;
1148 case VMCS_HOST_FS_SELECTOR:
1149 return VMCS_HOST_FS_SELECTOR_STR;
1150 case VMCS_HOST_GS_SELECTOR:
1151 return VMCS_HOST_GS_SELECTOR_STR;
1152 case VMCS_HOST_TR_SELECTOR:
1153 return VMCS_HOST_TR_SELECTOR_STR;
1154 case VMCS_IO_BITMAP_A_ADDR:
1155 return VMCS_IO_BITMAP_A_ADDR_STR;
1156 case VMCS_IO_BITMAP_A_ADDR_HIGH:
1157 return VMCS_IO_BITMAP_A_ADDR_HIGH_STR;
1158 case VMCS_IO_BITMAP_B_ADDR:
1159 return VMCS_IO_BITMAP_B_ADDR_STR;
1160 case VMCS_IO_BITMAP_B_ADDR_HIGH:
1161 return VMCS_IO_BITMAP_B_ADDR_HIGH_STR;
1162 case VMCS_MSR_BITMAP:
1163 return VMCS_MSR_BITMAP_STR;
1164 case VMCS_MSR_BITMAP_HIGH:
1165 return VMCS_MSR_BITMAP_HIGH_STR;
1166 case VMCS_EXIT_MSR_STORE_ADDR:
1167 return VMCS_EXIT_MSR_STORE_ADDR_STR;
1168 case VMCS_EXIT_MSR_STORE_ADDR_HIGH:
1169 return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR;
1170 case VMCS_EXIT_MSR_LOAD_ADDR:
1171 return VMCS_EXIT_MSR_LOAD_ADDR_STR;
1172 case VMCS_EXIT_MSR_LOAD_ADDR_HIGH:
1173 return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR;
1174 case VMCS_ENTRY_MSR_LOAD_ADDR:
1175 return VMCS_ENTRY_MSR_LOAD_ADDR_STR;
1176 case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH:
1177 return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR;
1179 return VMCS_EXEC_PTR_STR;
1180 case VMCS_EXEC_PTR_HIGH:
1181 return VMCS_EXEC_PTR_HIGH_STR;
1182 case VMCS_TSC_OFFSET:
1183 return VMCS_TSC_OFFSET_STR;
1184 case VMCS_TSC_OFFSET_HIGH:
1185 return VMCS_TSC_OFFSET_HIGH_STR;
1186 case VMCS_VAPIC_ADDR:
1187 return VMCS_VAPIC_ADDR_STR;
1188 case VMCS_VAPIC_ADDR_HIGH:
1189 return VMCS_VAPIC_ADDR_HIGH_STR;
1190 case VMCS_APIC_ACCESS_ADDR:
1191 return VMCS_APIC_ACCESS_ADDR_STR;
1192 case VMCS_APIC_ACCESS_ADDR_HIGH:
1193 return VMCS_APIC_ACCESS_ADDR_HIGH_STR;
1195 return VMCS_EPT_PTR_STR;
1196 case VMCS_EPT_PTR_HIGH:
1197 return VMCS_EPT_PTR_HIGH_STR;
1198 case VMCS_GUEST_PHYS_ADDR:
1199 return VMCS_GUEST_PHYS_ADDR_STR;
1200 case VMCS_GUEST_PHYS_ADDR_HIGH:
1201 return VMCS_GUEST_PHYS_ADDR_HIGH_STR;
1203 return VMCS_LINK_PTR_STR;
1204 case VMCS_LINK_PTR_HIGH:
1205 return VMCS_LINK_PTR_HIGH_STR;
1206 case VMCS_GUEST_DBG_CTL:
1207 return VMCS_GUEST_DBG_CTL_STR;
1208 case VMCS_GUEST_DBG_CTL_HIGH:
1209 return VMCS_GUEST_DBG_CTL_HIGH_STR;
1210 case VMCS_GUEST_PAT:
1211 return VMCS_GUEST_PAT_STR;
1212 case VMCS_GUEST_PAT_HIGH:
1213 return VMCS_GUEST_PAT_HIGH_STR;
1214 case VMCS_GUEST_EFER:
1215 return VMCS_GUEST_EFER_STR;
1216 case VMCS_GUEST_EFER_HIGH:
1217 return VMCS_GUEST_EFER_HIGH_STR;
1218 case VMCS_GUEST_PERF_GLOBAL_CTRL:
1219 return VMCS_GUEST_PERF_GLOBAL_CTRL_STR;
1220 case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH:
1221 return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR;
1222 case VMCS_GUEST_PDPTE0:
1223 return VMCS_GUEST_PDPTE0_STR;
1224 case VMCS_GUEST_PDPTE0_HIGH:
1225 return VMCS_GUEST_PDPTE0_HIGH_STR;
1226 case VMCS_GUEST_PDPTE1:
1227 return VMCS_GUEST_PDPTE1_STR;
1228 case VMCS_GUEST_PDPTE1_HIGH:
1229 return VMCS_GUEST_PDPTE1_HIGH_STR;
1230 case VMCS_GUEST_PDPTE2:
1231 return VMCS_GUEST_PDPTE2_STR;
1232 case VMCS_GUEST_PDPTE2_HIGH:
1233 return VMCS_GUEST_PDPTE2_HIGH_STR;
1234 case VMCS_GUEST_PDPTE3:
1235 return VMCS_GUEST_PDPTE3_STR;
1236 case VMCS_GUEST_PDPTE3_HIGH:
1237 return VMCS_GUEST_PDPTE3_HIGH_STR;
1239 return VMCS_HOST_PAT_STR;
1240 case VMCS_HOST_PAT_HIGH:
1241 return VMCS_HOST_PAT_HIGH_STR;
1242 case VMCS_HOST_EFER:
1243 return VMCS_HOST_EFER_STR;
1244 case VMCS_HOST_EFER_HIGH:
1245 return VMCS_HOST_EFER_HIGH_STR;
1246 case VMCS_HOST_PERF_GLOBAL_CTRL:
1247 return VMCS_HOST_PERF_GLOBAL_CTRL_STR;
1248 case VMCS_HOST_PERF_GLOBAL_CTRL_HIGH:
1249 return VMCS_HOST_PERF_GLOBAL_CTRL_HIGH_STR;
1250 case VMCS_PIN_CTRLS:
1251 return VMCS_PIN_CTRLS_STR;
1252 case VMCS_PROC_CTRLS:
1253 return VMCS_PROC_CTRLS_STR;
1254 case VMCS_EXCP_BITMAP:
1255 return VMCS_EXCP_BITMAP_STR;
1256 case VMCS_PG_FAULT_ERR_MASK:
1257 return VMCS_PG_FAULT_ERR_MASK_STR;
1258 case VMCS_PG_FAULT_ERR_MATCH:
1259 return VMCS_PG_FAULT_ERR_MATCH_STR;
1260 case VMCS_CR3_TGT_CNT:
1261 return VMCS_CR3_TGT_CNT_STR;
1262 case VMCS_EXIT_CTRLS:
1263 return VMCS_EXIT_CTRLS_STR;
1264 case VMCS_EXIT_MSR_STORE_CNT:
1265 return VMCS_EXIT_MSR_STORE_CNT_STR;
1266 case VMCS_EXIT_MSR_LOAD_CNT:
1267 return VMCS_EXIT_MSR_LOAD_CNT_STR;
1268 case VMCS_ENTRY_CTRLS:
1269 return VMCS_ENTRY_CTRLS_STR;
1270 case VMCS_ENTRY_MSR_LOAD_CNT:
1271 return VMCS_ENTRY_MSR_LOAD_CNT_STR;
1272 case VMCS_ENTRY_INT_INFO:
1273 return VMCS_ENTRY_INT_INFO_STR;
1274 case VMCS_ENTRY_EXCP_ERR:
1275 return VMCS_ENTRY_EXCP_ERR_STR;
1276 case VMCS_ENTRY_INSTR_LEN:
1277 return VMCS_ENTRY_INSTR_LEN_STR;
1278 case VMCS_TPR_THRESHOLD:
1279 return VMCS_TPR_THRESHOLD_STR;
1280 case VMCS_SEC_PROC_CTRLS:
1281 return VMCS_SEC_PROC_CTRLS_STR;
1283 return VMCS_PLE_GAP_STR;
1284 case VMCS_PLE_WINDOW:
1285 return VMCS_PLE_WINDOW_STR;
1286 case VMCS_INSTR_ERR:
1287 return VMCS_INSTR_ERR_STR;
1288 case VMCS_EXIT_REASON:
1289 return VMCS_EXIT_REASON_STR;
1290 case VMCS_EXIT_INT_INFO:
1291 return VMCS_EXIT_INT_INFO_STR;
1292 case VMCS_EXIT_INT_ERR:
1293 return VMCS_EXIT_INT_ERR_STR;
1294 case VMCS_IDT_VECTOR_INFO:
1295 return VMCS_IDT_VECTOR_INFO_STR;
1296 case VMCS_IDT_VECTOR_ERR:
1297 return VMCS_IDT_VECTOR_ERR_STR;
1298 case VMCS_EXIT_INSTR_LEN:
1299 return VMCS_EXIT_INSTR_LEN_STR;
1300 case VMCS_EXIT_INSTR_INFO:
1301 return VMCS_EXIT_INSTR_INFO_STR;
1302 case VMCS_GUEST_ES_LIMIT:
1303 return VMCS_GUEST_ES_LIMIT_STR;
1304 case VMCS_GUEST_CS_LIMIT:
1305 return VMCS_GUEST_CS_LIMIT_STR;
1306 case VMCS_GUEST_SS_LIMIT:
1307 return VMCS_GUEST_SS_LIMIT_STR;
1308 case VMCS_GUEST_DS_LIMIT:
1309 return VMCS_GUEST_DS_LIMIT_STR;
1310 case VMCS_GUEST_FS_LIMIT:
1311 return VMCS_GUEST_FS_LIMIT_STR;
1312 case VMCS_GUEST_GS_LIMIT:
1313 return VMCS_GUEST_GS_LIMIT_STR;
1314 case VMCS_GUEST_LDTR_LIMIT:
1315 return VMCS_GUEST_LDTR_LIMIT_STR;
1316 case VMCS_GUEST_TR_LIMIT:
1317 return VMCS_GUEST_TR_LIMIT_STR;
1318 case VMCS_GUEST_GDTR_LIMIT:
1319 return VMCS_GUEST_GDTR_LIMIT_STR;
1320 case VMCS_GUEST_IDTR_LIMIT:
1321 return VMCS_GUEST_IDTR_LIMIT_STR;
1322 case VMCS_GUEST_ES_ACCESS:
1323 return VMCS_GUEST_ES_ACCESS_STR;
1324 case VMCS_GUEST_CS_ACCESS:
1325 return VMCS_GUEST_CS_ACCESS_STR;
1326 case VMCS_GUEST_SS_ACCESS:
1327 return VMCS_GUEST_SS_ACCESS_STR;
1328 case VMCS_GUEST_DS_ACCESS:
1329 return VMCS_GUEST_DS_ACCESS_STR;
1330 case VMCS_GUEST_FS_ACCESS:
1331 return VMCS_GUEST_FS_ACCESS_STR;
1332 case VMCS_GUEST_GS_ACCESS:
1333 return VMCS_GUEST_GS_ACCESS_STR;
1334 case VMCS_GUEST_LDTR_ACCESS:
1335 return VMCS_GUEST_LDTR_ACCESS_STR;
1336 case VMCS_GUEST_TR_ACCESS:
1337 return VMCS_GUEST_TR_ACCESS_STR;
1338 case VMCS_GUEST_INT_STATE:
1339 return VMCS_GUEST_INT_STATE_STR;
1340 case VMCS_GUEST_ACTIVITY_STATE:
1341 return VMCS_GUEST_ACTIVITY_STATE_STR;
1342 case VMCS_GUEST_SMBASE:
1343 return VMCS_GUEST_SMBASE_STR;
1344 case VMCS_GUEST_SYSENTER_CS:
1345 return VMCS_GUEST_SYSENTER_CS_STR;
1346 case VMCS_PREEMPT_TIMER:
1347 return VMCS_PREEMPT_TIMER_STR;
1348 case VMCS_HOST_SYSENTER_CS:
1349 return VMCS_HOST_SYSENTER_CS_STR;
1351 return VMCS_CR0_MASK_STR;
1353 return VMCS_CR4_MASK_STR;
1354 case VMCS_CR0_READ_SHDW:
1355 return VMCS_CR0_READ_SHDW_STR;
1356 case VMCS_CR4_READ_SHDW:
1357 return VMCS_CR4_READ_SHDW_STR;
1358 case VMCS_CR3_TGT_VAL_0:
1359 return VMCS_CR3_TGT_VAL_0_STR;
1360 case VMCS_CR3_TGT_VAL_1:
1361 return VMCS_CR3_TGT_VAL_1_STR;
1362 case VMCS_CR3_TGT_VAL_2:
1363 return VMCS_CR3_TGT_VAL_2_STR;
1364 case VMCS_CR3_TGT_VAL_3:
1365 return VMCS_CR3_TGT_VAL_3_STR;
1366 case VMCS_EXIT_QUAL:
1367 return VMCS_EXIT_QUAL_STR;
1369 return VMCS_IO_RCX_STR;
1371 return VMCS_IO_RSI_STR;
1373 return VMCS_IO_RDI_STR;
1375 return VMCS_IO_RIP_STR;
1376 case VMCS_GUEST_LINEAR_ADDR:
1377 return VMCS_GUEST_LINEAR_ADDR_STR;
1378 case VMCS_GUEST_CR0:
1379 return VMCS_GUEST_CR0_STR;
1380 case VMCS_GUEST_CR3:
1381 return VMCS_GUEST_CR3_STR;
1382 case VMCS_GUEST_CR4:
1383 return VMCS_GUEST_CR4_STR;
1384 case VMCS_GUEST_ES_BASE:
1385 return VMCS_GUEST_ES_BASE_STR;
1386 case VMCS_GUEST_CS_BASE:
1387 return VMCS_GUEST_CS_BASE_STR;
1388 case VMCS_GUEST_SS_BASE:
1389 return VMCS_GUEST_SS_BASE_STR;
1390 case VMCS_GUEST_DS_BASE:
1391 return VMCS_GUEST_DS_BASE_STR;
1392 case VMCS_GUEST_FS_BASE:
1393 return VMCS_GUEST_FS_BASE_STR;
1394 case VMCS_GUEST_GS_BASE:
1395 return VMCS_GUEST_GS_BASE_STR;
1396 case VMCS_GUEST_LDTR_BASE:
1397 return VMCS_GUEST_LDTR_BASE_STR;
1398 case VMCS_GUEST_TR_BASE:
1399 return VMCS_GUEST_TR_BASE_STR;
1400 case VMCS_GUEST_GDTR_BASE:
1401 return VMCS_GUEST_GDTR_BASE_STR;
1402 case VMCS_GUEST_IDTR_BASE:
1403 return VMCS_GUEST_IDTR_BASE_STR;
1404 case VMCS_GUEST_DR7:
1405 return VMCS_GUEST_DR7_STR;
1406 case VMCS_GUEST_RSP:
1407 return VMCS_GUEST_RSP_STR;
1408 case VMCS_GUEST_RIP:
1409 return VMCS_GUEST_RIP_STR;
1410 case VMCS_GUEST_RFLAGS:
1411 return VMCS_GUEST_RFLAGS_STR;
1412 case VMCS_GUEST_PENDING_DBG_EXCP:
1413 return VMCS_GUEST_PENDING_DBG_EXCP_STR;
1414 case VMCS_GUEST_SYSENTER_ESP:
1415 return VMCS_GUEST_SYSENTER_ESP_STR;
1416 case VMCS_GUEST_SYSENTER_EIP:
1417 return VMCS_GUEST_SYSENTER_EIP_STR;
1419 return VMCS_HOST_CR0_STR;
1421 return VMCS_HOST_CR3_STR;
1423 return VMCS_HOST_CR4_STR;
1424 case VMCS_HOST_FS_BASE:
1425 return VMCS_HOST_FS_BASE_STR;
1426 case VMCS_HOST_GS_BASE:
1427 return VMCS_HOST_GS_BASE_STR;
1428 case VMCS_HOST_TR_BASE:
1429 return VMCS_HOST_TR_BASE_STR;
1430 case VMCS_HOST_GDTR_BASE:
1431 return VMCS_HOST_GDTR_BASE_STR;
1432 case VMCS_HOST_IDTR_BASE:
1433 return VMCS_HOST_IDTR_BASE_STR;
1434 case VMCS_HOST_SYSENTER_ESP:
1435 return VMCS_HOST_SYSENTER_ESP_STR;
1436 case VMCS_HOST_SYSENTER_EIP:
1437 return VMCS_HOST_SYSENTER_EIP_STR;
1439 return VMCS_HOST_RSP_STR;
1441 return VMCS_HOST_RIP_STR;