X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcs.c;h=85ee7a7151ae566e2f5750eb832152c9ade25b79;hb=54be7fbb6b41d1241ad563a7135cdb28be73ff82;hp=8fb408072e92c16d53e52a9f1c800a3fc1d875db;hpb=88648ddca6003a438826e7d86e28a2ba7b5bfcac;p=palacios.releases.git diff --git a/palacios/src/palacios/vmcs.c b/palacios/src/palacios/vmcs.c index 8fb4080..85ee7a7 100644 --- a/palacios/src/palacios/vmcs.c +++ b/palacios/src/palacios/vmcs.c @@ -24,6 +24,7 @@ #include #include #include +#include @@ -234,10 +235,30 @@ int v3_vmx_save_vmcs(struct guest_info * info) { #ifdef __V3_64BIT__ check_vmcs_read(VMCS_GUEST_EFER, &(info->ctrl_regs.efer)); + check_vmcs_read(VMCS_ENTRY_CTRLS, &(vmx_info->entry_ctrls.value)); #endif 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; } @@ -263,10 +284,21 @@ int v3_vmx_restore_vmcs(struct guest_info * info) { check_vmcs_write(VMCS_ENTRY_CTRLS, vmx_info->entry_ctrls.value); #endif + 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); - error = v3_write_vmcs_segments(&(info->segments)); + 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; @@ -487,6 +519,9 @@ int v3_update_vmcs_host_state(struct guest_info * info) { // PAT + v3_get_msr(IA32_PAT_MSR, &(tmp_msr.hi), &(tmp_msr.lo)); + vmx_ret |= check_vmcs_write(VMCS_HOST_PAT, tmp_msr.value); + // save STAR, LSTAR, FMASK, KERNEL_GS_BASE MSRs in MSR load/store area {