Re: git: 9eecef052155 - main - Add an Armv8 rndr random number provider

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Wed, 22 Nov 2023 18:14:15 UTC
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.

-- 
John Baldwin