Bah, re-apply. I still see errors without it.
This commit is contained in:
parent
30fd42e845
commit
44d265693d
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: tsc.c,v 1.23 2008/12/19 11:11:55 ad Exp $ */
|
||||
/* $NetBSD: tsc.c,v 1.24 2008/12/19 11:21:52 ad Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2008 The NetBSD Foundation, Inc.
|
||||
@ -27,7 +27,7 @@
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: tsc.c,v 1.23 2008/12/19 11:11:55 ad Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: tsc.c,v 1.24 2008/12/19 11:21:52 ad Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
@ -52,6 +52,9 @@ uint64_t tsc_freq;
|
||||
int64_t tsc_drift_max = 250; /* max cycles */
|
||||
int64_t tsc_drift_observed;
|
||||
|
||||
static volatile int64_t tsc_sync_val;
|
||||
static volatile struct cpu_info *tsc_sync_cpu;
|
||||
|
||||
static struct timecounter tsc_timecounter = {
|
||||
.tc_get_timecount = tsc_get_timecount,
|
||||
.tc_counter_mask = ~0U,
|
||||
@ -168,8 +171,9 @@ tsc_sync_bp(struct cpu_info *ci)
|
||||
{
|
||||
uint64_t tsc;
|
||||
|
||||
/* Clear remote result, pending later update. */
|
||||
ci->ci_data.cpu_cc_skew = 0x7fffffffffffffffLL;
|
||||
if (atomic_swap_ptr(&tsc_sync_cpu, ci) != NULL) {
|
||||
panic("tsc_sync_bp: 1");
|
||||
}
|
||||
|
||||
/* Flag it and read our TSC. */
|
||||
atomic_or_uint(&ci->ci_flags, CPUF_SYNCTSC);
|
||||
@ -182,12 +186,15 @@ tsc_sync_bp(struct cpu_info *ci)
|
||||
tsc += (rdmsr(MSR_TSC) >> 1);
|
||||
|
||||
/* Wait for the results to come in. */
|
||||
while (ci->ci_data.cpu_cc_skew == 0x7fffffffffffffffLL) {
|
||||
while (tsc_sync_cpu == ci) {
|
||||
x86_pause();
|
||||
}
|
||||
if (tsc_sync_cpu != NULL) {
|
||||
panic("tsc_sync_bp: 2");
|
||||
}
|
||||
|
||||
/* Compute final value to adjust for skew. */
|
||||
ci->ci_data.cpu_cc_skew = tsc - ci->ci_data.cpu_cc_skew;
|
||||
ci->ci_data.cpu_cc_skew = tsc - tsc_sync_val;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -210,7 +217,11 @@ tsc_sync_ap(struct cpu_info *ci)
|
||||
tsc += (rdmsr(MSR_TSC) >> 1);
|
||||
|
||||
/* Post result. Ensure the whole value goes out atomically. */
|
||||
(void)atomic_swap_64(&ci->ci_data.cpu_cc_skew, tsc);
|
||||
(void)atomic_swap_64(&tsc_sync_val, tsc);
|
||||
|
||||
if (atomic_swap_ptr(&tsc_sync_cpu, NULL) != ci) {
|
||||
panic("tsc_sync_ap");
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t
|
||||
|
Loading…
Reference in New Issue
Block a user