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.


Have unregistered hypercalls fail to guest
[palacios.git] / palacios / include / palacios / vmx_handler.h
index 1fdf98c..632277a 100644 (file)
 /* VMX Intercept Exit Codes               */
 /******************************************/
 typedef enum {
-    VMEXIT_INFO_EXCEPTION_OR_NMI            = 0,
-    VMEXIT_EXTERNAL_INTR                    = 1,
-    VMEXIT_TRIPLE_FAULT                     = 2,
-    VMEXIT_INIT_SIGNAL                      = 3,
-    VMEXIT_STARTUP_IPI                      = 4,
-    VMEXIT_IO_SMI                           = 5,
-    VMEXIT_OTHER_SMI                        = 6,
-    VMEXIT_INTR_WINDOW                      = 7,
-    VMEXIT_NMI_WINDOW                       = 8,
-    VMEXIT_TASK_SWITCH                      = 9,
-    VMEXIT_CPUID                            = 10,
-    VMEXIT_HLT                              = 12,
-    VMEXIT_INVD                             = 13,
-    VMEXIT_INVLPG                           = 14,
-    VMEXIT_RDPMC                            = 15,
-    VMEXIT_RDTSC                            = 16,
-    VMEXIT_RSM                              = 17,
-    VMEXIT_VMCALL                           = 18,
-    VMEXIT_VMCLEAR                          = 19,
-    VMEXIT_VMLAUNCH                         = 20,
-    VMEXIT_VMPTRLD                          = 21,
-    VMEXIT_VMPTRST                          = 22,
-    VMEXIT_VMREAD                           = 23,
-    VMEXIT_VMRESUME                         = 24,
-    VMEXIT_VMWRITE                          = 25,
-    VMEXIT_VMXOFF                           = 26,
-    VMEXIT_VMXON                            = 27,
-    VMEXIT_CR_REG_ACCESSES                  = 28,
-    VMEXIT_MOV_DR                           = 29,
-    VMEXIT_IO_INSTR                         = 30,
-    VMEXIT_RDMSR                            = 31,
-    VMEXIT_WRMSR                            = 32,
-    VMEXIT_ENTRY_FAIL_INVALID_GUEST_STATE   = 33,
-    VMEXIT_ENTRY_FAIL_MSR_LOAD              = 34,
-    VMEXIT_MWAIT                            = 36,
-    VMEXIT_MONITOR                          = 39,
-    VMEXIT_PAUSE                            = 40,
-    VMEXIT_ENTRY_FAILURE_MACHINE_CHECK      = 41,
-    VMEXIT_TPR_BELOW_THRESHOLD              = 43,
-    VMEXIT_APIC                             = 44,
-    VMEXIT_GDTR_IDTR                        = 46,
-    VMEXIT_LDTR_TR                          = 47,
-    VMEXIT_EPT_VIOLATION                    = 48,
-    VMEXIT_EPT_CONFIG                       = 49,
-    VMEXIT_INVEPT                           = 50,
-    VMEXIT_RDTSCP                           = 51,
-    VMEXIT_EXPIRED_PREEMPT_TIMER            = 52,
-    VMEXIT_INVVPID                          = 53,
-    VMEXIT_WBINVD                           = 54,
-    VMEXIT_XSETBV                           = 55
+    VMX_EXIT_INFO_EXCEPTION_OR_NMI            = 0,
+    VMX_EXIT_EXTERNAL_INTR                    = 1,
+    VMX_EXIT_TRIPLE_FAULT                     = 2,
+    VMX_EXIT_INIT_SIGNAL                      = 3,
+    VMX_EXIT_STARTUP_IPI                      = 4,
+    VMX_EXIT_IO_SMI                           = 5,
+    VMX_EXIT_OTHER_SMI                        = 6,
+    VMX_EXIT_INTR_WINDOW                      = 7,
+    VMX_EXIT_NMI_WINDOW                       = 8,
+    VMX_EXIT_TASK_SWITCH                      = 9,
+    VMX_EXIT_CPUID                            = 10,
+    VMX_EXIT_HLT                              = 12,
+    VMX_EXIT_INVD                             = 13,
+    VMX_EXIT_INVLPG                           = 14,
+    VMX_EXIT_RDPMC                            = 15,
+    VMX_EXIT_RDTSC                            = 16,
+    VMX_EXIT_RSM                              = 17,
+    VMX_EXIT_VMCALL                           = 18,
+    VMX_EXIT_VMCLEAR                          = 19,
+    VMX_EXIT_VMLAUNCH                         = 20,
+    VMX_EXIT_VMPTRLD                          = 21,
+    VMX_EXIT_VMPTRST                          = 22,
+    VMX_EXIT_VMREAD                           = 23,
+    VMX_EXIT_VMRESUME                         = 24,
+    VMX_EXIT_VMWRITE                          = 25,
+    VMX_EXIT_VMXOFF                           = 26,
+    VMX_EXIT_VMXON                            = 27,
+    VMX_EXIT_CR_REG_ACCESSES                  = 28,
+    VMX_EXIT_MOV_DR                           = 29,
+    VMX_EXIT_IO_INSTR                         = 30,
+    VMX_EXIT_RDMSR                            = 31,
+    VMX_EXIT_WRMSR                            = 32,
+    VMX_EXIT_INVALID_GUEST_STATE              = 33,
+    VMX_EXIT_INVALID_MSR_LOAD                 = 34,
+    VMX_EXIT_MWAIT                            = 36,
+    VMX_EXIT_MONITOR                          = 39,
+    VMX_EXIT_PAUSE                            = 40,
+    VMX_EXIT_INVALID_MACHINE_CHECK            = 41,
+    VMX_EXIT_TPR_BELOW_THRESHOLD              = 43,
+    VMX_EXIT_APIC                             = 44,
+    VMX_EXIT_GDTR_IDTR                        = 46,
+    VMX_EXIT_LDTR_TR                          = 47,
+    VMX_EXIT_EPT_VIOLATION                    = 48,
+    VMX_EXIT_EPT_CONFIG                       = 49,
+    VMX_EXIT_INVEPT                           = 50,
+    VMX_EXIT_RDTSCP                           = 51,
+    VMX_EXIT_EXPIRED_PREEMPT_TIMER            = 52,
+    VMX_EXIT_INVVPID                          = 53,
+    VMX_EXIT_WBINVD                           = 54,
+    VMX_EXIT_XSETBV                           = 55
 } vmx_exit_t;
 
 /* VMCS Exit QUALIFICATIONs */
@@ -153,7 +153,7 @@ struct VMExitDBGQual {
 } __attribute__((packed));
 
 
-struct VMExitTSQual {
+ struct VMExitTSQual {
     uint32_t selector   : 16; // selector of destination TSS 
     uint32_t rsvd       : 14; // reserved to 0
     uint32_t src        : 2; // (0: CALL ; 1: IRET ; 2: JMP ; 3: Task gate in IDT)
@@ -200,6 +200,20 @@ struct vmx_exit_idt_vec_info {
 
 
 
+struct vmx_basic_exit_info {
+    union {
+       uint32_t value;
+       struct {
+           uint16_t reason;
+           uint16_t rsvd1         :12;
+           uint8_t  mtf_pending   : 1;
+           uint8_t  vmx_root_op   : 1;
+           uint8_t  rsvd2         : 1;
+           uint8_t  entry_error   : 1;
+       } __attribute__((packed));
+    } __attribute__((packed));
+} __attribute__((packed));
+
 
 struct vmx_exit_info {
     uint32_t instr_len;
@@ -212,12 +226,16 @@ struct vmx_exit_info {
     uint32_t int_err;
 
     addr_t guest_linear_addr;
-};
 
+    /* EPT INFO */
+    addr_t ept_fault_addr;
+
+};
 
 
 
 
+int v3_handle_atomic_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_info);
 int v3_handle_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_info);
 const char * v3_vmx_exit_code_to_str(vmx_exit_t exit);