Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Additional VMX support. Bootstrapping code added.
[palacios.git] / palacios / src / palacios / vmcs.c
index aa25f5e..35dc5e1 100644 (file)
@@ -154,6 +154,512 @@ void print_vmcs_segment(char * name, vmcs_segment* seg)
     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);