On Thu, Mar 23, 2017 at 03:24:16PM +1100, Jonathan Gray wrote: > Instead of using using /dev/urandom on Linux and time(NULL) elsewhere > for a seed first use getentropy() for systems that have a kernel > interface to get a seed such as OpenBSD. This interface is also > present in other systems such as Solaris and even Linux with a recent > version of glibc. > > v2: check for/use the different header Solaris and glibc use > > Signed-off-by: Jonathan Gray <j...@jsg.id.au>
The functions should really be split for random and deterministic as well, but that is hard to cleanup without being able to assume arc4random or equivalent is present. diff --git a/configure.ac b/configure.ac index c27646ca4c..a1a62482d9 100644 --- a/configure.ac +++ b/configure.ac @@ -792,6 +792,9 @@ AC_CHECK_FUNC([posix_memalign], [DEFINES="$DEFINES -DHAVE_POSIX_MEMALIGN"]) dnl See if getentropy is available AC_CHECK_FUNC([getentropy], [DEFINES="$DEFINES -DHAVE_GETENTROPY"]) +dnl See if arc4random_buf is available +AC_CHECK_FUNC([arc4random_buf], [DEFINES="$DEFINES -DHAVE_ARC4RANDOM_BUF"]) + dnl Check for zlib PKG_CHECK_MODULES([ZLIB], [zlib >= $ZLIB_REQUIRED]) diff --git a/src/gallium/drivers/radeon/r600_test_dma.c b/src/gallium/drivers/radeon/r600_test_dma.c index 3c23b09329..0cdd24d1c0 100644 --- a/src/gallium/drivers/radeon/r600_test_dma.c +++ b/src/gallium/drivers/radeon/r600_test_dma.c @@ -77,7 +77,7 @@ static void set_random_pixels(struct pipe_context *ctx, for (x = 0; x < size; x++) { *ptr++ = *ptr_cpu++ = - rand_xorshift128plus(seed_xorshift128plus); + rand_xorshift128plus_deterministic(seed_xorshift128plus); } } } diff --git a/src/util/rand_xor.c b/src/util/rand_xor.c index c613371f67..db642dae54 100644 --- a/src/util/rand_xor.c +++ b/src/util/rand_xor.c @@ -37,6 +37,10 @@ #include <time.h> #endif +#ifdef HAVE_ARC4RANDOM_BUF +#include <stdlib.h> +#endif + #include "rand_xor.h" /* Super fast random number generator. @@ -45,7 +49,7 @@ * to the public domain. */ uint64_t -rand_xorshift128plus(uint64_t *seed) +rand_xorshift128plus_deterministic(uint64_t *seed) { uint64_t *s = seed; @@ -58,6 +62,18 @@ rand_xorshift128plus(uint64_t *seed) return s[1] + s0; } +uint64_t +rand_xorshift128plus(uint64_t *seed) +{ +#ifdef HAVE_ARC4RANDOM_BUF + uint64_t buf; + arc4random_buf(&buf, sizeof(buf)); + return buf; +#else + return rand_xorshift128plus_deterministic(seed); +#endif +} + void s_rand_xorshift128plus(uint64_t *seed, bool randomised_seed) { diff --git a/src/util/rand_xor.h b/src/util/rand_xor.h index 532d549bcd..0fbf4d3a8a 100644 --- a/src/util/rand_xor.h +++ b/src/util/rand_xor.h @@ -31,6 +31,9 @@ uint64_t rand_xorshift128plus(uint64_t *seed); +uint64_t +rand_xorshift128plus_deterministic(uint64_t *seed); + void s_rand_xorshift128plus(uint64_t *seed, bool randomised_seed); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev