X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcs.c;h=35dc5e17e6bf31f6648d079d399a2981cd186a08;hb=f8b365257743be47363da720f0261f5ed6441c57;hp=ced7201de00572f5ad7eb2a6ceb30b1c75b5d1be;hpb=e70e95962c26832628d586e07f9cd1a2e1852d72;p=palacios.git diff --git a/palacios/src/palacios/vmcs.c b/palacios/src/palacios/vmcs.c index ced7201..35dc5e1 100644 --- a/palacios/src/palacios/vmcs.c +++ b/palacios/src/palacios/vmcs.c @@ -27,404 +27,636 @@ // -#define CHK_VMCS_READ(tag, val) {if (VMCS_READ(tag, val) != 0) return -1;} -#define CHK_VMCS_WRITE(tag, val) {if (VMCS_WRITE(tag, val) != 0) return -1;} - - - -int CopyOutVMCSGuestStateArea(struct VMCSGuestStateArea *p) { - CHK_VMCS_READ(GUEST_CR0, &(p->cr0)); - CHK_VMCS_READ(GUEST_CR3, &(p->cr3)); - CHK_VMCS_READ(GUEST_CR4, &(p->cr4)); - CHK_VMCS_READ(GUEST_DR7, &(p->dr7)); - CHK_VMCS_READ(GUEST_RSP, &(p->rsp)); - CHK_VMCS_READ(GUEST_RIP, &(p->rip)); - CHK_VMCS_READ(GUEST_RFLAGS, &(p->rflags)); - CHK_VMCS_READ(VMCS_GUEST_CS_SELECTOR, &(p->cs.selector)); - CHK_VMCS_READ(VMCS_GUEST_SS_SELECTOR, &(p->ss.selector)); - CHK_VMCS_READ(VMCS_GUEST_DS_SELECTOR, &(p->ds.selector)); - CHK_VMCS_READ(VMCS_GUEST_ES_SELECTOR, &(p->es.selector)); - CHK_VMCS_READ(VMCS_GUEST_FS_SELECTOR, &(p->fs.selector)); - CHK_VMCS_READ(VMCS_GUEST_GS_SELECTOR, &(p->gs.selector)); - CHK_VMCS_READ(VMCS_GUEST_LDTR_SELECTOR, &(p->ldtr.selector)); - CHK_VMCS_READ(VMCS_GUEST_TR_SELECTOR, &(p->tr.selector)); - CHK_VMCS_READ(GUEST_CS_BASE, &(p->cs.baseAddr)); - CHK_VMCS_READ(GUEST_SS_BASE, &(p->ss.baseAddr)); - CHK_VMCS_READ(GUEST_DS_BASE, &(p->ds.baseAddr)); - CHK_VMCS_READ(GUEST_ES_BASE, &(p->es.baseAddr)); - CHK_VMCS_READ(GUEST_FS_BASE, &(p->fs.baseAddr)); - CHK_VMCS_READ(GUEST_GS_BASE, &(p->gs.baseAddr)); - CHK_VMCS_READ(GUEST_LDTR_BASE, &(p->ldtr.baseAddr)); - CHK_VMCS_READ(GUEST_TR_BASE, &(p->tr.baseAddr)); - CHK_VMCS_READ(GUEST_CS_LIMIT, &(p->cs.limit)); - CHK_VMCS_READ(GUEST_SS_LIMIT, &(p->ss.limit)); - CHK_VMCS_READ(GUEST_DS_LIMIT, &(p->ds.limit)); - CHK_VMCS_READ(GUEST_ES_LIMIT, &(p->es.limit)); - CHK_VMCS_READ(GUEST_FS_LIMIT, &(p->fs.limit)); - CHK_VMCS_READ(GUEST_GS_LIMIT, &(p->gs.limit)); - CHK_VMCS_READ(GUEST_LDTR_LIMIT, &(p->ldtr.limit)); - CHK_VMCS_READ(GUEST_TR_LIMIT, &(p->tr.limit)); - CHK_VMCS_READ(GUEST_CS_ACCESS, &(p->cs.access)); - CHK_VMCS_READ(GUEST_SS_ACCESS, &(p->ss.access)); - CHK_VMCS_READ(GUEST_DS_ACCESS, &(p->ds.access)); - CHK_VMCS_READ(GUEST_ES_ACCESS, &(p->es.access)); - CHK_VMCS_READ(GUEST_FS_ACCESS, &(p->fs.access)); - CHK_VMCS_READ(GUEST_GS_ACCESS, &(p->gs.access)); - CHK_VMCS_READ(GUEST_LDTR_ACCESS, &(p->ldtr.access)); - CHK_VMCS_READ(GUEST_TR_ACCESS, &(p->tr.access)); - CHK_VMCS_READ(GUEST_GDTR_BASE, &(p->gdtr.baseAddr)); - CHK_VMCS_READ(GUEST_IDTR_BASE, &(p->idtr.baseAddr)); - CHK_VMCS_READ(GUEST_GDTR_LIMIT, &(p->gdtr.limit)); - CHK_VMCS_READ(GUEST_IDTR_LIMIT, &(p->idtr.limit)); - CHK_VMCS_READ(GUEST_IA32_DEBUGCTL, &(p->dbg_ctrl)); - CHK_VMCS_READ(GUEST_IA32_DEBUGCTL_HIGH, ((char *)&(p->dbg_ctrl)) + 4); - CHK_VMCS_READ(GUEST_IA32_SYSENTER_CS, &(p->sysenter_cs)); - CHK_VMCS_READ(GUEST_IA32_SYSENTER_ESP, &(p->sysenter_esp)); - CHK_VMCS_READ(GUEST_IA32_SYSENTER_EIP, &(p->sysenter_eip)); - CHK_VMCS_READ(GUEST_SMBASE, &(p->smbase)); - - CHK_VMCS_READ(GUEST_ACTIVITY_STATE, &(p->activity)); - CHK_VMCS_READ(GUEST_INT_STATE, &(p->interrupt_state)); - CHK_VMCS_READ(GUEST_PENDING_DEBUG_EXCS, &(p->pending_dbg_exceptions)); - CHK_VMCS_READ(VMCS_LINK_PTR, &(p->vmcs_link)); - CHK_VMCS_READ(VMCS_LINK_PTR_HIGH, ((char *)&(p->vmcs_link)) + 4); - return 0; +static inline void print_vmcs_field(uint_t vmcs_index) { + int len = v3_vmcs_get_field_len(vmcs_index); + addr_t val; + + if (vmcs_read(vmcs_index, &val, len) != VMX_SUCCESS) { + PrintError("VMCS_READ error for index %x\n", vmcs_index); + return; + }; + + if (len == 2) { + PrintDebug("%s: %x\n", v3_vmcs_get_field_name(vmcs_index), (uint16_t)val); + } else if (len == 4) { + PrintDebug("%s: %x\n", v3_vmcs_get_field_name(vmcs_index), (uint32_t)val); + } else if (len == 8) { + PrintDebug("%s: %p\n", v3_vmcs_get_field_name(vmcs_index), (void *)(addr_t)val); + } } -int CopyInVMCSGuestStateArea(struct VMCSGuestStateArea *p) { - CHK_VMCS_WRITE(GUEST_CR0, &(p->cr0)); - CHK_VMCS_WRITE(GUEST_CR3, &(p->cr3)); - CHK_VMCS_WRITE(GUEST_CR4, &(p->cr4)); - CHK_VMCS_WRITE(GUEST_DR7, &(p->dr7)); - CHK_VMCS_WRITE(GUEST_RSP, &(p->rsp)); - CHK_VMCS_WRITE(GUEST_RIP, &(p->rip)); - CHK_VMCS_WRITE(GUEST_RFLAGS, &(p->rflags)); - CHK_VMCS_WRITE(VMCS_GUEST_CS_SELECTOR, &(p->cs.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_SS_SELECTOR, &(p->ss.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_DS_SELECTOR, &(p->ds.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_ES_SELECTOR, &(p->es.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_FS_SELECTOR, &(p->fs.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_GS_SELECTOR, &(p->gs.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_LDTR_SELECTOR, &(p->ldtr.selector)); - CHK_VMCS_WRITE(VMCS_GUEST_TR_SELECTOR, &(p->tr.selector)); - CHK_VMCS_WRITE(GUEST_CS_BASE, &(p->cs.baseAddr)); - CHK_VMCS_WRITE(GUEST_SS_BASE, &(p->ss.baseAddr)); - CHK_VMCS_WRITE(GUEST_DS_BASE, &(p->ds.baseAddr)); - CHK_VMCS_WRITE(GUEST_ES_BASE, &(p->es.baseAddr)); - CHK_VMCS_WRITE(GUEST_FS_BASE, &(p->fs.baseAddr)); - CHK_VMCS_WRITE(GUEST_GS_BASE, &(p->gs.baseAddr)); - CHK_VMCS_WRITE(GUEST_LDTR_BASE, &(p->ldtr.baseAddr)); - CHK_VMCS_WRITE(GUEST_TR_BASE, &(p->tr.baseAddr)); - CHK_VMCS_WRITE(GUEST_CS_LIMIT, &(p->cs.limit)); - CHK_VMCS_WRITE(GUEST_SS_LIMIT, &(p->ss.limit)); - CHK_VMCS_WRITE(GUEST_DS_LIMIT, &(p->ds.limit)); - CHK_VMCS_WRITE(GUEST_ES_LIMIT, &(p->es.limit)); - CHK_VMCS_WRITE(GUEST_FS_LIMIT, &(p->fs.limit)); - CHK_VMCS_WRITE(GUEST_GS_LIMIT, &(p->gs.limit)); - CHK_VMCS_WRITE(GUEST_LDTR_LIMIT, &(p->ldtr.limit)); - CHK_VMCS_WRITE(GUEST_TR_LIMIT, &(p->tr.limit)); - CHK_VMCS_WRITE(GUEST_CS_ACCESS, &(p->cs.access)); - CHK_VMCS_WRITE(GUEST_SS_ACCESS, &(p->ss.access)); - CHK_VMCS_WRITE(GUEST_DS_ACCESS, &(p->ds.access)); - CHK_VMCS_WRITE(GUEST_ES_ACCESS, &(p->es.access)); - CHK_VMCS_WRITE(GUEST_FS_ACCESS, &(p->fs.access)); - CHK_VMCS_WRITE(GUEST_GS_ACCESS, &(p->gs.access)); - CHK_VMCS_WRITE(GUEST_LDTR_ACCESS, &(p->ldtr.access)); - CHK_VMCS_WRITE(GUEST_TR_ACCESS, &(p->tr.access)); - CHK_VMCS_WRITE(GUEST_GDTR_BASE, &(p->gdtr.baseAddr)); - CHK_VMCS_WRITE(GUEST_IDTR_BASE, &(p->idtr.baseAddr)); - CHK_VMCS_WRITE(GUEST_GDTR_LIMIT, &(p->gdtr.limit)); - CHK_VMCS_WRITE(GUEST_IDTR_LIMIT, &(p->idtr.limit)); - CHK_VMCS_WRITE(GUEST_IA32_DEBUGCTL, &(p->dbg_ctrl)); - CHK_VMCS_WRITE(GUEST_IA32_DEBUGCTL_HIGH, ((char *)&(p->dbg_ctrl)) + 4); - CHK_VMCS_WRITE(GUEST_IA32_SYSENTER_CS, &(p->sysenter_cs)); - CHK_VMCS_WRITE(GUEST_IA32_SYSENTER_ESP, &(p->sysenter_esp)); - CHK_VMCS_WRITE(GUEST_IA32_SYSENTER_EIP, &(p->sysenter_eip)); - CHK_VMCS_WRITE(GUEST_SMBASE, &(p->smbase)); - - CHK_VMCS_WRITE(GUEST_ACTIVITY_STATE, &(p->activity)); - CHK_VMCS_WRITE(GUEST_INT_STATE, &(p->interrupt_state)); - CHK_VMCS_WRITE(GUEST_PENDING_DEBUG_EXCS, &(p->pending_dbg_exceptions)); - CHK_VMCS_WRITE(VMCS_LINK_PTR, &(p->vmcs_link)); - CHK_VMCS_WRITE(VMCS_LINK_PTR_HIGH, ((char *)&(p->vmcs_link)) + 4); - return 0; +static inline void print_vmcs_segments() { + // see vm_guest.c } -int CopyOutVMCSHostStateArea(struct VMCSHostStateArea *p) { - CHK_VMCS_READ(HOST_CR0, &(p->cr0)); - CHK_VMCS_READ(HOST_CR3, &(p->cr3)); - CHK_VMCS_READ(HOST_CR4, &(p->cr4)); - CHK_VMCS_READ(HOST_RSP, &(p->rsp)); - CHK_VMCS_READ(HOST_RIP, &(p->rip)); - CHK_VMCS_READ(VMCS_HOST_CS_SELECTOR, &(p->csSelector)); - CHK_VMCS_READ(VMCS_HOST_SS_SELECTOR, &(p->ssSelector)); - CHK_VMCS_READ(VMCS_HOST_DS_SELECTOR, &(p->dsSelector)); - CHK_VMCS_READ(VMCS_HOST_ES_SELECTOR, &(p->esSelector)); - CHK_VMCS_READ(VMCS_HOST_FS_SELECTOR, &(p->fsSelector)); - CHK_VMCS_READ(VMCS_HOST_GS_SELECTOR, &(p->gsSelector)); - CHK_VMCS_READ(VMCS_HOST_TR_SELECTOR, &(p->trSelector)); - CHK_VMCS_READ(HOST_FS_BASE, &(p->fsBaseAddr)); - CHK_VMCS_READ(HOST_GS_BASE, &(p->gsBaseAddr)); - CHK_VMCS_READ(HOST_TR_BASE, &(p->trBaseAddr)); - CHK_VMCS_READ(HOST_GDTR_BASE, &(p->gdtrBaseAddr)); - CHK_VMCS_READ(HOST_IDTR_BASE, &(p->idtrBaseAddr)); - CHK_VMCS_READ(HOST_IA32_SYSENTER_CS, &(p->sysenter_cs)); - CHK_VMCS_READ(HOST_IA32_SYSENTER_ESP, &(p->sysenter_esp)); - CHK_VMCS_READ(HOST_IA32_SYSENTER_EIP, &(p->sysenter_eip)); - return 0; -} +void print_debug_vmcs_load_guest() { + const int wordsize = sizeof(addr_t); + uint64_t temp; + vmcs_segment tmp_seg; -int CopyInVMCSHostStateArea(struct VMCSHostStateArea *p) { - CHK_VMCS_WRITE(HOST_CR0, &(p->cr0)); - CHK_VMCS_WRITE(HOST_CR3, &(p->cr3)); - CHK_VMCS_WRITE(HOST_CR4, &(p->cr4)); - CHK_VMCS_WRITE(HOST_RSP, &(p->rsp)); - CHK_VMCS_WRITE(HOST_RIP, &(p->rip)); - CHK_VMCS_WRITE(VMCS_HOST_CS_SELECTOR, &(p->csSelector)); - CHK_VMCS_WRITE(VMCS_HOST_SS_SELECTOR, &(p->ssSelector)); - CHK_VMCS_WRITE(VMCS_HOST_DS_SELECTOR, &(p->dsSelector)); - CHK_VMCS_WRITE(VMCS_HOST_ES_SELECTOR, &(p->esSelector)); - CHK_VMCS_WRITE(VMCS_HOST_FS_SELECTOR, &(p->fsSelector)); - CHK_VMCS_WRITE(VMCS_HOST_GS_SELECTOR, &(p->gsSelector)); - CHK_VMCS_WRITE(VMCS_HOST_TR_SELECTOR, &(p->trSelector)); - CHK_VMCS_WRITE(HOST_FS_BASE, &(p->fsBaseAddr)); - CHK_VMCS_WRITE(HOST_GS_BASE, &(p->gsBaseAddr)); - CHK_VMCS_WRITE(HOST_TR_BASE, &(p->trBaseAddr)); - CHK_VMCS_WRITE(HOST_GDTR_BASE, &(p->gdtrBaseAddr)); - CHK_VMCS_WRITE(HOST_IDTR_BASE, &(p->idtrBaseAddr)); - CHK_VMCS_WRITE(HOST_IA32_SYSENTER_CS, &(p->sysenter_cs)); - CHK_VMCS_WRITE(HOST_IA32_SYSENTER_ESP, &(p->sysenter_esp)); - CHK_VMCS_WRITE(HOST_IA32_SYSENTER_EIP, &(p->sysenter_eip)); - return 0; -} + PrintDebug("\n====== Loading Guest State ======\n"); + PRINT_VMREAD("Guest CR0: %x\n", GUEST_CR0, wordsize); + PRINT_VMREAD("Guest CR3: %x\n", GUEST_CR3, wordsize); + PRINT_VMREAD("Guest CR4: %x\n", GUEST_CR4, wordsize); + PRINT_VMREAD("Guest DR7: %x\n", GUEST_DR7, wordsize); + READ_VMCS_SEG(&tmp_seg,CS,wordsize); + print_vmcs_segment("CS", &tmp_seg); + + READ_VMCS_SEG(&tmp_seg,SS,wordsize); + print_vmcs_segment("SS", &tmp_seg); -int CopyOutVMCSExitCtrlFields(struct VMCSExitCtrlFields *p) -{ - CHK_VMCS_READ(VM_EXIT_CTRLS,&(p->exitCtrls)); - CHK_VMCS_READ(VM_EXIT_MSR_STORE_COUNT,&(p->msrStoreCount)); - CHK_VMCS_READ(VM_EXIT_MSR_STORE_ADDR,&(p->msrStoreAddr)); - CHK_VMCS_READ(VM_EXIT_MSR_LOAD_COUNT,&(p->msrLoadCount)); - CHK_VMCS_READ(VM_EXIT_MSR_LOAD_ADDR,&(p->msrLoadAddr)); - return 0; -} - -int CopyInVMCSExitCtrlFields(struct VMCSExitCtrlFields *p) -{ - CHK_VMCS_WRITE(VM_EXIT_CTRLS,&(p->exitCtrls)); - CHK_VMCS_WRITE(VM_EXIT_MSR_STORE_COUNT,&(p->msrStoreCount)); - CHK_VMCS_WRITE(VM_EXIT_MSR_STORE_ADDR,&(p->msrStoreAddr)); - CHK_VMCS_WRITE(VM_EXIT_MSR_LOAD_COUNT,&(p->msrLoadCount)); - CHK_VMCS_WRITE(VM_EXIT_MSR_LOAD_ADDR,&(p->msrLoadAddr)); - return 0; -} + READ_VMCS_SEG(&tmp,DS,wordsize); + print_vmcs_segment("DS", &tmp_seg); + READ_VMCS_SEG(&tmp_seg,ES,wordsize); + print_vmcs_segment("ES", &tmp_seg); -int CopyOutVMCSEntryCtrlFields(struct VMCSEntryCtrlFields *p) -{ - CHK_VMCS_READ(VM_ENTRY_CTRLS,&(p->entryCtrls)); - CHK_VMCS_READ(VM_ENTRY_MSR_LOAD_COUNT,&(p->msrLoadCount)); - CHK_VMCS_READ(VM_ENTRY_MSR_LOAD_ADDR,&(p->msrLoadAddr)); - CHK_VMCS_READ(VM_ENTRY_INT_INFO_FIELD,&(p->intInfo)); - CHK_VMCS_READ(VM_ENTRY_EXCEPTION_ERROR,&(p->exceptionErrorCode)); - CHK_VMCS_READ(VM_ENTRY_INSTR_LENGTH,&(p->instrLength)); - return 0; -} + READ_VMCS_SEG(&tmp_seg,FS,wordsize); + print_vmcs_segment("FS", &tmp_seg); -int CopyInVMCSEntryCtrlFields(struct VMCSEntryCtrlFields *p) -{ - CHK_VMCS_WRITE(VM_ENTRY_CTRLS,&(p->entryCtrls)); - CHK_VMCS_WRITE(VM_ENTRY_MSR_LOAD_COUNT,&(p->msrLoadCount)); - CHK_VMCS_WRITE(VM_ENTRY_MSR_LOAD_ADDR,&(p->msrLoadAddr)); - CHK_VMCS_WRITE(VM_ENTRY_INT_INFO_FIELD,&(p->intInfo)); - CHK_VMCS_WRITE(VM_ENTRY_EXCEPTION_ERROR,&(p->exceptionErrorCode)); - CHK_VMCS_WRITE(VM_ENTRY_INSTR_LENGTH,&(p->instrLength)); - return 0; -} + READ_VMCS_SEG(&tmp_seg,GS,wordsize); + print_vmcs_segment("GS", &tmp_seg); -int CopyOutVMCSExitInfoFields(struct VMCSExitInfoFields *p) { - CHK_VMCS_READ(EXIT_REASON,&(p->reason)); - CHK_VMCS_READ(EXIT_QUALIFICATION,&(p->qualification)); - CHK_VMCS_READ(VM_EXIT_INT_INFO,&(p->intInfo)); - CHK_VMCS_READ(VM_EXIT_INT_ERROR,&(p->intErrorCode)); - CHK_VMCS_READ(IDT_VECTOR_INFO,&(p->idtVectorInfo)); - CHK_VMCS_READ(IDT_VECTOR_ERROR,&(p->idtVectorErrorCode)); - CHK_VMCS_READ(VM_EXIT_INSTR_LENGTH,&(p->instrLength)); - CHK_VMCS_READ(GUEST_LINEAR_ADDR,&(p->guestLinearAddr)); - CHK_VMCS_READ(VMX_INSTR_INFO,&(p->instrInfo)); - CHK_VMCS_READ(IO_RCX,&(p->ioRCX)); - CHK_VMCS_READ(IO_RSI,&(p->ioRSI)); - CHK_VMCS_READ(IO_RDI,&(p->ioRDI)); - CHK_VMCS_READ(IO_RIP,&(p->ioRIP)); - CHK_VMCS_READ(VM_INSTR_ERROR,&(p->instrErrorField)); - return 0; -} + READ_VMCS_SEG(&tmp_seg,TR,wordsize); + print_vmcs_segment("TR", &tmp_seg); + READ_VMCS_SEG(&tmp_seg,LDTR,wordsize); + print_vmcs_segment("LDTR", &tmp_seg); + + PrintDebug("\n==GDTR==\n"); + PRINT_VMREAD("GDTR Base: %x\n", GUEST_GDTR_BASE, wordsize); + PRINT_VMREAD("GDTR Limit: %x\n", GUEST_GDTR_LIMIT, 32); + PrintDebug("====\n"); -int CopyOutVMCSExecCtrlFields(struct VMCSExecCtrlFields *p) -{ - CHK_VMCS_READ(PIN_VM_EXEC_CTRLS,&(p->pinCtrls)); - CHK_VMCS_READ(PROC_VM_EXEC_CTRLS,&(p->procCtrls)); - CHK_VMCS_READ(EXCEPTION_BITMAP,&(p->execBitmap)); - CHK_VMCS_READ(PAGE_FAULT_ERROR_MASK,&(p->pageFaultErrorMask)); - CHK_VMCS_READ(PAGE_FAULT_ERROR_MATCH,&(p->pageFaultErrorMatch)); - CHK_VMCS_READ(IO_BITMAP_A_ADDR,&(p->ioBitmapA)); - CHK_VMCS_READ(IO_BITMAP_B_ADDR,&(p->ioBitmapB)); - CHK_VMCS_READ(TSC_OFFSET,&(p->tscOffset)); - CHK_VMCS_READ(CR0_GUEST_HOST_MASK,&(p->cr0GuestHostMask)); - CHK_VMCS_READ(CR0_READ_SHADOW,&(p->cr0ReadShadow)); - CHK_VMCS_READ(CR4_GUEST_HOST_MASK,&(p->cr4GuestHostMask)); - CHK_VMCS_READ(CR4_READ_SHADOW,&(p->cr4ReadShadow)); - CHK_VMCS_READ(CR3_TARGET_COUNT, &(p->cr3TargetCount)); - CHK_VMCS_READ(CR3_TARGET_VALUE_0, &(p->cr3TargetValue0)); - CHK_VMCS_READ(CR3_TARGET_VALUE_1, &(p->cr3TargetValue1)); - CHK_VMCS_READ(CR3_TARGET_VALUE_2, &(p->cr3TargetValue2)); - CHK_VMCS_READ(CR3_TARGET_VALUE_3, &(p->cr3TargetValue3)); - CHK_VMCS_READ(VIRT_APIC_PAGE_ADDR, &(p->virtApicPageAddr)); - CHK_VMCS_READ(TPR_THRESHOLD, &(p->tprThreshold)); - CHK_VMCS_READ(MSR_BITMAPS, &(p->MSRBitmapsBaseAddr)); - CHK_VMCS_READ(VMCS_EXEC_PTR,&(p->vmcsExecPtr)); - return 0; -} + PrintDebug("\n==LDTR==\n"); + PRINT_VMREAD("LDTR Base: %x\n", GUEST_LDTR_BASE, wordsize); + PRINT_VMREAD("LDTR Limit: %x\n", GUEST_LDTR_LIMIT, 32); + PrintDebug("=====\n"); + PRINT_VMREAD("Guest RSP: %x\n", GUEST_RSP, wordsize); + PRINT_VMREAD("Guest RIP: %x\n", GUEST_RIP, wordsize); + PRINT_VMREAD("Guest RFLAGS: %x\n", GUEST_RFLAGS, wordsize); + PRINT_VMREAD("Guest Activity state: %x\n", GUEST_ACTIVITY_STATE, 32); + PRINT_VMREAD("Guest Interruptibility state: %x\n", GUEST_INT_STATE, 32); + PRINT_VMREAD("Guest pending debug: %x\n", GUEST_PENDING_DEBUG_EXCS, wordsize); -int CopyInVMCSExecCtrlFields(struct VMCSExecCtrlFields *p) -{ - CHK_VMCS_WRITE(PIN_VM_EXEC_CTRLS,&(p->pinCtrls)); - CHK_VMCS_WRITE(PROC_VM_EXEC_CTRLS,&(p->procCtrls)); - CHK_VMCS_WRITE(EXCEPTION_BITMAP,&(p->execBitmap)); - CHK_VMCS_WRITE(PAGE_FAULT_ERROR_MASK,&(p->pageFaultErrorMask)); - CHK_VMCS_WRITE(PAGE_FAULT_ERROR_MATCH,&(p->pageFaultErrorMatch)); - CHK_VMCS_WRITE(IO_BITMAP_A_ADDR,&(p->ioBitmapA)); - CHK_VMCS_WRITE(IO_BITMAP_B_ADDR,&(p->ioBitmapB)); - CHK_VMCS_WRITE(TSC_OFFSET,&(p->tscOffset)); - CHK_VMCS_WRITE(CR0_GUEST_HOST_MASK,&(p->cr0GuestHostMask)); - CHK_VMCS_WRITE(CR0_READ_SHADOW,&(p->cr0ReadShadow)); - CHK_VMCS_WRITE(CR4_GUEST_HOST_MASK,&(p->cr4GuestHostMask)); - CHK_VMCS_WRITE(CR4_READ_SHADOW,&(p->cr4ReadShadow)); - CHK_VMCS_WRITE(CR3_TARGET_COUNT, &(p->cr3TargetCount)); - CHK_VMCS_WRITE(CR3_TARGET_VALUE_0, &(p->cr3TargetValue0)); - CHK_VMCS_WRITE(CR3_TARGET_VALUE_1, &(p->cr3TargetValue1)); - CHK_VMCS_WRITE(CR3_TARGET_VALUE_2, &(p->cr3TargetValue2)); - CHK_VMCS_WRITE(CR3_TARGET_VALUE_3, &(p->cr3TargetValue3)); - CHK_VMCS_WRITE(VIRT_APIC_PAGE_ADDR, &(p->virtApicPageAddr)); - CHK_VMCS_WRITE(TPR_THRESHOLD, &(p->tprThreshold)); - CHK_VMCS_WRITE(MSR_BITMAPS, &(p->MSRBitmapsBaseAddr)); - CHK_VMCS_WRITE(VMCS_EXEC_PTR,&(p->vmcsExecPtr)); - return 0; + PRINT_VMREAD("IA32_DEBUGCTL: %x\n", GUEST_IA32_DEBUGCTL, 64); + PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", GUEST_IA32_SYSENTER_CS, 32); + PRINT_VMREAD("IA32_SYSTENTER_ESP: %x\n", GUEST_IA32_SYSENTER_ESP, wordsize); + PRINT_VMREAD("IA32_SYSTENTER_EIP: %x\n", GUEST_IA32_SYSENTER_EIP, wordsize); + PRINT_VMREAD("IA32_PERF_GLOBAL_CTRL: %x\n", GUEST_IA32_PERF_GLOBAL_CTRL, wordsize); + PRINT_VMREAD("VMCS Link Ptr: %x\n", VMCS_LINK_PTR, 64); + // TODO: Maybe add VMX preemption timer and PDTE (Intel 20-8 Vol. 3b) } - -int CopyOutVMCSData(struct VMCSData *p) { - if (CopyOutVMCSGuestStateArea(&(p->guestStateArea)) != 0) { - return -1; - } - if (CopyOutVMCSHostStateArea(&(p->hostStateArea)) != 0) { - return -1; - } - if (CopyOutVMCSExecCtrlFields(&(p->execCtrlFields)) != 0) { - return -1; - } - if (CopyOutVMCSExitCtrlFields(&(p->exitCtrlFields)) != 0) { - return -1; - } - if (CopyOutVMCSEntryCtrlFields(&(p->entryCtrlFields)) != 0) { - return -1; - } - if (CopyOutVMCSExitInfoFields(&(p->exitInfoFields)) != 0) { - return -1; - } - return 0; +void print_debug_load_host() { + const int wordsize = sizeof(addr_t); + uint64_t temp; + vmcs_segment tmp_seg; + + PrintDebug("\n====== Host State ========\n"); + PRINT_VMREAD("Host CR0: %x\n", HOST_CR0, wordsize); + PRINT_VMREAD("Host CR3: %x\n", HOST_CR3, wordsize); + PRINT_VMREAD("Host CR4: %x\n", HOST_CR4, wordsize); + PRINT_VMREAD("Host RSP: %x\n", HOST_RSP, wordsize); + PRINT_VMREAD("Host RIP: %x\n", HOST_RIP, wordsize); + PRINT_VMREAD("IA32_SYSENTER_CS: %x\n", HOST_IA32_SYSENTER_CS, 32); + PRINT_VMREAD("IA32_SYSENTER_ESP: %x\n", HOST_IA32_SYSENTER_ESP, wordsize); + PRINT_VMREAD("IA32_SYSENTER_EIP: %x\n", HOST_IA32_SYSENTER_EIP, wordsize); + + PRINT_VMREAD("Host CS Selector: %x\n", HOST_CS_SELECTOR, 16); + PRINT_VMREAD("Host SS Selector: %x\n", HOST_SS_SELECTOR, 16); + PRINT_VMREAD("Host DS Selector: %x\n", HOST_DS_SELECTOR, 16); + PRINT_VMREAD("Host ES Selector: %x\n", HOST_ES_SELECTOR, 16); + PRINT_VMREAD("Host FS Selector: %x\n", HOST_FS_SELECTOR, 16); + PRINT_VMREAD("Host GS Selector: %x\n", HOST_GS_SELECTOR, 16); + PRINT_VMREAD("Host TR Selector: %x\n", HOST_TR_SELECTOR, 16); + + PRINT_VMREAD("Host FS Base: %x\n", HOST_FS_BASE, wordsize); + PRINT_VMREAD("Host GS Base: %x\n", HOST_GS_BASE, wordsize); + PRINT_VMREAD("Host TR Base: %x\n", HOST_TR_BASE, wordsize); + PRINT_VMREAD("Host GDTR Base: %x\n", HOST_GDTR_BASE, wordsize); + PRINT_VMREAD("Host IDTR Base: %x\n", HOSE_IDTR_BASE, wordsize); } - -int CopyInVMCSData(struct VMCSData *p) { - if (CopyInVMCSGuestStateArea(&(p->guestStateArea)) != 0) { - return -1; - } - if (CopyInVMCSHostStateArea(&(p->hostStateArea)) != 0) { - return -1; - } - if (CopyInVMCSExecCtrlFields(&(p->execCtrlFields)) != 0) { - return -1; - } - if (CopyInVMCSExitCtrlFields(&(p->exitCtrlFields)) != 0) { - return -1; - } - if (CopyInVMCSEntryCtrlFields(&(p->entryCtrlFields)) != 0) { - return -1; - } - return 0; -} - - -void PrintTrace_VMX_Regs(struct VMXRegs * regs) { - PrintTrace("==>VMX Register values:\n"); - PrintTrace("EAX: %x\n", regs->eax); - PrintTrace("ECX: %x\n", regs->ecx); - PrintTrace("EDX: %x\n", regs->edx); - PrintTrace("EBX: %x\n", regs->ebx); - PrintTrace("ESP: %x\n", regs->esp); - PrintTrace("EBP: %x\n", regs->ebp); - PrintTrace("ESI: %x\n", regs->esi); - PrintTrace("EDI: %x\n", regs->edi); - PrintTrace("\n"); +void print_vmcs_segment(char * name, vmcs_segment* seg) +{ + PrintDebug("\n==VMCS %s Segment==\n",name); + PrintDebug("\tSelector: %x\n", seg->selector); + PrintDebug("\tBase Address: %x\n", seg->baseAddr); + PrintDebug("\tLimit: %x\n", seg->limit); + PrintDebug("\tAccess: %x\n", seg->access); } - -void PrintTrace_VMCSSegment(char * segname, struct VMCSSegment * seg, int abbr) { - PrintTrace("Segment: %s\n", segname); - if (abbr == 0) { - PrintTrace("\tSelector: %x\n", (uint_t)seg->selector); - PrintTrace("\tAccess: %x\n", *(uint_t*)&(seg->access)); - } - PrintTrace("\tBase Addr: %x\n", (uint_t)seg->baseAddr); - PrintTrace("\tLimit: %x\n", (uint_t)seg->limit); - +/* + * 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; + } } - -void PrintTrace_VMCSGuestStateArea(struct VMCSGuestStateArea * guestState) { - PrintTrace("==>Guest State Area\n"); - PrintTrace("==>==> Guest Register State\n"); - PrintTrace("GUEST_CR0: %x\n",(uint_t) guestState->cr0); - PrintTrace("GUEST_CR3: %x\n",(uint_t)guestState->cr3); - PrintTrace("GUEST_CR4: %x\n",(uint_t)guestState->cr4); - PrintTrace("GUEST_DR7: %x\n",(uint_t)guestState->dr7); - PrintTrace("GUEST_RSP: %x\n",(uint_t)guestState->rsp); - PrintTrace("GUEST_RIP: %x\n",(uint_t)guestState->rip); - PrintTrace("GUEST_RFLAGS: %x\n",(uint_t)guestState->rflags); - - PrintTrace_VMCSSegment("Guest CS", &(guestState->cs), 0); - PrintTrace_VMCSSegment("Guest SS", &(guestState->ss), 0); - PrintTrace_VMCSSegment("Guest DS",&(guestState->ds), 0); - PrintTrace_VMCSSegment("Guest ES", &(guestState->es), 0); - PrintTrace_VMCSSegment("Guest FS", &(guestState->fs), 0); - PrintTrace_VMCSSegment("Guest GS", &(guestState->gs), 0); - PrintTrace_VMCSSegment("Guest LDTR", &(guestState->ldtr), 0); - PrintTrace_VMCSSegment("Guest TR", &(guestState->tr), 0); - PrintTrace_VMCSSegment("Guest GDTR", &(guestState->gdtr), 1); - PrintTrace_VMCSSegment("Guest IDTR", &(guestState->idtr), 1); - - - PrintTrace("GUEST_IA32_DEBUGCTL: %x\n",(uint_t)(guestState->dbg_ctrl & 0xffffffff)); - PrintTrace("GUEST_IA32_DEBUGCTL_HIGH: %x\n",(uint_t)(guestState->dbg_ctrl >> 32) & 0xffffffff); - PrintTrace("GUEST_IA32_SYSENTER_CS: %x\n",guestState->sysenter_cs); - PrintTrace("GUEST_IA32_SYSENTER_ESP: %x\n",(uint_t)guestState->sysenter_esp); - PrintTrace("GUEST_IA32_SYSENTER_EIP: %x\n",(uint_t)guestState->sysenter_eip); - PrintTrace("GUEST_SMBASE: %x\n", (uint_t)guestState->smbase); - - PrintTrace("==>==> Guest Non-Register State\n"); - PrintTrace("GUEST_ACTIVITY_STATE: %x\n", (uint_t)guestState->activity); - PrintTrace("GUEST_INT_STATE: %x\n", (uint_t)guestState->interrupt_state); - PrintTrace("GUEST_PENDING_DEBUG_EXCS: %x\n", (uint_t)guestState->pending_dbg_exceptions); - PrintTrace("VMCS_LINK_PTR: %x\n", (uint_t)guestState->vmcs_link & 0xffffffff); - PrintTrace("VMCS_LINK_PTR_HIGH: %x\n", (uint_t)(guestState->vmcs_link >> 32) & 0xffffffff); +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; + } }