Skip to content

Commit 0fa8b9b

Browse files
yosrym93sean-jc
authored andcommitted
x86/svm: Move CR0 selective write intercept test near CR3 intercept
It makes more semantic sense for these tests to be in close proximity. Signed-off-by: Yosry Ahmed <yosry.ahmed@linux.dev> Reviewed-by: Manali Shukla <manali.shukla@amd.com> Link: https://patch.msgid.link/20251110232642.633672-5-yosry.ahmed@linux.dev Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 5f57e54 commit 0fa8b9b

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

x86/svm_tests.c

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
115144
static 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)
827827
static 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

Comments
 (0)