1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * This file is part of the Linux kernel. 4 * 5 * Copyright (c) 2011, Intel Corporation 6 * Authors: Fenghua Yu <fenghua.yu@intel.com>, 7 * H. Peter Anvin <hpa@linux.intel.com> 8 */ 9 10 #include <asm/processor.h> 11 #include <asm/archrandom.h> 12 #include <asm/sections.h> 13 14 static int __init x86_rdrand_setup(char *s) 15 { 16 setup_clear_cpu_cap(X86_FEATURE_RDRAND); 17 setup_clear_cpu_cap(X86_FEATURE_RDSEED); 18 return 1; 19 } 20 __setup("nordrand", x86_rdrand_setup); 21 22 /* 23 * RDRAND has Built-In-Self-Test (BIST) that runs on every invocation. 24 * Run the instruction a few times as a sanity check. 25 * If it fails, it is simple to disable RDRAND here. 26 */ 27 #define SANITY_CHECK_LOOPS 8 28 29 #ifdef CONFIG_ARCH_RANDOM 30 void x86_init_rdrand(struct cpuinfo_x86 *c) 31 { 32 unsigned long tmp; 33 int i; 34 35 if (!cpu_has(c, X86_FEATURE_RDRAND)) 36 return; 37 38 for (i = 0; i < SANITY_CHECK_LOOPS; i++) { 39 if (!rdrand_long(&tmp)) { 40 clear_cpu_cap(c, X86_FEATURE_RDRAND); 41 pr_warn_once("rdrand: disabled\n"); 42 return; 43 } 44 } 45 } 46 #endif 47