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