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 #include <vdso/page.h> 11 12 #ifndef __ASSEMBLY__ 13 14 #ifndef CONFIG_MMU 15 16 #include <asm/page-nommu.h> 17 18 #else 19 20 #include <asm/glue.h> 21 22 /* 23 * User Space Model 24 * ================ 25 * 26 * This section selects the correct set of functions for dealing with 27 * page-based copying and clearing for user space for the particular 28 * processor(s) we're building for. 29 * 30 * We have the following to choose from: 31 * v4wt - ARMv4 with writethrough cache, without minicache 32 * v4wb - ARMv4 with writeback cache, without minicache 33 * v4_mc - ARMv4 with minicache 34 * xscale - Xscale 35 * xsc3 - XScalev3 36 */ 37 #undef _USER 38 #undef MULTI_USER 39 40 #ifdef CONFIG_CPU_COPY_V4WT 41 # ifdef _USER 42 # define MULTI_USER 1 43 # else 44 # define _USER v4wt 45 # endif 46 #endif 47 48 #ifdef CONFIG_CPU_COPY_V4WB 49 # ifdef _USER 50 # define MULTI_USER 1 51 # else 52 # define _USER v4wb 53 # endif 54 #endif 55 56 #ifdef CONFIG_CPU_COPY_FEROCEON 57 # ifdef _USER 58 # define MULTI_USER 1 59 # else 60 # define _USER feroceon 61 # endif 62 #endif 63 64 #ifdef CONFIG_CPU_COPY_FA 65 # ifdef _USER 66 # define MULTI_USER 1 67 # else 68 # define _USER fa 69 # endif 70 #endif 71 72 #ifdef CONFIG_CPU_SA1100 73 # ifdef _USER 74 # define MULTI_USER 1 75 # else 76 # define _USER v4_mc 77 # endif 78 #endif 79 80 #ifdef CONFIG_CPU_XSCALE 81 # ifdef _USER 82 # define MULTI_USER 1 83 # else 84 # define _USER xscale_mc 85 # endif 86 #endif 87 88 #ifdef CONFIG_CPU_XSC3 89 # ifdef _USER 90 # define MULTI_USER 1 91 # else 92 # define _USER xsc3_mc 93 # endif 94 #endif 95 96 #ifdef CONFIG_CPU_COPY_V6 97 # define MULTI_USER 1 98 #endif 99 100 #if !defined(_USER) && !defined(MULTI_USER) 101 #error Unknown user operations model 102 #endif 103 104 struct page; 105 struct vm_area_struct; 106 107 struct cpu_user_fns { 108 void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr); 109 void (*cpu_copy_user_highpage)(struct page *to, struct page *from, 110 unsigned long vaddr, struct vm_area_struct *vma); 111 }; 112 113 void fa_copy_user_highpage(struct page *to, struct page *from, 114 unsigned long vaddr, struct vm_area_struct *vma); 115 void fa_clear_user_highpage(struct page *page, unsigned long vaddr); 116 void feroceon_copy_user_highpage(struct page *to, struct page *from, 117 unsigned long vaddr, struct vm_area_struct *vma); 118 void feroceon_clear_user_highpage(struct page *page, unsigned long vaddr); 119 void v4_mc_copy_user_highpage(struct page *to, struct page *from, 120 unsigned long vaddr, struct vm_area_struct *vma); 121 void v4_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 122 void v4wb_copy_user_highpage(struct page *to, struct page *from, 123 unsigned long vaddr, struct vm_area_struct *vma); 124 void v4wb_clear_user_highpage(struct page *page, unsigned long vaddr); 125 void v4wt_copy_user_highpage(struct page *to, struct page *from, 126 unsigned long vaddr, struct vm_area_struct *vma); 127 void v4wt_clear_user_highpage(struct page *page, unsigned long vaddr); 128 void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, 129 unsigned long vaddr, struct vm_area_struct *vma); 130 void xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 131 void xscale_mc_copy_user_highpage(struct page *to, struct page *from, 132 unsigned long vaddr, struct vm_area_struct *vma); 133 void xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 134 135 #ifdef MULTI_USER 136 extern struct cpu_user_fns cpu_user; 137 138 #define __cpu_clear_user_highpage cpu_user.cpu_clear_user_highpage 139 #define __cpu_copy_user_highpage cpu_user.cpu_copy_user_highpage 140 141 #else 142 143 #define __cpu_clear_user_highpage __glue(_USER,_clear_user_highpage) 144 #define __cpu_copy_user_highpage __glue(_USER,_copy_user_highpage) 145 146 extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr); 147 extern void __cpu_copy_user_highpage(struct page *to, struct page *from, 148 unsigned long vaddr, struct vm_area_struct *vma); 149 #endif 150 151 #define clear_user_highpage(page,vaddr) \ 152 __cpu_clear_user_highpage(page, vaddr) 153 154 #define __HAVE_ARCH_COPY_USER_HIGHPAGE 155 #define copy_user_highpage(to,from,vaddr,vma) \ 156 __cpu_copy_user_highpage(to, from, vaddr, vma) 157 158 #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 159 extern void copy_page(void *to, const void *from); 160 161 #ifdef CONFIG_KUSER_HELPERS 162 #define __HAVE_ARCH_GATE_AREA 1 163 #endif 164 165 #ifdef CONFIG_ARM_LPAE 166 #include <asm/pgtable-3level-types.h> 167 #else 168 #include <asm/pgtable-2level-types.h> 169 #ifdef CONFIG_VMAP_STACK 170 #define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED 171 #endif 172 #endif 173 174 #endif /* CONFIG_MMU */ 175 176 typedef struct page *pgtable_t; 177 178 #ifdef CONFIG_HAVE_ARCH_PFN_VALID 179 extern int pfn_valid(unsigned long); 180 #define pfn_valid pfn_valid 181 #endif 182 183 #endif /* !__ASSEMBLY__ */ 184 185 #include <asm/memory.h> 186 187 #define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_TSK_EXEC 188 189 #include <asm-generic/getorder.h> 190 #include <asm-generic/memory_model.h> 191 192 #endif 193