diff options
author | Avi Kivity <avi@redhat.com> | 2009-03-31 11:36:32 +0300 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2009-03-31 11:36:32 +0300 |
commit | bae1eb4578ba77a68ea2a19574750b3e39724d64 (patch) | |
tree | cb69e60bd59faf6873872671a9d3f42478fed539 | |
parent | 3564af5758c16cd26dda6e8f5787a9c0c56494f0 (diff) |
kvm: testsuite: test EFER.NXE
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 <avi@redhat.com>
-rw-r--r-- | kvm/user/test/x86/access.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/kvm/user/test/x86/access.c b/kvm/user/test/x86/access.c index 59a5756f6..272a4ef45 100644 --- a/kvm/user/test/x86/access.c +++ b/kvm/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 ( |