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