Use FEAT_RNG to feed entropy into the random subsystem like we do on amd64.
authorkettenis <kettenis@openbsd.org>
Thu, 11 Jul 2024 12:07:39 +0000 (12:07 +0000)
committerkettenis <kettenis@openbsd.org>
Thu, 11 Jul 2024 12:07:39 +0000 (12:07 +0000)
ok patrick@, deraadt@

sys/arch/arm64/arm64/cpu.c
sys/arch/arm64/conf/Makefile.arm64

index 000313f..47b2534 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.c,v 1.124 2024/07/10 11:01:24 kettenis Exp $      */
+/*     $OpenBSD: cpu.c,v 1.125 2024/07/11 12:07:39 kettenis Exp $      */
 
 /*
  * Copyright (c) 2016 Dale Rahn <drahn@dalerahn.com>
@@ -245,6 +245,7 @@ uint64_t cpu_id_aa64pfr0;
 uint64_t cpu_id_aa64pfr1;
 
 int arm64_has_lse;
+int arm64_has_rng;
 #ifdef CRYPTO
 int arm64_has_aes;
 #endif
@@ -273,6 +274,9 @@ struct cfdriver cpu_cd = {
        NULL, "cpu", DV_DULL
 };
 
+struct timeout cpu_rng_to;
+void   cpu_rng(void *);
+
 void   cpu_opp_init(struct cpu_info *, uint32_t);
 void   cpu_psci_init(struct cpu_info *);
 void   cpu_psci_idle_cycle(void);
@@ -286,6 +290,25 @@ void       cpu_kstat_attach(struct cpu_info *ci);
 void   cpu_opp_kstat_attach(struct cpu_info *ci);
 #endif
 
+void
+cpu_rng(void *arg)
+{
+       struct timeout *to = arg;
+       uint64_t rndr;
+       int ret;
+
+       ret = __builtin_arm_rndrrs(&rndr);
+       if (ret)
+               ret = __builtin_arm_rndr(&rndr);
+       if (ret == 0) {
+               enqueue_randomness(rndr & 0xffffffff);
+               enqueue_randomness(rndr >> 32);
+       }
+
+       if (to)
+               timeout_add_msec(to, 1000);
+}
+
 /*
  * Enable mitigation for Spectre-V2 branch target injection
  * vulnerabilities (CVE-2017-5715).
@@ -667,6 +690,7 @@ cpu_identify(struct cpu_info *ci)
        if (ID_AA64ISAR0_RNDR(id) >= ID_AA64ISAR0_RNDR_IMPL) {
                printf("%sRNDR", sep);
                sep = ",";
+               arm64_has_rng = 1;
        }
 
        if (ID_AA64ISAR0_TLB(id) >= ID_AA64ISAR0_TLB_IOS) {
@@ -1139,6 +1163,11 @@ cpu_attach(struct device *parent, struct device *dev, void *aux)
                }
 
                cpu_init();
+
+               if (arm64_has_rng) {
+                       timeout_set(&cpu_rng_to, cpu_rng, &cpu_rng_to);
+                       cpu_rng(&cpu_rng_to);
+               }
 #ifdef MULTIPROCESSOR
        }
 #endif
index 837b1fe..371e1f9 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile.arm64,v 1.48 2024/07/02 10:25:16 kettenis Exp $
+#      $OpenBSD: Makefile.arm64,v 1.49 2024/07/11 12:07:40 kettenis Exp $
 
 # For instructions on building kernels consult the config(8) and options(4)
 # manual pages.
@@ -56,7 +56,7 @@ CWARNFLAGS=   -Werror -Wall -Wimplicit-function-declaration \
                -Wno-unused-but-set-variable -Wno-gnu-folding-constant \
                -Wframe-larger-than=2047
 
-CMACHFLAGS=    -march=armv8-a+nofp+nosimd \
+CMACHFLAGS=    -march=armv8-a+nofp+nosimd+rng \
                -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer \
                -ffixed-x18
 CMACHFLAGS+=   -ffreestanding ${NOPIE_FLAGS}