X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcs.c;h=85ee7a7151ae566e2f5750eb832152c9ade25b79;hb=1c000bda0560742ad6be011722fa226771b656ff;hp=e28029e9dd1b1813851c3274f26aaaaca3e6c953;hpb=457220e0485aefc6efecbc81ab1343b9cb65d8ba;p=palacios.git diff --git a/palacios/src/palacios/vmcs.c b/palacios/src/palacios/vmcs.c index e28029e..85ee7a7 100644 --- a/palacios/src/palacios/vmcs.c +++ b/palacios/src/palacios/vmcs.c @@ -24,6 +24,7 @@ #include #include #include +#include @@ -239,6 +240,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 +286,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; }