diff options
Diffstat (limited to 'arch/x86/kernel/cpu/rdrand.c')
| -rw-r--r-- | arch/x86/kernel/cpu/rdrand.c | 22 | 
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/x86/kernel/cpu/rdrand.c b/arch/x86/kernel/cpu/rdrand.c index 5c900f9527ff..c4be62058dd9 100644 --- a/arch/x86/kernel/cpu/rdrand.c +++ b/arch/x86/kernel/cpu/rdrand.c @@ -29,7 +29,8 @@ __setup("nordrand", x86_rdrand_setup);  #ifdef CONFIG_ARCH_RANDOM  void x86_init_rdrand(struct cpuinfo_x86 *c)  { -	unsigned long tmp; +	unsigned int changed = 0; +	unsigned long tmp, prev;  	int i;  	if (!cpu_has(c, X86_FEATURE_RDRAND)) @@ -42,5 +43,24 @@ void x86_init_rdrand(struct cpuinfo_x86 *c)  			return;  		}  	} + +	/* +	 * Stupid sanity-check whether RDRAND does *actually* generate +	 * some at least random-looking data. +	 */ +	prev = tmp; +	for (i = 0; i < SANITY_CHECK_LOOPS; i++) { +		if (rdrand_long(&tmp)) { +			if (prev != tmp) +				changed++; + +			prev = tmp; +		} +	} + +	if (WARN_ON_ONCE(!changed)) +		pr_emerg( +"RDRAND gives funky smelling output, might consider not using it by booting with \"nordrand\""); +  }  #endif  |