summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikeb <mikeb@openbsd.org>2017-10-18 12:52:06 +0000
committermikeb <mikeb@openbsd.org>2017-10-18 12:52:06 +0000
commit49acae7e47a2b05cf0d7c9f464ab18dd89fed246 (patch)
tree60e1362a1f194319569f7e7c9414ac2e2555f20d
parentRevert previous commit, since not all interfaces behaved the same. (diff)
downloadwireguard-openbsd-49acae7e47a2b05cf0d7c9f464ab18dd89fed246.tar.xz
wireguard-openbsd-49acae7e47a2b05cf0d7c9f464ab18dd89fed246.zip
Set TSC timecounter frequency to the CPU frequency estimate if unknown
ok mlarkin
-rw-r--r--sys/arch/amd64/amd64/identcpu.c6
-rw-r--r--sys/arch/amd64/amd64/tsc.c7
2 files changed, 7 insertions, 6 deletions
diff --git a/sys/arch/amd64/amd64/identcpu.c b/sys/arch/amd64/amd64/identcpu.c
index b180ae9a3ff..2dc79925fa2 100644
--- a/sys/arch/amd64/amd64/identcpu.c
+++ b/sys/arch/amd64/amd64/identcpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: identcpu.c,v 1.89 2017/10/14 04:44:43 jsg Exp $ */
+/* $OpenBSD: identcpu.c,v 1.90 2017/10/18 12:52:06 mikeb Exp $ */
/* $NetBSD: identcpu.c,v 1.1 2003/04/26 18:39:28 fvdl Exp $ */
/*
@@ -47,7 +47,7 @@
void replacesmap(void);
uint64_t cpu_freq(struct cpu_info *);
-void tsc_timecounter_init(struct cpu_info *);
+void tsc_timecounter_init(struct cpu_info *, uint64_t);
#if NVMM > 0
void cpu_check_vmm_cap(struct cpu_info *);
#endif /* NVMM > 0 */
@@ -676,7 +676,7 @@ identifycpu(struct cpu_info *ci)
#endif
}
- tsc_timecounter_init(ci);
+ tsc_timecounter_init(ci, freq);
cpu_topology(ci);
#if NVMM > 0
diff --git a/sys/arch/amd64/amd64/tsc.c b/sys/arch/amd64/amd64/tsc.c
index d286d1a7efc..4e17fe9a5ed 100644
--- a/sys/arch/amd64/amd64/tsc.c
+++ b/sys/arch/amd64/amd64/tsc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tsc.c,v 1.3 2017/10/17 13:58:10 mikeb Exp $ */
+/* $OpenBSD: tsc.c,v 1.4 2017/10/18 12:52:06 mikeb Exp $ */
/*
* Copyright (c) 2016,2017 Reyk Floeter <reyk@openbsd.org>
* Copyright (c) 2017 Adam Steen <adam@adamsteen.com.au>
@@ -201,14 +201,15 @@ tsc_get_timecount(struct timecounter *tc)
}
void
-tsc_timecounter_init(struct cpu_info *ci)
+tsc_timecounter_init(struct cpu_info *ci, uint64_t cpufreq)
{
if (!(ci->ci_flags & CPUF_PRIMARY) ||
!(ci->ci_flags & CPUF_CONST_TSC) ||
!(ci->ci_flags & CPUF_INVAR_TSC))
return;
- tsc_frequency = tsc_freq_cpuid(ci);
+ if ((tsc_frequency = tsc_freq_cpuid(ci)) == 0)
+ tsc_frequency = cpufreq;
tsc_is_invariant = 1;
/* Newer CPUs don't require recalibration */