kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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).