aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2009-03-31 11:36:32 +0300
committerAvi Kivity <avi@redhat.com>2009-03-31 11:36:32 +0300
commitbae1eb4578ba77a68ea2a19574750b3e39724d64 (patch)
treecb69e60bd59faf6873872671a9d3f42478fed539
parent3564af5758c16cd26dda6e8f5787a9c0c56494f0 (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.c10
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 (