repository: /home/avi/kvm branch: master commit bdd2c9a33c96e85ce6503873ffebdda8e888228e Author: Avi Kivity <[EMAIL PROTECTED]> Date: Sun Dec 9 14:38:46 2007 +0200
kvm: testsuite: add large page access tests Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> diff --git a/user/test/x86/access.c b/user/test/x86/access.c index e793a20..df62c20 100644 --- a/user/test/x86/access.c +++ b/user/test/x86/access.c @@ -11,12 +11,14 @@ typedef unsigned long pt_element_t; #define PAGE_MASK (~(PAGE_SIZE-1)) #define PT_BASE_ADDR_MASK ((pt_element_t)((((pt_element_t)1 << 40) - 1) & PAGE_MASK)) +#define PT_PSE_BASE_ADDR_MASK (PT_BASE_ADDR_MASK & ~(1ull << 21)) #define PT_PRESENT_MASK ((pt_element_t)1 << 0) #define PT_WRITABLE_MASK ((pt_element_t)1 << 1) #define PT_USER_MASK ((pt_element_t)1 << 2) #define PT_ACCESSED_MASK ((pt_element_t)1 << 5) #define PT_DIRTY_MASK ((pt_element_t)1 << 6) +#define PT_PSE_MASK ((pt_element_t)1 << 7) #define PT_NX_MASK ((pt_element_t)1 << 63) #define CR0_WP_MASK (1UL << 16) @@ -47,6 +49,7 @@ enum { AC_PDE_USER, AC_PDE_ACCESSED, AC_PDE_DIRTY, + AC_PDE_PSE, AC_PDE_NX, AC_ACCESS_USER, @@ -73,6 +76,7 @@ const char *ac_names[] = { [AC_PDE_WRITABLE] = "pde.rw", [AC_PDE_USER] = "pde.user", [AC_PDE_DIRTY] = "pde.d", + [AC_PDE_PSE] = "pde.pse", [AC_PDE_NX] = "pde.nx", [AC_ACCESS_WRITE] = "write", [AC_ACCESS_USER] = "user", @@ -293,10 +297,11 @@ void ac_test_setup_pte(ac_test_t *at) if (!ac_test_enough_room(at)) ac_test_reset_pt_pool(at); - for (int i = 4; i >= 1; --i) { + at->ptep = 0; + for (int i = 4; i >= 1 && (i >= 2 || !at->flags[AC_PDE_PSE]); --i) { pt_element_t *vroot = va(root & PT_BASE_ADDR_MASK); unsigned index = ((unsigned long)at->virt >> (12 + (i-1) * 9)) & 511; - pt_element_t pte; + pt_element_t pte = 0; switch (i) { case 4: case 3: @@ -305,7 +310,12 @@ void ac_test_setup_pte(ac_test_t *at) pte |= PT_WRITABLE_MASK | PT_USER_MASK; break; case 2: - pte = ac_test_alloc_pt(at); + if (!at->flags[AC_PDE_PSE]) + pte = ac_test_alloc_pt(at); + else { + pte = at->phys & PT_PSE_BASE_ADDR_MASK; + pte |= PT_PSE_MASK; + } if (at->flags[AC_PDE_PRESENT]) pte |= PT_PRESENT_MASK; if (at->flags[AC_PDE_WRITABLE]) @@ -341,7 +351,8 @@ void ac_test_setup_pte(ac_test_t *at) root = vroot[index]; } invlpg(at->virt); - at->expected_pte = *at->ptep; + if (at->ptep) + at->expected_pte = *at->ptep; at->expected_pde = *at->pdep; at->expected_fault = 0; at->expected_error = PFERR_PRESENT_MASK; @@ -384,6 +395,12 @@ void ac_test_setup_pte(ac_test_t *at) at->expected_pde |= PT_ACCESSED_MASK; + if (at->flags[AC_PDE_PSE]) { + if (at->flags[AC_ACCESS_WRITE]) + at->expected_pde |= PT_DIRTY_MASK; + goto no_pte; + } + if (!at->flags[AC_PTE_PRESENT]) { at->expected_fault = 1; at->expected_error &= ~PFERR_PRESENT_MASK; @@ -407,6 +424,7 @@ void ac_test_setup_pte(ac_test_t *at) if (at->flags[AC_ACCESS_WRITE]) at->expected_pte |= PT_DIRTY_MASK; +no_pte: fault: ; } @@ -500,7 +518,7 @@ int ac_test_do_access(ac_test_t *at) printf("FAIL: error code %x expected %x\n", e, at->expected_error); return 0; } - if (*at->ptep != at->expected_pte) { + if (at->ptep && *at->ptep != at->expected_pte) { printf("FAIL: pte %x expected %x\n", *at->ptep, at->expected_pte); return 0; } ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits