|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 2/4] lib/ukswrand: Add seed generating function
This patch adds a new function, _get_random_seed32 for seed generaton. If the
pre-compiled config option is not selected, then rdrand is used on x86 and
ukplat_wall_clock on ARM.
Signed-off-by: Vlad-Andrei Badoiu <vlad_andrei.badoiu@xxxxxxxxxxxxxxx>
---
lib/ukswrand/Config.uk | 7 +++++++
lib/ukswrand/include/uk/swrand.h | 20 ++++++++++++++++++++
lib/ukswrand/mwc.c | 2 +-
3 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/lib/ukswrand/Config.uk b/lib/ukswrand/Config.uk
index c58371bb..8db3af03 100644
--- a/lib/ukswrand/Config.uk
+++ b/lib/ukswrand/Config.uk
@@ -14,10 +14,17 @@ config LIBUKSWRAND_MWC
Use multiply-with-carry algorithm
endchoice
+config LIBUKSWRAND_USE_INITIALSEED
+ bool "Use a pre-compiled seed"
+ default y
+
+if LIBUKSWRAND_USE_INITIALSEED
config LIBUKSWRAND_INITIALSEED
int "Initial random seed"
default 23
+endif
+
config LIBUKSWRAND_DEVFS
bool "Register random and urandom device to devfs"
select LIBDEVFS
diff --git a/lib/ukswrand/include/uk/swrand.h b/lib/ukswrand/include/uk/swrand.h
index 77912182..a3a1e227 100644
--- a/lib/ukswrand/include/uk/swrand.h
+++ b/lib/ukswrand/include/uk/swrand.h
@@ -39,6 +39,7 @@
#include <uk/arch/types.h>
#include <uk/plat/lcpu.h>
#include <uk/config.h>
+#include <uk/plat/time.h>
#ifdef __cplusplus
extern "C" {
@@ -53,6 +54,25 @@ 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);
+static inline __u32 _get_random_seed32(void)
+{
+ __u32 val;
+
+#ifdef CONFIG_LIBUKSWRAND_USE_INITIALSEED
+ return CONFIG_LIBUKSWRAND_INITIALSEED;
+#endif
+
+#ifdef CONFIG_ARCH_X86_64
+ asm volatile ("rdrand %%eax;"
+ : "=a" (val));
+ return val;
+#endif
+
+ /* TODO: Generate the seed randomly on ARM */
+ val = (__u32)ukplat_wall_clock();
+ return val;
+}
+
/* 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 */
diff --git a/lib/ukswrand/mwc.c b/lib/ukswrand/mwc.c
index 820aa2a2..6d785c07 100644
--- a/lib/ukswrand/mwc.c
+++ b/lib/ukswrand/mwc.c
@@ -99,7 +99,7 @@ __u32 uk_swrand_randr_r(struct uk_swrand *r)
static void _uk_swrand_ctor(void)
{
uk_pr_info("Initialize random number generator...\n");
- uk_swrand_init_r(&uk_swrand_def, CONFIG_LIBUKSWRAND_INITIALSEED);
+ uk_swrand_init_r(&uk_swrand_def, _get_random_seed32());
}
UK_CTOR_FUNC(UK_SWRAND_CTOR_PRIO, _uk_swrand_ctor);
--
2.20.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |