From: Jim Mattson <jmattson@google.com>
To: kvm@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>
Cc: Jim Mattson <jmattson@google.com>,
Ricardo Koller <ricarkol@google.com>,
Peter Shier <pshier@google.com>
Subject: [kvm-unit-tests PATCH 1/2] x86: vmx: Add test for L2 change of CR4.OSXSAVE
Date: Thu, 29 Oct 2020 10:10:23 -0700 [thread overview]
Message-ID: <20201029171024.486256-1-jmattson@google.com> (raw)
If L1 allows L2 to modify CR4.OSXSAVE, then L0 kvm recalculates the
guest's CPUID.01H:ECX.OSXSAVE bit when the L2 guest changes
CR4.OSXSAVE via MOV-to-CR4. Verify that kvm also recalculates this
CPUID bit when loading L1's CR4 from the "host CR4" field of the
VMCS12.
Signed-off-by: Jim Mattson <jmattson@google.com>
Reviewed-by: Ricardo Koller <ricarkol@google.com>
Reviewed-by: Peter Shier <pshier@google.com>
---
lib/x86/processor.h | 52 +++++++++++++++++++++++++--------------------
x86/vmx_tests.c | 34 +++++++++++++++++++++++++++++
2 files changed, 63 insertions(+), 23 deletions(-)
diff --git a/lib/x86/processor.h b/lib/x86/processor.h
index c2c487c..79ebbd1 100644
--- a/lib/x86/processor.h
+++ b/lib/x86/processor.h
@@ -26,30 +26,31 @@
#define PF_VECTOR 14
#define AC_VECTOR 17
-#define X86_CR0_PE 0x00000001
-#define X86_CR0_MP 0x00000002
-#define X86_CR0_EM 0x00000004
-#define X86_CR0_TS 0x00000008
-#define X86_CR0_WP 0x00010000
-#define X86_CR0_AM 0x00040000
-#define X86_CR0_NW 0x20000000
-#define X86_CR0_CD 0x40000000
-#define X86_CR0_PG 0x80000000
+#define X86_CR0_PE 0x00000001
+#define X86_CR0_MP 0x00000002
+#define X86_CR0_EM 0x00000004
+#define X86_CR0_TS 0x00000008
+#define X86_CR0_WP 0x00010000
+#define X86_CR0_AM 0x00040000
+#define X86_CR0_NW 0x20000000
+#define X86_CR0_CD 0x40000000
+#define X86_CR0_PG 0x80000000
#define X86_CR3_PCID_MASK 0x00000fff
-#define X86_CR4_TSD 0x00000004
-#define X86_CR4_DE 0x00000008
-#define X86_CR4_PSE 0x00000010
-#define X86_CR4_PAE 0x00000020
-#define X86_CR4_MCE 0x00000040
-#define X86_CR4_PGE 0x00000080
-#define X86_CR4_PCE 0x00000100
-#define X86_CR4_UMIP 0x00000800
-#define X86_CR4_LA57 0x00001000
-#define X86_CR4_VMXE 0x00002000
-#define X86_CR4_PCIDE 0x00020000
-#define X86_CR4_SMEP 0x00100000
-#define X86_CR4_SMAP 0x00200000
-#define X86_CR4_PKE 0x00400000
+#define X86_CR4_TSD 0x00000004
+#define X86_CR4_DE 0x00000008
+#define X86_CR4_PSE 0x00000010
+#define X86_CR4_PAE 0x00000020
+#define X86_CR4_MCE 0x00000040
+#define X86_CR4_PGE 0x00000080
+#define X86_CR4_PCE 0x00000100
+#define X86_CR4_UMIP 0x00000800
+#define X86_CR4_LA57 0x00001000
+#define X86_CR4_VMXE 0x00002000
+#define X86_CR4_PCIDE 0x00020000
+#define X86_CR4_OSXSAVE 0x00040000
+#define X86_CR4_SMEP 0x00100000
+#define X86_CR4_SMAP 0x00200000
+#define X86_CR4_PKE 0x00400000
#define X86_EFLAGS_CF 0x00000001
#define X86_EFLAGS_FIXED 0x00000002
@@ -609,4 +610,9 @@ static inline int cpu_has_efer_nx(void)
return !!(this_cpu_has(X86_FEATURE_NX));
}
+static inline bool cpuid_osxsave(void)
+{
+ return cpuid(1).c & (1 << (X86_FEATURE_OSXSAVE % 32));
+}
+
#endif
diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index d2084ae..301ca85 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -8416,6 +8416,39 @@ static void vmx_cr_load_test(void)
TEST_ASSERT(!write_cr4_checking(orig_cr4));
}
+static void vmx_cr4_osxsave_test_guest(void)
+{
+ write_cr4(read_cr4() & ~X86_CR4_OSXSAVE);
+}
+
+/*
+ * Ensure that kvm recalculates the L1 guest's CPUID.01H:ECX.OSXSAVE
+ * after VM-exit from an L2 guest that sets CR4.OSXSAVE to a different
+ * value than in L1.
+ */
+static void vmx_cr4_osxsave_test(void)
+{
+ if (!this_cpu_has(X86_FEATURE_XSAVE)) {
+ report_skip("XSAVE not detected");
+ return;
+ }
+
+ if (!(read_cr4() & X86_CR4_OSXSAVE)) {
+ unsigned long cr4 = read_cr4() | X86_CR4_OSXSAVE;
+
+ write_cr4(cr4);
+ vmcs_write(GUEST_CR4, cr4);
+ vmcs_write(HOST_CR4, cr4);
+ }
+
+ TEST_ASSERT(cpuid_osxsave());
+
+ test_set_guest(vmx_cr4_osxsave_test_guest);
+ enter_guest();
+
+ TEST_ASSERT(cpuid_osxsave());
+}
+
static void vmx_nm_test_guest(void)
{
write_cr0(read_cr0() | X86_CR0_TS);
@@ -10496,6 +10529,7 @@ struct vmx_test vmx_tests[] = {
TEST(vmx_vmcs_shadow_test),
/* Regression tests */
TEST(vmx_cr_load_test),
+ TEST(vmx_cr4_osxsave_test),
TEST(vmx_nm_test),
TEST(vmx_db_test),
TEST(vmx_nmi_window_test),
--
2.29.1.341.ge80a0c044ae-goog
next reply other threads:[~2020-10-29 17:10 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-29 17:10 Jim Mattson [this message]
2020-10-29 17:10 ` [kvm-unit-tests PATCH 2/2] x86: svm: Add test for L2 change of CR4.OSXSAVE Jim Mattson
2020-10-31 13:55 ` Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201029171024.486256-1-jmattson@google.com \
--to=jmattson@google.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=pshier@google.com \
--cc=ricarkol@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.