111 lines
3.3 KiB
Diff
111 lines
3.3 KiB
Diff
|
From 8d9a62a5fa89001266352a929c5d40b28c0dda85 Mon Sep 17 00:00:00 2001
|
||
|
From: Matt Weber <matthew.weber@rockwellcollins.com>
|
||
|
Date: Fri, 12 Jan 2018 19:07:27 -0600
|
||
|
Subject: [PATCH v2] kvm-unit-tests: test for rdseed/rdrand
|
||
|
|
||
|
The build fails when the host binutils isn't at least 2.23
|
||
|
(2.22.x introduced RDSEED).
|
||
|
|
||
|
Fixes:
|
||
|
http://autobuild.buildroot.net/results/c39/c3987a3cbd2960b0ff50f872636bdfd8d1a9c820/
|
||
|
|
||
|
Upstream:
|
||
|
https://marc.info/?l=kvm&m=151580743523259&w=2
|
||
|
|
||
|
Signed-off-by: Matthew Weber <matthew.weber@rockwellcollins.com>
|
||
|
---
|
||
|
Makefile | 2 +-
|
||
|
configure | 18 ++++++++++++++++++
|
||
|
x86/vmx_tests.c | 6 ++++++
|
||
|
3 files changed, 25 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/Makefile b/Makefile
|
||
|
index d9ad42b..799e9b5 100644
|
||
|
--- a/Makefile
|
||
|
+++ b/Makefile
|
||
|
@@ -50,7 +50,7 @@ include $(SRCDIR)/$(TEST_DIR)/Makefile
|
||
|
cc-option = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null \
|
||
|
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
|
||
|
|
||
|
-COMMON_CFLAGS += -g $(autodepend-flags)
|
||
|
+COMMON_CFLAGS += -g $(autodepend-flags) $(EXTRA_CFLAGS)
|
||
|
COMMON_CFLAGS += -Wall -Wwrite-strings -Wclobbered -Wempty-body -Wuninitialized
|
||
|
COMMON_CFLAGS += -Wignored-qualifiers -Wunused-but-set-parameter
|
||
|
frame-pointer-flag=-f$(if $(KEEP_FRAME_POINTER),no-,)omit-frame-pointer
|
||
|
diff --git a/configure b/configure
|
||
|
index dd9d361..21c0219 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
|
||
|
+ echo "Checking for rdseed/rdrand... No."
|
||
|
+ extra_cflags="-DNO_RDSEEDRAND"
|
||
|
+fi
|
||
|
+
|
||
|
# create the config
|
||
|
cat <<EOF > config.mak
|
||
|
SRCDIR=$srcdir
|
||
|
@@ -181,6 +198,7 @@ ARCH_NAME=$arch_name
|
||
|
PROCESSOR=$processor
|
||
|
CC=$cross_prefix$cc
|
||
|
CXX=$cross_prefix$cxx
|
||
|
+EXTRA_CFLAGS=$extra_cflags
|
||
|
LD=$cross_prefix$ld
|
||
|
OBJCOPY=$cross_prefix$objcopy
|
||
|
OBJDUMP=$cross_prefix$objdump
|
||
|
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
|
||
|
|