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 | order: PGD_TABLE_ORDER); |
16 | |
17 | if (ptdesc) { |
18 | ret = ptdesc_address(pt: 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 |