diff options
Diffstat (limited to 'sys/dev/random/probe.c')
-rw-r--r-- | sys/dev/random/probe.c | 63 |
1 files changed, 47 insertions, 16 deletions
diff --git a/sys/dev/random/probe.c b/sys/dev/random/probe.c index 7039b92..d9e70de 100644 --- a/sys/dev/random/probe.c +++ b/sys/dev/random/probe.c @@ -28,35 +28,66 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#if defined(__amd64__) || defined(__i386__) +#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) #include "opt_cpu.h" #endif +#include <sys/types.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> +#include <sys/malloc.h> +#include <sys/random.h> #include <sys/selinfo.h> +#include <sys/sysctl.h> + +#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#include <machine/cpufunc.h> +#include <machine/cputypes.h> +#include <machine/md_var.h> +#include <machine/specialreg.h> +#endif -#include <dev/random/random_adaptors.h> #include <dev/random/randomdev.h> +#include <dev/random/randomdev_soft.h> + +#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#ifdef PADLOCK_RNG +extern struct random_systat random_nehemiah; +#endif +#ifdef RDRAND_RNG +extern struct random_systat random_ivy; +#endif +#endif void -random_ident_hardware(struct random_adaptor **adaptor) +random_ident_hardware(struct random_systat **systat) { - struct random_adaptor *tmp; - int enable; - /* Set default to software (yarrow) */ - *adaptor = random_adaptor_get("yarrow"); + /* Set default to software */ + *systat = &random_yarrow; /* Then go looking for hardware */ - enable = 1; - TUNABLE_INT_FETCH("hw.nehemiah_rng_enable", &enable); - if (enable && (tmp = random_adaptor_get("nehemiah"))) - *adaptor = tmp; - - enable = 1; - TUNABLE_INT_FETCH("hw.ivy_rng_enable", &enable); - if (enable && (tmp = random_adaptor_get("rdrand"))) - *adaptor = tmp; +#if defined(__amd64__) || (defined(__i386__) && !defined(PC98)) +#ifdef PADLOCK_RNG + if (via_feature_rng & VIA_HAS_RNG) { + int enable; + + enable = 1; + TUNABLE_INT_FETCH("hw.nehemiah_rng_enable", &enable); + if (enable) + *systat = &random_nehemiah; + } +#endif +#ifdef RDRAND_RNG + if (cpu_feature2 & CPUID2_RDRAND) { + int enable; + + enable = 1; + TUNABLE_INT_FETCH("hw.ivy_rng_enable", &enable); + if (enable) + *systat = &random_ivy; + } +#endif +#endif } |