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>
This commit is contained in:
Stefan Reinauer 2017-06-21 12:40:15 -07:00
parent 154d209ac3
commit 0380e0a68e
1 changed files with 7 additions and 2 deletions

View File

@ -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;