PrintDebug("\tAccess: %x\n", seg->access);
}
+/*
+ * Returns the field length in bytes
+ */
+int vmcs_field_length(vmcs_field_t field)
+{
+ switch(field)
+ {
+ case VMCS_GUEST_ES_SELECTOR:
+ case VMCS_GUEST_CS_SELECTOR:
+ case VMCS_GUEST_SS_SELECTOR:
+ case VMCS_GUEST_DS_SELECTOR:
+ case VMCS_GUEST_FS_SELECTOR:
+ case VMCS_GUEST_GS_SELECTOR:
+ case VMCS_GUEST_LDTR_SELECTOR:
+ case VMCS_GUEST_TR_SELECTOR:
+ /* 16 bit host state */
+ case VMCS_HOST_ES_SELECTOR:
+ case VMCS_HOST_CS_SELECTOR:
+ case VMCS_HOST_SS_SELECTOR:
+ case VMCS_HOST_DS_SELECTOR:
+ case VMCS_HOST_FS_SELECTOR:
+ case VMCS_HOST_GS_SELECTOR:
+ case VMCS_HOST_TR_SELECTOR:
+ return 2;
+ /* 64 bit control fields */
+ case IO_BITMAP_A_ADDR:
+ case IO_BITMAP_A_ADDR_HIGH:
+ case IO_BITMAP_B_ADDR:
+ case IO_BITMAP_B_ADDR_HIGH:
+ case MSR_BITMAPS:
+ case MSR_BITMAPS_HIGH:
+ case VM_EXIT_MSR_STORE_ADDR:
+ case VM_EXIT_MSR_STORE_ADDR_HIGH:
+ case VM_EXIT_MSR_LOAD_ADDR:
+ case VM_EXIT_MSR_LOAD_ADDR_HIGH:
+ case VM_ENTRY_MSR_LOAD_ADDR:
+ case VM_ENTRY_MSR_LOAD_ADDR_HIGH:
+ case VMCS_EXEC_PTR:
+ case VMCS_EXEC_PTR_HIGH:
+ case TSC_OFFSET:
+ case TSC_OFFSET_HIGH:
+ case VIRT_APIC_PAGE_ADDR:
+ case VIRT_APIC_PAGE_ADDR_HIGH:
+ /* 64 bit guest state fields */
+ case VMCS_LINK_PTR:
+ case VMCS_LINK_PTR_HIGH:
+ case GUEST_IA32_DEBUGCTL:
+ case GUEST_IA32_DEBUGCTL_HIGH:
+ case GUEST_IA32_PERF_GLOBAL_CTRL:
+ case GUEST_IA32_PERF_GLOBAL_CTRL_HIGH:
+ return 8;
+ /* 32 bit control fields */
+ case PIN_VM_EXEC_CTRLS:
+ case PROC_VM_EXEC_CTRLS:
+ case EXCEPTION_BITMAP:
+ case PAGE_FAULT_ERROR_MASK:
+ case PAGE_FAULT_ERROR_MATCH:
+ case CR3_TARGET_COUNT:
+ case VM_EXIT_CTRLS:
+ case VM_EXIT_MSR_STORE_COUNT:
+ case VM_EXIT_MSR_LOAD_COUNT:
+ case VM_ENTRY_CTRLS:
+ case VM_ENTRY_MSR_LOAD_COUNT:
+ case VM_ENTRY_INT_INFO_FIELD:
+ case VM_ENTRY_EXCEPTION_ERROR:
+ case VM_ENTRY_INSTR_LENGTH:
+ case TPR_THRESHOLD:
+ /* 32 bit Read Only data fields */
+ case VM_INSTR_ERROR:
+ case EXIT_REASON:
+ case VM_EXIT_INT_INFO:
+ case VM_EXIT_INT_ERROR:
+ case IDT_VECTOR_INFO:
+ case IDT_VECTOR_ERROR:
+ case VM_EXIT_INSTR_LENGTH:
+ case VMX_INSTR_INFO:
+ /* 32 bit Guest state fields */
+ case GUEST_ES_LIMIT:
+ case GUEST_CS_LIMIT:
+ case GUEST_SS_LIMIT:
+ case GUEST_DS_LIMIT:
+ case GUEST_FS_LIMIT:
+ case GUEST_GS_LIMIT:
+ case GUEST_LDTR_LIMIT:
+ case GUEST_TR_LIMIT:
+ case GUEST_GDTR_LIMIT:
+ case GUEST_IDTR_LIMIT:
+ case GUEST_ES_ACCESS:
+ case GUEST_CS_ACCESS:
+ case GUEST_SS_ACCESS:
+ case GUEST_DS_ACCESS:
+ case GUEST_FS_ACCESS:
+ case GUEST_GS_ACCESS:
+ case GUEST_LDTR_ACCESS:
+ case GUEST_TR_ACCESS:
+ case GUEST_INT_STATE:
+ case GUEST_ACTIVITY_STATE:
+ case GUEST_SMBASE:
+ case GUEST_IA32_SYSENTER_CS:
+ /* 32 bit host state field */
+ case HOST_IA32_SYSENTER_CS:
+ return 4;
+ /* Natural Width Control Fields */
+ case CR0_GUEST_HOST_MASK:
+ case CR4_GUEST_HOST_MASK:
+ case CR0_READ_SHADOW:
+ case CR4_READ_SHADOW:
+ case CR3_TARGET_VALUE_0:
+ case CR3_TARGET_VALUE_1:
+ case CR3_TARGET_VALUE_2:
+ case CR3_TARGET_VALUE_3:
+ /* Natural Width Read Only Fields */
+ case EXIT_QUALIFICATION:
+ case IO_RCX:
+ case IO_RSI:
+ case IO_RDI:
+ case IO_RIP:
+ case GUEST_LINEAR_ADDR:
+ /* Natural Width Guest State Fields */
+ case GUEST_CR0:
+ case GUEST_CR3:
+ case GUEST_CR4:
+ case GUEST_ES_BASE:
+ case GUEST_CS_BASE:
+ case GUEST_SS_BASE:
+ case GUEST_DS_BASE:
+ case GUEST_FS_BASE:
+ case GUEST_GS_BASE:
+ case GUEST_LDTR_BASE:
+ case GUEST_TR_BASE:
+ case GUEST_GDTR_BASE:
+ case GUEST_IDTR_BASE:
+ case GUEST_DR7:
+ case GUEST_RSP:
+ case GUEST_RIP:
+ case GUEST_RFLAGS:
+ case GUEST_PENDING_DEBUG_EXCS:
+ case GUEST_IA32_SYSENTER_ESP:
+ case GUEST_IA32_SYSENTER_EIP:
+ /* Natural Width Host State Fields */
+ case HOST_CR0:
+ case HOST_CR3:
+ case HOST_CR4:
+ case HOST_FS_BASE:
+ case HOST_GS_BASE:
+ case HOST_TR_BASE:
+ case HOST_GDTR_BASE:
+ case HOST_IDTR_BASE:
+ case HOST_IA32_SYSENTER_ESP:
+ case HOST_IA32_SYSENTER_EIP:
+ case HOST_RSP:
+ case HOST_RIP:
+ /* Pin Based VM Execution Controls */
+ /* INTEL MANUAL: 20-10 vol 3B */
+ case EXTERNAL_INTERRUPT_EXITING:
+ case NMI_EXITING:
+ case VIRTUAL_NMIS:
+ /* Processor Based VM Execution Controls */
+ /* INTEL MANUAL: 20-11 vol. 3B */
+ case INTERRUPT_WINDOWS_EXIT:
+ case USE_TSC_OFFSETTING:
+ case HLT_EXITING:
+ case INVLPG_EXITING:
+ case MWAIT_EXITING:
+ case RDPMC_EXITING:
+ case RDTSC_EXITING:
+ case CR8_LOAD_EXITING:
+ case CR8_STORE_EXITING:
+ case USE_TPR_SHADOW:
+ case NMI_WINDOW_EXITING:
+ case MOVDR_EXITING:
+ case UNCONDITION_IO_EXITING:
+ case USE_IO_BITMAPS:
+ case USE_MSR_BITMAPS:
+ case MONITOR_EXITING:
+ case PAUSE_EXITING:
+ /* VM-Exit Controls */
+ /* INTEL MANUAL: 20-16 vol. 3B */
+ case HOST_ADDR_SPACE_SIZE:
+ case ACK_IRQ_ON_EXIT:
+#ifdef __V3_64BIT__
+ return 8;
+#else
+ return 4;
+#endif
+ default:
+ return -1;
+ }
+}
+
+char* vmcs_field_name(vmcs_field_t field)
+{
+ case(field)
+ {
+ case VMCS_GUEST_ES_SELECTOR:
+ return "VMCS_GUEST_ES_SELECTOR";
+ case VMCS_GUEST_CS_SELECTOR:
+ return "VMCS_GUEST_CS_SELECTOR";
+ case VMCS_GUEST_SS_SELECTOR:
+ return "VMCS_GUEST_SS_SELECTOR";
+ case VMCS_GUEST_DS_SELECTOR:
+ return "VMCS_GUEST_DS_SELECTOR";
+ case VMCS_GUEST_FS_SELECTOR:
+ return "VMCS_GUEST_FS_SELECTOR";
+ case VMCS_GUEST_GS_SELECTOR:
+ return "VMCS_GUEST_GS_SELECTOR";
+ case VMCS_GUEST_LDTR_SELECTOR:
+ return "VMCS_GUEST_LDTR_SELECTOR";
+ case VMCS_GUEST_TR_SELECTOR:
+ return "VMCS_GUEST_TR_SELECTOR";
+ case VMCS_HOST_ES_SELECTOR:
+ return "VMCS_HOST_ES_SELECTOR";
+ case VMCS_HOST_CS_SELECTOR:
+ return "VMCS_HOST_CS_SELECTOR";
+ case VMCS_HOST_SS_SELECTOR:
+ return "VMCS_HOST_SS_SELECTOR";
+ case VMCS_HOST_DS_SELECTOR:
+ return "VMCS_HOST_DS_SELECTOR";
+ case VMCS_HOST_FS_SELECTOR:
+ return "VMCS_HOST_FS_SELECTOR";
+ case VMCS_HOST_GS_SELECTOR:
+ return "VMCS_HOST_GS_SELECTOR";
+ case VMCS_HOST_TR_SELECTOR:
+ return "VMCS_HOST_TR_SELECTOR";
+ case IO_BITMAP_A_ADDR:
+ return "IO_BITMAP_A_ADDR";
+ case IO_BITMAP_A_ADDR_HIGH:
+ return "IO_BITMAP_A_ADDR_HIGH";
+ case IO_BITMAP_B_ADDR:
+ return "IO_BITMAP_B_ADDR";
+ case IO_BITMAP_B_ADDR_HIGH:
+ return "IO_BITMAP_B_ADDR_HIGH";
+ case MSR_BITMAPS:
+ return "MSR_BITMAPS";
+ case MSR_BITMAPS_HIGH:
+ return "MSR_BITMAPS_HIGH";
+ case VM_EXIT_MSR_STORE_ADDR:
+ return "VM_EXIT_MSR_STORE_ADDR";
+ case VM_EXIT_MSR_STORE_ADDR_HIGH:
+ return "VM_EXIT_MSR_STORE_ADDR_HIGH";
+ case VM_EXIT_MSR_LOAD_ADDR:
+ return "VM_EXIT_MSR_LOAD_ADDR";
+ case VM_EXIT_MSR_LOAD_ADDR_HIGH:
+ return "VM_EXIT_MSR_LOAD_ADDR_HIGH";
+ case VM_ENTRY_MSR_LOAD_ADDR:
+ return "VM_ENTRY_MSR_LOAD_ADDR";
+ case VM_ENTRY_MSR_LOAD_ADDR_HIGH:
+ return "VM_ENTRY_MSR_LOAD_ADDR_HIGH";
+ case VMCS_EXEC_PTR:
+ return "VMCS_EXEC_PTR";
+ case VMCS_EXEC_PTR_HIGH:
+ return "VMCS_EXEC_PTR_HIGH";
+ case TSC_OFFSET:
+ return "TSC_OFFSET";
+ case TSC_OFFSET_HIGH:
+ return "TSC_OFFSET_HIGH";
+ case VIRT_APIC_PAGE_ADDR:
+ return "VIRT_APIC_PAGE_ADDR";
+ case VIRT_APIC_PAGE_ADDR_HIGH:
+ return "VIRT_APIC_PAGE_ADDR_HIGH";
+ case VMCS_LINK_PTR:
+ return "VMCS_LINK_PTR";
+ case VMCS_LINK_PTR_HIGH:
+ return "VMCS_LINK_PTR_HIGH";
+ case GUEST_IA32_DEBUGCTL:
+ return "GUEST_IA32_DEBUGCTL";
+ case GUEST_IA32_DEBUGCTL_HIGH:
+ return "GUEST_IA32_DEBUGCTL_HIGH";
+ case GUEST_IA32_PERF_GLOBAL_CTRL:
+ return "GUEST_IA32_PERF_GLOBAL_CTRL";
+ case GUEST_IA32_PERF_GLOBAL_CTRL_HIGH:
+ return "GUEST_IA32_PERF_GLOBAL_CTRL_HIGH";
+ case PIN_VM_EXEC_CTRLS:
+ return "PIN_VM_EXEC_CTRLS";
+ case PROC_VM_EXEC_CTRLS:
+ return "PROC_VM_EXEC_CTRLS";
+ case EXCEPTION_BITMAP:
+ return "EXCEPTION_BITMAP";
+ case PAGE_FAULT_ERROR_MASK:
+ return "PAGE_FAULT_ERROR_MASK";
+ case PAGE_FAULT_ERROR_MATCH:
+ return "PAGE_FAULT_ERROR_MATCH";
+ case CR3_TARGET_COUNT:
+ return "CR3_TARGET_COUNT";
+ case VM_EXIT_CTRLS:
+ return "VM_EXIT_CTRLS";
+ case VM_EXIT_MSR_STORE_COUNT:
+ return "VM_EXIT_MSR_STORE_COUNT";
+ case VM_EXIT_MSR_LOAD_COUNT:
+ return "VM_EXIT_MSR_LOAD_COUNT";
+ case VM_ENTRY_CTRLS:
+ return "VM_ENTRY_CTRLS";
+ case VM_ENTRY_MSR_LOAD_COUNT:
+ return "VM_ENTRY_MSR_LOAD_COUNT";
+ case VM_ENTRY_INT_INFO_FIELD:
+ return "VM_ENTRY_INT_INFO_FIELD";
+ case VM_ENTRY_EXCEPTION_ERROR:
+ return "VM_ENTRY_EXCEPTION_ERROR";
+ case VM_ENTRY_INSTR_LENGTH:
+ return "VM_ENTRY_INSTR_LENGTH";
+ case TPR_THRESHOLD:
+ return "TPR_THRESHOLD";
+ case VM_INSTR_ERROR:
+ return "VM_INSTR_ERROR";
+ case EXIT_REASON:
+ return "EXIT_REASON";
+ case VM_EXIT_INT_INFO:
+ return "VM_EXIT_INT_INFO";
+ case VM_EXIT_INT_ERROR:
+ return "VM_EXIT_INT_ERROR";
+ case IDT_VECTOR_INFO:
+ return "IDT_VECTOR_INFO";
+ case IDT_VECTOR_ERROR:
+ return "IDT_VECTOR_ERROR";
+ case VM_EXIT_INSTR_LENGTH:
+ return "VM_EXIT_INSTR_LENGTH";
+ case VMX_INSTR_INFO:
+ return "VMX_INSTR_INFO";
+ case GUEST_ES_LIMIT:
+ return "GUEST_ES_LIMIT";
+ case GUEST_CS_LIMIT:
+ return "GUEST_CS_LIMIT";
+ case GUEST_SS_LIMIT:
+ return "GUEST_SS_LIMIT";
+ case GUEST_DS_LIMIT:
+ return "GUEST_DS_LIMIT";
+ case GUEST_FS_LIMIT:
+ return "GUEST_FS_LIMIT";
+ case GUEST_GS_LIMIT:
+ return "GUEST_GS_LIMIT";
+ case GUEST_LDTR_LIMIT:
+ return "GUEST_LDTR_LIMIT";
+ case GUEST_TR_LIMIT:
+ return "GUEST_TR_LIMIT";
+ case GUEST_GDTR_LIMIT:
+ return "GUEST_GDTR_LIMIT";
+ case GUEST_IDTR_LIMIT:
+ return "GUEST_IDTR_LIMIT";
+ case GUEST_ES_ACCESS:
+ return "GUEST_ES_ACCESS";
+ case GUEST_CS_ACCESS:
+ return "GUEST_CS_ACCESS";
+ case GUEST_SS_ACCESS:
+ return "GUEST_SS_ACCESS";
+ case GUEST_DS_ACCESS:
+ return "GUEST_DS_ACCESS";
+ case GUEST_FS_ACCESS:
+ return "GUEST_FS_ACCESS";
+ case GUEST_GS_ACCESS:
+ return "GUEST_GS_ACCESS";
+ case GUEST_LDTR_ACCESS:
+ return "GUEST_LDTR_ACCESS";
+ case GUEST_TR_ACCESS:
+ return "GUEST_TR_ACCESS";
+ case GUEST_INT_STATE:
+ return "GUEST_INT_STATE";
+ case GUEST_ACTIVITY_STATE:
+ return "GUEST_ACTIVITY_STATE";
+ case GUEST_SMBASE:
+ return "GUEST_SMBASE";
+ case GUEST_IA32_SYSENTER_CS:
+ return "GUEST_IA32_SYSENTER_CS";
+ case HOST_IA32_SYSENTER_CS:
+ return "HOST_IA32_SYSENTER_CS";
+ case CR0_GUEST_HOST_MASK:
+ return "CR0_GUEST_HOST_MASK";
+ case CR4_GUEST_HOST_MASK:
+ return "CR4_GUEST_HOST_MASK";
+ case CR0_READ_SHADOW:
+ return "CR0_READ_SHADOW";
+ case CR4_READ_SHADOW:
+ return "CR4_READ_SHADOW";
+ case CR3_TARGET_VALUE_0:
+ return "CR3_TARGET_VALUE_0";
+ case CR3_TARGET_VALUE_1:
+ return "CR3_TARGET_VALUE_1";
+ case CR3_TARGET_VALUE_2:
+ return "CR3_TARGET_VALUE_2";
+ case CR3_TARGET_VALUE_3:
+ return "CR3_TARGET_VALUE_3";
+ case EXIT_QUALIFICATION:
+ return "EXIT_QUALIFICATION";
+ case IO_RCX:
+ return "IO_RCX";
+ case IO_RSI:
+ return "IO_RSI";
+ case IO_RDI:
+ return "IO_RDI";
+ case IO_RIP:
+ return "IO_RIP";
+ case GUEST_LINEAR_ADDR:
+ return "GUEST_LINEAR_ADDR";
+ case GUEST_CR0:
+ return "GUEST_CR0";
+ case GUEST_CR3:
+ return "GUEST_CR3";
+ case GUEST_CR4:
+ return "GUEST_CR4";
+ case GUEST_ES_BASE:
+ return "GUEST_ES_BASE";
+ case GUEST_CS_BASE:
+ return "GUEST_CS_BASE";
+ case GUEST_SS_BASE:
+ return "GUEST_SS_BASE";
+ case GUEST_DS_BASE:
+ return "GUEST_DS_BASE";
+ case GUEST_FS_BASE:
+ return "GUEST_FS_BASE";
+ case GUEST_GS_BASE:
+ return "GUEST_GS_BASE";
+ case GUEST_LDTR_BASE:
+ return "GUEST_LDTR_BASE";
+ case GUEST_TR_BASE:
+ return "GUEST_TR_BASE";
+ case GUEST_GDTR_BASE:
+ return "GUEST_GDTR_BASE";
+ case GUEST_IDTR_BASE:
+ return "GUEST_IDTR_BASE";
+ case GUEST_DR7:
+ return "GUEST_DR7";
+ case GUEST_RSP:
+ return "GUEST_RSP";
+ case GUEST_RIP:
+ return "GUEST_RIP";
+ case GUEST_RFLAGS:
+ return "GUEST_RFLAGS";
+ case GUEST_PENDING_DEBUG_EXCS:
+ return "GUEST_PENDING_DEBUG_EXCS";
+ case GUEST_IA32_SYSENTER_ESP:
+ return "GUEST_IA32_SYSENTER_ESP";
+ case GUEST_IA32_SYSENTER_EIP:
+ return "GUEST_IA32_SYSENTER_EIP";
+ case HOST_CR0:
+ return "HOST_CR0";
+ case HOST_CR3:
+ return "HOST_CR3";
+ case HOST_CR4:
+ return "HOST_CR4";
+ case HOST_FS_BASE:
+ return "HOST_FS_BASE";
+ case HOST_GS_BASE:
+ return "HOST_GS_BASE";
+ case HOST_TR_BASE:
+ return "HOST_TR_BASE";
+ case HOST_GDTR_BASE:
+ return "HOST_GDTR_BASE";
+ case HOST_IDTR_BASE:
+ return "HOST_IDTR_BASE";
+ case HOST_IA32_SYSENTER_ESP:
+ return "HOST_IA32_SYSENTER_ESP";
+ case HOST_IA32_SYSENTER_EIP:
+ return "HOST_IA32_SYSENTER_EIP";
+ case HOST_RSP:
+ return "HOST_RSP";
+ case HOST_RIP:
+ return "HOST_RIP";
+ case EXTERNAL_INTERRUPT_EXITING:
+ return "EXTERNAL_INTERRUPT_EXITING";
+ case NMI_EXITING:
+ return "NMI_EXITING";
+ case VIRTUAL_NMIS:
+ return "VIRTUAL_NMIS";
+ case INTERRUPT_WINDOWS_EXIT:
+ return "INTERRUPT_WINDOWS_EXIT";
+ case USE_TSC_OFFSETTING:
+ return "USE_TSC_OFFSETTING";
+ case HLT_EXITING:
+ return "HLT_EXITING";
+ case INVLPG_EXITING:
+ return "INVLPG_EXITING";
+ case MWAIT_EXITING:
+ return "MWAIT_EXITING";
+ case RDPMC_EXITING:
+ return "RDPMC_EXITING";
+ case RDTSC_EXITING:
+ return "RDTSC_EXITING";
+ case CR8_LOAD_EXITING:
+ return "CR8_LOAD_EXITING";
+ case CR8_STORE_EXITING:
+ return "CR8_STORE_EXITING";
+ case USE_TPR_SHADOW:
+ return "USE_TPR_SHADOW";
+ case NMI_WINDOW_EXITING:
+ return "NMI_WINDOW_EXITING";
+ case MOVDR_EXITING:
+ return "MOVDR_EXITING";
+ case UNCONDITION_IO_EXITING:
+ return "UNCONDITION_IO_EXITING";
+ case USE_IO_BITMAPS:
+ return "USE_IO_BITMAPS";
+ case USE_MSR_BITMAPS:
+ return "USE_MSR_BITMAPS";
+ case MONITOR_EXITING:
+ return "MONITOR_EXITING";
+ case PAUSE_EXITING:
+ return "PAUSE_EXITING";
+ case HOST_ADDR_SPACE_SIZE:
+ return "HOST_ADDR_SPACE_SIZE";
+ case ACK_IRQ_ON_EXIT:
+ return "ACK_IRQ_ON_EXIT";
+ default:
+ return NULL;
+ }
+}
+
+
void PrintTrace_VMCSHostStateArea(struct VMCSHostStateArea * hostState) {
PrintTrace("\n==> Host State Area\n");
PrintTrace("HOST_CR0: %x\n", (uint_t)hostState->cr0);