/* Yield until that host time is reached */
host_time = v3_get_host_time(time_state);
+
while (host_time < target_host_time) {
v3_yield(info);
host_time = v3_get_host_time(time_state);
time_state->guest_host_offset = (sint64_t)guest_time - (sint64_t)host_time;
}
+
return 0;
}
* ra/c/dx here since they're modified by this instruction anyway. */
info->vm_regs.rcx = TSC_AUX_MSR;
ret = v3_handle_msr_read(info);
- if (ret) return ret;
+
+ if (ret != 0) {
+ return ret;
+ }
+
info->vm_regs.rcx = info->vm_regs.rax;
/* Now do the TSC half of the instruction */
ret = v3_rdtsc(info);
- if (ret) return ret;
-
+
+ if (ret != 0) {
+ return ret;
+ }
+
return 0;
}
struct vm_time * time_state = &(info->time_state);
V3_ASSERT(msr_num == TSC_AUX_MSR);
+
msr_val->lo = time_state->tsc_aux.lo;
msr_val->hi = time_state->tsc_aux.hi;
struct vm_time * time_state = &(info->time_state);
V3_ASSERT(msr_num == TSC_AUX_MSR);
+
time_state->tsc_aux.lo = msr_val.lo;
time_state->tsc_aux.hi = msr_val.hi;
uint64_t time = v3_get_guest_tsc(&info->time_state);
V3_ASSERT(msr_num == TSC_MSR);
+
msr_val->hi = time >> 32;
msr_val->lo = time & 0xffffffffLL;
struct v3_msr msr_val, void *priv) {
struct vm_time * time_state = &(info->time_state);
uint64_t guest_time, new_tsc;
+
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 - (sint64_t)guest_time;