diff options
-rw-r--r-- | arch/powerpc/include/asm/archrandom.h | 9 | ||||
-rw-r--r-- | arch/x86/include/asm/archrandom.h | 3 | ||||
-rw-r--r-- | drivers/char/random.c | 3 | ||||
-rw-r--r-- | include/linux/random.h | 8 |
4 files changed, 23 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/archrandom.h b/arch/powerpc/include/asm/archrandom.h index 801beba4e64b..bde531103638 100644 --- a/arch/powerpc/include/asm/archrandom.h +++ b/arch/powerpc/include/asm/archrandom.h | |||
@@ -25,6 +25,11 @@ static inline int arch_get_random_int(unsigned int *v) | |||
25 | return rc; | 25 | return rc; |
26 | } | 26 | } |
27 | 27 | ||
28 | static inline int arch_has_random(void) | ||
29 | { | ||
30 | return !!ppc_md.get_random_long; | ||
31 | } | ||
32 | |||
28 | int powernv_get_random_long(unsigned long *v); | 33 | int powernv_get_random_long(unsigned long *v); |
29 | 34 | ||
30 | static inline int arch_get_random_seed_long(unsigned long *v) | 35 | static inline int arch_get_random_seed_long(unsigned long *v) |
@@ -35,6 +40,10 @@ static inline int arch_get_random_seed_int(unsigned int *v) | |||
35 | { | 40 | { |
36 | return 0; | 41 | return 0; |
37 | } | 42 | } |
43 | static inline int arch_has_random_seed(void) | ||
44 | { | ||
45 | return 0; | ||
46 | } | ||
38 | 47 | ||
39 | #endif /* CONFIG_ARCH_RANDOM */ | 48 | #endif /* CONFIG_ARCH_RANDOM */ |
40 | 49 | ||
diff --git a/arch/x86/include/asm/archrandom.h b/arch/x86/include/asm/archrandom.h index 6ad7f6d3f97f..69f1366f1aa3 100644 --- a/arch/x86/include/asm/archrandom.h +++ b/arch/x86/include/asm/archrandom.h | |||
@@ -114,6 +114,9 @@ GET_SEED(arch_get_random_seed_int, unsigned int, RDSEED_INT, ASM_NOP4); | |||
114 | 114 | ||
115 | #endif /* CONFIG_X86_64 */ | 115 | #endif /* CONFIG_X86_64 */ |
116 | 116 | ||
117 | #define arch_has_random() static_cpu_has(X86_FEATURE_RDRAND) | ||
118 | #define arch_has_random_seed() static_cpu_has(X86_FEATURE_RDSEED) | ||
119 | |||
117 | #else | 120 | #else |
118 | 121 | ||
119 | static inline int rdrand_long(unsigned long *v) | 122 | static inline int rdrand_long(unsigned long *v) |
diff --git a/drivers/char/random.c b/drivers/char/random.c index c35cee268e13..6b75713d953a 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -1307,6 +1307,9 @@ static int arch_random_refill(void) | |||
1307 | unsigned int i; | 1307 | unsigned int i; |
1308 | unsigned long buf[nlongs]; | 1308 | unsigned long buf[nlongs]; |
1309 | 1309 | ||
1310 | if (!arch_has_random_seed()) | ||
1311 | return 0; | ||
1312 | |||
1310 | for (i = 0; i < nlongs; i++) { | 1313 | for (i = 0; i < nlongs; i++) { |
1311 | if (arch_get_random_seed_long(&buf[n])) | 1314 | if (arch_get_random_seed_long(&buf[n])) |
1312 | n++; | 1315 | n++; |
diff --git a/include/linux/random.h b/include/linux/random.h index c2f08131050d..57fbbffd77a0 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
@@ -88,6 +88,10 @@ static inline int arch_get_random_int(unsigned int *v) | |||
88 | { | 88 | { |
89 | return 0; | 89 | return 0; |
90 | } | 90 | } |
91 | static inline int arch_has_random(void) | ||
92 | { | ||
93 | return 0; | ||
94 | } | ||
91 | static inline int arch_get_random_seed_long(unsigned long *v) | 95 | static inline int arch_get_random_seed_long(unsigned long *v) |
92 | { | 96 | { |
93 | return 0; | 97 | return 0; |
@@ -96,6 +100,10 @@ static inline int arch_get_random_seed_int(unsigned int *v) | |||
96 | { | 100 | { |
97 | return 0; | 101 | return 0; |
98 | } | 102 | } |
103 | static inline int arch_has_random_seed(void) | ||
104 | { | ||
105 | return 0; | ||
106 | } | ||
99 | #endif | 107 | #endif |
100 | 108 | ||
101 | /* Pseudo random number generator from numerical recipes. */ | 109 | /* Pseudo random number generator from numerical recipes. */ |