1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 */ 6 #include <linux/export.h> 7 #include <linux/mm.h> 8 #include <linux/string.h> 9 #include <asm/pgalloc.h> 10 11 pgd_t *pgd_alloc(struct mm_struct *mm) 12 { 13 pgd_t *init, *ret = NULL; 14 struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL & ~__GFP_HIGHMEM, 15 PGD_TABLE_ORDER); 16 17 if (ptdesc) { 18 ret = ptdesc_address(ptdesc); 19 init = pgd_offset(&init_mm, 0UL); 20 pgd_init(ret); 21 memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD, 22 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); 23 } 24 25 return ret; 26 } 27 EXPORT_SYMBOL_GPL(pgd_alloc); 28