// Returns offset of guest TSC from host TSC
static inline sint64_t v3_tsc_host_offset(struct vm_core_time *time_state) {
uint64_t host_time = v3_get_host_time(time_state);
- return ((sint64_t)host_time - (sint64_t)time_state->guest_cycles) + time_state->tsc_guest_offset;
+ return ((sint64_t)time_state->guest_cycles - (sint64_t)host_time) + time_state->tsc_guest_offset;
}
// Functions for handling exits on the TSC when fully virtualizing
// (void *)cur_cycle, (void *)info->yield_start_cycle,
// (void *)info->yield_cycle_period);
- info->yield_start_cycle += info->vm_info->yield_cycle_period;
V3_Yield();
+ info->yield_start_cycle += info->vm_info->yield_cycle_period;
}
}
V3_Yield();
if (info) {
- info->yield_start_cycle = v3_get_host_time(&info->time_state);
+ info->yield_start_cycle += info->vm_info->yield_cycle_period;
}
}
}
int v3_handle_rdtsc(struct guest_info * info) {
+ PrintDebug("Handling virtual RDTSC call.\n");
v3_rdtsc(info);
info->vm_regs.rax &= 0x00000000ffffffffLL;
int v3_handle_rdtscp(struct guest_info * info) {
- PrintDebug("Handling virtual RDTSCP call.\n");
+ PrintDebug("Handling virtual RDTSCP call.\n");
v3_rdtscp(info);
struct v3_msr *msr_val, void *priv) {
uint64_t time = v3_get_guest_tsc(&info->time_state);
+ PrintDebug("Handling virtual TSC MSR read call.\n");
V3_ASSERT(msr_num == TSC_MSR);
msr_val->hi = time >> 32;
struct vm_core_time * time_state = &(info->time_state);
uint64_t guest_time, new_tsc;
- V3_ASSERT(msr_num == TSC_MSR);
+ PrintDebug("Handling virtual TSC MSR write call.\n");
+ V3_ASSERT(msr_num == TSC_MSR);
- new_tsc = (((uint64_t)msr_val.hi) << 32) | (uint64_t)msr_val.lo;
- guest_time = v3_get_guest_time(time_state);
- time_state->tsc_guest_offset = (sint64_t)(new_tsc - guest_time);
+ new_tsc = (((uint64_t)msr_val.hi) << 32) | (uint64_t)msr_val.lo;
+ guest_time = v3_get_guest_time(time_state);
+ time_state->tsc_guest_offset = (sint64_t)(new_tsc - guest_time);
- return 0;
- }
+ return 0;
+}
static int
handle_time_configuration(struct v3_vm_info * vm, v3_cfg_tree_t *cfg) {