X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/f1da6683c88aa279a6350122d96856185d581925..15dfa998435a40ff3a7b1de4ec85541e8bac08dc:/rand/rand.c diff --git a/rand/rand.c b/rand/rand.c index aa3fb453..f9f16d5d 100644 --- a/rand/rand.c +++ b/rand/rand.c @@ -161,8 +161,26 @@ 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; + int i = 16; + + __asm__ ("0: rdrand %0; jc 9f; dec %1; jnz 0b; 9:" + : "=r" (rr), "=r" (i) : "1" (i) : "cc"); + if (!i) return (-1); + rand_add(r, &rr, sizeof(rr), 8*sizeof(rr)); + return (0); +} +#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); }