* [PATCH] nSVM: Test VMLOAD/VMSAVE intercepts
@ 2021-03-04 16:36 Krish Sadhukhan
2021-03-04 16:36 ` Krish Sadhukhan
0 siblings, 1 reply; 3+ messages in thread
From: Krish Sadhukhan @ 2021-03-04 16:36 UTC (permalink / raw)
To: kvm; +Cc: pbonzini, jmattson, seanjc
If VMLOAD/VMSAVE intercepts are disabled, no respective #VMEXIT to host
happens. Enabling VMLOAD/VMSAVE intercept will cause respective #VMEXIT
to host.
[PATCH] nSVM: Test VMLOAD/VMSAVE intercepts
x86/svm_tests.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
Krish Sadhukhan (1):
nSVM: Test VMLOAD/VMSAVE intercepts
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] nSVM: Test VMLOAD/VMSAVE intercepts
2021-03-04 16:36 [PATCH] nSVM: Test VMLOAD/VMSAVE intercepts Krish Sadhukhan
@ 2021-03-04 16:36 ` Krish Sadhukhan
2021-03-04 18:00 ` Paolo Bonzini
0 siblings, 1 reply; 3+ messages in thread
From: Krish Sadhukhan @ 2021-03-04 16:36 UTC (permalink / raw)
To: kvm; +Cc: pbonzini, jmattson, seanjc
If VMLOAD/VMSAVE intercepts are disabled, no respective #VMEXIT to host
happens. Enabling VMLOAD/VMSAVE intercept will cause respective #VMEXIT
to host.
Signed-off-by: Krish Sadhukhan <krish.sadhukhan@oracle.com>
---
x86/svm_tests.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/x86/svm_tests.c b/x86/svm_tests.c
index 29a0b59..7f4e63e 100644
--- a/x86/svm_tests.c
+++ b/x86/svm_tests.c
@@ -2382,6 +2382,69 @@ static void svm_vmrun_errata_test(void)
}
}
+static void vmload_vmsave_guest_main(struct svm_test *test)
+{
+ u64 vmcb_phys = virt_to_phys(vmcb);
+
+ asm volatile ("vmload %0" : : "a"(vmcb_phys));
+ asm volatile ("vmsave %0" : : "a"(vmcb_phys));
+}
+
+static void svm_vmload_vmsave(void)
+{
+ u32 intercept_saved = vmcb->control.intercept;
+
+ test_set_guest(vmload_vmsave_guest_main);
+
+ /*
+ * Disabling intercept for VMLOAD and VMSAVE doesn't cause
+ * respective #VMEXIT to host
+ */
+ vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMLOAD);
+ vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMSAVE);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
+
+ /*
+ * Enabling intercept for VMLOAD and VMSAVE causes respective
+ * #VMEXIT to host
+ */
+ vmcb->control.intercept |= (1ULL << INTERCEPT_VMLOAD);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMLOAD, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMLOAD #VMEXIT");
+ vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMLOAD);
+ vmcb->control.intercept |= (1ULL << INTERCEPT_VMSAVE);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMSAVE, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMSAVE #VMEXIT");
+ vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMSAVE);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
+
+ vmcb->control.intercept |= (1ULL << INTERCEPT_VMLOAD);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMLOAD, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMLOAD #VMEXIT");
+ vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMLOAD);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
+
+ vmcb->control.intercept |= (1ULL << INTERCEPT_VMSAVE);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMSAVE, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMSAVE #VMEXIT");
+ vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMSAVE);
+ svm_vmrun();
+ report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
+ "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
+
+ vmcb->control.intercept = intercept_saved;
+}
+
struct svm_test svm_tests[] = {
{ "null", default_supported, default_prepare,
default_prepare_gif_clear, null_test,
@@ -2495,5 +2558,6 @@ struct svm_test svm_tests[] = {
TEST(svm_cr4_osxsave_test),
TEST(svm_guest_state_test),
TEST(svm_vmrun_errata_test),
+ TEST(svm_vmload_vmsave),
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL }
};
--
2.27.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] nSVM: Test VMLOAD/VMSAVE intercepts
2021-03-04 16:36 ` Krish Sadhukhan
@ 2021-03-04 18:00 ` Paolo Bonzini
0 siblings, 0 replies; 3+ messages in thread
From: Paolo Bonzini @ 2021-03-04 18:00 UTC (permalink / raw)
To: Krish Sadhukhan, kvm; +Cc: jmattson, seanjc
On 04/03/21 17:36, Krish Sadhukhan wrote:
> If VMLOAD/VMSAVE intercepts are disabled, no respective #VMEXIT to host
> happens. Enabling VMLOAD/VMSAVE intercept will cause respective #VMEXIT
> to host.
>
> Signed-off-by: Krish Sadhukhan <krish.sadhukhan@oracle.com>
> ---
> x86/svm_tests.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 64 insertions(+)
>
> diff --git a/x86/svm_tests.c b/x86/svm_tests.c
> index 29a0b59..7f4e63e 100644
> --- a/x86/svm_tests.c
> +++ b/x86/svm_tests.c
> @@ -2382,6 +2382,69 @@ static void svm_vmrun_errata_test(void)
> }
> }
>
> +static void vmload_vmsave_guest_main(struct svm_test *test)
> +{
> + u64 vmcb_phys = virt_to_phys(vmcb);
> +
> + asm volatile ("vmload %0" : : "a"(vmcb_phys));
> + asm volatile ("vmsave %0" : : "a"(vmcb_phys));
> +}
> +
> +static void svm_vmload_vmsave(void)
> +{
> + u32 intercept_saved = vmcb->control.intercept;
> +
> + test_set_guest(vmload_vmsave_guest_main);
> +
> + /*
> + * Disabling intercept for VMLOAD and VMSAVE doesn't cause
> + * respective #VMEXIT to host
> + */
> + vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMLOAD);
> + vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMSAVE);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
> +
> + /*
> + * Enabling intercept for VMLOAD and VMSAVE causes respective
> + * #VMEXIT to host
> + */
> + vmcb->control.intercept |= (1ULL << INTERCEPT_VMLOAD);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMLOAD, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMLOAD #VMEXIT");
> + vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMLOAD);
> + vmcb->control.intercept |= (1ULL << INTERCEPT_VMSAVE);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMSAVE, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMSAVE #VMEXIT");
> + vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMSAVE);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
> +
> + vmcb->control.intercept |= (1ULL << INTERCEPT_VMLOAD);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMLOAD, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMLOAD #VMEXIT");
> + vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMLOAD);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
> +
> + vmcb->control.intercept |= (1ULL << INTERCEPT_VMSAVE);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMSAVE, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMSAVE #VMEXIT");
> + vmcb->control.intercept &= ~(1ULL << INTERCEPT_VMSAVE);
> + svm_vmrun();
> + report(vmcb->control.exit_code == SVM_EXIT_VMMCALL, "Test "
> + "VMLOAD/VMSAVE intercept: Expected VMMCALL #VMEXIT");
> +
> + vmcb->control.intercept = intercept_saved;
> +}
> +
> struct svm_test svm_tests[] = {
> { "null", default_supported, default_prepare,
> default_prepare_gif_clear, null_test,
> @@ -2495,5 +2558,6 @@ struct svm_test svm_tests[] = {
> TEST(svm_cr4_osxsave_test),
> TEST(svm_guest_state_test),
> TEST(svm_vmrun_errata_test),
> + TEST(svm_vmload_vmsave),
> { NULL, NULL, NULL, NULL, NULL, NULL, NULL }
> };
>
Queued, thanks.
Paolo
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-03-04 18:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-04 16:36 [PATCH] nSVM: Test VMLOAD/VMSAVE intercepts Krish Sadhukhan
2021-03-04 16:36 ` Krish Sadhukhan
2021-03-04 18:00 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).