From: Jack Lange Date: Fri, 13 Apr 2012 23:30:26 +0000 (-0500) Subject: added arch independent MSR storage X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=df69e9f90c11f91a7bb3ccdf4218ef61124a5442;p=palacios.releases.git added arch independent MSR storage --- diff --git a/palacios/include/palacios/vm_guest.h b/palacios/include/palacios/vm_guest.h index a63d19e..49e8598 100644 --- a/palacios/include/palacios/vm_guest.h +++ b/palacios/include/palacios/vm_guest.h @@ -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; diff --git a/palacios/include/palacios/vmm_regs.h b/palacios/include/palacios/vmm_regs.h index e8ed725..32a870e 100644 --- a/palacios/include/palacios/vmm_regs.h +++ b/palacios/include/palacios/vmm_regs.h @@ -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; diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 962a34b..e13cc96 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -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); diff --git a/palacios/src/palacios/vmcs.c b/palacios/src/palacios/vmcs.c index e28029e..67c6f69 100644 --- a/palacios/src/palacios/vmcs.c +++ b/palacios/src/palacios/vmcs.c @@ -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; }