A binutils of at least 2.23 is required (2.22.x introduced RDSEED). Signed-off-by: Matthew Weber <matthew.weber@xxxxxxxxxxxxxxxxxxx> --- configure | 17 +++++++++++++++++ x86/vmx_tests.c | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/configure b/configure index dd9d361..4912582 100755 --- a/configure +++ b/configure @@ -171,6 +171,23 @@ mkdir -p lib ln -sf "$asm" lib/asm +cat > rd_test.c <<EOF +#include <stdint.h> +int main() { + uint16_t seed=0; + unsigned char ok; + asm volatile ("rdseed %0; setc %1" + : "=r" (seed), "=qm" (ok)); + return ok; +} +EOF +if $cross_prefix$cc -o /dev/null rd_test.c &> /dev/null; then + echo "Checking for rdseed/rdrand... Yes." +else + CFLAGS="${CFLAGS} -DNO_RDSEEDRAND" + echo "Checking for rdseed/rdrand... No." +fi + # create the config cat <<EOF > config.mak SRCDIR=$srcdir diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c index 4a3e94b..2cbe3eb 100644 --- a/x86/vmx_tests.c +++ b/x86/vmx_tests.c @@ -770,8 +770,10 @@ asm( "insn_sldt: sldt %ax;ret\n\t" "insn_lldt: xor %eax, %eax; lldt %ax;ret\n\t" "insn_str: str %ax;ret\n\t" +#ifndef NO_RDSEEDRAND "insn_rdrand: rdrand %rax;ret\n\t" "insn_rdseed: rdseed %rax;ret\n\t" +#endif ); extern void insn_hlt(); extern void insn_invlpg(); @@ -796,8 +798,10 @@ extern void insn_lldt(); extern void insn_str(); extern void insn_cpuid(); extern void insn_invd(); +#ifndef NO_RDSEEDRAND extern void insn_rdrand(); extern void insn_rdseed(); +#endif u32 cur_insn; u64 cr3; @@ -853,8 +857,10 @@ static struct insn_table insn_table[] = { {"DESC_TABLE (LLDT)", CPU_DESC_TABLE, insn_lldt, INSN_CPU1, 47, 0, 0, 0}, {"DESC_TABLE (STR)", CPU_DESC_TABLE, insn_str, INSN_CPU1, 47, 0, 0, 0}, /* LTR causes a #GP if done with a busy selector, so it is not tested. */ +#ifndef NO_RDSEEDRAND {"RDRAND", CPU_RDRAND, insn_rdrand, INSN_CPU1, VMX_RDRAND, 0, 0, 0}, {"RDSEED", CPU_RDSEED, insn_rdseed, INSN_CPU1, VMX_RDSEED, 0, 0, 0}, +#endif // Instructions always trap {"CPUID", 0, insn_cpuid, INSN_ALWAYS_TRAP, 10, 0, 0, 0}, {"INVD", 0, insn_invd, INSN_ALWAYS_TRAP, 13, 0, 0, 0}, -- 1.9.1