1 /* 2 * arch/arm/include/asm/page.h 3 * 4 * Copyright (C) 1995-2003 Russell King 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 #ifndef _ASMARM_PAGE_H 11 #define _ASMARM_PAGE_H 12 13 /* PAGE_SHIFT determines the page size */ 14 #define PAGE_SHIFT 12 15 #define PAGE_SIZE (1UL << PAGE_SHIFT) 16 #define PAGE_MASK (~(PAGE_SIZE-1)) 17 18 #ifndef __ASSEMBLY__ 19 20 #ifndef CONFIG_MMU 21 22 #include "page-nommu.h" 23 24 #else 25 26 #include <asm/glue.h> 27 28 /* 29 * User Space Model 30 * ================ 31 * 32 * This section selects the correct set of functions for dealing with 33 * page-based copying and clearing for user space for the particular 34 * processor(s) we're building for. 35 * 36 * We have the following to choose from: 37 * v3 - ARMv3 38 * v4wt - ARMv4 with writethrough cache, without minicache 39 * v4wb - ARMv4 with writeback cache, without minicache 40 * v4_mc - ARMv4 with minicache 41 * xscale - Xscale 42 * xsc3 - XScalev3 43 */ 44 #undef _USER 45 #undef MULTI_USER 46 47 #ifdef CONFIG_CPU_COPY_V3 48 # ifdef _USER 49 # define MULTI_USER 1 50 # else 51 # define _USER v3 52 # endif 53 #endif 54 55 #ifdef CONFIG_CPU_COPY_V4WT 56 # ifdef _USER 57 # define MULTI_USER 1 58 # else 59 # define _USER v4wt 60 # endif 61 #endif 62 63 #ifdef CONFIG_CPU_COPY_V4WB 64 # ifdef _USER 65 # define MULTI_USER 1 66 # else 67 # define _USER v4wb 68 # endif 69 #endif 70 71 #ifdef CONFIG_CPU_COPY_FEROCEON 72 # ifdef _USER 73 # define MULTI_USER 1 74 # else 75 # define _USER feroceon 76 # endif 77 #endif 78 79 #ifdef CONFIG_CPU_COPY_FA 80 # ifdef _USER 81 # define MULTI_USER 1 82 # else 83 # define _USER fa 84 # endif 85 #endif 86 87 #ifdef CONFIG_CPU_SA1100 88 # ifdef _USER 89 # define MULTI_USER 1 90 # else 91 # define _USER v4_mc 92 # endif 93 #endif 94 95 #ifdef CONFIG_CPU_XSCALE 96 # ifdef _USER 97 # define MULTI_USER 1 98 # else 99 # define _USER xscale_mc 100 # endif 101 #endif 102 103 #ifdef CONFIG_CPU_XSC3 104 # ifdef _USER 105 # define MULTI_USER 1 106 # else 107 # define _USER xsc3_mc 108 # endif 109 #endif 110 111 #ifdef CONFIG_CPU_COPY_V6 112 # define MULTI_USER 1 113 #endif 114 115 #if !defined(_USER) && !defined(MULTI_USER) 116 #error Unknown user operations model 117 #endif 118 119 struct page; 120 121 struct cpu_user_fns { 122 void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr); 123 void (*cpu_copy_user_highpage)(struct page *to, struct page *from, 124 unsigned long vaddr); 125 }; 126 127 #ifdef MULTI_USER 128 extern struct cpu_user_fns cpu_user; 129 130 #define __cpu_clear_user_highpage cpu_user.cpu_clear_user_highpage 131 #define __cpu_copy_user_highpage cpu_user.cpu_copy_user_highpage 132 133 #else 134 135 #define __cpu_clear_user_highpage __glue(_USER,_clear_user_highpage) 136 #define __cpu_copy_user_highpage __glue(_USER,_copy_user_highpage) 137 138 extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr); 139 extern void __cpu_copy_user_highpage(struct page *to, struct page *from, 140 unsigned long vaddr); 141 #endif 142 143 #define clear_user_highpage(page,vaddr) \ 144 __cpu_clear_user_highpage(page, vaddr) 145 146 #define __HAVE_ARCH_COPY_USER_HIGHPAGE 147 #define copy_user_highpage(to,from,vaddr,vma) \ 148 __cpu_copy_user_highpage(to, from, vaddr) 149 150 #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 151 extern void copy_page(void *to, const void *from); 152 153 #undef STRICT_MM_TYPECHECKS 154 155 #ifdef STRICT_MM_TYPECHECKS 156 /* 157 * These are used to make use of C type-checking.. 158 */ 159 typedef struct { unsigned long pte; } pte_t; 160 typedef struct { unsigned long pmd; } pmd_t; 161 typedef struct { unsigned long pgd[2]; } pgd_t; 162 typedef struct { unsigned long pgprot; } pgprot_t; 163 164 #define pte_val(x) ((x).pte) 165 #define pmd_val(x) ((x).pmd) 166 #define pgd_val(x) ((x).pgd[0]) 167 #define pgprot_val(x) ((x).pgprot) 168 169 #define __pte(x) ((pte_t) { (x) } ) 170 #define __pmd(x) ((pmd_t) { (x) } ) 171 #define __pgprot(x) ((pgprot_t) { (x) } ) 172 173 #else 174 /* 175 * .. while these make it easier on the compiler 176 */ 177 typedef unsigned long pte_t; 178 typedef unsigned long pmd_t; 179 typedef unsigned long pgd_t[2]; 180 typedef unsigned long pgprot_t; 181 182 #define pte_val(x) (x) 183 #define pmd_val(x) (x) 184 #define pgd_val(x) ((x)[0]) 185 #define pgprot_val(x) (x) 186 187 #define __pte(x) (x) 188 #define __pmd(x) (x) 189 #define __pgprot(x) (x) 190 191 #endif /* STRICT_MM_TYPECHECKS */ 192 193 #endif /* CONFIG_MMU */ 194 195 typedef struct page *pgtable_t; 196 197 #include <asm/memory.h> 198 199 #endif /* !__ASSEMBLY__ */ 200 201 #define VM_DATA_DEFAULT_FLAGS \ 202 (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0) | \ 203 VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 204 205 /* 206 * With EABI on ARMv5 and above we must have 64-bit aligned slab pointers. 207 */ 208 #if defined(CONFIG_AEABI) && (__LINUX_ARM_ARCH__ >= 5) 209 #define ARCH_SLAB_MINALIGN 8 210 #endif 211 212 #include <asm-generic/page.h> 213 214 #endif 215