summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Reinauer <stefan.reinauer@coreboot.org>2017-06-21 12:40:15 -0700
committerStefan Reinauer <stefan.reinauer@coreboot.org>2017-06-22 04:11:02 +0000
commit0380e0a68e63f36ce0d9507ad986407f36fa480f (patch)
tree3b5c6d9de9a463283ba760603b633147fb1b8070
parent154d209ac3636cf9d2340e80b0ded932e04a251d (diff)
arch/x86: Make rdrand.c clang friendly
rdrand64() is not clang friendly. Actually it looks like the function is incorrect on 32bit x86 for all compilers including gcc, but gcc won't care because the function is never called on x86: src/arch/x86/rdrand.c:51:15: error: invalid output size for constraint '=a' : "=a" (*rand), "=qm" (carry)); ^ 1 error generated. Guard the code correctly if ENV_X86_64 is not set. Change-Id: Ia565897f5e4caaaccfcb02cf1245b150272dff68 Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-on: https://review.coreboot.org/20298 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
-rw-r--r--src/arch/x86/rdrand.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/arch/x86/rdrand.c b/src/arch/x86/rdrand.c
index dc7ed60a61..97aabd4ab5 100644
--- a/src/arch/x86/rdrand.c
+++ b/src/arch/x86/rdrand.c
@@ -38,6 +38,7 @@ static inline uint8_t rdrand_32(uint32_t *rand)
return carry;
}
+#if ENV_X86_64
/*
* Generate a 64-bit random number through RDRAND instruction.
* Carry flag is set on RDRAND success and 0 on failure.
@@ -51,6 +52,7 @@ static inline uint8_t rdrand_64(uint64_t *rand)
: "=a" (*rand), "=qm" (carry));
return carry;
}
+#endif
int get_random_number_32(uint32_t *rand)
{
@@ -71,9 +73,12 @@ int get_random_number_64(uint64_t *rand)
/* Perform a loop call until RDRAND succeeds or returns failure. */
for (i = 0; i < RDRAND_RETRY_LOOPS; i++) {
- if (ENV_X86_64 && rdrand_64(rand))
+#if ENV_X86_64
+ if (rdrand_64(rand))
return 0;
- else if (rdrand_32(&rand_high) && rdrand_32(&rand_low)) {
+ else
+#endif
+ if (rdrand_32(&rand_high) && rdrand_32(&rand_low)) {
*rand = ((uint64_t)rand_high << 32) |
(uint64_t)rand_low;
return 0;