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