Re: git: 9eecef052155 - main - Add an Armv8 rndr random number provider
- In reply to: John Baldwin : "Re: git: 9eecef052155 - main - Add an Armv8 rndr random number provider"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 29 Nov 2023 13:36:40 UTC
> On 22 Nov 2023, at 18:14, John Baldwin <jhb@FreeBSD.org> wrote: > > On 11/15/23 4:29 PM, Jessica Clarke wrote: >> On 15 Nov 2023, at 18:27, Jessica Clarke <jrtc27@FreeBSD.org> wrote: >>> >>> On 15 Nov 2023, at 18:12, Andrew Turner <andrew@FreeBSD.org> wrote: >>>> >>>> The branch main has been updated by andrew: >>>> >>>> URL: https://cgit.FreeBSD.org/src/commit/?id=9eecef052155646fbc5f8f533b952b372572d06a >>>> >>>> commit 9eecef052155646fbc5f8f533b952b372572d06a >>>> Author: Andrew Turner <andrew@FreeBSD.org> >>>> AuthorDate: 2023-11-15 17:42:02 +0000 >>>> Commit: Andrew Turner <andrew@FreeBSD.org> >>>> CommitDate: 2023-11-15 18:05:08 +0000 >>>> >>>> Add an Armv8 rndr random number provider >>>> >>>> Armv8.5 adds an optional random number generator. This is implemented >>>> as two special registers one to read a random number, the other to >>>> re-seed the entropy pool before reading a random number. Both registers >>>> will set the condition flags to tell the caller they can't produce a >>>> random number in a reasonable amount of time. >>>> >>>> Without a signal to reseed the entropy pool use the latter register >>>> to provide random numbers to the kernel pool. If at a later time we >>>> had a way to tell the provider if it needs to reseed or not we could >>>> use the former. >>>> >>>> On an Amazon AWS Graviton3 VM this never failed, however this may not >>>> be the case on low end CPUs so retry reading the random number 10 times >>>> before returning an error. >>>> >>>> Reviewed by: imp, delphij (csprng) >>>> Sponsored by: The FreeBSD Foundation >>>> Sponsored by: Arm Ltd >>>> Differential Revision: https://reviews.freebsd.org/D35411 >>>> --- >>>> sys/arm64/conf/std.dev | 1 + >>>> sys/conf/files.arm64 | 2 + >>>> sys/dev/random/armv8rng.c | 135 +++++++++++++++++++++++++++++++++++++++ >>>> sys/dev/random/random_harvestq.c | 1 + >>>> sys/modules/Makefile | 2 + >>>> sys/modules/armv8_rng/Makefile | 11 ++++ >>>> sys/sys/random.h | 1 + >>>> 7 files changed, 153 insertions(+) >>>> >>>> diff --git a/sys/arm64/conf/std.dev b/sys/arm64/conf/std.dev >>>> index 74d2407e0aec..0ebf2e775b11 100644 >>>> --- a/sys/arm64/conf/std.dev >>>> +++ b/sys/arm64/conf/std.dev >>>> @@ -53,6 +53,7 @@ device vt_simplefb >>>> >>>> # Pseudo devices. >>>> device crypto # core crypto support >>>> +device armv8_rng # Armv8.5 rndr RNG >>>> device loop # Network loopback >>>> device ether # Ethernet support >>>> device vlan # 802.1Q VLAN support >>>> diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64 >>>> index 38b9e40463eb..9ccead6a98e1 100644 >>>> --- a/sys/conf/files.arm64 >>>> +++ b/sys/conf/files.arm64 >>>> @@ -379,6 +379,8 @@ dev/psci/psci.c standard >>>> dev/psci/smccc_arm64.S standard >>>> dev/psci/smccc.c standard >>>> >>>> +dev/random/armv8rng.c optional armv8_rng !random_loadable >>>> + >>>> dev/safexcel/safexcel.c optional safexcel fdt >>>> >>>> dev/sdhci/sdhci_xenon.c optional sdhci_xenon sdhci >>>> diff --git a/sys/dev/random/armv8rng.c b/sys/dev/random/armv8rng.c >>>> new file mode 100644 >>>> index 000000000000..3cca42a5bbf3 >>>> --- /dev/null >>>> +++ b/sys/dev/random/armv8rng.c >>>> @@ -0,0 +1,135 @@ >>>> +/*- >>>> + * Copyright (c) 2022 The FreeBSD Foundation >>>> + * >>>> + * This software was developed by Andrew Turner under sponsorship from >>>> + * the FreeBSD Foundation. >>>> + * >>>> + * Redistribution and use in source and binary forms, with or without >>>> + * modification, are permitted provided that the following conditions >>>> + * are met: >>>> + * 1. Redistributions of source code must retain the above copyright >>>> + * notice, this list of conditions and the following disclaimer. >>>> + * 2. Redistributions in binary form must reproduce the above copyright >>>> + * notice, this list of conditions and the following disclaimer in the >>>> + * documentation and/or other materials provided with the distribution. >>>> + * >>>> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND >>>> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >>>> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE >>>> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE >>>> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL >>>> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS >>>> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) >>>> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT >>>> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY >>>> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF >>>> + * SUCH DAMAGE. >>>> + */ >>>> + >>>> +#include <sys/cdefs.h> >>>> + >>>> +#include <sys/param.h> >>>> +#include <sys/systm.h> >>>> +#include <sys/conf.h> >>>> +#include <sys/kernel.h> >>>> +#include <sys/lock.h> >>>> +#include <sys/malloc.h> >>>> +#include <sys/module.h> >>>> +#include <sys/random.h> >>>> + >>>> +#include <machine/armreg.h> >>>> + >>>> +#include <dev/random/randomdev.h> >>>> + >>>> +static u_int random_rndr_read(void *, u_int); >>>> + >>>> +static bool has_rndr; >>>> +static struct random_source random_armv8_rndr = { >>>> + .rs_ident = "Armv8 rndr RNG", >>>> + .rs_source = RANDOM_PURE_ARMV8, >>>> + .rs_read = random_rndr_read, >>>> +}; >>>> + >>>> +static inline int >>>> +random_rndr_read_one(u_long *buf) >>>> +{ >>>> + u_long val; >>>> + int loop, ret; >>>> + >>>> + loop = 10; >>>> + do { >>>> + __asm __volatile( >>>> + ".arch_extension rng \n" >>>> + "mrs %0, rndrrs \n" /* Read the random number */ >>>> + "cset %w1, ne \n" /* 1 on success, 0 on failure */ >>>> + ".arch_extension norng \n" >>>> + : "=&r" (val), "=&r"(ret) :: "cc"); >>> >>> Early clobber doesn’t make sense with no inputs. >> This also breaks the aarch64 ubuntu-20.04 GitHub build, as its LLVM >> doesn’t know about the RNG extension. Can you please stop breaking the >> arm64 kernel build with older LLVM, this is far from the first time >> it’s happened, and some of those never got fixed upstream, we just had >> to hack around them downstream. > > The aarch64 GitHub build is still broken and has been broken now for a > week. Can this be fixed to work with that version or should we deprecated > support for LLVM 12 for aarch64? Morello LLVM is at LLVM 13 currently. I think depicting LLVM 12 is best. There is https://apt.llvm.org/ that may be usable to get a toolchain to build FreeBSD on older Ubuntu and Debian installs. I’m happy to keep 13 as the baseline for now, but expect we will find it’s too old as I work through adding support for newer Architecture features. Andrew