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 void fa_copy_user_highpage(struct page *to, struct page *from, 117 unsigned long vaddr, struct vm_area_struct *vma); 118 void fa_clear_user_highpage(struct page *page, unsigned long vaddr); 119 void feroceon_copy_user_highpage(struct page *to, struct page *from, 120 unsigned long vaddr, struct vm_area_struct *vma); 121 void feroceon_clear_user_highpage(struct page *page, unsigned long vaddr); 122 void v4_mc_copy_user_highpage(struct page *to, struct page *from, 123 unsigned long vaddr, struct vm_area_struct *vma); 124 void v4_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 125 void v4wb_copy_user_highpage(struct page *to, struct page *from, 126 unsigned long vaddr, struct vm_area_struct *vma); 127 void v4wb_clear_user_highpage(struct page *page, unsigned long vaddr); 128 void v4wt_copy_user_highpage(struct page *to, struct page *from, 129 unsigned long vaddr, struct vm_area_struct *vma); 130 void v4wt_clear_user_highpage(struct page *page, unsigned long vaddr); 131 void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, 132 unsigned long vaddr, struct vm_area_struct *vma); 133 void xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 134 void xscale_mc_copy_user_highpage(struct page *to, struct page *from, 135 unsigned long vaddr, struct vm_area_struct *vma); 136 void xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 137 138 #ifdef MULTI_USER 139 extern struct cpu_user_fns cpu_user; 140 141 #define __cpu_clear_user_highpage cpu_user.cpu_clear_user_highpage 142 #define __cpu_copy_user_highpage cpu_user.cpu_copy_user_highpage 143 144 #else 145 146 #define __cpu_clear_user_highpage __glue(_USER,_clear_user_highpage) 147 #define __cpu_copy_user_highpage __glue(_USER,_copy_user_highpage) 148 149 extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr); 150 extern void __cpu_copy_user_highpage(struct page *to, struct page *from, 151 unsigned long vaddr, struct vm_area_struct *vma); 152 #endif 153 154 #define clear_user_highpage(page,vaddr) \ 155 __cpu_clear_user_highpage(page, vaddr) 156 157 #define __HAVE_ARCH_COPY_USER_HIGHPAGE 158 #define copy_user_highpage(to,from,vaddr,vma) \ 159 __cpu_copy_user_highpage(to, from, vaddr, vma) 160 161 #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 162 extern void copy_page(void *to, const void *from); 163 164 #ifdef CONFIG_KUSER_HELPERS 165 #define __HAVE_ARCH_GATE_AREA 1 166 #endif 167 168 #ifdef CONFIG_ARM_LPAE 169 #include <asm/pgtable-3level-types.h> 170 #else 171 #include <asm/pgtable-2level-types.h> 172 #ifdef CONFIG_VMAP_STACK 173 #define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED 174 #endif 175 #endif 176 177 #endif /* CONFIG_MMU */ 178 179 typedef struct page *pgtable_t; 180 181 #ifdef CONFIG_HAVE_ARCH_PFN_VALID 182 extern int pfn_valid(unsigned long); 183 #define pfn_valid pfn_valid 184 #endif 185 186 #endif /* !__ASSEMBLY__ */ 187 188 #include <asm/memory.h> 189 190 #define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_TSK_EXEC 191 192 #include <asm-generic/getorder.h> 193 #include <asm-generic/memory_model.h> 194 195 #endif 196