1*4882a593SmuzhiyunFrom 8d9a62a5fa89001266352a929c5d40b28c0dda85 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Matt Weber <matthew.weber@rockwellcollins.com>
3*4882a593SmuzhiyunDate: Fri, 12 Jan 2018 19:07:27 -0600
4*4882a593SmuzhiyunSubject: [PATCH v2] kvm-unit-tests: test for rdseed/rdrand
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunThe build fails when the host binutils isn't at least 2.23
7*4882a593Smuzhiyun(2.22.x introduced RDSEED).
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunFixes:
10*4882a593Smuzhiyunhttp://autobuild.buildroot.net/results/c39/c3987a3cbd2960b0ff50f872636bdfd8d1a9c820/
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunUpstream:
13*4882a593Smuzhiyunhttps://marc.info/?l=kvm&m=151580743523259&w=2
14*4882a593Smuzhiyun
15*4882a593SmuzhiyunSigned-off-by: Matthew Weber <matthew.weber@rockwellcollins.com>
16*4882a593Smuzhiyun---
17*4882a593Smuzhiyun Makefile        |  2 +-
18*4882a593Smuzhiyun configure       | 18 ++++++++++++++++++
19*4882a593Smuzhiyun x86/vmx_tests.c |  6 ++++++
20*4882a593Smuzhiyun 3 files changed, 25 insertions(+), 1 deletion(-)
21*4882a593Smuzhiyun
22*4882a593Smuzhiyundiff --git a/Makefile b/Makefile
23*4882a593Smuzhiyunindex d9ad42b..799e9b5 100644
24*4882a593Smuzhiyun--- a/Makefile
25*4882a593Smuzhiyun+++ b/Makefile
26*4882a593Smuzhiyun@@ -50,7 +50,7 @@ include $(SRCDIR)/$(TEST_DIR)/Makefile
27*4882a593Smuzhiyun cc-option = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null \
28*4882a593Smuzhiyun               > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun-COMMON_CFLAGS += -g $(autodepend-flags)
31*4882a593Smuzhiyun+COMMON_CFLAGS += -g $(autodepend-flags) $(EXTRA_CFLAGS)
32*4882a593Smuzhiyun COMMON_CFLAGS += -Wall -Wwrite-strings -Wclobbered -Wempty-body -Wuninitialized
33*4882a593Smuzhiyun COMMON_CFLAGS += -Wignored-qualifiers -Wunused-but-set-parameter
34*4882a593Smuzhiyun frame-pointer-flag=-f$(if $(KEEP_FRAME_POINTER),no-,)omit-frame-pointer
35*4882a593Smuzhiyundiff --git a/configure b/configure
36*4882a593Smuzhiyunindex dd9d361..21c0219 100755
37*4882a593Smuzhiyun--- a/configure
38*4882a593Smuzhiyun+++ b/configure
39*4882a593Smuzhiyun@@ -171,6 +171,23 @@ mkdir -p lib
40*4882a593Smuzhiyun ln -sf "$asm" lib/asm
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun+cat > rd_test.c <<EOF
44*4882a593Smuzhiyun+#include <stdint.h>
45*4882a593Smuzhiyun+int main() {
46*4882a593Smuzhiyun+   uint16_t seed=0;
47*4882a593Smuzhiyun+   unsigned char ok;
48*4882a593Smuzhiyun+   asm volatile ("rdseed %0; setc %1"
49*4882a593Smuzhiyun+                 : "=r" (seed), "=qm" (ok));
50*4882a593Smuzhiyun+   return ok;
51*4882a593Smuzhiyun+}
52*4882a593Smuzhiyun+EOF
53*4882a593Smuzhiyun+if $cross_prefix$cc -o /dev/null rd_test.c &> /dev/null; then
54*4882a593Smuzhiyun+  echo "Checking for rdseed/rdrand... Yes."
55*4882a593Smuzhiyun+else
56*4882a593Smuzhiyun+  echo "Checking for rdseed/rdrand... No."
57*4882a593Smuzhiyun+  extra_cflags="-DNO_RDSEEDRAND"
58*4882a593Smuzhiyun+fi
59*4882a593Smuzhiyun+
60*4882a593Smuzhiyun # create the config
61*4882a593Smuzhiyun cat <<EOF > config.mak
62*4882a593Smuzhiyun SRCDIR=$srcdir
63*4882a593Smuzhiyun@@ -181,6 +198,7 @@ ARCH_NAME=$arch_name
64*4882a593Smuzhiyun PROCESSOR=$processor
65*4882a593Smuzhiyun CC=$cross_prefix$cc
66*4882a593Smuzhiyun CXX=$cross_prefix$cxx
67*4882a593Smuzhiyun+EXTRA_CFLAGS=$extra_cflags
68*4882a593Smuzhiyun LD=$cross_prefix$ld
69*4882a593Smuzhiyun OBJCOPY=$cross_prefix$objcopy
70*4882a593Smuzhiyun OBJDUMP=$cross_prefix$objdump
71*4882a593Smuzhiyundiff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
72*4882a593Smuzhiyunindex 4a3e94b..2cbe3eb 100644
73*4882a593Smuzhiyun--- a/x86/vmx_tests.c
74*4882a593Smuzhiyun+++ b/x86/vmx_tests.c
75*4882a593Smuzhiyun@@ -770,8 +770,10 @@ asm(
76*4882a593Smuzhiyun 	"insn_sldt: sldt %ax;ret\n\t"
77*4882a593Smuzhiyun 	"insn_lldt: xor %eax, %eax; lldt %ax;ret\n\t"
78*4882a593Smuzhiyun 	"insn_str: str %ax;ret\n\t"
79*4882a593Smuzhiyun+#ifndef NO_RDSEEDRAND
80*4882a593Smuzhiyun 	"insn_rdrand: rdrand %rax;ret\n\t"
81*4882a593Smuzhiyun 	"insn_rdseed: rdseed %rax;ret\n\t"
82*4882a593Smuzhiyun+#endif
83*4882a593Smuzhiyun );
84*4882a593Smuzhiyun extern void insn_hlt();
85*4882a593Smuzhiyun extern void insn_invlpg();
86*4882a593Smuzhiyun@@ -796,8 +798,10 @@ extern void insn_lldt();
87*4882a593Smuzhiyun extern void insn_str();
88*4882a593Smuzhiyun extern void insn_cpuid();
89*4882a593Smuzhiyun extern void insn_invd();
90*4882a593Smuzhiyun+#ifndef NO_RDSEEDRAND
91*4882a593Smuzhiyun extern void insn_rdrand();
92*4882a593Smuzhiyun extern void insn_rdseed();
93*4882a593Smuzhiyun+#endif
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun u32 cur_insn;
96*4882a593Smuzhiyun u64 cr3;
97*4882a593Smuzhiyun@@ -853,8 +857,10 @@ static struct insn_table insn_table[] = {
98*4882a593Smuzhiyun 	{"DESC_TABLE (LLDT)", CPU_DESC_TABLE, insn_lldt, INSN_CPU1, 47, 0, 0, 0},
99*4882a593Smuzhiyun 	{"DESC_TABLE (STR)", CPU_DESC_TABLE, insn_str, INSN_CPU1, 47, 0, 0, 0},
100*4882a593Smuzhiyun 	/* LTR causes a #GP if done with a busy selector, so it is not tested.  */
101*4882a593Smuzhiyun+#ifndef NO_RDSEEDRAND
102*4882a593Smuzhiyun 	{"RDRAND", CPU_RDRAND, insn_rdrand, INSN_CPU1, VMX_RDRAND, 0, 0, 0},
103*4882a593Smuzhiyun 	{"RDSEED", CPU_RDSEED, insn_rdseed, INSN_CPU1, VMX_RDSEED, 0, 0, 0},
104*4882a593Smuzhiyun+#endif
105*4882a593Smuzhiyun 	// Instructions always trap
106*4882a593Smuzhiyun 	{"CPUID", 0, insn_cpuid, INSN_ALWAYS_TRAP, 10, 0, 0, 0},
107*4882a593Smuzhiyun 	{"INVD", 0, insn_invd, INSN_ALWAYS_TRAP, 13, 0, 0, 0},
108*4882a593Smuzhiyun--
109*4882a593Smuzhiyun1.9.1
110*4882a593Smuzhiyun
111