xref: /linux/include/linux/pgalloc.h (revision 8026aed072e1221f0a61e5acc48c64546341bd4d)
1*f2d2f959SHarry Yoo /* SPDX-License-Identifier: GPL-2.0 */
2*f2d2f959SHarry Yoo #ifndef _LINUX_PGALLOC_H
3*f2d2f959SHarry Yoo #define _LINUX_PGALLOC_H
4*f2d2f959SHarry Yoo 
5*f2d2f959SHarry Yoo #include <linux/pgtable.h>
6*f2d2f959SHarry Yoo #include <asm/pgalloc.h>
7*f2d2f959SHarry Yoo 
8*f2d2f959SHarry Yoo /*
9*f2d2f959SHarry Yoo  * {pgd,p4d}_populate_kernel() are defined as macros to allow
10*f2d2f959SHarry Yoo  * compile-time optimization based on the configured page table levels.
11*f2d2f959SHarry Yoo  * Without this, linking may fail because callers (e.g., KASAN) may rely
12*f2d2f959SHarry Yoo  * on calls to these functions being optimized away when passing symbols
13*f2d2f959SHarry Yoo  * that exist only for certain page table levels.
14*f2d2f959SHarry Yoo  */
15*f2d2f959SHarry Yoo #define pgd_populate_kernel(addr, pgd, p4d)				\
16*f2d2f959SHarry Yoo 	do {								\
17*f2d2f959SHarry Yoo 		pgd_populate(&init_mm, pgd, p4d);			\
18*f2d2f959SHarry Yoo 		if (ARCH_PAGE_TABLE_SYNC_MASK & PGTBL_PGD_MODIFIED)	\
19*f2d2f959SHarry Yoo 			arch_sync_kernel_mappings(addr, addr);		\
20*f2d2f959SHarry Yoo 	} while (0)
21*f2d2f959SHarry Yoo 
22*f2d2f959SHarry Yoo #define p4d_populate_kernel(addr, p4d, pud)				\
23*f2d2f959SHarry Yoo 	do {								\
24*f2d2f959SHarry Yoo 		p4d_populate(&init_mm, p4d, pud);			\
25*f2d2f959SHarry Yoo 		if (ARCH_PAGE_TABLE_SYNC_MASK & PGTBL_P4D_MODIFIED)	\
26*f2d2f959SHarry Yoo 			arch_sync_kernel_mappings(addr, addr);		\
27*f2d2f959SHarry Yoo 	} while (0)
28*f2d2f959SHarry Yoo 
29*f2d2f959SHarry Yoo #endif /* _LINUX_PGALLOC_H */
30