[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 3/5] lib/ukswrand: Introduce libukswrand
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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |