On Tue, May 03, 2016 at 01:48:09PM +0200, Alexander Gordeev wrote: > Cc: Andrew Jones <drjones@xxxxxxxxxx> > Cc: Thomas Huth <thuth@xxxxxxxxxx> > Cc: Radim Krčmář <rkrcmar@xxxxxxxxxx> > Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx> > Signed-off-by: Alexander Gordeev <agordeev@xxxxxxxxxx> > --- > lib/x86/asm/page.h | 3 +++ > lib/x86/vm.c | 4 ++-- > x86/access.c | 48 ++++++++++++++++++++---------------------------- > 3 files changed, 25 insertions(+), 30 deletions(-) > > diff --git a/lib/x86/asm/page.h b/lib/x86/asm/page.h > index 916462d..ac2a9c3 100644 > --- a/lib/x86/asm/page.h > +++ b/lib/x86/asm/page.h > @@ -24,7 +24,10 @@ > #define PTE_PRESENT (1ull << 0) > #define PTE_WRITE (1ull << 1) > #define PTE_USER (1ull << 2) > +#define PTE_ACCESSED (1ull << 5) > +#define PTE_DIRTY (1ull << 6) > #define PTE_PSE (1ull << 7) > +#define PTE_NX (1ull << 63) > #define PTE_ADDR (0xffffffffff000ull) > > #ifdef __x86_64__ > diff --git a/lib/x86/vm.c b/lib/x86/vm.c > index 9c94ca5..2018a83 100644 > --- a/lib/x86/vm.c > +++ b/lib/x86/vm.c > @@ -58,7 +58,7 @@ unsigned long *install_pte(unsigned long *cr3, > memset(new_pt, 0, PAGE_SIZE); > pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE | PTE_USER; > } > - pt = phys_to_virt(pt[offset] & 0xffffffffff000ull); > + pt = phys_to_virt(pt[offset] & PTE_ADDR); > } > offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK; > pt[offset] = pte; > @@ -78,7 +78,7 @@ unsigned long *get_pte(unsigned long *cr3, void *virt) > return NULL; > if (level == 2 && (pte & PTE_PSE)) > return &pt[offset]; > - pt = phys_to_virt(pte & 0xffffffffff000ull); > + pt = phys_to_virt(pte & PTE_ADDR); > } > offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK; > return &pt[offset]; > diff --git a/x86/access.c b/x86/access.c > index aaf805d..b6127aa 100644 > --- a/x86/access.c > +++ b/x86/access.c > @@ -19,14 +19,6 @@ static int invalid_mask; > #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) I think I was to hasty with my r-b last round. I just checked and these are the names we should keep, as they're consistent with the kernel, see arch/x86/kvm/mmu.h > - > #define CR0_WP_MASK (1UL << 16) > #define CR4_SMEP_MASK (1UL << 20) > > @@ -210,10 +202,10 @@ void set_cr4_smep(int smep) > return; > > if (smep) > - ptl2[2] &= ~PT_USER_MASK; > + ptl2[2] &= ~PTE_USER; > write_cr4(cr4); > if (!smep) > - ptl2[2] |= PT_USER_MASK; > + ptl2[2] |= PTE_USER; > } > > void set_cr4_pke(int pke) > @@ -362,9 +354,9 @@ pt_element_t ac_test_permissions(ac_test_t *at, unsigned flags, bool writable, > } > > if (!at->expected_fault) { > - expected |= PT_ACCESSED_MASK; > + expected |= PTE_ACCESSED; > if (F(AC_ACCESS_WRITE)) > - expected |= PT_DIRTY_MASK; > + expected |= PTE_DIRTY; > } > > return expected; > @@ -385,7 +377,7 @@ void ac_emulate_access(ac_test_t *at, unsigned flags) > at->expected_error |= PFERR_FETCH_MASK; > > if (!F(AC_PDE_ACCESSED)) > - at->ignore_pde = PT_ACCESSED_MASK; > + at->ignore_pde = PTE_ACCESSED; > > pde_valid = F(AC_PDE_PRESENT) > && !F(AC_PDE_BIT51) && !F(AC_PDE_BIT13) > @@ -411,7 +403,7 @@ void ac_emulate_access(ac_test_t *at, unsigned flags) > goto no_pte; > } > > - at->expected_pde |= PT_ACCESSED_MASK; > + at->expected_pde |= PTE_ACCESSED; > > pte_valid = F(AC_PTE_PRESENT) > && !F(AC_PTE_BIT51) > @@ -483,7 +475,7 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page, > case 4: > case 3: > pte = pd_page ? pd_page : ac_test_alloc_pt(pool); > - pte |= PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK; > + pte |= PTE_PRESENT | PTE_WRITE | PTE_USER; > break; > case 2: > if (!F(AC_PDE_PSE)) { > @@ -493,22 +485,22 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page, > pte |= 2ull << 59; > } else { > pte = at->phys & PT_PSE_BASE_ADDR_MASK; > - pte |= PT_PSE_MASK; > + pte |= PTE_PSE; > if (F(AC_PKU_PKEY)) > pte |= 1ull << 59; > } > if (F(AC_PDE_PRESENT)) > - pte |= PT_PRESENT_MASK; > + pte |= PTE_PRESENT; > if (F(AC_PDE_WRITABLE)) > - pte |= PT_WRITABLE_MASK; > + pte |= PTE_WRITE; > if (F(AC_PDE_USER)) > - pte |= PT_USER_MASK; > + pte |= PTE_USER; > if (F(AC_PDE_ACCESSED)) > - pte |= PT_ACCESSED_MASK; > + pte |= PTE_ACCESSED; > if (F(AC_PDE_DIRTY)) > - pte |= PT_DIRTY_MASK; > + pte |= PTE_DIRTY; > if (F(AC_PDE_NX)) > - pte |= PT_NX_MASK; > + pte |= PTE_NX; > if (F(AC_PDE_BIT51)) > pte |= 1ull << 51; > if (F(AC_PDE_BIT13)) > @@ -520,17 +512,17 @@ void __ac_setup_specific_pages(ac_test_t *at, ac_pool_t *pool, u64 pd_page, > if (F(AC_PKU_PKEY)) > pte |= 1ull << 59; > if (F(AC_PTE_PRESENT)) > - pte |= PT_PRESENT_MASK; > + pte |= PTE_PRESENT; > if (F(AC_PTE_WRITABLE)) > - pte |= PT_WRITABLE_MASK; > + pte |= PTE_WRITE; > if (F(AC_PTE_USER)) > - pte |= PT_USER_MASK; > + pte |= PTE_USER; > if (F(AC_PTE_ACCESSED)) > - pte |= PT_ACCESSED_MASK; > + pte |= PTE_ACCESSED; > if (F(AC_PTE_DIRTY)) > - pte |= PT_DIRTY_MASK; > + pte |= PTE_DIRTY; > if (F(AC_PTE_NX)) > - pte |= PT_NX_MASK; > + pte |= PTE_NX; > if (F(AC_PTE_BIT51)) > pte |= 1ull << 51; > at->ptep = &vroot[index]; > -- > 1.8.3.1 > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html