From 7ecd83373cb0eee7bd91dcae8befc2c19883707c Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Wed, 4 Feb 2015 10:17:57 +0100 Subject: [PATCH] rump: Reduce startup latency Since rump now requires large buffers of random numbers (>= 512 bytes), use the jitterentropy library instead of the slow timer pseudo random number generation. Fixes #1393 --- repos/dde_rump/lib/mk/rump_base.inc | 5 +++ repos/dde_rump/src/lib/rump/bootstrap.cc | 2 +- repos/dde_rump/src/lib/rump/hypercall.cc | 49 ++++++++++++++++++++---- repos/dde_rump/src/lib/rump/misc.cc | 9 ----- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/repos/dde_rump/lib/mk/rump_base.inc b/repos/dde_rump/lib/mk/rump_base.inc index 45bd84779..b56602d40 100644 --- a/repos/dde_rump/lib/mk/rump_base.inc +++ b/repos/dde_rump/lib/mk/rump_base.inc @@ -12,6 +12,11 @@ RMAKE = $(RUMP_TOOLS)/rumpmake # VERBOSE_LEVEL ?= 0 +# +# Libraries +# +LIBS += jitterentropy + # # Sources # diff --git a/repos/dde_rump/src/lib/rump/bootstrap.cc b/repos/dde_rump/src/lib/rump/bootstrap.cc index f669e71aa..87a21c431 100644 --- a/repos/dde_rump/src/lib/rump/bootstrap.cc +++ b/repos/dde_rump/src/lib/rump/bootstrap.cc @@ -166,7 +166,7 @@ struct Sym_tab /* set absolute value */ sym_tab[out_cnt].st_value += map->addr; if (verbose) - PDBG("Read symbol %s val: %zx", name, sym_tab[out_cnt].st_value); + PDBG("Read symbol %s val: %lx", name, sym_tab[out_cnt].st_value); out_cnt++; } } diff --git a/repos/dde_rump/src/lib/rump/hypercall.cc b/repos/dde_rump/src/lib/rump/hypercall.cc index 6d2c7ba66..ddb2d0c82 100644 --- a/repos/dde_rump/src/lib/rump/hypercall.cc +++ b/repos/dde_rump/src/lib/rump/hypercall.cc @@ -21,6 +21,11 @@ #include #include +extern "C" { + namespace Jitter { + #include + } +} extern "C" void wait_for_continue(); enum { SUPPORTED_RUMP_VERSION = 17 }; @@ -31,6 +36,38 @@ static bool verbose = false; struct rumpuser_hyperup _rump_upcalls; +/*********************************** + ** Jitter entropy for randomness ** + ***********************************/ + +struct Entropy +{ + struct Jitter::rand_data *ec_stir; + + Entropy() + { + Jitter::jent_entropy_init(); + ec_stir = Jitter::jent_entropy_collector_alloc(0, 0); + } + + static Entropy *e() + { + static Entropy _e; + return &_e; + } + + size_t read(char *buf, size_t len) + { + int err; + if ((err = Jitter::jent_read_entropy(ec_stir, buf, len) < 0)) { + PERR("Failed to read entropy: %d", err); + return 0; + } + + return len; + } +}; + /******************** ** Initialization ** ********************/ @@ -53,6 +90,9 @@ int rumpuser_init(int version, const struct rumpuser_hyperup *hyp) */ Genode::Timeout_thread::alarm_timer(); + /* initialize jitter entropy */ + Entropy::e(); + return 0; } @@ -296,14 +336,7 @@ int rumpuser_clock_sleep(int enum_rumpclock, int64_t sec, long nsec) int rumpuser_getrandom(void *buf, size_t buflen, int flags, size_t *retp) { - Timer::Connection *timer = myself()->timer(); - - uint8_t *rndbuf; - for (*retp = 0, rndbuf = (uint8_t *)buf; *retp < buflen; (*retp)++) { - *rndbuf++ = timer->elapsed_ms() & 0xff; - timer->msleep(timer->elapsed_ms() & 0xf); - } - + *retp = Entropy::e()->read((char *)buf, buflen); return 0; } diff --git a/repos/dde_rump/src/lib/rump/misc.cc b/repos/dde_rump/src/lib/rump/misc.cc index ecf6ccade..5a918383a 100644 --- a/repos/dde_rump/src/lib/rump/misc.cc +++ b/repos/dde_rump/src/lib/rump/misc.cc @@ -15,15 +15,6 @@ #include -/* - * On some platforms (namely ARM) we end-up pulling in string.h prototypes - */ -extern "C" void *memcpy(void *d, void *s, Genode::size_t n) -{ - return Genode::memcpy(d, s, n); -} - - extern "C" void *memset(void *s, int c, Genode::size_t n) { return Genode::memset(s, c, n);