Module Name:    src
Committed By:   jmcneill
Date:           Sun Sep 26 13:37:36 UTC 2021

Modified Files:
        src/sys/dev/tprof: tprof_armv8.c

Log Message:
Make sure setup happens on all CPUs.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/tprof/tprof_armv8.c

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

Modified files:

Index: src/sys/dev/tprof/tprof_armv8.c
diff -u src/sys/dev/tprof/tprof_armv8.c:1.6 src/sys/dev/tprof/tprof_armv8.c:1.7
--- src/sys/dev/tprof/tprof_armv8.c:1.6	Fri Oct 30 18:54:37 2020
+++ src/sys/dev/tprof/tprof_armv8.c	Sun Sep 26 13:37:36 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: tprof_armv8.c,v 1.6 2020/10/30 18:54:37 skrll Exp $ */
+/* $NetBSD: tprof_armv8.c,v 1.7 2021/09/26 13:37:36 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tprof_armv8.c,v 1.6 2020/10/30 18:54:37 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tprof_armv8.c,v 1.7 2021/09/26 13:37:36 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -111,6 +111,7 @@ armv8_pmu_start_cpu(void *arg1, void *ar
 
 	/* Enable event counter */
 	reg_pmcntenset_el0_write(counter_mask);
+	reg_pmcr_el0_write(PMCR_E);
 }
 
 static void
@@ -123,6 +124,7 @@ armv8_pmu_stop_cpu(void *arg1, void *arg
 
 	/* Disable event counter */
 	reg_pmcntenclr_el0_write(counter_mask);
+	reg_pmcr_el0_write(0);
 }
 
 static uint64_t
@@ -130,16 +132,11 @@ armv8_pmu_estimate_freq(void)
 {
 	uint64_t cpufreq = curcpu()->ci_data.cpu_cc_freq;
 	uint64_t freq = 10000;
-	uint32_t pmcr;
 
 	counter_val = cpufreq / freq;
 	if (counter_val == 0)
 		counter_val = 4000000000ULL / freq;
 
-	pmcr = reg_pmcr_el0_read();
-	if (pmcr & PMCR_D)
-		counter_val /= 64;
-
 	return freq;
 }
 
@@ -206,9 +203,9 @@ armv8_pmu_intr(void *priv)
 	return 1;
 }
 
-int
-armv8_pmu_init(void)
-{
+static void
+armv8_pmu_init_cpu(void *arg1, void *arg2)
+{	
 	/* Disable EL0 access to performance monitors */
 	reg_pmuserenr_el0_write(0);
 
@@ -217,6 +214,15 @@ armv8_pmu_init(void)
 
 	/* Disable event counters */
 	reg_pmcntenclr_el0_write(PMCNTEN_P);
+}
+
+int
+armv8_pmu_init(void)
+{
+	uint64_t xc;
+
+	xc = xc_broadcast(0, armv8_pmu_init_cpu, NULL, NULL);
+	xc_wait(xc);
 
 	return tprof_backend_register("tprof_armv8", &tprof_armv8_pmu_ops,
 	    TPROF_BACKEND_VERSION);

Reply via email to