[kvm-unit-tests PATCH v2 4/4] x86: nSVM: Move part of #NM test to exception test framework

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Remove the boiler plate code for #NM test and move #NM exception test in
exception test framework.

Keep the test case for the condition where #NM exception is not
generated as it is.

Signed-off-by: Manali Shukla <manali.shukla@xxxxxxx>
---
 x86/svm_tests.c | 44 ++++++++++++++++++++++++--------------------
 1 file changed, 24 insertions(+), 20 deletions(-)

diff --git a/x86/svm_tests.c b/x86/svm_tests.c
index b0f0980..2ed65c3 100644
--- a/x86/svm_tests.c
+++ b/x86/svm_tests.c
@@ -2807,34 +2807,18 @@ static void svm_nm_test_guest(struct svm_test *test)
 	asm volatile("fnop");
 }
 
-/* This test checks that:
- *
- * (a) If CR0.TS is set in L2, #NM is handled by L2 when
- *     just an L2 handler is registered.
- *
- * (b) If CR0.TS is cleared and CR0.EM is set, #NM is handled
- *     by L2 when just an l2 handler is registered.
- *
- * (c) If CR0.TS and CR0.EM are cleared in L2, no exception
- *     is generated.
+/*
+ * If CR0.TS and CR0.EM are cleared in L2, no exception
+ * is generated.
  */
-
 static void svm_nm_test(void)
 {
 	handle_exception(NM_VECTOR, guest_test_nm_handler);
 	write_cr0(read_cr0() & ~X86_CR0_TS);
 	test_set_guest(svm_nm_test_guest);
 
-	vmcb->save.cr0 = vmcb->save.cr0 | X86_CR0_TS;
-	report(svm_vmrun() == SVM_EXIT_VMMCALL && nm_test_counter == 1,
-	       "fnop with CR0.TS set in L2, #NM is triggered");
-
-	vmcb->save.cr0 = (vmcb->save.cr0 & ~X86_CR0_TS) | X86_CR0_EM;
-	report(svm_vmrun() == SVM_EXIT_VMMCALL && nm_test_counter == 2,
-	       "fnop with CR0.EM set in L2, #NM is triggered");
-
 	vmcb->save.cr0 = vmcb->save.cr0 & ~(X86_CR0_TS | X86_CR0_EM);
-	report(svm_vmrun() == SVM_EXIT_VMMCALL && nm_test_counter == 2,
+	report(svm_vmrun() == SVM_EXIT_VMMCALL && nm_test_counter == 0,
 	       "fnop with CR0.TS and CR0.EM unset no #NM excpetion");
 }
 
@@ -3308,6 +3292,24 @@ static void svm_l2_ac_test(struct svm_test *test)
 	vmmcall();
 }
 
+/*
+ * If CR0.TS is set in L2, #NM is generared
+ */
+static void svm_l2_nm_test(struct svm_test *svm)
+{
+	write_cr0(read_cr0() | X86_CR0_TS);
+	asm volatile("fnop");
+}
+
+/*
+ * If CR0.TS is cleared and CR0.EM is set, #NM is generated
+ */
+static void svm_l2_nm_test1(struct svm_test *svm)
+{
+	write_cr0((read_cr0() & ~X86_CR0_TS) | X86_CR0_EM);
+	asm volatile("fnop");
+}
+
 struct svm_exception_test {
 	u8 vector;
 	void (*guest_code)(struct svm_test*);
@@ -3321,6 +3323,8 @@ struct svm_exception_test svm_exception_tests[] = {
 	{ AC_VECTOR, svm_l2_ac_test },
 	{ BP_VECTOR, svm_l2_bp_test },
 	{ OF_VECTOR, svm_l2_of_test },
+	{ NM_VECTOR, svm_l2_nm_test },
+	{ NM_VECTOR, svm_l2_nm_test1 },
 };
 
 static u8 svm_exception_test_vector;
-- 
2.34.1




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux