13e394a58SAlexander Gordeev #ifndef _ASM_X86_PAGE_H_ 23e394a58SAlexander Gordeev #define _ASM_X86_PAGE_H_ 33e394a58SAlexander Gordeev /* 43e394a58SAlexander Gordeev * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev <agordeev@redhat.com> 53e394a58SAlexander Gordeev * 63e394a58SAlexander Gordeev * This work is licensed under the terms of the GNU LGPL, version 2. 73e394a58SAlexander Gordeev */ 83e394a58SAlexander Gordeev 93e394a58SAlexander Gordeev 101ad15f10SAlexander Gordeev #include <linux/const.h> 11d10d16e1SAlexander Gordeev #include <bitops.h> 121ad15f10SAlexander Gordeev 134363f1d9SPaolo Bonzini typedef unsigned long pteval_t; 144363f1d9SPaolo Bonzini typedef unsigned long pgd_t; 154363f1d9SPaolo Bonzini 161ad15f10SAlexander Gordeev #define PAGE_SHIFT 12 171ad15f10SAlexander Gordeev #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) 181ad15f10SAlexander Gordeev #define PAGE_MASK (~(PAGE_SIZE-1)) 191ad15f10SAlexander Gordeev 201ad15f10SAlexander Gordeev #ifndef __ASSEMBLY__ 211ad15f10SAlexander Gordeev 225b70cbdbSClaudio Imbrenda #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE) 235b70cbdbSClaudio Imbrenda 243e394a58SAlexander Gordeev #ifdef __x86_64__ 253e394a58SAlexander Gordeev #define LARGE_PAGE_SIZE (512 * PAGE_SIZE) 263e394a58SAlexander Gordeev #else 273e394a58SAlexander Gordeev #define LARGE_PAGE_SIZE (1024 * PAGE_SIZE) 283e394a58SAlexander Gordeev #endif 293e394a58SAlexander Gordeev 30d10d16e1SAlexander Gordeev #define PT_PRESENT_MASK (1ull << 0) 31d10d16e1SAlexander Gordeev #define PT_WRITABLE_MASK (1ull << 1) 32d10d16e1SAlexander Gordeev #define PT_USER_MASK (1ull << 2) 33d10d16e1SAlexander Gordeev #define PT_ACCESSED_MASK (1ull << 5) 34d10d16e1SAlexander Gordeev #define PT_DIRTY_MASK (1ull << 6) 35d10d16e1SAlexander Gordeev #define PT_PAGE_SIZE_MASK (1ull << 7) 36d10d16e1SAlexander Gordeev #define PT64_NX_MASK (1ull << 63) 37d10d16e1SAlexander Gordeev #define PT_ADDR_MASK GENMASK_ULL(51, 12) 383e394a58SAlexander Gordeev 39*be704affSPeter Shier #define PDPTE64_PAGE_SIZE_MASK (1ull << 7) 40*be704affSPeter Shier #define PDPTE64_RSVD_MASK GENMASK_ULL(51, cpuid_maxphyaddr()) 41*be704affSPeter Shier 42359575f6SPeter Feiner #define PT_AD_MASK (PT_ACCESSED_MASK | PT_DIRTY_MASK) 43359575f6SPeter Feiner 44*be704affSPeter Shier #define PAE_PDPTE_RSVD_MASK (GENMASK_ULL(63, cpuid_maxphyaddr()) | \ 45*be704affSPeter Shier GENMASK_ULL(8, 5) | GENMASK_ULL(2, 1)) 46*be704affSPeter Shier 47*be704affSPeter Shier 483e394a58SAlexander Gordeev #ifdef __x86_64__ 493e394a58SAlexander Gordeev #define PAGE_LEVEL 4 50*be704affSPeter Shier #define PDPT_LEVEL 3 513e394a58SAlexander Gordeev #define PGDIR_WIDTH 9 523e394a58SAlexander Gordeev #define PGDIR_MASK 511 533e394a58SAlexander Gordeev #else 543e394a58SAlexander Gordeev #define PAGE_LEVEL 2 553e394a58SAlexander Gordeev #define PGDIR_WIDTH 10 563e394a58SAlexander Gordeev #define PGDIR_MASK 1023 573e394a58SAlexander Gordeev #endif 583e394a58SAlexander Gordeev 599d7e08c0SPeter Xu #define PGDIR_BITS(lvl) (((lvl) - 1) * PGDIR_WIDTH + PAGE_SHIFT) 609d7e08c0SPeter Xu #define PGDIR_OFFSET(va, lvl) (((va) >> PGDIR_BITS(lvl)) & PGDIR_MASK) 619d7e08c0SPeter Xu 621ad15f10SAlexander Gordeev #endif /* !__ASSEMBLY__ */ 633e394a58SAlexander Gordeev #endif 64