// If the guest is supposed to run slower than the host, yield out until
// the host time is appropriately far along;
-int v3_adjust_time(struct guest_info * info)
-{
+int v3_adjust_time(struct guest_info * info) {
struct vm_time * time_state = &(info->time_state);
- uint64_t guest_time, host_time, target_host_time;
- guest_time = v3_get_guest_time(time_state);
- host_time = v3_get_host_time(time_state);
- target_host_time = (host_time - time_state->initial_time) *
- time_state->host_cpu_freq / time_state->guest_cpu_freq;
-
- while (host_time < target_host_time) {
- v3_yield(info);
+ if (time_state->host_cpu_freq == time_state->guest_cpu_freq) {
+ time_state->guest_host_offset = 0;
+ } else {
+ uint64_t guest_time, host_time, target_host_time;
+ guest_time = v3_get_guest_time(time_state);
host_time = v3_get_host_time(time_state);
+ target_host_time = (host_time - time_state->initial_time) *
+ time_state->host_cpu_freq / time_state->guest_cpu_freq;
+ while (host_time < target_host_time) {
+ v3_yield(info);
+ host_time = v3_get_host_time(time_state);
+ }
+ time_state->guest_host_offset = guest_time - host_time;
+
}
- time_state->guest_host_offset = guest_time - host_time;
return 0;
}
return 0;
}
-
int v3_remove_timer(struct guest_info * info, struct vm_timer * timer) {
list_del(&(timer->timer_link));
info->time_state.num_timers--;
}
}
-
/*
* Handle full virtualization of the time stamp counter. As noted
* above, we don't store the actual value of the TSC, only the guest's
vmx_state->pri_proc_ctrls.invlpg_exit = 1;
vmx_state->pri_proc_ctrls.use_msr_bitmap = 1;
vmx_state->pri_proc_ctrls.pause_exit = 1;
-#ifdef CONFIG_TIME_VIRTUALIZE_TSC
vmx_state->pri_proc_ctrls.tsc_offset = 1;
+#ifdef CONFIG_TIME_VIRTUALIZE_TSC
vmx_state->pri_proc_ctrls.rdtsc_exit = 1;
#endif