162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * arch/arm/include/asm/page.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1995-2003 Russell King 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef _ASMARM_PAGE_H 862306a36Sopenharmony_ci#define _ASMARM_PAGE_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* PAGE_SHIFT determines the page size */ 1162306a36Sopenharmony_ci#define PAGE_SHIFT 12 1262306a36Sopenharmony_ci#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) 1362306a36Sopenharmony_ci#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#ifndef CONFIG_MMU 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include <asm/page-nommu.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#else 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <asm/glue.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/* 2662306a36Sopenharmony_ci * User Space Model 2762306a36Sopenharmony_ci * ================ 2862306a36Sopenharmony_ci * 2962306a36Sopenharmony_ci * This section selects the correct set of functions for dealing with 3062306a36Sopenharmony_ci * page-based copying and clearing for user space for the particular 3162306a36Sopenharmony_ci * processor(s) we're building for. 3262306a36Sopenharmony_ci * 3362306a36Sopenharmony_ci * We have the following to choose from: 3462306a36Sopenharmony_ci * v4wt - ARMv4 with writethrough cache, without minicache 3562306a36Sopenharmony_ci * v4wb - ARMv4 with writeback cache, without minicache 3662306a36Sopenharmony_ci * v4_mc - ARMv4 with minicache 3762306a36Sopenharmony_ci * xscale - Xscale 3862306a36Sopenharmony_ci * xsc3 - XScalev3 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci#undef _USER 4162306a36Sopenharmony_ci#undef MULTI_USER 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V4WT 4462306a36Sopenharmony_ci# ifdef _USER 4562306a36Sopenharmony_ci# define MULTI_USER 1 4662306a36Sopenharmony_ci# else 4762306a36Sopenharmony_ci# define _USER v4wt 4862306a36Sopenharmony_ci# endif 4962306a36Sopenharmony_ci#endif 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V4WB 5262306a36Sopenharmony_ci# ifdef _USER 5362306a36Sopenharmony_ci# define MULTI_USER 1 5462306a36Sopenharmony_ci# else 5562306a36Sopenharmony_ci# define _USER v4wb 5662306a36Sopenharmony_ci# endif 5762306a36Sopenharmony_ci#endif 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_FEROCEON 6062306a36Sopenharmony_ci# ifdef _USER 6162306a36Sopenharmony_ci# define MULTI_USER 1 6262306a36Sopenharmony_ci# else 6362306a36Sopenharmony_ci# define _USER feroceon 6462306a36Sopenharmony_ci# endif 6562306a36Sopenharmony_ci#endif 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_FA 6862306a36Sopenharmony_ci# ifdef _USER 6962306a36Sopenharmony_ci# define MULTI_USER 1 7062306a36Sopenharmony_ci# else 7162306a36Sopenharmony_ci# define _USER fa 7262306a36Sopenharmony_ci# endif 7362306a36Sopenharmony_ci#endif 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci#ifdef CONFIG_CPU_SA1100 7662306a36Sopenharmony_ci# ifdef _USER 7762306a36Sopenharmony_ci# define MULTI_USER 1 7862306a36Sopenharmony_ci# else 7962306a36Sopenharmony_ci# define _USER v4_mc 8062306a36Sopenharmony_ci# endif 8162306a36Sopenharmony_ci#endif 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#ifdef CONFIG_CPU_XSCALE 8462306a36Sopenharmony_ci# ifdef _USER 8562306a36Sopenharmony_ci# define MULTI_USER 1 8662306a36Sopenharmony_ci# else 8762306a36Sopenharmony_ci# define _USER xscale_mc 8862306a36Sopenharmony_ci# endif 8962306a36Sopenharmony_ci#endif 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#ifdef CONFIG_CPU_XSC3 9262306a36Sopenharmony_ci# ifdef _USER 9362306a36Sopenharmony_ci# define MULTI_USER 1 9462306a36Sopenharmony_ci# else 9562306a36Sopenharmony_ci# define _USER xsc3_mc 9662306a36Sopenharmony_ci# endif 9762306a36Sopenharmony_ci#endif 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci#ifdef CONFIG_CPU_COPY_V6 10062306a36Sopenharmony_ci# define MULTI_USER 1 10162306a36Sopenharmony_ci#endif 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#if !defined(_USER) && !defined(MULTI_USER) 10462306a36Sopenharmony_ci#error Unknown user operations model 10562306a36Sopenharmony_ci#endif 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct page; 10862306a36Sopenharmony_cistruct vm_area_struct; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistruct cpu_user_fns { 11162306a36Sopenharmony_ci void (*cpu_clear_user_highpage)(struct page *page, unsigned long vaddr); 11262306a36Sopenharmony_ci void (*cpu_copy_user_highpage)(struct page *to, struct page *from, 11362306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_civoid fa_copy_user_highpage(struct page *to, struct page *from, 11762306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 11862306a36Sopenharmony_civoid fa_clear_user_highpage(struct page *page, unsigned long vaddr); 11962306a36Sopenharmony_civoid feroceon_copy_user_highpage(struct page *to, struct page *from, 12062306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 12162306a36Sopenharmony_civoid feroceon_clear_user_highpage(struct page *page, unsigned long vaddr); 12262306a36Sopenharmony_civoid v4_mc_copy_user_highpage(struct page *to, struct page *from, 12362306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 12462306a36Sopenharmony_civoid v4_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 12562306a36Sopenharmony_civoid v4wb_copy_user_highpage(struct page *to, struct page *from, 12662306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 12762306a36Sopenharmony_civoid v4wb_clear_user_highpage(struct page *page, unsigned long vaddr); 12862306a36Sopenharmony_civoid v4wt_copy_user_highpage(struct page *to, struct page *from, 12962306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 13062306a36Sopenharmony_civoid v4wt_clear_user_highpage(struct page *page, unsigned long vaddr); 13162306a36Sopenharmony_civoid xsc3_mc_copy_user_highpage(struct page *to, struct page *from, 13262306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 13362306a36Sopenharmony_civoid xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 13462306a36Sopenharmony_civoid xscale_mc_copy_user_highpage(struct page *to, struct page *from, 13562306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 13662306a36Sopenharmony_civoid xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci#ifdef MULTI_USER 13962306a36Sopenharmony_ciextern struct cpu_user_fns cpu_user; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#define __cpu_clear_user_highpage cpu_user.cpu_clear_user_highpage 14262306a36Sopenharmony_ci#define __cpu_copy_user_highpage cpu_user.cpu_copy_user_highpage 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#else 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define __cpu_clear_user_highpage __glue(_USER,_clear_user_highpage) 14762306a36Sopenharmony_ci#define __cpu_copy_user_highpage __glue(_USER,_copy_user_highpage) 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ciextern void __cpu_clear_user_highpage(struct page *page, unsigned long vaddr); 15062306a36Sopenharmony_ciextern void __cpu_copy_user_highpage(struct page *to, struct page *from, 15162306a36Sopenharmony_ci unsigned long vaddr, struct vm_area_struct *vma); 15262306a36Sopenharmony_ci#endif 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#define clear_user_highpage(page,vaddr) \ 15562306a36Sopenharmony_ci __cpu_clear_user_highpage(page, vaddr) 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci#define __HAVE_ARCH_COPY_USER_HIGHPAGE 15862306a36Sopenharmony_ci#define copy_user_highpage(to,from,vaddr,vma) \ 15962306a36Sopenharmony_ci __cpu_copy_user_highpage(to, from, vaddr, vma) 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 16262306a36Sopenharmony_ciextern void copy_page(void *to, const void *from); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci#ifdef CONFIG_KUSER_HELPERS 16562306a36Sopenharmony_ci#define __HAVE_ARCH_GATE_AREA 1 16662306a36Sopenharmony_ci#endif 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#ifdef CONFIG_ARM_LPAE 16962306a36Sopenharmony_ci#include <asm/pgtable-3level-types.h> 17062306a36Sopenharmony_ci#else 17162306a36Sopenharmony_ci#include <asm/pgtable-2level-types.h> 17262306a36Sopenharmony_ci#ifdef CONFIG_VMAP_STACK 17362306a36Sopenharmony_ci#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED 17462306a36Sopenharmony_ci#endif 17562306a36Sopenharmony_ci#endif 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci#endif /* CONFIG_MMU */ 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_citypedef struct page *pgtable_t; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci#ifdef CONFIG_HAVE_ARCH_PFN_VALID 18262306a36Sopenharmony_ciextern int pfn_valid(unsigned long); 18362306a36Sopenharmony_ci#define pfn_valid pfn_valid 18462306a36Sopenharmony_ci#endif 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci#endif /* !__ASSEMBLY__ */ 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci#include <asm/memory.h> 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci#define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_TSK_EXEC 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci#include <asm-generic/getorder.h> 19362306a36Sopenharmony_ci#include <asm-generic/memory_model.h> 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci#endif 196