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

test that reserved bits in pdes and ptes cause faults and that the
expected error code is issued.

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

diff --git a/user/test/x86/access.c b/user/test/x86/access.c
index 49f74b3..59a5756 100644
--- a/user/test/x86/access.c
+++ b/user/test/x86/access.c
@@ -43,6 +43,7 @@ enum {
     AC_PTE_ACCESSED,
     AC_PTE_DIRTY,
     AC_PTE_NX,
+    AC_PTE_BIT51,
 
     AC_PDE_PRESENT,
     AC_PDE_WRITABLE,
@@ -51,6 +52,7 @@ enum {
     AC_PDE_DIRTY,
     AC_PDE_PSE,
     AC_PDE_NX,
+    AC_PDE_BIT51,
 
     AC_ACCESS_USER,
     AC_ACCESS_WRITE,
@@ -71,6 +73,7 @@ const char *ac_names[] = {
     [AC_PTE_USER] = "pte.user",
     [AC_PTE_DIRTY] = "pte.d",
     [AC_PTE_NX] = "pte.nx",
+    [AC_PTE_BIT51] = "pte.51",
     [AC_PDE_PRESENT] = "pde.p",
     [AC_PDE_ACCESSED] = "pde.a",
     [AC_PDE_WRITABLE] = "pde.rw",
@@ -78,6 +81,7 @@ const char *ac_names[] = {
     [AC_PDE_DIRTY] = "pde.d",
     [AC_PDE_PSE] = "pde.pse",
     [AC_PDE_NX] = "pde.nx",
+    [AC_PDE_BIT51] = "pde.51",
     [AC_ACCESS_WRITE] = "write",
     [AC_ACCESS_USER] = "user",
     [AC_ACCESS_FETCH] = "fetch",
@@ -293,6 +297,7 @@ void ac_test_reset_pt_pool(ac_test_t *at)
 void ac_test_setup_pte(ac_test_t *at)
 {
     unsigned long root = read_cr3();
+    int pde_valid, pte_valid;
 
     if (!ac_test_enough_room(at))
        ac_test_reset_pt_pool(at);
@@ -328,6 +333,8 @@ void ac_test_setup_pte(ac_test_t *at)
                pte |= PT_DIRTY_MASK;
            if (at->flags[AC_PDE_NX])
                pte |= PT_NX_MASK;
+           if (at->flags[AC_PDE_BIT51])
+               pte |= 1ull << 51;
            at->pdep = &vroot[index];
            break;
        case 1:
@@ -344,6 +351,8 @@ void ac_test_setup_pte(ac_test_t *at)
                pte |= PT_DIRTY_MASK;
            if (at->flags[AC_PTE_NX])
                pte |= PT_NX_MASK;
+           if (at->flags[AC_PTE_BIT51])
+               pte |= 1ull << 51;
            at->ptep = &vroot[index];
            break;
        }
@@ -357,10 +366,15 @@ void ac_test_setup_pte(ac_test_t *at)
     at->expected_fault = 0;
     at->expected_error = PFERR_PRESENT_MASK;
 
+    pde_valid = at->flags[AC_PDE_PRESENT]
+        && !at->flags[AC_PDE_BIT51];
+    pte_valid = pde_valid
+        && at->flags[AC_PTE_PRESENT]
+        && !at->flags[AC_PTE_BIT51];
     if (at->flags[AC_ACCESS_TWICE]) {
-       if (at->flags[AC_PDE_PRESENT]) {
+       if (pde_valid) {
            at->expected_pde |= PT_ACCESSED_MASK;
-           if (at->flags[AC_PTE_PRESENT])
+           if (pte_valid)
                at->expected_pte |= PT_ACCESSED_MASK;
        }
     }
@@ -377,6 +391,9 @@ void ac_test_setup_pte(ac_test_t *at)
     if (!at->flags[AC_PDE_PRESENT]) {
        at->expected_fault = 1;
        at->expected_error &= ~PFERR_PRESENT_MASK;
+    } else if (!pde_valid) {
+        at->expected_fault = 1;
+        at->expected_error |= PFERR_RESERVED_MASK;
     }
 
     if (at->flags[AC_ACCESS_USER] && !at->flags[AC_PDE_USER])
@@ -404,6 +421,9 @@ void ac_test_setup_pte(ac_test_t *at)
     if (!at->flags[AC_PTE_PRESENT]) {
        at->expected_fault = 1;
        at->expected_error &= ~PFERR_PRESENT_MASK;
+    } else if (!pte_valid) {
+        at->expected_fault = 1;
+        at->expected_error |= PFERR_RESERVED_MASK;
     }
 
     if (at->flags[AC_ACCESS_USER] && !at->flags[AC_PTE_USER])
--
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