X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx.c;h=b29673f7a6c409a6bf10217264ff3ab0246e68fc;hb=3500a418f4ab8a5ce38c1480f107b5deb5712bee;hp=16f3e3bff4afb322eb0d7d79099f275c67740b18;hpb=d9c2f0c816ccafbad28d5d7c451bab2723db8fdf;p=palacios.git diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index 16f3e3b..b29673f 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -872,7 +872,7 @@ int v3_vmx_config_tsc_virtualization(struct guest_info * info) { struct vmx_data * vmx_info = (struct vmx_data *)(info->vmm_data); - if (info->time_state.time_flags & V3_TIME_TRAP_RDTSC) { + if (info->time_state.flags & VM_TIME_TRAP_RDTSC) { if (!vmx_info->pri_proc_ctrls.rdtsc_exit) { vmx_info->pri_proc_ctrls.rdtsc_exit = 1; check_vmcs_write(VMCS_PROC_CTRLS, vmx_info->pri_proc_ctrls.value); @@ -913,16 +913,16 @@ int v3_vmx_enter(struct guest_info * info) { // Conditionally yield the CPU if the timeslice has expired v3_yield_cond(info); - // disable global interrupts for vm state transition - v3_disable_ints(); - // Update timer devices late after being in the VM so that as much // of the time in the VM is accounted for as possible. Also do it before // updating IRQ entry state so that any interrupts the timers raise get - // handled on the next VM entry. Must be done with interrupts disabled. - v3_advance_time(info); + // handled on the next VM entry. + v3_advance_time(info, NULL); v3_update_timers(info); + // disable global interrupts for vm state transition + v3_disable_ints(); + if (vmcs_store() != vmx_info->vmcs_ptr_phys) { vmcs_clear(vmx_info->vmcs_ptr_phys); vmcs_load(vmx_info->vmcs_ptr_phys); @@ -947,12 +947,9 @@ int v3_vmx_enter(struct guest_info * info) { } - // Perform last-minute time bookkeeping prior to entering the VM - v3_time_enter_vm(info); + // Perform last-minute time setup prior to entering the VM v3_vmx_config_tsc_virtualization(info); - - if (v3_update_vmcs_host_state(info)) { v3_enable_ints(); PrintError("Could not write host state\n"); @@ -1019,8 +1016,7 @@ int v3_vmx_enter(struct guest_info * info) { } // Immediate exit from VM time bookkeeping - v3_time_exit_vm(info, &guest_cycles); - + v3_advance_time(info, &guest_cycles); /* Update guest state */ v3_vmx_save_vmcs(info); @@ -1073,6 +1069,8 @@ int v3_vmx_enter(struct guest_info * info) { // Conditionally yield the CPU if the timeslice has expired v3_yield_cond(info); + v3_advance_time(info, NULL); + v3_update_timers(info); if (v3_handle_vmx_exit(info, &exit_info) == -1) { PrintError("Error in VMX exit handler (Exit reason=%x)\n", exit_info.exit_reason);