On 20/12/2019 16:05, Jan Beulich wrote:
>> +    wrmsrl(HV_X64_MSR_REFERENCE_TSC, tsc_msr);
>> +
>> +    /* Get TSC frequency from Hyper-V */
>> +    rdmsrl(HV_X64_MSR_TSC_FREQUENCY, freq);
>> +    pts->frequency = freq;
>> +
>> +    return freq;
>> +}
>> +
>> +static inline uint64_t read_hyperv_timer(void)
>> +{
>> +    uint64_t scale, offset, ret, tsc;
>> +    uint32_t seq;
>> +    const struct ms_hyperv_tsc_page *tsc_page = hyperv_tsc;
>> +
>> +    do {
>> +        seq = tsc_page->tsc_sequence;
>> +
>> +        /* Seq 0 is special. It means the TSC enlightenment is not
>> +         * available at the moment. The reference time can only be
>> +         * obtained from the Reference Counter MSR.
>> +         */
>> +        if ( seq == 0 )
>> +        {
>> +            rdmsrl(HV_X64_MSR_TIME_REF_COUNT, ret);
>> +            return ret;
>> +        }
>> +
>> +        /* rdtsc_ordered already contains a load fence */
>> +        tsc = rdtsc_ordered();
>> +        scale = tsc_page->tsc_scale;
>> +        offset = tsc_page->tsc_offset;
>> +
>> +        smp_rmb();
>> +
>> +    } while (tsc_page->tsc_sequence != seq);

Style.

~Andrew

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to