[PATCH kvm-unit-tests] Add a test case for MSR_KVM_GET_RNG_SEED

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

 



Signed-off-by: Andy Lutomirski <luto@xxxxxxxxxxxxxx>
---
 config/config-x86-common.mak |  5 ++++-
 x86/get_rng_seed.c           | 50 ++++++++++++++++++++++++++++++++++++++++++++
 x86/unittests.cfg            |  3 +++
 3 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 x86/get_rng_seed.c

diff --git a/config/config-x86-common.mak b/config/config-x86-common.mak
index 0b0da85..201a029 100644
--- a/config/config-x86-common.mak
+++ b/config/config-x86-common.mak
@@ -35,7 +35,8 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \
                $(TEST_DIR)/kvmclock_test.flat  $(TEST_DIR)/eventinj.flat \
                $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat \
                $(TEST_DIR)/tsc_adjust.flat $(TEST_DIR)/asyncpf.flat \
-               $(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat
+               $(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat \
+               $(TEST_DIR)/get_rng_seed.flat
 
 ifdef API
 tests-common += api/api-sample
@@ -105,6 +106,8 @@ $(TEST_DIR)/vmx.elf: $(cstart.o) $(TEST_DIR)/vmx.o $(TEST_DIR)/vmx_tests.o
 
 $(TEST_DIR)/debug.elf: $(cstart.o) $(TEST_DIR)/debug.o
 
+$(TEST_DIR)/get_rng_seed.elf: $(cstart.o) $(TEST_DIR)/get_rng_seed.o
+
 arch_clean:
 	$(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \
 	$(TEST_DIR)/.*.d lib/x86/.*.d
diff --git a/x86/get_rng_seed.c b/x86/get_rng_seed.c
new file mode 100644
index 0000000..b2e1b01
--- /dev/null
+++ b/x86/get_rng_seed.c
@@ -0,0 +1,50 @@
+/*
+ * Simple test for MSR_KVM_GET_RNG_SEED.
+ */
+#include "x86/msr.h"
+#include "x86/processor.h"
+#include "x86/apic-defs.h"
+#include "x86/apic.h"
+#include "x86/desc.h"
+#include "x86/isr.h"
+#include "x86/vm.h"
+
+#include "libcflat.h"
+#include <stdint.h>
+
+#define MSR_KVM_GET_RNG_SEED 0x4b564d05
+
+volatile int ngpfs;
+bool fail;
+
+static void gpf_isr(struct ex_regs *r)
+{
+	ngpfs++;
+	r->rip += 2;
+}
+
+int main(int ac, char **av)
+{
+	int loop = 3;
+	u64 val, prev = 0;
+
+	setup_vm();
+	setup_idt();
+	while(loop--) {
+		val = rdmsr(MSR_KVM_GET_RNG_SEED);
+		printf("rng seed: %llx\n", (unsigned long)val);
+		if (val == prev)
+			fail = true;
+		prev = val;
+	}
+
+	handle_exception(13, gpf_isr);
+	wrmsr(MSR_KVM_GET_RNG_SEED, 0);
+	if (ngpfs != 1) {
+		printf("error: wrmsr(MSR_KVM_GET_RNG_SEED) should not work\n");
+		fail = true;
+	}
+
+	printf("%s\n", fail ? "FAIL" : "PASS");
+	return fail;
+}
diff --git a/x86/unittests.cfg b/x86/unittests.cfg
index d78fe0e..98e5c7b 100644
--- a/x86/unittests.cfg
+++ b/x86/unittests.cfg
@@ -158,3 +158,6 @@ arch = x86_64
 [debug]
 file = debug.flat
 arch = x86_64
+
+[get_rng_seed]
+file = get_rnd_seed.flat
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[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