1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * arch/arm/include/asm/page.h 4 * 5 * Copyright (C) 1995-2003 Russell King 6 */ 7 #ifndef _ASMARM_PAGE_H 8 #define _ASMARM_PAGE_H 9 10 /* PAGE_SHIFT determines the page size */ 11 #define PAGE_SHIFT 12 12 #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) 13 #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) 14 15 #ifndef __ASSEMBLY__ 16 17 #ifndef CONFIG_MMU 18 19 #include <asm/page-nommu.h> 20 21 #else 22 23 #include <asm/glue.h> 24 25 /* 26 * User Space Model 27 * ================ 28 * 29 * This section selects the correct set of functions for dealing with 30 * page-based copying and clearing for user space for the particular 31 * processor(s) we're building for. 32 * 33 * We have the following to choose from: 34 * v4wt - ARMv4 with writethrough cache, without minicache 35 * v4wb - ARMv4 with writeback cache, without minicache 36 * v4_mc - ARMv4 with minicache 37 * xscale - Xscale 38 * xsc3 - XScalev3 39 */ 40 #undef _USER 41 #undef MULTI_USER 42 43 #ifdef CONFIG_CPU_COPY_V4WT 44 # ifdef _USER 45 # define MULTI_USER 1 46 # else 47 # define _USER v4wt 48 # endif 49 #endif 50 51 #ifdef CONFIG_CPU_COPY_V4WB 52 # ifdef _USER 53 # define MULTI_USER 1 54 # else 55 # define _USER v4wb 56 # endif 57 #endif 58 59 #ifdef CONFIG_CPU_COPY_FEROCEON 60 # ifdef _USER 61 # define MULTI_USER 1 62 # else 63 # define _USER feroceon 64 # endif 65 #endif 66 67 #ifdef CONFIG_CPU_COPY_FA 68 # ifdef _USER 69 # define MULTI_USER 1 70 # else 71 # define _USER fa 72 # endif 73 #endif 74 75 #ifdef CONFIG_CPU_SA1100 76 # ifdef _USER 77 # define MULTI_USER 1 78 # else 79 # define _USER v4_mc 80 # endif 81 #endif 82 83 #ifdef CONFIG_CPU_XSCALE 84 # ifdef _USER 85 # define MULTI_USER 1 86 # else 87 # define _USER xscale_mc 88 # endif 89 #endif 90 91 #ifdef CONFIG_CPU_XSC3 92 # ifdef _USER 93 # define MULTI_USER 1 94 # else 95 # define _USER xsc3_mc 96 # endif 97 #endif 98 99 #ifdef CONFIG_CPU_COPY_V6 100 # define MULTI_USER 1 101 #endif 102 103 #if !defined(_USER) && !defined(MULTI_USER) 104 #error Unknown user operations model 105 #endif 106 107 struct page; 108 struct vm_area_struct; 109 110 struct cpu_user_fns { 111 void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr); 112 void (*cpu_copy_user_highpage)(struct page *to, struct page *from, 113 unsigned long vaddr, struct vm_area_struct *vma); 114 }; 115 116 #ifdef MULTI_USER 117 extern struct cpu_user_fns cpu_user; 118 119 #define __cpu_clear_user_highpage cpu_user.cpu_clear_user_highpage 120 #define __cpu_copy_user_highpage cpu_user.cpu_copy_user_highpage 121 122 #else 123 124 #define __cpu_clear_user_highpage __glue(_USER,_clear_user_highpage) 125 #define __cpu_copy_user_highpage __glue(_USER,_copy_user_highpage) 126 127 extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr); 128 extern void __cpu_copy_user_highpage(struct page *to, struct page *from, 129 unsigned long vaddr, struct vm_area_struct *vma); 130 #endif 131 132 #define clear_user_highpage(page,vaddr) \ 133 __cpu_clear_user_highpage(page, vaddr) 134 135 #define __HAVE_ARCH_COPY_USER_HIGHPAGE 136 #define copy_user_highpage(to,from,vaddr,vma) \ 137 __cpu_copy_user_highpage(to, from, vaddr, vma) 138 139 #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 140 extern void copy_page(void *to, const void *from); 141 142 #ifdef CONFIG_KUSER_HELPERS 143 #define __HAVE_ARCH_GATE_AREA 1 144 #endif 145 146 #ifdef CONFIG_ARM_LPAE 147 #include <asm/pgtable-3level-types.h> 148 #else 149 #include <asm/pgtable-2level-types.h> 150 #endif 151 152 #endif /* CONFIG_MMU */ 153 154 typedef struct page *pgtable_t; 155 156 #ifdef CONFIG_HAVE_ARCH_PFN_VALID 157 extern int pfn_valid(unsigned long); 158 #endif 159 160 #include <asm/memory.h> 161 162 #endif /* !__ASSEMBLY__ */ 163 164 #define VM_DATA_DEFAULT_FLAGS \ 165 (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ 166 VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 167 168 #include <asm-generic/getorder.h> 169 170 #endif 171