From: Avi Kivity <a...@redhat.com>

Accesses with the NX bit set in a pte or pde behave differently when EFER.NXE
is set or unset.  Test that.

Signed-off-by: Avi Kivity <a...@redhat.com>

diff --git a/user/test/x86/access.c b/user/test/x86/access.c
index 59a5756..272a4ef 100644
--- a/user/test/x86/access.c
+++ b/user/test/x86/access.c
@@ -60,7 +60,7 @@ enum {
     AC_ACCESS_TWICE,
     // AC_ACCESS_PTE,
 
-    // AC_CPU_EFER_NX,
+    AC_CPU_EFER_NX,
     AC_CPU_CR0_WP,
 
     NR_AC_FLAGS
@@ -86,6 +86,7 @@ const char *ac_names[] = {
     [AC_ACCESS_USER] = "user",
     [AC_ACCESS_FETCH] = "fetch",
     [AC_ACCESS_TWICE] = "twice",
+    [AC_CPU_EFER_NX] = "efer.nx",
     [AC_CPU_CR0_WP] = "cr0.wp",
 };
 
@@ -367,10 +368,12 @@ void ac_test_setup_pte(ac_test_t *at)
     at->expected_error = PFERR_PRESENT_MASK;
 
     pde_valid = at->flags[AC_PDE_PRESENT]
-        && !at->flags[AC_PDE_BIT51];
+        && !at->flags[AC_PDE_BIT51]
+        && !(at->flags[AC_PDE_NX] && !at->flags[AC_CPU_EFER_NX]);
     pte_valid = pde_valid
         && at->flags[AC_PTE_PRESENT]
-        && !at->flags[AC_PTE_BIT51];
+        && !at->flags[AC_PTE_BIT51]
+        && !(at->flags[AC_PTE_NX] && !at->flags[AC_CPU_EFER_NX]);
     if (at->flags[AC_ACCESS_TWICE]) {
        if (pde_valid) {
            at->expected_pde |= PT_ACCESSED_MASK;
@@ -463,6 +466,7 @@ int ac_test_do_access(ac_test_t *at)
 
     unsigned r = unique;
     set_cr0_wp(at->flags[AC_CPU_CR0_WP]);
+    set_efer_nx(at->flags[AC_CPU_EFER_NX]);
 
     if (at->flags[AC_ACCESS_TWICE]) {
        asm volatile (
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to