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