summaryrefslogtreecommitdiff
path: root/kvm
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2010-07-28 19:25:47 +0300
committerMarcelo Tosatti <mtosatti@redhat.com>2010-07-29 18:30:36 -0300
commite48a4fcce2e740e717edca561b6cbc88dc676dc5 (patch)
tree96974ed955fc2304b8759334365ead7a6daba2d0 /kvm
parenta405414fb783f67b54fe4a15db236d97f4007614 (diff)
test: add intercepted and unintercepted cr3 read tests for svm
Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'kvm')
-rw-r--r--kvm/test/x86/svm.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/kvm/test/x86/svm.c b/kvm/test/x86/svm.c
index 5bb64ff29..222356d93 100644
--- a/kvm/test/x86/svm.c
+++ b/kvm/test/x86/svm.c
@@ -146,12 +146,36 @@ static bool check_vmrun(struct test *test)
return test->vmcb->control.exit_code == SVM_EXIT_VMRUN;
}
+static void prepare_cr3_intercept(struct test *test)
+{
+ default_prepare(test);
+ test->vmcb->control.intercept_cr_read |= 1 << 3;
+}
+
+static void test_cr3_intercept(struct test *test)
+{
+ asm volatile ("mov %%cr3, %0" : "=r"(test->scratch) : : "memory");
+}
+
+static bool check_cr3_intercept(struct test *test)
+{
+ return test->vmcb->control.exit_code == SVM_EXIT_READ_CR3;
+}
+
+static bool check_cr3_nointercept(struct test *test)
+{
+ return null_check(test) && test->scratch == read_cr3();
+}
+
static struct test tests[] = {
{ "null", default_prepare, null_test, default_finished, null_check },
{ "vmrun", default_prepare, test_vmrun, default_finished, check_vmrun },
{ "vmrun intercept check", prepare_no_vmrun_int, null_test,
default_finished, check_no_vmrun_int },
-
+ { "cr3 read intercept", prepare_cr3_intercept, test_cr3_intercept,
+ default_finished, check_cr3_intercept },
+ { "cr3 read nointercept", default_prepare, test_cr3_intercept,
+ default_finished, check_cr3_nointercept },
};
int main(int ac, char **av)