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