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.


Fix to MSR save/restore handling to avoid VMX ABORT errors
[palacios.git] / palacios / include / palacios / vmx.h
index a37ead8..4384b13 100644 (file)
@@ -1,5 +1,3 @@
-
-
 /* 
  * This file is part of the Palacios Virtual Machine Monitor developed
  * by the V3VEE Project with funding from the United States National 
@@ -9,12 +7,10 @@
  * and the University of New Mexico.  You can find out more at 
  * http://www.v3vee.org
  *
- * Copyright (c) 2008, Peter Dinda <pdinda@northwestern.edu> 
- * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
- * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
+ * Copyright (c) 2011, Jack Lange <jarusl@cs.northwestern.edu> 
+ * Copyright (c) 2011, The V3VEE Project <http://www.v3vee.org> 
  * All rights reserved.
  *
- * Author: Peter Dinda <pdinda@northwestern.edu>
  * Author: Jack Lange <jarusl@cs.northwestern.edu>
  *
  * This is free software.  You are permitted to use,
 #include <palacios/vmm.h>
 #include <palacios/vm_guest.h>
 
-// Intel VMX Specific MSRs
-#define VMX_FEATURE_CONTROL_MSR     0x0000003a
-#define VMX_BASIC_MSR               0x00000480
-#define VMX_PINBASED_CTLS_MSR       0x00000481
-#define VMX_PROCBASED_CTLS_MSR      0x00000482
-#define VMX_EXIT_CTLS_MSR           0x00000483
-#define VMX_ENTRY_CTLS_MSR          0x00000484
-#define VMX_MISC_MSR                0x00000485
-#define VMX_CR0_FIXED0_MSR          0x00000486
-#define VMX_CR0_FIXED1_MSR          0x00000487
-#define VMX_CR4_FIXED0_MSR          0x00000488
-#define VMX_CR4_FIXED1_MSR          0x00000489
-#define VMX_VMCS_ENUM_MSR           0x0000048A
 
 #define VMX_SUCCESS        0
 #define VMX_FAIL_INVALID   1
 #define VMX_FAIL_VALID     2
 #define VMM_ERROR          3
 
-#define FEATURE_CONTROL_LOCK  0x00000001
-#define FEATURE_CONTROL_VMXON 0x00000004
-#define FEATURE_CONTROL_VALID ( FEATURE_CONTROL_LOCK | FEATURE_CONTROL_VMXON )
-
-
-#define CPUID_1_ECX_VTXFLAG 0x00000020
-
 
 struct vmx_pin_ctrls {
     union {
@@ -120,7 +96,8 @@ struct vmx_sec_proc_ctrls {
            uint_t enable_rdtscp   : 1;
            uint_t virt_x2apic     : 1;
            uint_t enable_vpid     : 1;
-           uint_t unrstrct_guest  : 1;
+           uint_t wbinvd_exit     : 1;
+           uint_t unrstrct_guest  : 1; /* un restricted guest (CAN RUN IN REAL MODE) */
            uint_t rsvd1           : 2;
            uint_t pause_loop_exit : 1;
            uint_t rsvd2           : 21;
@@ -170,19 +147,15 @@ struct vmx_entry_ctrls {
     } __attribute__((packed));
 } __attribute__((packed));
 
-struct vmx_basic_msr {
-    uint32_t revision;
-    uint_t regionSize   : 13;
-    uint_t rsvd1        : 4; // Always 0
-    uint_t physWidth    : 1;
-    uint_t smm          : 1; // Always 1
-    uint_t memType      : 4;
-    uint_t rsvd2        : 10; // Always 0
-}  __attribute__((packed));
 
 typedef enum { 
     VMXASSIST_DISABLED,
     VMXASSIST_ENABLED
+} vmxassist_state_t;
+
+typedef enum {
+    VMX_UNLAUNCHED,
+    VMX_LAUNCHED
 } vmx_state_t;
 
 struct tss_descriptor {
@@ -206,7 +179,7 @@ struct tss_descriptor {
     uint_t      zero4       : 5;
     uint_t      rsvd2       : 19;
 #endif
-}__attribute__((packed));
+} __attribute__((packed));
 
 struct vmcs_host_state {
     struct v3_segment  gdtr;
@@ -215,16 +188,38 @@ struct vmcs_host_state {
 };
 
 
+struct vmcs_msr_save_area {
+    union {
+       struct vmcs_msr_entry guest_msrs[4];
+       struct {
+           struct vmcs_msr_entry guest_star;
+           struct vmcs_msr_entry guest_lstar;
+           struct vmcs_msr_entry guest_fmask;
+           struct vmcs_msr_entry guest_kern_gs;
+       } __attribute__((packed));
+    } __attribute__((packed));
+
+    union {
+       struct vmcs_msr_entry host_msrs[4];
+       struct {
+           struct vmcs_msr_entry host_star;
+           struct vmcs_msr_entry host_lstar;
+           struct vmcs_msr_entry host_fmask;
+           struct vmcs_msr_entry host_kern_gs;
+       } __attribute__((packed));
+    } __attribute__((packed)); 
 
+} __attribute__((packed)); 
 
 
 struct vmx_data {
     vmx_state_t state;
+    vmxassist_state_t assist_state;
     struct vmcs_host_state host_state;
 
-    addr_t vmcs_ptr_phys;
 
-    uint8_t ia32e_avail;
+
+    addr_t vmcs_ptr_phys;
 
     v3_reg_t guest_cr4; /// corresponds to the CR4 Read shadow
 
@@ -235,15 +230,33 @@ struct vmx_data {
     struct vmx_sec_proc_ctrls sec_proc_ctrls;
     struct vmx_exit_ctrls exit_ctrls;
     struct vmx_entry_ctrls entry_ctrls;
+
+    struct vmx_exception_bitmap excp_bmap;
+
+    addr_t msr_area_paddr;
+    struct vmcs_msr_save_area * msr_area;
 };
 
 int v3_is_vmx_capable();
+
 void v3_init_vmx_cpu(int cpu_id);
+void v3_deinit_vmx_cpu(int cpu_id);
+
+int v3_init_vmx_vmcs(struct guest_info * info, v3_vm_class_t vm_class);
+int v3_deinit_vmx_vmcs(struct guest_info * core);
 
 int v3_start_vmx_guest(struct guest_info* info);
+int v3_reset_vmx_vm_core(struct guest_info * core, addr_t rip);
+void v3_flush_vmx_vm_core(struct guest_info * core);
+
 int v3_vmx_enter(struct guest_info * info);
 
-int v3_init_vmx_vmcs(struct guest_info * info, v3_vm_class_t vm_class);
+int v3_vmx_load_core(struct guest_info * core, void * ctx);
+int v3_vmx_save_core(struct guest_info * core, void * ctx);
+
+
+
+
 
 #endif // ! __V3VEE__