Add interface to derive a TSC frequency from the pvclock

This can later use this to determine the TSC frequency like is done with
VMware, instead of using a DELAY loop that is not always accurate in an VM.

MFC after:	1 month
This commit is contained in:
Bryan Venteicher 2015-02-04 08:33:04 +00:00
parent d3ccddf3ce
commit 4025433eb2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=278184
2 changed files with 16 additions and 0 deletions

View file

@ -51,6 +51,7 @@ struct pvclock_wall_clock {
void pvclock_resume(void);
uint64_t pvclock_get_last_cycles(void);
uint64_t pvclock_tsc_freq(struct pvclock_vcpu_time_info *ti);
uint64_t pvclock_get_timecount(struct pvclock_vcpu_time_info *ti);
void pvclock_get_wallclock(struct pvclock_wall_clock *wc,
struct timespec *ts);

View file

@ -58,6 +58,21 @@ pvclock_get_last_cycles(void)
return (atomic_load_acq_64(&pvclock_last_cycles));
}
uint64_t
pvclock_tsc_freq(struct pvclock_vcpu_time_info *ti)
{
uint64_t freq;
freq = (1000000000ULL << 32) / ti->tsc_to_system_mul;
if (ti->tsc_shift < 0)
freq <<= -ti->tsc_shift;
else
freq >>= ti->tsc_shift;
return (freq);
}
/*
* Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
* yielding a 64-bit result.