at v6.19 192 lines 4.8 kB view raw
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 104struct page; 105struct vm_area_struct; 106 107struct 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 113void fa_copy_user_highpage(struct page *to, struct page *from, 114 unsigned long vaddr, struct vm_area_struct *vma); 115void fa_clear_user_highpage(struct page *page, unsigned long vaddr); 116void feroceon_copy_user_highpage(struct page *to, struct page *from, 117 unsigned long vaddr, struct vm_area_struct *vma); 118void feroceon_clear_user_highpage(struct page *page, unsigned long vaddr); 119void v4_mc_copy_user_highpage(struct page *to, struct page *from, 120 unsigned long vaddr, struct vm_area_struct *vma); 121void v4_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 122void v4wb_copy_user_highpage(struct page *to, struct page *from, 123 unsigned long vaddr, struct vm_area_struct *vma); 124void v4wb_clear_user_highpage(struct page *page, unsigned long vaddr); 125void v4wt_copy_user_highpage(struct page *to, struct page *from, 126 unsigned long vaddr, struct vm_area_struct *vma); 127void v4wt_clear_user_highpage(struct page *page, unsigned long vaddr); 128void xsc3_mc_copy_user_highpage(struct page *to, struct page *from, 129 unsigned long vaddr, struct vm_area_struct *vma); 130void xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 131void xscale_mc_copy_user_highpage(struct page *to, struct page *from, 132 unsigned long vaddr, struct vm_area_struct *vma); 133void xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 134 135#ifdef MULTI_USER 136extern 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 146extern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr); 147extern 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) 159extern 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 176typedef struct page *pgtable_t; 177 178#ifdef CONFIG_HAVE_ARCH_PFN_VALID 179extern 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