xref: /kvm-unit-tests/lib/x86/asm/page.h (revision be704aff683c54fc108deaafacc7cb89ad0648d9)
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