|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 3/5] lib/ukswrand: Introduce libukswrand
Reviewed-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx>
I have no clue how the algorithm works, but I choose to trust you here :)
Sharan Santhanam <sharan.santhanam@xxxxxxxxx> writes:
> Implementation a psuedo random number generator.
>
> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx>
> ---
> lib/Config.uk | 1 +
> lib/Makefile.uk | 1 +
> lib/ukswrand/Config.uk | 20 ++++++++
> lib/ukswrand/Makefile.uk | 6 +++
> lib/ukswrand/export.syms | 2 +
> lib/ukswrand/include/uk/swrand.h | 70 ++++++++++++++++++++++++++
> lib/ukswrand/mwc.c | 103
> +++++++++++++++++++++++++++++++++++++++
> 7 files changed, 203 insertions(+)
> create mode 100644 lib/ukswrand/Config.uk
> create mode 100644 lib/ukswrand/Makefile.uk
> create mode 100644 lib/ukswrand/export.syms
> create mode 100644 lib/ukswrand/include/uk/swrand.h
> create mode 100644 lib/ukswrand/mwc.c
>
> diff --git a/lib/Config.uk b/lib/Config.uk
> index 5bf5ebc..0a78a02 100644
> --- a/lib/Config.uk
> +++ b/lib/Config.uk
> @@ -33,3 +33,4 @@ source "lib/ukallocbbuddy/Config.uk"
> source "lib/uksched/Config.uk"
> source "lib/ukschedcoop/Config.uk"
> source "lib/fdt/Config.uk"
> +source "lib/ukswrand/Config.uk"
> diff --git a/lib/Makefile.uk b/lib/Makefile.uk
> index 1d7cb57..d549152 100644
> --- a/lib/Makefile.uk
> +++ b/lib/Makefile.uk
> @@ -5,6 +5,7 @@
>
> ################################################################################
>
> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukboot))
> +$(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukswrand))
> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukdebug))
> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/ukargparse))
> $(eval $(call _import_lib,$(CONFIG_UK_BASE)/lib/uktimeconv))
> diff --git a/lib/ukswrand/Config.uk b/lib/ukswrand/Config.uk
> new file mode 100644
> index 0000000..44f6ee5
> --- /dev/null
> +++ b/lib/ukswrand/Config.uk
> @@ -0,0 +1,20 @@
> +menuconfig LIBUKSWRAND
> + bool "ukswrand: Software random number generator"
> + select LIBUKDEBUG
> + default n
> +
> +if LIBUKSWRAND
> +choice
> + prompt "Algorithm"
> + default LIBUKSWRAND_MWC
> +
> +config LIBUKSWRAND_MWC
> + bool "Multiply-with-carry"
> + help
> + Use multiply-with-carry algorithm
> +endchoice
> +
> +config LIBUKSWRAND_INITIALSEED
> + int "Initial random seed"
> + default 23
> +endif
> diff --git a/lib/ukswrand/Makefile.uk b/lib/ukswrand/Makefile.uk
> new file mode 100644
> index 0000000..8d4482c
> --- /dev/null
> +++ b/lib/ukswrand/Makefile.uk
> @@ -0,0 +1,6 @@
> +$(eval $(call addlib_s,libukswrand,$(CONFIG_LIBUKSWRAND)))
> +
> +CINCLUDES-$(CONFIG_LIBUKSWRAND) += -I$(LIBUKSWRAND_BASE)/include
> +CXXINCLUDES-$(CONFIG_LIBUKSWRAND) += -I$(LIBUKSWRAND_BASE)/include
> +
> +LIBUKSWRAND_SRCS-$(CONFIG_LIBUKSWRAND_MWC) += $(LIBUKSWRAND_BASE)/mwc.c
> diff --git a/lib/ukswrand/export.syms b/lib/ukswrand/export.syms
> new file mode 100644
> index 0000000..92f2be3
> --- /dev/null
> +++ b/lib/ukswrand/export.syms
> @@ -0,0 +1,2 @@
> +uk_swrand_init_r
> +uk_swrand_randr_r
> diff --git a/lib/ukswrand/include/uk/swrand.h
> b/lib/ukswrand/include/uk/swrand.h
> new file mode 100644
> index 0000000..e2e43f9
> --- /dev/null
> +++ b/lib/ukswrand/include/uk/swrand.h
> @@ -0,0 +1,70 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * Authors: Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> + *
> + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved.
> + *
> + * 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.
> + * 3. Neither the name of the copyright holder nor the names of its
> + * contributors may be used to endorse or promote products derived from
> + * this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> + *
> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> + */
> +
> +#ifndef __UK_SWRAND__
> +#define __UK_SWRAND__
> +
> +#include <uk/arch/types.h>
> +#include <uk/plat/lcpu.h>
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +struct uk_swrand;
> +extern struct uk_swrand uk_swrand_def;
> +
> +void uk_swrand_init_r(struct uk_swrand *r, __u32 seed);
> +__u32 uk_swrand_randr_r(struct uk_swrand *r);
> +
> +/* Uses the pre-initialized default generator */
> +/* TODO: Add assertion when we can test if we are in interrupt context */
> +/* TODO: Revisit with multi-CPU support */
> +static inline __u32 uk_swrand_randr(void)
> +{
> + unsigned long iflags;
> + __u32 ret;
> +
> + iflags = ukplat_lcpu_save_irqf();
> + ret = uk_swrand_randr_r(&uk_swrand_def);
> + ukplat_lcpu_restore_irqf(iflags);
> +
> + return ret;
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* __UK_SWRAND__ */
> diff --git a/lib/ukswrand/mwc.c b/lib/ukswrand/mwc.c
> new file mode 100644
> index 0000000..60a5bf1
> --- /dev/null
> +++ b/lib/ukswrand/mwc.c
> @@ -0,0 +1,103 @@
> +/* SPDX-License-Identifier: BSD-3-Clause */
> +/*
> + * Authors: Florian Schmidt <florian.schmidt@xxxxxxxxx>
> + * Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
> + *
> + * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights reserved.
> + *
> + * 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.
> + * 3. Neither the name of the copyright holder nor the names of its
> + * contributors may be used to endorse or promote products derived from
> + * this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
> + *
> + * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
> + */
> +
> +#include <uk/swrand.h>
> +#include <uk/print.h>
> +#include <uk/assert.h>
> +#include <uk/plat/ctors.h>
> +
> +/*
> https://stackoverflow.com/questions/9492581/c-random-number-generation-pure-c-code-no-libraries-or-functions
> */
> +#define PHI 0x9e3779b9
> +#define UK_SWRAND_CTOR_PRIO (200U)
> +
> +struct uk_swrand {
> + __u32 Q[4096];
> + __u32 c;
> + __u32 i;
> +};
> +
> +struct uk_swrand uk_swrand_def;
> +
> +/*
> + * Declare the constructor function to initialize the swrand
> + */
> +static void _uk_swrand_ctor(void) __constructor_prio(UK_SWRAND_CTOR_PRIO);
> +
> +void uk_swrand_init_r(struct uk_swrand *r, __u32 seed)
> +{
> + __u32 i;
> +
> + UK_ASSERT(r);
> +
> + r->Q[0] = seed;
> + r->Q[1] = seed + PHI;
> + r->Q[2] = seed + PHI + PHI;
> + for (i = 3; i < 4096; i++)
> + r->Q[i] = r->Q[i - 3] ^ r->Q[i - 2] ^ PHI ^ i;
> +
> + r->c = 362436;
> + r->i = 4095;
> +}
> +
> +__u32 uk_swrand_randr_r(struct uk_swrand *r)
> +{
> + __u64 t, a = 18782LL;
> + __u32 x, y = 0xfffffffe;
> + __u32 i, c;
> +
> + UK_ASSERT(r);
> +
> + i = r->i;
> + c = r->c;
> +
> + i = (i + 1) & 4095;
> + t = a * r->Q[i] + c;
> + c = (t >> 32);
> + x = t + c;
> + if (x < c) {
> + x++;
> + c++;
> + }
> +
> + r->i = i;
> + r->c = c;
> + return (r->Q[i] = y - x);
> +}
> +
> +static void _uk_swrand_ctor(void)
> +{
> + uk_printd(DLVL_INFO, "Initialize random number generator...\n");
> + uk_swrand_init_r(&uk_swrand_def, CONFIG_LIBUKSWRAND_INITIALSEED);
> +}
> --
> 2.7.4
>
>
> _______________________________________________
> Minios-devel mailing list
> Minios-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/minios-devel
--
Yuri Volchkov
Software Specialist
NEC Europe Ltd
Kurfürsten-Anlage 36
D-69115 Heidelberg
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |