Re: [PATCH v5 5/8] sandbox: rng: Add a random number generator(rng) driver
On Fri, 27 Dec 2019 at 12:29, Heinrich Schuchardt wrote: > On 12/26/19 6:25 PM, Sughosh Ganu wrote: > > Add a sandbox driver for random number generation. Mostly aimed at > > providing a unit test for rng uclass. > > > > Signed-off-by: Sughosh Ganu > > Reviewed-by: Patrice Chotard > > --- > > Changes since V4: > > * Return number of bytes read on a successful read, and a -ve value on > >error. > > * Modify the logic of sandbox_rng_read function to use rand and srand > >functions to return random data, based on feedback from Heinrich > >Schuchardt. > > > > arch/sandbox/dts/test.dts | 4 > > drivers/rng/Kconfig | 8 +++ > > drivers/rng/Makefile | 1 + > > drivers/rng/sandbox_rng.c | 56 > +++ > > 4 files changed, 69 insertions(+) > > create mode 100644 drivers/rng/sandbox_rng.c > > > > diff --git a/drivers/rng/sandbox_rng.c b/drivers/rng/sandbox_rng.c > > new file mode 100644 > > index 000..5de1799 > > --- /dev/null > > +++ b/drivers/rng/sandbox_rng.c > > @@ -0,0 +1,56 @@ > > +// SPDX-License-Identifier: GPL-2.0-or-later > > +/* > > + * Copyright (c) 2019, Linaro Limited > > + */ > > + > > +#include > > +#include > > +#include > > + > > +#include > > + > > +static int sandbox_rng_read(struct udevice *dev, void *data, size_t len) > > +{ > > + int nbytes; > > + unsigned int i, seed; > > + unsigned int *buf = data; > > You assume here that data is 4 byte aligned which may not hold true and > hence may lead to a crash on ARM. > Will fix. -sughosh
Re: [PATCH v5 5/8] sandbox: rng: Add a random number generator(rng) driver
On 12/26/19 6:25 PM, Sughosh Ganu wrote: Add a sandbox driver for random number generation. Mostly aimed at providing a unit test for rng uclass. Signed-off-by: Sughosh Ganu Reviewed-by: Patrice Chotard --- Changes since V4: * Return number of bytes read on a successful read, and a -ve value on error. * Modify the logic of sandbox_rng_read function to use rand and srand functions to return random data, based on feedback from Heinrich Schuchardt. arch/sandbox/dts/test.dts | 4 drivers/rng/Kconfig | 8 +++ drivers/rng/Makefile | 1 + drivers/rng/sandbox_rng.c | 56 +++ 4 files changed, 69 insertions(+) create mode 100644 drivers/rng/sandbox_rng.c diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index fdb08f2..2c85540 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -599,6 +599,10 @@ reset-names = "other", "test"; }; + rng@0 { + compatible = "sandbox,sandbox-rng"; + }; + rproc_1: rproc@1 { compatible = "sandbox,test-processor"; remoteproc-name = "remoteproc-test-dev1"; diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index c9c4751..35a3bd1 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -6,6 +6,14 @@ config DM_RNG This interface is used to initialise the rng device and to read the random seed from the device. +config RNG_SANDBOX + bool "Sandbox random number generator" + depends on SANDBOX && DM_RNG + select CONFIG_LIB_RAND + help + Enable random number generator for sandbox. This is an + emulation of a rng device. + config RNG_STM32MP1 bool "Enable random number generator for STM32MP1" depends on ARCH_STM32MP && DM_RNG diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 699beb3..3517005 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,4 +4,5 @@ # obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_SANDBOX) += sandbox_rng.o obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/sandbox_rng.c b/drivers/rng/sandbox_rng.c new file mode 100644 index 000..5de1799 --- /dev/null +++ b/drivers/rng/sandbox_rng.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2019, Linaro Limited + */ + +#include +#include +#include + +#include + +static int sandbox_rng_read(struct udevice *dev, void *data, size_t len) +{ + int nbytes; + unsigned int i, seed; + unsigned int *buf = data; You assume here that data is 4 byte aligned which may not hold true and hence may lead to a crash on ARM. Best regards Heinrich + size_t nrem, nloops; + + /* +* Only INT_MAX number of bytes can be returned. If more +* bytes need to be read, the caller must do it in a loop. +*/ + if (len > INT_MAX) + len = INT_MAX; + + nbytes = len; + nloops = len / sizeof(unsigned int); + seed = get_timer(0) ^ rand(); + srand(seed); + + for (i = 0, nrem = len; i < nloops; i++, nrem -= sizeof(unsigned int)) + *buf++ = rand(); + + seed = rand(); + memcpy(buf, , nrem); + + return nbytes; +} + +static const struct dm_rng_ops sandbox_rng_ops = { + .read = sandbox_rng_read, +}; + +static const struct udevice_id sandbox_rng_match[] = { + { + .compatible = "sandbox,sandbox-rng", + }, + {}, +}; + +U_BOOT_DRIVER(sandbox_rng) = { + .name = "sandbox-rng", + .id = UCLASS_RNG, + .of_match = sandbox_rng_match, + .ops = _rng_ops, +};
[PATCH v5 5/8] sandbox: rng: Add a random number generator(rng) driver
Add a sandbox driver for random number generation. Mostly aimed at providing a unit test for rng uclass. Signed-off-by: Sughosh Ganu Reviewed-by: Patrice Chotard --- Changes since V4: * Return number of bytes read on a successful read, and a -ve value on error. * Modify the logic of sandbox_rng_read function to use rand and srand functions to return random data, based on feedback from Heinrich Schuchardt. arch/sandbox/dts/test.dts | 4 drivers/rng/Kconfig | 8 +++ drivers/rng/Makefile | 1 + drivers/rng/sandbox_rng.c | 56 +++ 4 files changed, 69 insertions(+) create mode 100644 drivers/rng/sandbox_rng.c diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index fdb08f2..2c85540 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -599,6 +599,10 @@ reset-names = "other", "test"; }; + rng@0 { + compatible = "sandbox,sandbox-rng"; + }; + rproc_1: rproc@1 { compatible = "sandbox,test-processor"; remoteproc-name = "remoteproc-test-dev1"; diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig index c9c4751..35a3bd1 100644 --- a/drivers/rng/Kconfig +++ b/drivers/rng/Kconfig @@ -6,6 +6,14 @@ config DM_RNG This interface is used to initialise the rng device and to read the random seed from the device. +config RNG_SANDBOX + bool "Sandbox random number generator" + depends on SANDBOX && DM_RNG + select CONFIG_LIB_RAND + help + Enable random number generator for sandbox. This is an + emulation of a rng device. + config RNG_STM32MP1 bool "Enable random number generator for STM32MP1" depends on ARCH_STM32MP && DM_RNG diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile index 699beb3..3517005 100644 --- a/drivers/rng/Makefile +++ b/drivers/rng/Makefile @@ -4,4 +4,5 @@ # obj-$(CONFIG_DM_RNG) += rng-uclass.o +obj-$(CONFIG_RNG_SANDBOX) += sandbox_rng.o obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o diff --git a/drivers/rng/sandbox_rng.c b/drivers/rng/sandbox_rng.c new file mode 100644 index 000..5de1799 --- /dev/null +++ b/drivers/rng/sandbox_rng.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2019, Linaro Limited + */ + +#include +#include +#include + +#include + +static int sandbox_rng_read(struct udevice *dev, void *data, size_t len) +{ + int nbytes; + unsigned int i, seed; + unsigned int *buf = data; + size_t nrem, nloops; + + /* +* Only INT_MAX number of bytes can be returned. If more +* bytes need to be read, the caller must do it in a loop. +*/ + if (len > INT_MAX) + len = INT_MAX; + + nbytes = len; + nloops = len / sizeof(unsigned int); + seed = get_timer(0) ^ rand(); + srand(seed); + + for (i = 0, nrem = len; i < nloops; i++, nrem -= sizeof(unsigned int)) + *buf++ = rand(); + + seed = rand(); + memcpy(buf, , nrem); + + return nbytes; +} + +static const struct dm_rng_ops sandbox_rng_ops = { + .read = sandbox_rng_read, +}; + +static const struct udevice_id sandbox_rng_match[] = { + { + .compatible = "sandbox,sandbox-rng", + }, + {}, +}; + +U_BOOT_DRIVER(sandbox_rng) = { + .name = "sandbox-rng", + .id = UCLASS_RNG, + .of_match = sandbox_rng_match, + .ops = _rng_ops, +}; -- 2.7.4