1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 4 */ 5 6 #include <linux/stddef.h> 7 #include <linux/module.h> 8 #include <linux/memblock.h> 9 #include <linux/swap.h> 10 #include <linux/slab.h> 11 #include <asm/page.h> 12 #include <asm/pgalloc.h> 13 #include <as-layout.h> 14 #include <init.h> 15 #include <kern.h> 16 #include <kern_util.h> 17 #include <mem_user.h> 18 #include <os.h> 19 #include <um_malloc.h> 20 21 22 /* Allocate and free page tables. */ 23 24 pgd_t *pgd_alloc(struct mm_struct *mm) 25 { 26 pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL); 27 28 if (pgd) { 29 memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t)); 30 memcpy(pgd + USER_PTRS_PER_PGD, 31 swapper_pg_dir + USER_PTRS_PER_PGD, 32 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); 33 } 34 return pgd; 35 } 36 37 static const pgprot_t protection_map[16] = { 38 [VM_NONE] = PAGE_NONE, 39 [VM_READ] = PAGE_READONLY, 40 [VM_WRITE] = PAGE_COPY, 41 [VM_WRITE | VM_READ] = PAGE_COPY, 42 [VM_EXEC] = PAGE_READONLY_EXEC, 43 [VM_EXEC | VM_READ] = PAGE_READONLY_EXEC, 44 [VM_EXEC | VM_WRITE] = PAGE_COPY_EXEC, 45 [VM_EXEC | VM_WRITE | VM_READ] = PAGE_COPY_EXEC, 46 [VM_SHARED] = PAGE_NONE, 47 [VM_SHARED | VM_READ] = PAGE_READONLY, 48 [VM_SHARED | VM_WRITE] = PAGE_SHARED, 49 [VM_SHARED | VM_WRITE | VM_READ] = PAGE_SHARED, 50 [VM_SHARED | VM_EXEC] = PAGE_READONLY_EXEC, 51 [VM_SHARED | VM_EXEC | VM_READ] = PAGE_READONLY_EXEC, 52 [VM_SHARED | VM_EXEC | VM_WRITE] = PAGE_SHARED_EXEC, 53 [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] = PAGE_SHARED_EXEC 54 }; 55 DECLARE_VM_GET_PAGE_PROT 56