Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Nov 2023 00:29:41 +0000
From:      Jessica Clarke <jrtc27@freebsd.org>
To:        Andrew Turner <andrew@FreeBSD.org>
Cc:        "src-committers@freebsd.org" <src-committers@FreeBSD.org>, "dev-commits-src-all@freebsd.org" <dev-commits-src-all@FreeBSD.org>, "dev-commits-src-main@freebsd.org" <dev-commits-src-main@FreeBSD.org>
Subject:   Re: git: 9eecef052155 - main - Add an Armv8 rndr random number provider
Message-ID:  <2423E245-0F1B-4195-A766-166183774421@freebsd.org>
In-Reply-To: <E302C81B-CAA0-4122-8754-FE9F055C3FBB@freebsd.org>
References:  <202311151812.3AFICLIs077567@gitrepo.freebsd.org> <E302C81B-CAA0-4122-8754-FE9F055C3FBB@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 15 Nov 2023, at 18:27, Jessica Clarke <jrtc27@FreeBSD.org> wrote:
>=20
> On 15 Nov 2023, at 18:12, Andrew Turner <andrew@FreeBSD.org> wrote:
>>=20
>> The branch main has been updated by andrew:
>>=20
>> URL: =
https://cgit.FreeBSD.org/src/commit/?id=3D9eecef052155646fbc5f8f533b952b37=
2572d06a
>>=20
>> 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
>>=20
>>   Add an Armv8 rndr random number provider
>>=20
>>   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.
>>=20
>>   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.
>>=20
>>   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.
>>=20
>>   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(+)
>>=20
>> 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
>>=20
>> # 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
>>=20
>> +dev/random/armv8rng.c optional armv8_rng !random_loadable
>> +
>> dev/safexcel/safexcel.c optional safexcel fdt
>>=20
>> 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 =3D {
>> + .rs_ident =3D "Armv8 rndr RNG",
>> + .rs_source =3D RANDOM_PURE_ARMV8,
>> + .rs_read =3D random_rndr_read,
>> +};
>> +
>> +static inline int
>> +random_rndr_read_one(u_long *buf)
>> +{
>> + u_long val;
>> + int loop, ret;
>> +
>> + loop =3D 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"
>> +    : "=3D&r" (val), "=3D&r"(ret) :: "cc");
>=20
> Early clobber doesn=E2=80=99t make sense with no inputs.

This also breaks the aarch64 ubuntu-20.04 GitHub build, as its LLVM
doesn=E2=80=99t 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=E2=80=99s happened, and some of those never got fixed upstream, we =
just had
to hack around them downstream.

Jess




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2423E245-0F1B-4195-A766-166183774421>