From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joerg Roedel Subject: [PATCH 1/7] svm: Add test for selective cr0 intercept Date: Fri, 10 Sep 2010 17:34:04 +0200 Message-ID: <1284132850-19302-2-git-send-email-joerg.roedel@amd.com> References: <1284132850-19302-1-git-send-email-joerg.roedel@amd.com> Mime-Version: 1.0 Content-Type: text/plain Cc: , Joerg Roedel To: Avi Kivity , Marcelo Tosatti Return-path: Received: from tx2ehsobe003.messaging.microsoft.com ([65.55.88.13]:12590 "EHLO TX2EHSOBE005.bigfish.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754660Ab0IJPjq (ORCPT ); Fri, 10 Sep 2010 11:39:46 -0400 In-Reply-To: <1284132850-19302-1-git-send-email-joerg.roedel@amd.com> Sender: kvm-owner@vger.kernel.org List-ID: This patch adds a test to check if the selective cr0 intercept emulation of the kvm svm emulation works. Signed-off-by: Joerg Roedel --- x86/svm.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/x86/svm.c b/x86/svm.c index 2f1c900..e65360e 100644 --- a/x86/svm.c +++ b/x86/svm.c @@ -357,6 +357,40 @@ static bool check_asid_zero(struct test *test) return test->vmcb->control.exit_code == SVM_EXIT_ERR; } +static void sel_cr0_prepare(struct test *test) +{ + vmcb_ident(test->vmcb); + test->vmcb->control.intercept |= (1ULL << INTERCEPT_SELECTIVE_CR0); +} + +static bool sel_cr0_finished(struct test *test) +{ + return true; +} + +static void sel_cr0_test(struct test *test) +{ + unsigned long cr0; + + /* read cr0, clear CD, and write back */ + cr0 = read_cr0(); + cr0 |= (1UL << 30); + write_cr0(cr0); + + /* + * If we are here the test failed, not sure what to do now because we + * are not in guest-mode anymore so we can't trigger an intercept. + * Trigger a tripple-fault for now. + */ + printf("sel_cr0 test failed. Can not recover from this - exiting\n"); + exit(1); +} + +static bool sel_cr0_check(struct test *test) +{ + return test->vmcb->control.exit_code == SVM_EXIT_CR0_SEL_WRITE; +} + static struct test tests[] = { { "null", default_supported, default_prepare, null_test, default_finished, null_check }, @@ -377,7 +411,8 @@ static struct test tests[] = { mode_switch_finished, check_mode_switch }, { "asid_zero", default_supported, prepare_asid_zero, test_asid_zero, default_finished, check_asid_zero }, - + { "sel_cr0", default_supported, sel_cr0_prepare, sel_cr0_test, + sel_cr0_finished, sel_cr0_check }, }; int main(int ac, char **av) -- 1.7.0.4