Module Name: src
Committed By: riastradh
Date: Sat Aug 10 15:20:59 UTC 2024
Modified Files:
src/sys/arch/aarch64/aarch64: cpu.c
src/sys/arch/aarch64/include: cpu.h
Log Message:
aarch64: Count RNDRRS failure events and add dtrace probe.
PR port-arm/58572: aarch64 RNDRRS failures should be evcounted and
dtraced
To generate a diff of this commit:
cvs rdiff -u -r1.77 -r1.78 src/sys/arch/aarch64/aarch64/cpu.c
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/aarch64/include/cpu.h
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/aarch64/aarch64/cpu.c
diff -u src/sys/arch/aarch64/aarch64/cpu.c:1.77 src/sys/arch/aarch64/aarch64/cpu.c:1.78
--- src/sys/arch/aarch64/aarch64/cpu.c:1.77 Sun Jun 30 17:55:52 2024
+++ src/sys/arch/aarch64/aarch64/cpu.c Sat Aug 10 15:20:59 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.77 2024/06/30 17:55:52 jmcneill Exp $ */
+/* $NetBSD: cpu.c,v 1.78 2024/08/10 15:20:59 riastradh Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.77 2024/06/30 17:55:52 jmcneill Exp $");
+__KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.78 2024/08/10 15:20:59 riastradh Exp $");
#include "locators.h"
#include "opt_arm_debug.h"
@@ -42,6 +42,7 @@ __KERNEL_RCSID(1, "$NetBSD: cpu.c,v 1.77
#include <sys/kmem.h>
#include <sys/reboot.h>
#include <sys/rndsource.h>
+#include <sys/sdt.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
@@ -167,6 +168,8 @@ cpu_attach(device_t dv, cpuid_t id)
aarch64_printcacheinfo(dv, ci);
cpu_identify2(dv, ci);
+ cpu_setup_rng(dv, ci);
+
if (unit != 0) {
return;
}
@@ -178,7 +181,6 @@ cpu_attach(device_t dv, cpuid_t id)
cpu_init_counter(ci);
/* These currently only check the BP. */
- cpu_setup_rng(dv, ci);
cpu_setup_aes(dv, ci);
cpu_setup_chacha(dv, ci);
@@ -606,8 +608,9 @@ rndrrs_get(size_t nbytes, void *cookie)
const unsigned bpb = 4;
size_t nbits = nbytes*NBBY;
uint64_t x;
- int error;
+ int error, bound;
+ bound = curlwp_bind(); /* bind to CPU for rndrrs_fail evcnt */
while (nbits) {
/*
* x := random 64-bit sample
@@ -627,12 +630,16 @@ rndrrs_get(size_t nbytes, void *cookie)
"mrs %0, s3_3_c2_c4_1\n"
"cset %w1, eq"
: "=r"(x), "=r"(error));
- if (error)
+ if (error) {
+ DTRACE_PROBE(rndrrs_fail);
+ curcpu()->ci_rndrrs_fail.ev_count++;
break;
+ }
rnd_add_data_sync(&rndrrs_source, &x, sizeof(x),
bpb*sizeof(x));
nbits -= MIN(nbits, bpb*sizeof(x));
}
+ curlwp_bindx(bound);
explicit_memset(&x, 0, sizeof x);
}
@@ -653,7 +660,16 @@ cpu_setup_rng(device_t dv, struct cpu_in
return;
}
- /* Attach it. */
+ /* Attach event counter for RNDRRS failure. */
+ evcnt_attach_dynamic(&ci->ci_rndrrs_fail, EVCNT_TYPE_MISC, NULL,
+ ci->ci_cpuname, "rndrrs fail");
+
+ /*
+ * On the primary CPU, attach random source -- this only
+ * happens once globally.
+ */
+ if (!CPU_IS_PRIMARY(ci))
+ return;
rndsource_setcb(&rndrrs_source, rndrrs_get, NULL);
rnd_attach_source(&rndrrs_source, "rndrrs", RND_TYPE_RNG,
RND_FLAG_DEFAULT|RND_FLAG_HASCB);
Index: src/sys/arch/aarch64/include/cpu.h
diff -u src/sys/arch/aarch64/include/cpu.h:1.50 src/sys/arch/aarch64/include/cpu.h:1.51
--- src/sys/arch/aarch64/include/cpu.h:1.50 Thu May 9 12:09:59 2024
+++ src/sys/arch/aarch64/include/cpu.h Sat Aug 10 15:20:59 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.50 2024/05/09 12:09:59 pho Exp $ */
+/* $NetBSD: cpu.h,v 1.51 2024/08/10 15:20:59 riastradh Exp $ */
/*-
* Copyright (c) 2014, 2020 The NetBSD Foundation, Inc.
@@ -154,6 +154,7 @@ struct cpu_info {
struct evcnt ci_vfp_release;
struct evcnt ci_uct_trap;
struct evcnt ci_intr_preempt;
+ struct evcnt ci_rndrrs_fail;
/* FDT or similar supplied "cpu capacity" */
uint32_t ci_capacity_dmips_mhz;