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.


added arch independent MSR storage
Jack Lange [Fri, 13 Apr 2012 23:30:26 +0000 (18:30 -0500)]
palacios/include/palacios/vm_guest.h
palacios/include/palacios/vmm_regs.h
palacios/src/palacios/svm.c
palacios/src/palacios/vmcs.c

index a63d19e..49e8598 100644 (file)
@@ -101,6 +101,7 @@ struct guest_info {
     struct v3_ctrl_regs ctrl_regs;
     struct v3_dbg_regs dbg_regs;
     struct v3_segments segments;
+    struct v3_msrs     msrs;
 
 
     void * vmm_data;
index e8ed725..32a870e 100644 (file)
@@ -57,6 +57,13 @@ struct v3_ctrl_regs {
 };
 
 
+struct v3_msrs {
+    v3_reg_t star;
+    v3_reg_t lstar;
+    v3_reg_t sfmask;
+    v3_reg_t kern_gs_base;
+};
+
 
 struct v3_dbg_regs {
     v3_reg_t dr0;
index 962a34b..e13cc96 100644 (file)
@@ -569,6 +569,12 @@ int v3_svm_enter(struct guest_info * info) {
     guest_state->rflags = info->ctrl_regs.rflags;
     guest_state->efer = info->ctrl_regs.efer;
     
+    /* Synchronize MSRs */
+    guest_state->star = info->msrs.star;
+    guest_state->lstar = info->msrs.lstar;
+    guest_state->sfmask = info->msrs.sfmask;
+    guest_state->KernelGsBase = info->msrs.kern_gs_base;
+
     guest_state->cpl = info->cpl;
 
     v3_set_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments));
@@ -646,6 +652,12 @@ int v3_svm_enter(struct guest_info * info) {
     info->ctrl_regs.rflags = guest_state->rflags;
     info->ctrl_regs.efer = guest_state->efer;
     
+    /* Synchronize MSRs */
+    info->msrs.star =  guest_state->star;
+    info->msrs.lstar = guest_state->lstar;
+    info->msrs.sfmask = guest_state->sfmask;
+    info->msrs.kern_gs_base = guest_state->KernelGsBase;
+
     v3_get_vmcb_segments((vmcb_t*)(info->vmm_data), &(info->segments));
     info->cpu_mode = v3_get_vm_cpu_mode(info);
     info->mem_mode = v3_get_vm_mem_mode(info);
index e28029e..67c6f69 100644 (file)
@@ -239,6 +239,25 @@ int v3_vmx_save_vmcs(struct guest_info * info) {
     
     error =  v3_read_vmcs_segments(&(info->segments));
 
+    /* Save MSRs from MSR SAVE Area (whereever that is...)*/
+
+    info->msrs.star = vmx_info->msr_area->guest_star.hi;
+    info->msrs.star <<= 32;
+    info->msrs.star |= vmx_info->msr_area->guest_star.lo;
+
+    info->msrs.lstar = vmx_info->msr_area->guest_lstar.hi;
+    info->msrs.lstar <<= 32;
+    info->msrs.lstar |= vmx_info->msr_area->guest_lstar.lo;
+
+    info->msrs.sfmask = vmx_info->msr_area->guest_fmask.hi;
+    info->msrs.sfmask <<= 32;
+    info->msrs.sfmask |= vmx_info->msr_area->guest_fmask.lo;
+
+    info->msrs.kern_gs_base = vmx_info->msr_area->guest_kern_gs.hi;
+    info->msrs.kern_gs_base <<= 32;
+    info->msrs.kern_gs_base |= vmx_info->msr_area->guest_kern_gs.lo;
+
+
     return error;
 }
 
@@ -266,6 +285,20 @@ int v3_vmx_restore_vmcs(struct guest_info * info) {
 
     error = v3_write_vmcs_segments(&(info->segments));
 
+    /* Restore MSRs from MSR SAVE Area (whereever that is...)*/
+
+    vmx_info->msr_area->guest_star.hi = (info->msrs.star >> 32);
+    vmx_info->msr_area->guest_star.lo = (info->msrs.star & 0xffffffff);
+
+    vmx_info->msr_area->guest_lstar.hi = (info->msrs.lstar >> 32);
+    vmx_info->msr_area->guest_lstar.lo = (info->msrs.lstar & 0xffffffff);
+
+    vmx_info->msr_area->guest_fmask.hi = (info->msrs.sfmask >> 32);
+    vmx_info->msr_area->guest_fmask.lo = (info->msrs.sfmask & 0xffffffff);
+
+    vmx_info->msr_area->guest_kern_gs.hi = (info->msrs.kern_gs_base >> 32);
+    vmx_info->msr_area->guest_kern_gs.lo = (info->msrs.kern_gs_base & 0xffffffff);
+
     return error;
 
 }