Module Name:    src
Committed By:   martin
Date:           Wed Aug  5 16:20:09 UTC 2020

Modified Files:
        src/sys/arch/x86/conf [netbsd-8]: files.x86
        src/sys/arch/x86/include [netbsd-8]: apicvar.h cpu.h
        src/sys/arch/x86/x86 [netbsd-8]: cpu.c hyperv.c tsc.c
        src/sys/arch/xen/conf [netbsd-8]: files.xen

Log Message:
Pull up the following revisions, requested by msaitoh in ticket #1593:

        sys/arch/x86/conf/files.x86                     1.108
        sys/arch/x86/include/apicvar.h                  1.7 via patch
        sys/arch/x86/include/cpu.h                      1.121
        sys/arch/x86/x86/cpu.c                          1.185 via patch
        sys/arch/x86/x86/hyperv.c                       1.7
        sys/arch/x86/x86/tsc.c                          1.41
        sys/arch/xen/conf/files.xen                     1.181

Get TSC frequency from CPUID 0x15 and/or x16 if it's available.
This change fixes a problem that newer Intel processors' timer
counts very slowly.


To generate a diff of this commit:
cvs rdiff -u -r1.88.6.2 -r1.88.6.3 src/sys/arch/x86/conf/files.x86
cvs rdiff -u -r1.5 -r1.5.80.1 src/sys/arch/x86/include/apicvar.h
cvs rdiff -u -r1.71.2.8 -r1.71.2.9 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.130.2.9 -r1.130.2.10 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sys/arch/x86/x86/hyperv.c
cvs rdiff -u -r1.36.22.1 -r1.36.22.2 src/sys/arch/x86/x86/tsc.c
cvs rdiff -u -r1.147.2.3 -r1.147.2.4 src/sys/arch/xen/conf/files.xen

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/conf/files.x86
diff -u src/sys/arch/x86/conf/files.x86:1.88.6.2 src/sys/arch/x86/conf/files.x86:1.88.6.3
--- src/sys/arch/x86/conf/files.x86:1.88.6.2	Sat Mar  9 17:10:20 2019
+++ src/sys/arch/x86/conf/files.x86	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: files.x86,v 1.88.6.2 2019/03/09 17:10:20 martin Exp $
+#	$NetBSD: files.x86,v 1.88.6.3 2020/08/05 16:20:08 martin Exp $
 
 # options for MP configuration through the MP spec
 defflag opt_mpbios.h MPBIOS MPVERBOSE MPDEBUG MPBIOS_SCANPCI
@@ -84,6 +84,7 @@ file	arch/x86/x86/efi.c		machdep
 file	arch/x86/x86/errata.c		machdep
 file	arch/x86/x86/genfb_machdep.c	machdep
 file	arch/x86/x86/identcpu.c		machdep
+file	arch/x86/x86/identcpu_subr.c	machdep
 file	arch/x86/x86/i8259.c		machdep
 file	arch/x86/x86/intr.c		machdep
 file	arch/x86/x86/nmi.c		machdep

Index: src/sys/arch/x86/include/apicvar.h
diff -u src/sys/arch/x86/include/apicvar.h:1.5 src/sys/arch/x86/include/apicvar.h:1.5.80.1
--- src/sys/arch/x86/include/apicvar.h:1.5	Mon Apr 28 20:23:40 2008
+++ src/sys/arch/x86/include/apicvar.h	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-/* 	$NetBSD: apicvar.h,v 1.5 2008/04/28 20:23:40 martin Exp $ */
+/* 	$NetBSD: apicvar.h,v 1.5.80.1 2020/08/05 16:20:08 martin Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -46,4 +46,7 @@ struct apic_attach_args {
 
 void apic_format_redir(const char *, const char *, int, u_int32_t, u_int32_t);
 
+/* For lapic.c */
+extern uint32_t lapic_per_second;
+
 #endif /* !_X86_APICVAR_H_ */

Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.71.2.8 src/sys/arch/x86/include/cpu.h:1.71.2.9
--- src/sys/arch/x86/include/cpu.h:1.71.2.8	Sat Mar  9 17:10:20 2019
+++ src/sys/arch/x86/include/cpu.h	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.71.2.8 2019/03/09 17:10:20 martin Exp $	*/
+/*	$NetBSD: cpu.h,v 1.71.2.9 2020/08/05 16:20:08 martin Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -451,6 +451,9 @@ void 	cpu_probe(struct cpu_info *);
 void	cpu_identify(struct cpu_info *);
 void	identify_hypervisor(void);
 
+/* identcpu_subr.c */
+uint64_t cpu_tsc_freq_cpuid(struct cpu_info *);
+
 typedef enum vm_guest {
 	VM_GUEST_NO = 0,
 	VM_GUEST_VM,

Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.130.2.9 src/sys/arch/x86/x86/cpu.c:1.130.2.10
--- src/sys/arch/x86/x86/cpu.c:1.130.2.9	Tue Jan 21 16:47:24 2020
+++ src/sys/arch/x86/x86/cpu.c	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.130.2.9 2020/01/21 16:47:24 martin Exp $	*/
+/*	$NetBSD: cpu.c,v 1.130.2.10 2020/08/05 16:20:08 martin Exp $	*/
 
 /*-
  * Copyright (c) 2000-2012 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.130.2.9 2020/01/21 16:47:24 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.130.2.10 2020/08/05 16:20:08 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -1226,16 +1226,25 @@ cpu_shutdown(device_t dv, int how)
 	return cpu_stop(dv);
 }
 
+/* Get the TSC frequency and set it to ci->ci_data.cpu_cc_freq. */
 void
 cpu_get_tsc_freq(struct cpu_info *ci)
 {
-	uint64_t last_tsc;
+	uint64_t freq = 0, last_tsc;
 
 	if (cpu_hascounter()) {
-		last_tsc = cpu_counter_serializing();
-		x86_delay(100000);
-		ci->ci_data.cpu_cc_freq =
-		    (cpu_counter_serializing() - last_tsc) * 10;
+		freq = cpu_tsc_freq_cpuid(ci);
+
+		if (freq != 0) {
+			/* Use TSC frequency taken from CPUID. */
+			ci->ci_data.cpu_cc_freq = freq;
+		} else {
+			/* Calibrate TSC frequency. */
+			last_tsc = cpu_counter_serializing();
+			x86_delay(100000);
+			ci->ci_data.cpu_cc_freq =
+			    (cpu_counter_serializing() - last_tsc) * 10;
+		}
 	}
 }
 

Index: src/sys/arch/x86/x86/hyperv.c
diff -u src/sys/arch/x86/x86/hyperv.c:1.1.2.4 src/sys/arch/x86/x86/hyperv.c:1.1.2.5
--- src/sys/arch/x86/x86/hyperv.c:1.1.2.4	Thu Dec  5 16:54:59 2019
+++ src/sys/arch/x86/x86/hyperv.c	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: hyperv.c,v 1.1.2.4 2019/12/05 16:54:59 bouyer Exp $	*/
+/*	$NetBSD: hyperv.c,v 1.1.2.5 2020/08/05 16:20:08 martin Exp $	*/
 
 /*-
  * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
@@ -33,7 +33,7 @@
  */
 #include <sys/cdefs.h>
 #ifdef __KERNEL_RCSID
-__KERNEL_RCSID(0, "$NetBSD: hyperv.c,v 1.1.2.4 2019/12/05 16:54:59 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hyperv.c,v 1.1.2.5 2020/08/05 16:20:08 martin Exp $");
 #endif
 #ifdef __FBSDID
 __FBSDID("$FreeBSD: head/sys/dev/hyperv/vmbus/hyperv.c 331757 2018-03-30 02:25:12Z emaste $");
@@ -67,6 +67,7 @@ __FBSDID("$FreeBSD: head/sys/dev/hyperv/
 #include <machine/cputypes.h>
 #include <machine/cpuvar.h>
 #include <machine/cpu_counter.h>
+#include <x86/apicvar.h>
 #include <x86/efi.h>
 
 #include <dev/wsfb/genfbvar.h>
@@ -536,11 +537,8 @@ hyperv_init(void)
 
 #if NLAPIC > 0
 	if ((hyperv_features & CPUID_HV_MSR_TIME_FREQ) &&
-	    (hyperv_features3 & CPUID3_HV_TIME_FREQ)) {
-		extern uint32_t lapic_per_second;
-
+	    (hyperv_features3 & CPUID3_HV_TIME_FREQ))
 		lapic_per_second = rdmsr(MSR_HV_APIC_FREQUENCY);
-	}
 #endif
 
 	return hyperv_init_hypercall();

Index: src/sys/arch/x86/x86/tsc.c
diff -u src/sys/arch/x86/x86/tsc.c:1.36.22.1 src/sys/arch/x86/x86/tsc.c:1.36.22.2
--- src/sys/arch/x86/x86/tsc.c:1.36.22.1	Wed Apr 15 14:25:09 2020
+++ src/sys/arch/x86/x86/tsc.c	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: tsc.c,v 1.36.22.1 2020/04/15 14:25:09 martin Exp $	*/
+/*	$NetBSD: tsc.c,v 1.36.22.2 2020/08/05 16:20:08 martin Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tsc.c,v 1.36.22.1 2020/04/15 14:25:09 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tsc.c,v 1.36.22.2 2020/08/05 16:20:08 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -139,6 +139,11 @@ tsc_is_invariant(void)
 	return invariant;
 }
 
+/*
+ * Initialize timecounter(9) of TSC.
+ * This function is called after all secondary processors were up and
+ * calculated the drift.
+ */
 void
 tsc_tc_init(void)
 {

Index: src/sys/arch/xen/conf/files.xen
diff -u src/sys/arch/xen/conf/files.xen:1.147.2.3 src/sys/arch/xen/conf/files.xen:1.147.2.4
--- src/sys/arch/xen/conf/files.xen:1.147.2.3	Mon Sep 23 13:51:12 2019
+++ src/sys/arch/xen/conf/files.xen	Wed Aug  5 16:20:08 2020
@@ -1,4 +1,4 @@
-#	$NetBSD: files.xen,v 1.147.2.3 2019/09/23 13:51:12 martin Exp $
+#	$NetBSD: files.xen,v 1.147.2.4 2020/08/05 16:20:08 martin Exp $
 #	NetBSD: files.x86,v 1.10 2003/10/08 17:30:00 bouyer Exp 
 #	NetBSD: files.i386,v 1.254 2004/03/25 23:32:10 jmc Exp 
 
@@ -136,6 +136,7 @@ file	arch/xen/x86/xen_bus_dma.c	machdep
 file	arch/x86/x86/bus_space.c	machdep
 file	arch/xen/x86/consinit.c		machdep
 file	arch/x86/x86/identcpu.c		machdep
+file	arch/x86/x86/identcpu_subr.c	machdep
 file	arch/xen/x86/intr.c		machdep
 file	arch/xen/x86/xen_ipi.c		multiprocessor
 file	arch/x86/x86/pmap.c		machdep

Reply via email to