On 12/28/19 4:03 PM, Sughosh Ganu wrote:

On Sat, 28 Dec 2019 at 20:01, Heinrich Schuchardt <[email protected]
<mailto:[email protected]>> wrote:

    On 12/27/19 3:26 PM, Sughosh Ganu wrote:
     > Add support for the EFI_RNG_PROTOCOL routines for the qemu arm64
     > platform. EFI_RNG_PROTOCOL is an uefi boottime service which is
     > invoked by the efi stub in the kernel for getting random seed for
     > kaslr.
     >
     > The routines are platform specific, and use the virtio-rng device on
     > the platform to get random data.
     >
     > The feature can be enabled through the following config
     > CONFIG_EFI_RNG_PROTOCOL
     >
     > Signed-off-by: Sughosh Ganu <[email protected]
    <mailto:[email protected]>>
     > ---
     > Changes since V2:
     > * Based on review comments from Heinrich Schuchardt, the rng drivers
     >    read all the bytes requested in the individual
     >    drivers. Corresponding changes made in getrng routine to
    remove the
     >    loop to read the bytes requested, since that would be handled
    in the
     >    drivers.
     >
     >   board/emulation/qemu-arm/qemu-arm.c | 41 +++++++++++++++++++
     >   include/efi_rng.h                   | 32 +++++++++++++++
     >   lib/efi_loader/Kconfig              |  8 ++++
     >   lib/efi_loader/Makefile             |  1 +
     >   lib/efi_loader/efi_rng.c            | 80
    +++++++++++++++++++++++++++++++++++++
     >   5 files changed, 162 insertions(+)
     >   create mode 100644 include/efi_rng.h
     >   create mode 100644 lib/efi_loader/efi_rng.c
     >


<snip>

     > diff --git a/lib/efi_loader/efi_rng.c b/lib/efi_loader/efi_rng.c
     > new file mode 100644
     > index 0000000..eb91aa7
     > --- /dev/null
     > +++ b/lib/efi_loader/efi_rng.c
     > @@ -0,0 +1,80 @@
     > +// SPDX-License-Identifier: GPL-2.0+
     > +/*
     > + * Copyright (c) 2019, Linaro Limited
     > + */
     > +
     > +#include <common.h>
     > +#include <dm.h>
     > +#include <efi_loader.h>
     > +#include <efi_rng.h>
     > +#include <rng.h>
     > +
     > +DECLARE_GLOBAL_DATA_PTR;
     > +
     > +static efi_status_t EFIAPI rng_getinfo(struct efi_rng_protocol
    *this,
     > +                                    efi_uintn_t
    *rng_algorithm_list_size,
     > +                                    efi_guid_t *rng_algorithm_list)
     > +{
     > +     efi_guid_t rng_algo_guid = EFI_RNG_ALGORITHM_RAW;
     > +
     > +     EFI_ENTRY("%p, %p, %p", this, rng_algorithm_list_size,
     > +               rng_algorithm_list);
     > +
     > +     if (!this || !rng_algorithm_list_size)
     > +             return EFI_INVALID_PARAMETER;
     > +
     > +     if (!rng_algorithm_list ||
     > +         *rng_algorithm_list_size < sizeof(*rng_algorithm_list)) {
     > +             *rng_algorithm_list_size = sizeof(*rng_algorithm_list);
     > +             return EFI_BUFFER_TOO_SMALL;
     > +     }
     > +
     > +     /*
     > +      * For now, use EFI_RNG_ALGORITHM_RAW as the default
     > +      * algorithm. If a new algorithm gets added in the
     > +      * future through a Kconfig, rng_algo_guid will be set
     > +      * based on that Kconfig option
     > +      */
     > +     *rng_algorithm_list_size = sizeof(*rng_algorithm_list);
     > +     guidcpy(rng_algorithm_list, &rng_algo_guid);
     > +
     > +     return EFI_EXIT(EFI_SUCCESS);
     > +}
     > +
     > +static efi_status_t EFIAPI getrng(struct efi_rng_protocol *this,
     > +                               efi_guid_t *rng_algorithm,
     > +                               efi_uintn_t rng_value_length,
     > +                               uint8_t *rng_value)
     > +{
     > +     int ret;
     > +     struct udevice *dev;
     > +     const efi_guid_t rng_raw_guid = EFI_RNG_ALGORITHM_RAW;
     > +
     > +     EFI_ENTRY("%p, %p, %zu, %p", this, rng_algorithm,
    rng_value_length,
     > +               rng_value);
     > +
     > +     if (!this || !rng_value || !rng_value_length)
     > +             return EFI_INVALID_PARAMETER;
     > +
     > +     if (rng_algorithm) {
     > +             if (guidcmp(rng_algorithm, &rng_raw_guid))
     > +                     return EFI_UNSUPPORTED;
     > +     }
     > +
     > +     ret = platform_get_rng_device(&dev);

    This does not compile for sandbox_defconfig.

    You could replace this by:

    ret = uclass_get_device(UCLASS_RNG, 0, &dev);


Like I had stated in one of my earlier mail, I would prefer having a
platform specific routine for fetching the rng device. For example, on
qemu, where the rng device is the child of a virtio-pci device, the
above logic would not get the rng device without having previously
scanned the virtio devices. Instead, i will add a weak function
platform_get_rng_device, which uses uclass_get_device. Any platform
which has a different topology, can then define it's own
platform_get_rng_device function.

-sughosh

For patches series the expectation is that the code compiles when
stopping after any patch in the series.

Adding the uclass_get_device() solution in a weak function is ok for me.

When testing I already experienced that I had to issue the `virtio scan`
command.

Best regards

Heinrich

Reply via email to