[PATCH] x86/vmx_tests: test for rdseed/rdrand

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux