Index: sys/x86/x86/tsc.c =================================================================== --- sys/x86/x86/tsc.c +++ sys/x86/x86/tsc.c @@ -59,6 +59,7 @@ uint64_t tsc_freq; int tsc_is_invariant; int tsc_perf_stat; +int tsc_early_calib_exact; static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; @@ -267,6 +268,7 @@ if (vm_guest == VM_GUEST_VMWARE) { tsc_freq_vmware(); + tsc_early_calib_exact = 1; return; } @@ -709,6 +711,8 @@ if (tsc_disabled) return; + if (tsc_early_calib_exact) + goto calibrated; tc = atomic_load_ptr(&timecounter); @@ -739,6 +743,7 @@ freq_khz = tc->tc_frequency * (tsc_end - tsc_start) / (t_end - t_start); tsc_update_freq(freq_khz); +calibrated: tc_init(&tsc_timecounter); set_cputicker(rdtsc, tsc_freq, !tsc_is_invariant); }