From aaf296c8b4ac5515bc09fe7ec3c98f5e5f311e12 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Thu, 26 May 2016 09:26:09 +0100 Subject: [PATCH] rand/rand.c: Add support for x86 `RDRAND' instruction in `rand_quick'. --- rand/rand.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/rand/rand.c b/rand/rand.c index aa3fb453..29b180d8 100644 --- a/rand/rand.c +++ b/rand/rand.c @@ -161,8 +161,30 @@ CPU_DISPATCH(static, return, int, quick, (rand_pool *r), (r), static int trivial_quick(rand_pool *r) { return (-1); } +#if __GNUC__ && (CPUFAM_X86 || CPUFAM_AMD64) +static int rdrand_quick(rand_pool *r) +{ + unsigned long rr; + unsigned char w; + int i; + + for (i = 0; i < 16; i++) { + __asm__ ("rdrand %0; setc %1" : "=r" (rr), "=g" (w) : : "cc"); + if (w) { + rand_add(r, &rr, sizeof(rr), 8*sizeof(rr)); + return (0); + } + } + return (-1); +} +#endif + static quick__functype *pick_quick(void) { +#if __GNUC__ && (CPUFAM_X86 || CPUFAM_AMD64) + DISPATCH_PICK_COND(rand_quick, rdrand_quick, + cpu_feature_p(CPUFEAT_X86_RDRAND)); +#endif DISPATCH_PICK_FALLBACK(rand_quick, trivial_quick); } -- 2.11.0