diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2020-05-09 10:06:02 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2020-05-09 10:06:02 -0400 |
commit | 401299a581d7b255a615de482c3a9e97e090fd8a (patch) | |
tree | 5f50a21c213161de0260ceaf7cd477bd2e1af5e9 | |
parent | b49a1a6d4e234a60211805b7cb0db06c9b293209 (diff) | |
download | kvm-unit-tests-401299a581d7b255a615de482c3a9e97e090fd8a.tar.gz |
svm_tests: add RSM intercept test
This test is currently broken, but it passes under QEMU.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | x86/svm_tests.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/x86/svm_tests.c b/x86/svm_tests.c index cb3ace1..c1abd55 100644 --- a/x86/svm_tests.c +++ b/x86/svm_tests.c @@ -66,6 +66,52 @@ static bool check_vmrun(struct svm_test *test) return vmcb->control.exit_code == SVM_EXIT_VMRUN; } +static void prepare_rsm_intercept(struct svm_test *test) +{ + default_prepare(test); + vmcb->control.intercept |= 1 << INTERCEPT_RSM; + vmcb->control.intercept_exceptions |= (1ULL << UD_VECTOR); +} + +static void test_rsm_intercept(struct svm_test *test) +{ + asm volatile ("rsm" : : : "memory"); +} + +static bool check_rsm_intercept(struct svm_test *test) +{ + return get_test_stage(test) == 2; +} + +static bool finished_rsm_intercept(struct svm_test *test) +{ + switch (get_test_stage(test)) { + case 0: + if (vmcb->control.exit_code != SVM_EXIT_RSM) { + report(false, "VMEXIT not due to rsm. Exit reason 0x%x", + vmcb->control.exit_code); + return true; + } + vmcb->control.intercept &= ~(1 << INTERCEPT_RSM); + inc_test_stage(test); + break; + + case 1: + if (vmcb->control.exit_code != SVM_EXIT_EXCP_BASE + UD_VECTOR) { + report(false, "VMEXIT not due to #UD. Exit reason 0x%x", + vmcb->control.exit_code); + return true; + } + vmcb->save.rip += 2; + inc_test_stage(test); + break; + + default: + return true; + } + return get_test_stage(test) == 2; +} + static void prepare_cr3_intercept(struct svm_test *test) { default_prepare(test); @@ -1819,6 +1865,9 @@ struct svm_test svm_tests[] = { { "vmrun intercept check", default_supported, prepare_no_vmrun_int, default_prepare_gif_clear, null_test, default_finished, check_no_vmrun_int }, + { "rsm", default_supported, + prepare_rsm_intercept, default_prepare_gif_clear, + test_rsm_intercept, finished_rsm_intercept, check_rsm_intercept }, { "cr3 read intercept", default_supported, prepare_cr3_intercept, default_prepare_gif_clear, test_cr3_intercept, default_finished, check_cr3_intercept }, |