From: Mark Brown <broonie@kernel•org>
To: Will Deacon <will@kernel•org>, Catalin Marinas <catalin.marinas@arm•com>
Cc: Mark Rutland <mark.rutland@arm•com>,
Mark Brown <broonie@kernel•org>,
Richard Henderson <richard.henderson@linaro•org>,
linux-arm-kernel@lists•infradead.org,
Ard Biesheuvel <ard.biesheuvel@linaro•org>
Subject: [PATCH v10 2/3] arm64: random: Add data to pool from setup_arch()
Date: Fri, 10 Jan 2020 12:23:40 +0000 [thread overview]
Message-ID: <20200110122341.8445-3-broonie@kernel.org> (raw)
In-Reply-To: <20200110122341.8445-1-broonie@kernel.org>
Since the arm64 ARCH_RANDOM implementation is not available until
cpufeature has determined the system capabilities it can't be used by
the generic random code to initialize the entropy pool for early use.
Instead explicitly add some data to the pool from setup_arch() if the
boot CPU supports v8.5-RNG, this is the point recommended by the generic
code.
Note that we are only adding data here, it will be mixed into the pool
but won't be credited as entropy. There are currently no suitable
interfaces for that at present - extending the random code to provide
those will be done as a future step. Providing data is better than not
doing so as it will still provide an increase in variation in the output
from the random code and there will be no impact on the rate at which
entropy is credited compared to what we have without this patch.
Signed-off-by: Mark Brown <broonie@kernel•org>
---
arch/arm64/include/asm/archrandom.h | 30 +++++++++++++++++++++++++++++
arch/arm64/kernel/setup.c | 2 ++
2 files changed, 32 insertions(+)
diff --git a/arch/arm64/include/asm/archrandom.h b/arch/arm64/include/asm/archrandom.h
index 5ea5a1ce5a5f..2eb1db1f0bdf 100644
--- a/arch/arm64/include/asm/archrandom.h
+++ b/arch/arm64/include/asm/archrandom.h
@@ -59,9 +59,39 @@ static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
return ok;
}
+static inline bool __init __early_cpu_has_rndr(void)
+{
+ /* Open code as we run prior to the first call to cpufeature. */
+ unsigned long ftr = read_sysreg_s(SYS_ID_AA64ISAR0_EL1);
+ return (ftr >> ID_AA64ISAR0_RNDR_SHIFT) & 0xf;
+}
+
+/*
+ * Our ARCH_RANDOM implementation does not function until relatively
+ * late in the boot when cpufeature has detertmined system
+ * capabilities so the core code can't use arch_get_random*() to
+ * initialize, instead we call this function to inject data from
+ * setup_arch() if the boot CPU supports v8.5-RNG.
+ */
+static inline void __init arm64_add_early_rndr_entropy(void)
+{
+ unsigned long val;
+ int i;
+
+ if (!__early_cpu_has_rndr())
+ return;
+
+ /* Add multiple values to mirror the generic code. */
+ for (i = 0; i < 16; i++)
+ if (__arm64_rndr(&val))
+ add_device_randomness(&val, sizeof(val));
+}
+
#else
static inline bool __arm64_rndr(unsigned long *v) { return false; }
+static inline bool __init __early_cpu_has_rndr(void) { return false; }
+static inline void __init arm64_add_early_rndr_entropy(void) { }
#endif /* CONFIG_ARCH_RANDOM */
#endif /* _ASM_ARCHRANDOM_H */
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index 56f664561754..170842965a32 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -344,6 +344,8 @@ void __init setup_arch(char **cmdline_p)
/* Init percpu seeds for random tags after cpus are set up. */
kasan_init_tags();
+ arm64_add_early_rndr_entropy();
+
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
/*
* Make sure init_thread_info.ttbr0 always generates translation
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists•infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-01-10 12:24 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-10 12:23 [PATCH v10 0/3] ARMv8.5-RNG support Mark Brown
2020-01-10 12:23 ` [PATCH v10 1/3] arm64: Implement archrandom.h for ARMv8.5-RNG Mark Brown
2020-01-14 17:44 ` Will Deacon
2020-01-15 7:40 ` Ard Biesheuvel
2020-01-15 9:16 ` Will Deacon
2020-01-15 9:24 ` Ard Biesheuvel
2020-01-15 11:07 ` Mark Brown
2020-01-15 11:16 ` Will Deacon
2020-01-15 14:26 ` Catalin Marinas
2020-01-16 0:23 ` Richard Henderson
2020-01-16 11:02 ` Catalin Marinas
2020-01-16 11:10 ` Ard Biesheuvel
2020-01-16 11:40 ` Catalin Marinas
2020-01-10 12:23 ` Mark Brown [this message]
2020-01-10 12:35 ` [PATCH v10 2/3] arm64: random: Add data to pool from setup_arch() Mark Rutland
2020-01-13 19:09 ` Richard Henderson
2020-01-15 7:48 ` Ard Biesheuvel
2020-01-15 9:16 ` Will Deacon
2020-01-15 9:22 ` Ard Biesheuvel
2020-01-15 10:11 ` Mark Rutland
2020-01-15 14:01 ` Mark Brown
2020-01-15 12:07 ` Mark Brown
2020-01-15 12:42 ` Will Deacon
2020-01-15 13:36 ` Ard Biesheuvel
2020-01-15 17:04 ` Mark Brown
2020-01-16 11:33 ` Will Deacon
2020-01-15 15:40 ` Mark Brown
2020-01-10 12:23 ` [PATCH v10 3/3] arm64: Use v8.5-RNG entropy for KASLR seed Mark Brown
2020-01-10 12:35 ` Mark Rutland
2020-01-13 19:09 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200110122341.8445-3-broonie@kernel.org \
--to=broonie@kernel$(echo .)org \
--cc=ard.biesheuvel@linaro$(echo .)org \
--cc=catalin.marinas@arm$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=mark.rutland@arm$(echo .)com \
--cc=richard.henderson@linaro$(echo .)org \
--cc=will@kernel$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox