Hi tech@,

This patch fixes vmm pvclock accuracy issues.  Shift math error
discovered by George Koehler.  This diff also fixes the error in tsc
multiplier which was correct only if the host timecounter is tsc.

--
Pratik


Index: sys/arch/amd64/amd64/vmm.c
===================================================================
RCS file: /home/cvs/src/sys/arch/amd64/amd64/vmm.c,v
retrieving revision 1.254
diff -u -p -a -u -r1.254 vmm.c
--- sys/arch/amd64/amd64/vmm.c  22 Sep 2019 08:47:54 -0000      1.254
+++ sys/arch/amd64/amd64/vmm.c  26 Nov 2019 00:08:10 -0000
@@ -28,7 +28,6 @@
#include <sys/rwlock.h>
#include <sys/pledge.h>
#include <sys/memrange.h>
-#include <sys/timetc.h>

#include <uvm/uvm_extern.h>

@@ -6879,8 +6878,11 @@ void
vmm_init_pvclock(struct vcpu *vcpu, paddr_t gpa)
{
        vcpu->vc_pvclock_system_gpa = gpa;
-       vcpu->vc_pvclock_system_tsc_mul =
-           (int) ((1000000000L << 20) / tc_getfrequency());
+       if (tsc_frequency > 0)
+               vcpu->vc_pvclock_system_tsc_mul =
+                   (int) ((1000000000L << 20) / tsc_frequency);
+       else
+               vcpu->vc_pvclock_system_tsc_mul = 0;
        vmm_update_pvclock(vcpu);
}

@@ -6906,7 +6908,7 @@ vmm_update_pvclock(struct vcpu *vcpu)
                nanotime(&tv);
                pvclock_ti->ti_system_time =
                    tv.tv_sec * 1000000000L + tv.tv_nsec;
-               pvclock_ti->ti_tsc_shift = -20;
+               pvclock_ti->ti_tsc_shift = 12;
                pvclock_ti->ti_tsc_to_system_mul =
                    vcpu->vc_pvclock_system_tsc_mul;
                pvclock_ti->ti_flags = PVCLOCK_FLAG_TSC_STABLE;

Reply via email to