@@ -112,6 +112,35 @@ static bool finished_rsm_intercept(struct svm_test *test)
112112 return get_test_stage (test ) == 2 ;
113113}
114114
115+ static void prepare_sel_cr0_intercept (struct svm_test * test )
116+ {
117+ vmcb -> save .cr0 &= ~X86_CR0_CD ;
118+ vmcb -> control .intercept |= (1ULL << INTERCEPT_SELECTIVE_CR0 );
119+ }
120+
121+ static void test_sel_cr0_write_intercept (struct svm_test * test )
122+ {
123+ unsigned long cr0 ;
124+
125+ /* read cr0, set CD, and write back */
126+ cr0 = read_cr0 ();
127+ cr0 |= X86_CR0_CD ;
128+ write_cr0 (cr0 );
129+
130+ /*
131+ * If we are here the test failed, not sure what to do now because we
132+ * are not in guest-mode anymore so we can't trigger an intercept.
133+ * Trigger a tripple-fault for now.
134+ */
135+ report_fail ("sel_cr0 test. Can not recover from this - exiting" );
136+ exit (report_summary ());
137+ }
138+
139+ static bool check_sel_cr0_intercept (struct svm_test * test )
140+ {
141+ return vmcb -> control .exit_code == SVM_EXIT_CR0_SEL_WRITE ;
142+ }
143+
115144static void prepare_cr3_intercept (struct svm_test * test )
116145{
117146 default_prepare (test );
@@ -793,35 +822,6 @@ static bool check_asid_zero(struct svm_test *test)
793822 return vmcb -> control .exit_code == SVM_EXIT_ERR ;
794823}
795824
796- static void prepare_sel_cr0_intercept (struct svm_test * test )
797- {
798- vmcb -> save .cr0 &= ~X86_CR0_CD ;
799- vmcb -> control .intercept |= (1ULL << INTERCEPT_SELECTIVE_CR0 );
800- }
801-
802- static void test_sel_cr0_write_intercept (struct svm_test * test )
803- {
804- unsigned long cr0 ;
805-
806- /* read cr0, set CD, and write back */
807- cr0 = read_cr0 ();
808- cr0 |= X86_CR0_CD ;
809- write_cr0 (cr0 );
810-
811- /*
812- * If we are here the test failed, not sure what to do now because we
813- * are not in guest-mode anymore so we can't trigger an intercept.
814- * Trigger a tripple-fault for now.
815- */
816- report_fail ("sel_cr0 test. Can not recover from this - exiting" );
817- exit (report_summary ());
818- }
819-
820- static bool check_sel_cr0_intercept (struct svm_test * test )
821- {
822- return vmcb -> control .exit_code == SVM_EXIT_CR0_SEL_WRITE ;
823- }
824-
825825#define TSC_ADJUST_VALUE (1ll << 32)
826826#define TSC_OFFSET_VALUE (~0ull << 48)
827827static bool ok ;
@@ -3458,6 +3458,9 @@ struct svm_test svm_tests[] = {
34583458 { "rsm" , default_supported ,
34593459 prepare_rsm_intercept , default_prepare_gif_clear ,
34603460 test_rsm_intercept , finished_rsm_intercept , check_rsm_intercept },
3461+ { "sel cr0 write intercept" , default_supported ,
3462+ prepare_sel_cr0_intercept , default_prepare_gif_clear ,
3463+ test_sel_cr0_write_intercept , default_finished , check_sel_cr0_intercept },
34613464 { "cr3 read intercept" , default_supported ,
34623465 prepare_cr3_intercept , default_prepare_gif_clear ,
34633466 test_cr3_intercept , default_finished , check_cr3_intercept },
@@ -3482,9 +3485,6 @@ struct svm_test svm_tests[] = {
34823485 { "asid_zero" , default_supported , prepare_asid_zero ,
34833486 default_prepare_gif_clear , test_asid_zero ,
34843487 default_finished , check_asid_zero },
3485- { "sel cr0 write intercept" , default_supported ,
3486- prepare_sel_cr0_intercept , default_prepare_gif_clear ,
3487- test_sel_cr0_write_intercept , default_finished , check_sel_cr0_intercept },
34883488 { "tsc_adjust" , tsc_adjust_supported , tsc_adjust_prepare ,
34893489 default_prepare_gif_clear , tsc_adjust_test ,
34903490 default_finished , tsc_adjust_check },
0 commit comments