@@ -2562,6 +2562,41 @@ static void guest_rflags_test_db_handler(struct ex_regs *r)
r->rflags &= ~X86_EFLAGS_TF;
}
+/*
+ * Support for TLB_CONTROL commands, other than 0x0 and 0x1, is optional
+ * and is indicated by CPUID Fn8000_000A_EDX[FlushByAsid].
+ * All encodings of TLB_CONTROL not defined in the APM are reserved.
+ */
+static void test_tlb_ctl(void)
+{
+ u64 tlb_ctl_saved = vmcb->control.tlb_ctl;
+ u64 i;
+
+ if (!this_cpu_has(X86_FEATURE_FLUSHBYASID)) {
+ int ret;
+ vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ASID;
+ ret = svm_vmrun();
+ report(ret == SVM_EXIT_ERR, "Test TLB_CONTROL: %x, CPU doesn't support FLUSH_ASID (encoding 0x3), VMRUN failure expected",
+ vmcb->control.tlb_ctl);
+
+ vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ASID_LOCAL;
+ report(svm_vmrun() == SVM_EXIT_ERR, "Test TLB_CONTROL: %x, CPU doesn't support FLUSH_ASID_LOCAL (encoding 0x7), VMRUN failure expected",
+ vmcb->control.tlb_ctl);
+ }
+
+ /*
+ * Test reserved encodings up to 0xf only
+ */
+ for (i = 0; i <= 0xf; i++) {
+ if (i == 0x2 || (i > 3 && i < 7) || i > 7) {
+ vmcb->control.tlb_ctl = i;
+ report(svm_vmrun() == SVM_EXIT_ERR, "Test TLB_CONTROL: %x, reserved encoding used, VMRUN failure expected", vmcb->control.tlb_ctl);
+ }
+ }
+
+ vmcb->control.tlb_ctl = tlb_ctl_saved;
+}
+
static void svm_guest_state_test(void)
{
test_set_guest(basic_guest_main);
@@ -2572,6 +2607,7 @@ static void svm_guest_state_test(void)
test_dr();
test_msrpm_iopm_bitmap_addrs();
test_canonicalization();
+ test_tlb_ctl();
}
extern void guest_rflags_test_guest(struct svm_test *test);
According to section "TLB Flush" in APM vol 2, "Support for TLB_CONTROL commands, other than 0x0 and 0x1, is optional and is indicated by CPUID Fn8000_000A_EDX[FlushByAsid]. All encodings of TLB_CONTROL not defined in the APM are reserved." Signed-off-by: Krish Sadhukhan <krish.sadhukhan@oracle.com> --- x86/svm_tests.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)