xref: /linux/arch/um/kernel/mem-pgtable.c (revision 5b193d6a8973655f19de87a7873ce31dee2d5fe6)
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