X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcs.c;h=5ab9a0c08a926e766e4a0cf3dffb503774fac49e;hb=5d0908c468453271f6de6bc786ee864b3308f9ef;hp=aa25f5e18b2dca90b113882ca95279ce7c14066e;hpb=e058c75f238c6662f6ae1cd517bbca030cc130ab;p=palacios.git diff --git a/palacios/src/palacios/vmcs.c b/palacios/src/palacios/vmcs.c index aa25f5e..5ab9a0c 100644 --- a/palacios/src/palacios/vmcs.c +++ b/palacios/src/palacios/vmcs.c @@ -18,8 +18,11 @@ */ #include +#include +#include +static const char * vmcs_field_to_str(vmcs_field_t field); //extern char * exception_names; // @@ -27,7 +30,7 @@ // -static inline void print_vmcs_field(uint_t vmcs_index) { +static inline void print_vmcs_field(vmcs_field_t vmcs_index) { int len = v3_vmcs_get_field_len(vmcs_index); addr_t val; @@ -37,11 +40,11 @@ static inline void print_vmcs_field(uint_t vmcs_index) { }; if (len == 2) { - PrintDebug("%s: %x\n", v3_vmcs_get_field_name(vmcs_index), (uint16_t)val); + PrintDebug("%s: %x\n", vmcs_field_to_str(vmcs_index), (uint16_t)val); } else if (len == 4) { - PrintDebug("%s: %x\n", v3_vmcs_get_field_name(vmcs_index), (uint32_t)val); + PrintDebug("%s: %x\n", vmcs_field_to_str(vmcs_index), (uint32_t)val); } else if (len == 8) { - PrintDebug("%s: %p\n", v3_vmcs_get_field_name(vmcs_index), (void *)(addr_t)val); + PrintDebug("%s: %p\n", vmcs_field_to_str(vmcs_index), (void *)(addr_t)val); } } @@ -53,11 +56,11 @@ static inline void print_vmcs_segments() { - +/* void print_debug_vmcs_load_guest() { const int wordsize = sizeof(addr_t); uint64_t temp; - vmcs_segment tmp_seg; + struct vmcs_segment_access tmp_seg; PrintDebug("\n====== Loading Guest State ======\n"); PRINT_VMREAD("Guest CR0: %x\n", GUEST_CR0, wordsize); @@ -152,112 +155,578 @@ void print_vmcs_segment(char * name, vmcs_segment* seg) PrintDebug("\tBase Address: %x\n", seg->baseAddr); PrintDebug("\tLimit: %x\n", seg->limit); PrintDebug("\tAccess: %x\n", seg->access); -} +}*/ -void PrintTrace_VMCSHostStateArea(struct VMCSHostStateArea * hostState) { - PrintTrace("\n==> Host State Area\n"); - PrintTrace("HOST_CR0: %x\n", (uint_t)hostState->cr0); - PrintTrace("HOST_CR3: %x\n", (uint_t)hostState->cr3); - PrintTrace("HOST_CR4: %x\n", (uint_t)hostState->cr4); - PrintTrace("HOST_RSP: %x\n", (uint_t)hostState->rsp); - PrintTrace("HOST_RIP: %x\n", (uint_t)hostState->rip); - PrintTrace("VMCS_HOST_CS_SELECTOR: %x\n", (uint_t)hostState->csSelector); - PrintTrace("VMCS_HOST_SS_SELECTOR: %x\n", (uint_t)hostState->ssSelector); - PrintTrace("VMCS_HOST_DS_SELECTOR: %x\n", (uint_t)hostState->dsSelector); - PrintTrace("VMCS_HOST_ES_SELECTOR: %x\n", (uint_t)hostState->esSelector); - PrintTrace("VMCS_HOST_FS_SELECTOR: %x\n", (uint_t)hostState->fsSelector); - PrintTrace("VMCS_HOST_GS_SELECTOR: %x\n", (uint_t)hostState->gsSelector); - PrintTrace("VMCS_HOST_TR_SELECTOR: %x\n", (uint_t)hostState->trSelector); - PrintTrace("HOST_FS_BASE: %x\n", (uint_t)hostState->fsBaseAddr); - PrintTrace("HOST_GS_BASE: %x\n", (uint_t)hostState->gsBaseAddr); - PrintTrace("HOST_TR_BASE: %x\n", (uint_t)hostState->trBaseAddr); - PrintTrace("HOST_GDTR_BASE: %x\n", (uint_t)hostState->gdtrBaseAddr); - PrintTrace("HOST_IDTR_BASE: %x\n", (uint_t)hostState->idtrBaseAddr); - PrintTrace("HOST_IA32_SYSENTER_CS: %x\n", (uint_t)hostState->sysenter_cs); - PrintTrace("HOST_IA32_SYSENTER_ESP: %x\n", (uint_t)hostState->sysenter_esp); - PrintTrace("HOST_IA32_SYSENTER_EIP: %x\n", (uint_t)hostState->sysenter_eip); +/* + * Returns the field length in bytes + */ +int v3_vmcs_get_field_len(vmcs_field_t field) { + switch(field) { + /* 16 bit Control Fields */ + 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: + 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; + + /* 32 bit Control Fields */ + case VMCS_PIN_CTRLS: + case VMCS_PROC_CTRLS: + case VMCS_EXCP_BITMAP: + case VMCS_PG_FAULT_ERR_MASK: + case VMCS_PG_FAULT_ERR_MATCH: + case VMCS_CR3_TGT_CNT: + case VMCS_EXIT_CTRLS: + case VMCS_EXIT_MSR_STORE_CNT: + case VMCS_EXIT_MSR_LOAD_CNT: + case VMCS_ENTRY_CTRLS: + case VMCS_ENTRY_MSR_LOAD_CNT: + case VMCS_ENTRY_INT_INFO: + case VMCS_ENTRY_EXCP_ERR: + case VMCS_ENTRY_INSTR_LEN: + case VMCS_TPR_THRESHOLD: + case VMCS_INSTR_ERR: + case VMCS_EXIT_REASON: + case VMCS_EXIT_INT_INFO: + case VMCS_EXIT_INT_ERR: + case VMCS_IDT_VECTOR_INFO: + case VMCS_IDT_VECTOR_ERR: + case VMCS_EXIT_INSTR_LEN: + case VMCS_VMX_INSTR_INFO: + case VMCS_GUEST_ES_LIMIT: + case VMCS_GUEST_CS_LIMIT: + case VMCS_GUEST_SS_LIMIT: + case VMCS_GUEST_DS_LIMIT: + case VMCS_GUEST_FS_LIMIT: + case VMCS_GUEST_GS_LIMIT: + case VMCS_GUEST_LDTR_LIMIT: + case VMCS_GUEST_TR_LIMIT: + case VMCS_GUEST_GDTR_LIMIT: + case VMCS_GUEST_IDTR_LIMIT: + case VMCS_GUEST_ES_ACCESS: + case VMCS_GUEST_CS_ACCESS: + case VMCS_GUEST_SS_ACCESS: + case VMCS_GUEST_DS_ACCESS: + case VMCS_GUEST_FS_ACCESS: + case VMCS_GUEST_GS_ACCESS: + case VMCS_GUEST_LDTR_ACCESS: + case VMCS_GUEST_TR_ACCESS: + case VMCS_GUEST_INT_STATE: + case VMCS_GUEST_ACTIVITY_STATE: + case VMCS_GUEST_SMBASE: + case VMCS_GUEST_SYSENTER_CS: + case VMCS_HOST_SYSENTER_CS: + return 4; + + + /* high bits of variable width fields + * We can probably just delete most of these.... + */ + case VMCS_IO_BITMAP_A_ADDR_HIGH: + case VMCS_IO_BITMAP_B_ADDR_HIGH: + case VMCS_MSR_BITMAP_HIGH: + case VMCS_EXIT_MSR_STORE_ADDR_HIGH: + case VMCS_EXIT_MSR_LOAD_ADDR_HIGH: + case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH: + case VMCS_EXEC_PTR_HIGH: + case VMCS_TSC_OFFSET_HIGH: + case VMCS_VAPIC_ADDR_HIGH: + case VMCS_LINK_PTR_HIGH: + case VMCS_GUEST_DBG_CTL_HIGH: + case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH: + return 4; + + /* Natural Width Control Fields */ + case VMCS_IO_BITMAP_A_ADDR: + case VMCS_IO_BITMAP_B_ADDR: + case VMCS_MSR_BITMAP: + case VMCS_EXIT_MSR_STORE_ADDR: + case VMCS_EXIT_MSR_LOAD_ADDR: + case VMCS_ENTRY_MSR_LOAD_ADDR: + case VMCS_EXEC_PTR: + case VMCS_TSC_OFFSET: + case VMCS_VAPIC_ADDR: + case VMCS_LINK_PTR: + case VMCS_GUEST_DBG_CTL: + case VMCS_GUEST_PERF_GLOBAL_CTRL: + case VMCS_CR0_MASK: + case VMCS_CR4_MASK: + case VMCS_CR0_READ_SHDW: + case VMCS_CR4_READ_SHDW: + case VMCS_CR3_TGT_VAL_0: + case VMCS_CR3_TGT_VAL_1: + case VMCS_CR3_TGT_VAL_2: + case VMCS_CR3_TGT_VAL_3: + case VMCS_EXIT_QUAL: + case VMCS_IO_RCX: + case VMCS_IO_RSI: + case VMCS_IO_RDI: + case VMCS_IO_RIP: + case VMCS_GUEST_LINEAR_ADDR: + case VMCS_GUEST_CR0: + case VMCS_GUEST_CR3: + case VMCS_GUEST_CR4: + case VMCS_GUEST_ES_BASE: + case VMCS_GUEST_CS_BASE: + case VMCS_GUEST_SS_BASE: + case VMCS_GUEST_DS_BASE: + case VMCS_GUEST_FS_BASE: + case VMCS_GUEST_GS_BASE: + case VMCS_GUEST_LDTR_BASE: + case VMCS_GUEST_TR_BASE: + case VMCS_GUEST_GDTR_BASE: + case VMCS_GUEST_IDTR_BASE: + case VMCS_GUEST_DR7: + case VMCS_GUEST_RSP: + case VMCS_GUEST_RIP: + case VMCS_GUEST_RFLAGS: + case VMCS_GUEST_PENDING_DBG_EXCP: + case VMCS_GUEST_SYSENTER_ESP: + case VMCS_GUEST_SYSENTER_EIP: + case VMCS_HOST_CR0: + case VMCS_HOST_CR3: + case VMCS_HOST_CR4: + case VMCS_HOST_FS_BASE: + case VMCS_HOST_GS_BASE: + case VMCS_HOST_TR_BASE: + case VMCS_HOST_GDTR_BASE: + case VMCS_HOST_IDTR_BASE: + case VMCS_HOST_SYSENTER_ESP: + case VMCS_HOST_SYSENTER_EIP: + case VMCS_HOST_RSP: + case VMCS_HOST_RIP: + return sizeof(addr_t); + + default: + PrintError("Invalid VMCS field\n"); + return -1; + } } -void PrintTrace_VMCSExecCtrlFields(struct VMCSExecCtrlFields * execCtrls) { - PrintTrace("\n==> VM-Execution Controls:\n"); - PrintTrace("PIN_VM_EXEC_CTRLS: %x\n", (uint_t) execCtrls->pinCtrls); - PrintTrace("PROC_VM_EXEC_CTRLS: %x\n", (uint_t) execCtrls->procCtrls); - PrintTrace("EXCEPTION_BITMAP: %x\n", (uint_t) execCtrls->execBitmap); - PrintTrace("PAGE_FAULT_ERROR_MASK: %x\n", (uint_t) execCtrls->pageFaultErrorMask); - PrintTrace("PAGE_FAULT_ERROR_MATCH: %x\n", (uint_t) execCtrls->pageFaultErrorMatch); - PrintTrace("IO_BITMAP_A_ADDR: %x\n", (uint_t) execCtrls->ioBitmapA); - // PrintTrace("IO_BITMAP_A_ADDR_HIGH: %x\n", (uint_t) execCtrls->); - PrintTrace("IO_BITMAP_B_ADDR: %x\n", (uint_t) execCtrls->ioBitmapB); - // PrintTrace("IO_BITMAP_B_ADDR_HIGH: %x\n", (uint_t) execCtrls->); - PrintTrace("TSC_OFFSET: %x\n", (uint_t) execCtrls->tscOffset & 0xffffffff); - PrintTrace("TSC_OFFSET_HIGH: %x\n", (uint_t) (execCtrls->tscOffset >> 32) & 0xffffffff); - PrintTrace("CR0_GUEST_HOST_MASK: %x\n", (uint_t) execCtrls->cr0GuestHostMask); - PrintTrace("CR0_READ_SHADOW: %x\n", (uint_t) execCtrls->cr0ReadShadow); - PrintTrace("CR4_GUEST_HOST_MASK: %x\n", (uint_t) execCtrls->cr4GuestHostMask); - PrintTrace("CR4_READ_SHADOW: %x\n", (uint_t) execCtrls->cr4ReadShadow); - PrintTrace("CR3_TARGET_COUNT: %x\n", (uint_t) execCtrls->cr3TargetCount); - PrintTrace("CR3_TARGET_VALUE_0: %x\n", (uint_t) execCtrls->cr3TargetValue0); - PrintTrace("CR3_TARGET_VALUE_1: %x\n", (uint_t) execCtrls->cr3TargetValue1); - PrintTrace("CR3_TARGET_VALUE_2: %x\n", (uint_t) execCtrls->cr3TargetValue2); - PrintTrace("CR3_TARGET_VALUE_3: %x\n", (uint_t) execCtrls->cr3TargetValue3); - PrintTrace("VIRT_APIC_PAGE_ADDR: %x\n", (uint_t) execCtrls->virtApicPageAddr & 0xffffffff); - PrintTrace("VIRT_APIC_PAGE_ADDR_HIGH: %x\n", (uint_t) (execCtrls->virtApicPageAddr >> 32) & 0xffffffff); - PrintTrace("TPR_THRESHOLD: %x\n", (uint_t) execCtrls->tprThreshold); - PrintTrace("MSR_BITMAPS: %x\n", (uint_t) execCtrls->MSRBitmapsBaseAddr & 0xffffffff); - PrintTrace("MSR_BITMAPS_HIGH: %x\n", (uint_t) (execCtrls->MSRBitmapsBaseAddr >> 32) & 0xffffffff); - PrintTrace("VMCS_EXEC_PTR: %x\n", (uint_t) execCtrls->vmcsExecPtr & 0xffffffff); - PrintTrace("VMCS_EXEC_PTR_HIGH: %x\n", (uint_t) (execCtrls->vmcsExecPtr >> 32) & 0xffffffff); -} -void PrintTrace_VMCSExitCtrlFields(struct VMCSExitCtrlFields * exitCtrls) { - PrintTrace("\n==> VM Exit Controls\n"); - PrintTrace("VM_EXIT_CTRLS: %x\n", (uint_t) exitCtrls->exitCtrls); - PrintTrace("VM_EXIT_MSR_STORE_COUNT: %x\n", (uint_t) exitCtrls->msrStoreCount); - PrintTrace("VM_EXIT_MSR_STORE_ADDR: %x\n", (uint_t) exitCtrls->msrStoreAddr & 0xffffffff); - PrintTrace("VM_EXIT_MSR_STORE_ADDR_HIGH: %x\n", (uint_t) (exitCtrls->msrStoreAddr >> 32) & 0xffffffff); - PrintTrace("VM_EXIT_MSR_LOAD_COUNT: %x\n", (uint_t) exitCtrls->msrLoadCount); - PrintTrace("VM_EXIT_MSR_LOAD_ADDR: %x\n", (uint_t) exitCtrls->msrLoadAddr & 0xffffffff); - PrintTrace("VM_EXIT_MSR_LOAD_ADDR_HIGH: %x\n", (uint_t) (exitCtrls->msrLoadAddr >> 32) & 0xffffffff); -} -void PrintTrace_VMCSEntryCtrlFields(struct VMCSEntryCtrlFields * entryCtrls) { - PrintTrace("\n==> VM Entry Controls\n"); - PrintTrace("VM_ENTRY_CTRLS: %x\n", (uint_t) entryCtrls->entryCtrls); - PrintTrace("VM_ENTRY_MSR_LOAD_COUNT: %x\n", (uint_t) entryCtrls->msrLoadCount); - PrintTrace("VM_ENTRY_MSR_LOAD_ADDR: %x\n", (uint_t) entryCtrls->msrLoadAddr & 0xffffffff); - PrintTrace("VM_ENTRY_MSR_LOAD_ADDR_HIGH: %x\n", (uint_t) (entryCtrls->msrLoadAddr >> 32) & 0xffffffff); - PrintTrace("VM_ENTRY_INT_INFO_FIELD: %x\n", (uint_t) entryCtrls->intInfo); - PrintTrace("VM_ENTRY_EXCEPTION_ERROR: %x\n", (uint_t) entryCtrls->exceptionErrorCode); - PrintTrace("VM_ENTRY_INSTR_LENGTH: %x\n", (uint_t) entryCtrls->instrLength); -} -void PrintTrace_VMCSExitInfoFields(struct VMCSExitInfoFields * exitInfo) { - PrintTrace("\n==> VM Exit Info\n"); - PrintTrace("EXIT_REASON: %x\n", (uint_t) exitInfo->reason); - PrintTrace("EXIT_QUALIFICATION: %x\n", (uint_t) exitInfo->qualification); - PrintTrace("VM_EXIT_INT_INFO: %x\n", (uint_t) exitInfo->intInfo); - PrintTrace("VM_EXIT_INT_ERROR: %x\n", (uint_t) exitInfo->intErrorCode); - PrintTrace("IDT_VECTOR_INFO: %x\n", (uint_t) exitInfo->idtVectorInfo); - PrintTrace("IDT_VECTOR_ERROR: %x\n", (uint_t) exitInfo->idtVectorErrorCode); - PrintTrace("VM_EXIT_INSTR_LENGTH: %x\n", (uint_t) exitInfo->instrLength); - PrintTrace("GUEST_LINEAR_ADDR: %x\n", (uint_t) exitInfo->guestLinearAddr); - PrintTrace("VMX_INSTR_INFO: %x\n", (uint_t) exitInfo->instrInfo); - PrintTrace("IO_RCX: %x\n", (uint_t) exitInfo->ioRCX); - PrintTrace("IO_RSI: %x\n", (uint_t) exitInfo->ioRSI); - PrintTrace("IO_RDI: %x\n", (uint_t) exitInfo->ioRDI); - PrintTrace("IO_RIP: %x\n", (uint_t) exitInfo->ioRIP); - PrintTrace("VM_INSTR_ERROR: %x\n", (uint_t) exitInfo->instrErrorField); -} -void PrintTrace_VMCSData(struct VMCSData * vmcs) { - PrintTrace("VMCSData Structure\n"); - PrintTrace_VMCSGuestStateArea(&(vmcs->guestStateArea)); - PrintTrace_VMCSHostStateArea(&(vmcs->hostStateArea)); - PrintTrace_VMCSExecCtrlFields(&(vmcs->execCtrlFields)); - PrintTrace_VMCSExitCtrlFields(&(vmcs->exitCtrlFields)); - PrintTrace_VMCSEntryCtrlFields(&(vmcs->entryCtrlFields)); - PrintTrace_VMCSExitInfoFields(&(vmcs->exitInfoFields)); - PrintTrace("\n"); + + + + + +static const char VMCS_GUEST_ES_SELECTOR_STR[] = "GUEST_ES_SELECTOR"; +static const char VMCS_GUEST_CS_SELECTOR_STR[] = "GUEST_CS_SELECTOR"; +static const char VMCS_GUEST_SS_SELECTOR_STR[] = "GUEST_SS_SELECTOR"; +static const char VMCS_GUEST_DS_SELECTOR_STR[] = "GUEST_DS_SELECTOR"; +static const char VMCS_GUEST_FS_SELECTOR_STR[] = "GUEST_FS_SELECTOR"; +static const char VMCS_GUEST_GS_SELECTOR_STR[] = "GUEST_GS_SELECTOR"; +static const char VMCS_GUEST_LDTR_SELECTOR_STR[] = "GUEST_LDTR_SELECTOR"; +static const char VMCS_GUEST_TR_SELECTOR_STR[] = "GUEST_TR_SELECTOR"; +static const char VMCS_HOST_ES_SELECTOR_STR[] = "HOST_ES_SELECTOR"; +static const char VMCS_HOST_CS_SELECTOR_STR[] = "HOST_CS_SELECTOR"; +static const char VMCS_HOST_SS_SELECTOR_STR[] = "HOST_SS_SELECTOR"; +static const char VMCS_HOST_DS_SELECTOR_STR[] = "HOST_DS_SELECTOR"; +static const char VMCS_HOST_FS_SELECTOR_STR[] = "HOST_FS_SELECTOR"; +static const char VMCS_HOST_GS_SELECTOR_STR[] = "HOST_GS_SELECTOR"; +static const char VMCS_HOST_TR_SELECTOR_STR[] = "HOST_TR_SELECTOR"; +static const char VMCS_IO_BITMAP_A_ADDR_STR[] = "IO_BITMAP_A_ADDR"; +static const char VMCS_IO_BITMAP_A_ADDR_HIGH_STR[] = "IO_BITMAP_A_ADDR_HIGH"; +static const char VMCS_IO_BITMAP_B_ADDR_STR[] = "IO_BITMAP_B_ADDR"; +static const char VMCS_IO_BITMAP_B_ADDR_HIGH_STR[] = "IO_BITMAP_B_ADDR_HIGH"; +static const char VMCS_MSR_BITMAP_STR[] = "MSR_BITMAPS"; +static const char VMCS_MSR_BITMAP_HIGH_STR[] = "MSR_BITMAPS_HIGH"; +static const char VMCS_EXIT_MSR_STORE_ADDR_STR[] = "EXIT_MSR_STORE_ADDR"; +static const char VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR[] = "EXIT_MSR_STORE_ADDR_HIGH"; +static const char VMCS_EXIT_MSR_LOAD_ADDR_STR[] = "EXIT_MSR_LOAD_ADDR"; +static const char VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR[] = "EXIT_MSR_LOAD_ADDR_HIGH"; +static const char VMCS_ENTRY_MSR_LOAD_ADDR_STR[] = "ENTRY_MSR_LOAD_ADDR"; +static const char VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR[] = "ENTRY_MSR_LOAD_ADDR_HIGH"; +static const char VMCS_EXEC_PTR_STR[] = "VMCS_EXEC_PTR"; +static const char VMCS_EXEC_PTR_HIGH_STR[] = "VMCS_EXEC_PTR_HIGH"; +static const char VMCS_TSC_OFFSET_STR[] = "TSC_OFFSET"; +static const char VMCS_TSC_OFFSET_HIGH_STR[] = "TSC_OFFSET_HIGH"; +static const char VMCS_VAPIC_ADDR_STR[] = "VAPIC_PAGE_ADDR"; +static const char VMCS_VAPIC_ADDR_HIGH_STR[] = "VAPIC_PAGE_ADDR_HIGH"; +static const char VMCS_LINK_PTR_STR[] = "VMCS_LINK_PTR"; +static const char VMCS_LINK_PTR_HIGH_STR[] = "VMCS_LINK_PTR_HIGH"; +static const char VMCS_GUEST_DBG_CTL_STR[] = "GUEST_DEBUG_CTL"; +static const char VMCS_GUEST_DBG_CTL_HIGH_STR[] = "GUEST_DEBUG_CTL_HIGH"; +static const char VMCS_GUEST_PERF_GLOBAL_CTRL_STR[] = "GUEST_PERF_GLOBAL_CTRL"; +static const char VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR[] = "GUEST_PERF_GLOBAL_CTRL_HIGH"; +static const char VMCS_PIN_CTRLS_STR[] = "PIN_VM_EXEC_CTRLS"; +static const char VMCS_PROC_CTRLS_STR[] = "PROC_VM_EXEC_CTRLS"; +static const char VMCS_EXCP_BITMAP_STR[] = "EXCEPTION_BITMAP"; +static const char VMCS_PG_FAULT_ERR_MASK_STR[] = "PAGE_FAULT_ERROR_MASK"; +static const char VMCS_PG_FAULT_ERR_MATCH_STR[] = "PAGE_FAULT_ERROR_MATCH"; +static const char VMCS_CR3_TGT_CNT_STR[] = "CR3_TARGET_COUNT"; +static const char VMCS_EXIT_CTRLS_STR[] = "VM_EXIT_CTRLS"; +static const char VMCS_EXIT_MSR_STORE_CNT_STR[] = "VM_EXIT_MSR_STORE_COUNT"; +static const char VMCS_EXIT_MSR_LOAD_CNT_STR[] = "VM_EXIT_MSR_LOAD_COUNT"; +static const char VMCS_ENTRY_CTRLS_STR[] = "VM_ENTRY_CTRLS"; +static const char VMCS_ENTRY_MSR_LOAD_CNT_STR[] = "VM_ENTRY_MSR_LOAD_COUNT"; +static const char VMCS_ENTRY_INT_INFO_STR[] = "VM_ENTRY_INT_INFO_FIELD"; +static const char VMCS_ENTRY_EXCP_ERR_STR[] = "VM_ENTRY_EXCEPTION_ERROR"; +static const char VMCS_ENTRY_INSTR_LEN_STR[] = "VM_ENTRY_INSTR_LENGTH"; +static const char VMCS_TPR_THRESHOLD_STR[] = "TPR_THRESHOLD"; +static const char VMCS_INSTR_ERR_STR[] = "VM_INSTR_ERROR"; +static const char VMCS_EXIT_REASON_STR[] = "EXIT_REASON"; +static const char VMCS_EXIT_INT_INFO_STR[] = "VM_EXIT_INT_INFO"; +static const char VMCS_EXIT_INT_ERR_STR[] = "VM_EXIT_INT_ERROR"; +static const char VMCS_IDT_VECTOR_INFO_STR[] = "IDT_VECTOR_INFO"; +static const char VMCS_IDT_VECTOR_ERR_STR[] = "IDT_VECTOR_ERROR"; +static const char VMCS_EXIT_INSTR_LEN_STR[] = "VM_EXIT_INSTR_LENGTH"; +static const char VMCS_VMX_INSTR_INFO_STR[] = "VMX_INSTR_INFO"; +static const char VMCS_GUEST_ES_LIMIT_STR[] = "GUEST_ES_LIMIT"; +static const char VMCS_GUEST_CS_LIMIT_STR[] = "GUEST_CS_LIMIT"; +static const char VMCS_GUEST_SS_LIMIT_STR[] = "GUEST_SS_LIMIT"; +static const char VMCS_GUEST_DS_LIMIT_STR[] = "GUEST_DS_LIMIT"; +static const char VMCS_GUEST_FS_LIMIT_STR[] = "GUEST_FS_LIMIT"; +static const char VMCS_GUEST_GS_LIMIT_STR[] = "GUEST_GS_LIMIT"; +static const char VMCS_GUEST_LDTR_LIMIT_STR[] = "GUEST_LDTR_LIMIT"; +static const char VMCS_GUEST_TR_LIMIT_STR[] = "GUEST_TR_LIMIT"; +static const char VMCS_GUEST_GDTR_LIMIT_STR[] = "GUEST_GDTR_LIMIT"; +static const char VMCS_GUEST_IDTR_LIMIT_STR[] = "GUEST_IDTR_LIMIT"; +static const char VMCS_GUEST_ES_ACCESS_STR[] = "GUEST_ES_ACCESS"; +static const char VMCS_GUEST_CS_ACCESS_STR[] = "GUEST_CS_ACCESS"; +static const char VMCS_GUEST_SS_ACCESS_STR[] = "GUEST_SS_ACCESS"; +static const char VMCS_GUEST_DS_ACCESS_STR[] = "GUEST_DS_ACCESS"; +static const char VMCS_GUEST_FS_ACCESS_STR[] = "GUEST_FS_ACCESS"; +static const char VMCS_GUEST_GS_ACCESS_STR[] = "GUEST_GS_ACCESS"; +static const char VMCS_GUEST_LDTR_ACCESS_STR[] = "GUEST_LDTR_ACCESS"; +static const char VMCS_GUEST_TR_ACCESS_STR[] = "GUEST_TR_ACCESS"; +static const char VMCS_GUEST_INT_STATE_STR[] = "GUEST_INT_STATE"; +static const char VMCS_GUEST_ACTIVITY_STATE_STR[] = "GUEST_ACTIVITY_STATE"; +static const char VMCS_GUEST_SMBASE_STR[] = "GUEST_SMBASE"; +static const char VMCS_GUEST_SYSENTER_CS_STR[] = "GUEST_SYSENTER_CS"; +static const char VMCS_HOST_SYSENTER_CS_STR[] = "HOST_SYSENTER_CS"; +static const char VMCS_CR0_MASK_STR[] = "CR0_GUEST_HOST_MASK"; +static const char VMCS_CR4_MASK_STR[] = "CR4_GUEST_HOST_MASK"; +static const char VMCS_CR0_READ_SHDW_STR[] = "CR0_READ_SHADOW"; +static const char VMCS_CR4_READ_SHDW_STR[] = "CR4_READ_SHADOW"; +static const char VMCS_CR3_TGT_VAL_0_STR[] = "CR3_TARGET_VALUE_0"; +static const char VMCS_CR3_TGT_VAL_1_STR[] = "CR3_TARGET_VALUE_1"; +static const char VMCS_CR3_TGT_VAL_2_STR[] = "CR3_TARGET_VALUE_2"; +static const char VMCS_CR3_TGT_VAL_3_STR[] = "CR3_TARGET_VALUE_3"; +static const char VMCS_EXIT_QUAL_STR[] = "EXIT_QUALIFICATION"; +static const char VMCS_IO_RCX_STR[] = "IO_RCX"; +static const char VMCS_IO_RSI_STR[] = "IO_RSI"; +static const char VMCS_IO_RDI_STR[] = "IO_RDI"; +static const char VMCS_IO_RIP_STR[] = "IO_RIP"; +static const char VMCS_GUEST_LINEAR_ADDR_STR[] = "GUEST_LINEAR_ADDR"; +static const char VMCS_GUEST_CR0_STR[] = "GUEST_CR0"; +static const char VMCS_GUEST_CR3_STR[] = "GUEST_CR3"; +static const char VMCS_GUEST_CR4_STR[] = "GUEST_CR4"; +static const char VMCS_GUEST_ES_BASE_STR[] = "GUEST_ES_BASE"; +static const char VMCS_GUEST_CS_BASE_STR[] = "GUEST_CS_BASE"; +static const char VMCS_GUEST_SS_BASE_STR[] = "GUEST_SS_BASE"; +static const char VMCS_GUEST_DS_BASE_STR[] = "GUEST_DS_BASE"; +static const char VMCS_GUEST_FS_BASE_STR[] = "GUEST_FS_BASE"; +static const char VMCS_GUEST_GS_BASE_STR[] = "GUEST_GS_BASE"; +static const char VMCS_GUEST_LDTR_BASE_STR[] = "GUEST_LDTR_BASE"; +static const char VMCS_GUEST_TR_BASE_STR[] = "GUEST_TR_BASE"; +static const char VMCS_GUEST_GDTR_BASE_STR[] = "GUEST_GDTR_BASE"; +static const char VMCS_GUEST_IDTR_BASE_STR[] = "GUEST_IDTR_BASE"; +static const char VMCS_GUEST_DR7_STR[] = "GUEST_DR7"; +static const char VMCS_GUEST_RSP_STR[] = "GUEST_RSP"; +static const char VMCS_GUEST_RIP_STR[] = "GUEST_RIP"; +static const char VMCS_GUEST_RFLAGS_STR[] = "GUEST_RFLAGS"; +static const char VMCS_GUEST_PENDING_DBG_EXCP_STR[] = "GUEST_PENDING_DEBUG_EXCS"; +static const char VMCS_GUEST_SYSENTER_ESP_STR[] = "GUEST_SYSENTER_ESP"; +static const char VMCS_GUEST_SYSENTER_EIP_STR[] = "GUEST_SYSENTER_EIP"; +static const char VMCS_HOST_CR0_STR[] = "HOST_CR0"; +static const char VMCS_HOST_CR3_STR[] = "HOST_CR3"; +static const char VMCS_HOST_CR4_STR[] = "HOST_CR4"; +static const char VMCS_HOST_FS_BASE_STR[] = "HOST_FS_BASE"; +static const char VMCS_HOST_GS_BASE_STR[] = "HOST_GS_BASE"; +static const char VMCS_HOST_TR_BASE_STR[] = "HOST_TR_BASE"; +static const char VMCS_HOST_GDTR_BASE_STR[] = "HOST_GDTR_BASE"; +static const char VMCS_HOST_IDTR_BASE_STR[] = "HOST_IDTR_BASE"; +static const char VMCS_HOST_SYSENTER_ESP_STR[] = "HOST_SYSENTER_ESP"; +static const char VMCS_HOST_SYSENTER_EIP_STR[] = "HOST_SYSENTER_EIP"; +static const char VMCS_HOST_RSP_STR[] = "HOST_RSP"; +static const char VMCS_HOST_RIP_STR[] = "HOST_RIP"; + + + +static const char * vmcs_field_to_str(vmcs_field_t field) { + switch (field) { + case VMCS_GUEST_ES_SELECTOR: + return VMCS_GUEST_ES_SELECTOR_STR; + case VMCS_GUEST_CS_SELECTOR: + return VMCS_GUEST_CS_SELECTOR_STR; + case VMCS_GUEST_SS_SELECTOR: + return VMCS_GUEST_SS_SELECTOR_STR; + case VMCS_GUEST_DS_SELECTOR: + return VMCS_GUEST_DS_SELECTOR_STR; + case VMCS_GUEST_FS_SELECTOR: + return VMCS_GUEST_FS_SELECTOR_STR; + case VMCS_GUEST_GS_SELECTOR: + return VMCS_GUEST_GS_SELECTOR_STR; + case VMCS_GUEST_LDTR_SELECTOR: + return VMCS_GUEST_LDTR_SELECTOR_STR; + case VMCS_GUEST_TR_SELECTOR: + return VMCS_GUEST_TR_SELECTOR_STR; + case VMCS_HOST_ES_SELECTOR: + return VMCS_HOST_ES_SELECTOR_STR; + case VMCS_HOST_CS_SELECTOR: + return VMCS_HOST_CS_SELECTOR_STR; + case VMCS_HOST_SS_SELECTOR: + return VMCS_HOST_SS_SELECTOR_STR; + case VMCS_HOST_DS_SELECTOR: + return VMCS_HOST_DS_SELECTOR_STR; + case VMCS_HOST_FS_SELECTOR: + return VMCS_HOST_FS_SELECTOR_STR; + case VMCS_HOST_GS_SELECTOR: + return VMCS_HOST_GS_SELECTOR_STR; + case VMCS_HOST_TR_SELECTOR: + return VMCS_HOST_TR_SELECTOR_STR; + case VMCS_IO_BITMAP_A_ADDR: + return VMCS_IO_BITMAP_A_ADDR_STR; + case VMCS_IO_BITMAP_A_ADDR_HIGH: + return VMCS_IO_BITMAP_A_ADDR_HIGH_STR; + case VMCS_IO_BITMAP_B_ADDR: + return VMCS_IO_BITMAP_B_ADDR_STR; + case VMCS_IO_BITMAP_B_ADDR_HIGH: + return VMCS_IO_BITMAP_B_ADDR_HIGH_STR; + case VMCS_MSR_BITMAP: + return VMCS_MSR_BITMAP_STR; + case VMCS_MSR_BITMAP_HIGH: + return VMCS_MSR_BITMAP_HIGH_STR; + case VMCS_EXIT_MSR_STORE_ADDR: + return VMCS_EXIT_MSR_STORE_ADDR_STR; + case VMCS_EXIT_MSR_STORE_ADDR_HIGH: + return VMCS_EXIT_MSR_STORE_ADDR_HIGH_STR; + case VMCS_EXIT_MSR_LOAD_ADDR: + return VMCS_EXIT_MSR_LOAD_ADDR_STR; + case VMCS_EXIT_MSR_LOAD_ADDR_HIGH: + return VMCS_EXIT_MSR_LOAD_ADDR_HIGH_STR; + case VMCS_ENTRY_MSR_LOAD_ADDR: + return VMCS_ENTRY_MSR_LOAD_ADDR_STR; + case VMCS_ENTRY_MSR_LOAD_ADDR_HIGH: + return VMCS_ENTRY_MSR_LOAD_ADDR_HIGH_STR; + case VMCS_EXEC_PTR: + return VMCS_EXEC_PTR_STR; + case VMCS_EXEC_PTR_HIGH: + return VMCS_EXEC_PTR_HIGH_STR; + case VMCS_TSC_OFFSET: + return VMCS_TSC_OFFSET_STR; + case VMCS_TSC_OFFSET_HIGH: + return VMCS_TSC_OFFSET_HIGH_STR; + case VMCS_VAPIC_ADDR: + return VMCS_VAPIC_ADDR_STR; + case VMCS_VAPIC_ADDR_HIGH: + return VMCS_VAPIC_ADDR_HIGH_STR; + case VMCS_LINK_PTR: + return VMCS_LINK_PTR_STR; + case VMCS_LINK_PTR_HIGH: + return VMCS_LINK_PTR_HIGH_STR; + case VMCS_GUEST_DBG_CTL: + return VMCS_GUEST_DBG_CTL_STR; + case VMCS_GUEST_DBG_CTL_HIGH: + return VMCS_GUEST_DBG_CTL_HIGH_STR; + case VMCS_GUEST_PERF_GLOBAL_CTRL: + return VMCS_GUEST_PERF_GLOBAL_CTRL_STR; + case VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH: + return VMCS_GUEST_PERF_GLOBAL_CTRL_HIGH_STR; + case VMCS_PIN_CTRLS: + return VMCS_PIN_CTRLS_STR; + case VMCS_PROC_CTRLS: + return VMCS_PROC_CTRLS_STR; + case VMCS_EXCP_BITMAP: + return VMCS_EXCP_BITMAP_STR; + case VMCS_PG_FAULT_ERR_MASK: + return VMCS_PG_FAULT_ERR_MASK_STR; + case VMCS_PG_FAULT_ERR_MATCH: + return VMCS_PG_FAULT_ERR_MATCH_STR; + case VMCS_CR3_TGT_CNT: + return VMCS_CR3_TGT_CNT_STR; + case VMCS_EXIT_CTRLS: + return VMCS_EXIT_CTRLS_STR; + case VMCS_EXIT_MSR_STORE_CNT: + return VMCS_EXIT_MSR_STORE_CNT_STR; + case VMCS_EXIT_MSR_LOAD_CNT: + return VMCS_EXIT_MSR_LOAD_CNT_STR; + case VMCS_ENTRY_CTRLS: + return VMCS_ENTRY_CTRLS_STR; + case VMCS_ENTRY_MSR_LOAD_CNT: + return VMCS_ENTRY_MSR_LOAD_CNT_STR; + case VMCS_ENTRY_INT_INFO: + return VMCS_ENTRY_INT_INFO_STR; + case VMCS_ENTRY_EXCP_ERR: + return VMCS_ENTRY_EXCP_ERR_STR; + case VMCS_ENTRY_INSTR_LEN: + return VMCS_ENTRY_INSTR_LEN_STR; + case VMCS_TPR_THRESHOLD: + return VMCS_TPR_THRESHOLD_STR; + case VMCS_INSTR_ERR: + return VMCS_INSTR_ERR_STR; + case VMCS_EXIT_REASON: + return VMCS_EXIT_REASON_STR; + case VMCS_EXIT_INT_INFO: + return VMCS_EXIT_INT_INFO_STR; + case VMCS_EXIT_INT_ERR: + return VMCS_EXIT_INT_ERR_STR; + case VMCS_IDT_VECTOR_INFO: + return VMCS_IDT_VECTOR_INFO_STR; + case VMCS_IDT_VECTOR_ERR: + return VMCS_IDT_VECTOR_ERR_STR; + case VMCS_EXIT_INSTR_LEN: + return VMCS_EXIT_INSTR_LEN_STR; + case VMCS_VMX_INSTR_INFO: + return VMCS_VMX_INSTR_INFO_STR; + case VMCS_GUEST_ES_LIMIT: + return VMCS_GUEST_ES_LIMIT_STR; + case VMCS_GUEST_CS_LIMIT: + return VMCS_GUEST_CS_LIMIT_STR; + case VMCS_GUEST_SS_LIMIT: + return VMCS_GUEST_SS_LIMIT_STR; + case VMCS_GUEST_DS_LIMIT: + return VMCS_GUEST_DS_LIMIT_STR; + case VMCS_GUEST_FS_LIMIT: + return VMCS_GUEST_FS_LIMIT_STR; + case VMCS_GUEST_GS_LIMIT: + return VMCS_GUEST_GS_LIMIT_STR; + case VMCS_GUEST_LDTR_LIMIT: + return VMCS_GUEST_LDTR_LIMIT_STR; + case VMCS_GUEST_TR_LIMIT: + return VMCS_GUEST_TR_LIMIT_STR; + case VMCS_GUEST_GDTR_LIMIT: + return VMCS_GUEST_GDTR_LIMIT_STR; + case VMCS_GUEST_IDTR_LIMIT: + return VMCS_GUEST_IDTR_LIMIT_STR; + case VMCS_GUEST_ES_ACCESS: + return VMCS_GUEST_ES_ACCESS_STR; + case VMCS_GUEST_CS_ACCESS: + return VMCS_GUEST_CS_ACCESS_STR; + case VMCS_GUEST_SS_ACCESS: + return VMCS_GUEST_SS_ACCESS_STR; + case VMCS_GUEST_DS_ACCESS: + return VMCS_GUEST_DS_ACCESS_STR; + case VMCS_GUEST_FS_ACCESS: + return VMCS_GUEST_FS_ACCESS_STR; + case VMCS_GUEST_GS_ACCESS: + return VMCS_GUEST_GS_ACCESS_STR; + case VMCS_GUEST_LDTR_ACCESS: + return VMCS_GUEST_LDTR_ACCESS_STR; + case VMCS_GUEST_TR_ACCESS: + return VMCS_GUEST_TR_ACCESS_STR; + case VMCS_GUEST_INT_STATE: + return VMCS_GUEST_INT_STATE_STR; + case VMCS_GUEST_ACTIVITY_STATE: + return VMCS_GUEST_ACTIVITY_STATE_STR; + case VMCS_GUEST_SMBASE: + return VMCS_GUEST_SMBASE_STR; + case VMCS_GUEST_SYSENTER_CS: + return VMCS_GUEST_SYSENTER_CS_STR; + case VMCS_HOST_SYSENTER_CS: + return VMCS_HOST_SYSENTER_CS_STR; + case VMCS_CR0_MASK: + return VMCS_CR0_MASK_STR; + case VMCS_CR4_MASK: + return VMCS_CR4_MASK_STR; + case VMCS_CR0_READ_SHDW: + return VMCS_CR0_READ_SHDW_STR; + case VMCS_CR4_READ_SHDW: + return VMCS_CR4_READ_SHDW_STR; + case VMCS_CR3_TGT_VAL_0: + return VMCS_CR3_TGT_VAL_0_STR; + case VMCS_CR3_TGT_VAL_1: + return VMCS_CR3_TGT_VAL_1_STR; + case VMCS_CR3_TGT_VAL_2: + return VMCS_CR3_TGT_VAL_2_STR; + case VMCS_CR3_TGT_VAL_3: + return VMCS_CR3_TGT_VAL_3_STR; + case VMCS_EXIT_QUAL: + return VMCS_EXIT_QUAL_STR; + case VMCS_IO_RCX: + return VMCS_IO_RCX_STR; + case VMCS_IO_RSI: + return VMCS_IO_RSI_STR; + case VMCS_IO_RDI: + return VMCS_IO_RDI_STR; + case VMCS_IO_RIP: + return VMCS_IO_RIP_STR; + case VMCS_GUEST_LINEAR_ADDR: + return VMCS_GUEST_LINEAR_ADDR_STR; + case VMCS_GUEST_CR0: + return VMCS_GUEST_CR0_STR; + case VMCS_GUEST_CR3: + return VMCS_GUEST_CR3_STR; + case VMCS_GUEST_CR4: + return VMCS_GUEST_CR4_STR; + case VMCS_GUEST_ES_BASE: + return VMCS_GUEST_ES_BASE_STR; + case VMCS_GUEST_CS_BASE: + return VMCS_GUEST_CS_BASE_STR; + case VMCS_GUEST_SS_BASE: + return VMCS_GUEST_SS_BASE_STR; + case VMCS_GUEST_DS_BASE: + return VMCS_GUEST_DS_BASE_STR; + case VMCS_GUEST_FS_BASE: + return VMCS_GUEST_FS_BASE_STR; + case VMCS_GUEST_GS_BASE: + return VMCS_GUEST_GS_BASE_STR; + case VMCS_GUEST_LDTR_BASE: + return VMCS_GUEST_LDTR_BASE_STR; + case VMCS_GUEST_TR_BASE: + return VMCS_GUEST_TR_BASE_STR; + case VMCS_GUEST_GDTR_BASE: + return VMCS_GUEST_GDTR_BASE_STR; + case VMCS_GUEST_IDTR_BASE: + return VMCS_GUEST_IDTR_BASE_STR; + case VMCS_GUEST_DR7: + return VMCS_GUEST_DR7_STR; + case VMCS_GUEST_RSP: + return VMCS_GUEST_RSP_STR; + case VMCS_GUEST_RIP: + return VMCS_GUEST_RIP_STR; + case VMCS_GUEST_RFLAGS: + return VMCS_GUEST_RFLAGS_STR; + case VMCS_GUEST_PENDING_DBG_EXCP: + return VMCS_GUEST_PENDING_DBG_EXCP_STR; + case VMCS_GUEST_SYSENTER_ESP: + return VMCS_GUEST_SYSENTER_ESP_STR; + case VMCS_GUEST_SYSENTER_EIP: + return VMCS_GUEST_SYSENTER_EIP_STR; + case VMCS_HOST_CR0: + return VMCS_HOST_CR0_STR; + case VMCS_HOST_CR3: + return VMCS_HOST_CR3_STR; + case VMCS_HOST_CR4: + return VMCS_HOST_CR4_STR; + case VMCS_HOST_FS_BASE: + return VMCS_HOST_FS_BASE_STR; + case VMCS_HOST_GS_BASE: + return VMCS_HOST_GS_BASE_STR; + case VMCS_HOST_TR_BASE: + return VMCS_HOST_TR_BASE_STR; + case VMCS_HOST_GDTR_BASE: + return VMCS_HOST_GDTR_BASE_STR; + case VMCS_HOST_IDTR_BASE: + return VMCS_HOST_IDTR_BASE_STR; + case VMCS_HOST_SYSENTER_ESP: + return VMCS_HOST_SYSENTER_ESP_STR; + case VMCS_HOST_SYSENTER_EIP: + return VMCS_HOST_SYSENTER_EIP_STR; + case VMCS_HOST_RSP: + return VMCS_HOST_RSP_STR; + case VMCS_HOST_RIP: + return VMCS_HOST_RIP_STR; + default: + return NULL; + } } + + +