pgtable.h

来自「linux 内核源代码」· C头文件 代码 · 共 593 行 · 第 1/2 页

H
593
字号
/* * This file contains the functions and defines necessary to modify and * use the SuperH page table tree. * * Copyright (C) 1999 Niibe Yutaka * Copyright (C) 2002 - 2005 Paul Mundt * * This file is subject to the terms and conditions of the GNU General * Public License.  See the file "COPYING" in the main directory of this * archive for more details. */#ifndef __ASM_SH_PGTABLE_H#define __ASM_SH_PGTABLE_H#include <asm-generic/pgtable-nopmd.h>#include <asm/page.h>#ifndef __ASSEMBLY__#include <asm/addrspace.h>#include <asm/fixmap.h>/* * ZERO_PAGE is a global shared page that is always zero: used * for zero-mapped memory areas etc.. */extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))#endif /* !__ASSEMBLY__ *//* * traditional two-level paging structure *//* PTE bits */#ifdef CONFIG_X2TLB# define PTE_MAGNITUDE	3	/* 64-bit PTEs on extended mode SH-X2 TLB */#else# define PTE_MAGNITUDE	2	/* 32-bit PTEs */#endif#define PTE_SHIFT	PAGE_SHIFT#define PTE_BITS	(PTE_SHIFT - PTE_MAGNITUDE)/* PGD bits */#define PGDIR_SHIFT	(PTE_SHIFT + PTE_BITS)#define PGDIR_SIZE	(1UL << PGDIR_SHIFT)#define PGDIR_MASK	(~(PGDIR_SIZE-1))/* Entries per level */#define PTRS_PER_PTE	(PAGE_SIZE / (1 << PTE_MAGNITUDE))#define PTRS_PER_PGD	(PAGE_SIZE / sizeof(pgd_t))#define USER_PTRS_PER_PGD	(TASK_SIZE/PGDIR_SIZE)#define FIRST_USER_ADDRESS	0#define PTE_PHYS_MASK		(0x20000000 - PAGE_SIZE)#define VMALLOC_START	(P3SEG)#define VMALLOC_END	(FIXADDR_START-2*PAGE_SIZE)/* * Linux PTEL encoding. * * Hardware and software bit definitions for the PTEL value (see below for * notes on SH-X2 MMUs and 64-bit PTEs): * * - Bits 0 and 7 are reserved on SH-3 (_PAGE_WT and _PAGE_SZ1 on SH-4). * * - Bit 1 is the SH-bit, but is unused on SH-3 due to an MMU bug (the *   hardware PTEL value can't have the SH-bit set when MMUCR.IX is set, *   which is the default in cpu-sh3/mmu_context.h:MMU_CONTROL_INIT). * *   In order to keep this relatively clean, do not use these for defining *   SH-3 specific flags until all of the other unused bits have been *   exhausted. * * - Bit 9 is reserved by everyone and used by _PAGE_PROTNONE. * * - Bits 10 and 11 are low bits of the PPN that are reserved on >= 4K pages. *   Bit 10 is used for _PAGE_ACCESSED, bit 11 remains unused. * * - Bits 31, 30, and 29 remain unused by everyone and can be used for future *   software flags, although care must be taken to update _PAGE_CLEAR_FLAGS. * * XXX: Leave the _PAGE_FILE and _PAGE_WT overhaul for a rainy day. * * SH-X2 MMUs and extended PTEs * * SH-X2 supports an extended mode TLB with split data arrays due to the * number of bits needed for PR and SZ (now EPR and ESZ) encodings. The PR and * SZ bit placeholders still exist in data array 1, but are implemented as * reserved bits, with the real logic existing in data array 2. * * The downside to this is that we can no longer fit everything in to a 32-bit * PTE encoding, so a 64-bit pte_t is necessary for these parts. On the plus * side, this gives us quite a few spare bits to play with for future usage. *//* Legacy and compat mode bits */#define	_PAGE_WT	0x001		/* WT-bit on SH-4, 0 on SH-3 */#define _PAGE_HW_SHARED	0x002		/* SH-bit  : shared among processes */#define _PAGE_DIRTY	0x004		/* D-bit   : page changed */#define _PAGE_CACHABLE	0x008		/* C-bit   : cachable */#define _PAGE_SZ0	0x010		/* SZ0-bit : Size of page */#define _PAGE_RW	0x020		/* PR0-bit : write access allowed */#define _PAGE_USER	0x040		/* PR1-bit : user space access allowed*/#define _PAGE_SZ1	0x080		/* SZ1-bit : Size of page (on SH-4) */#define _PAGE_PRESENT	0x100		/* V-bit   : page is valid */#define _PAGE_PROTNONE	0x200		/* software: if not present  */#define _PAGE_ACCESSED	0x400		/* software: page referenced */#define _PAGE_FILE	_PAGE_WT	/* software: pagecache or swap? */#define _PAGE_SZ_MASK	(_PAGE_SZ0 | _PAGE_SZ1)#define _PAGE_PR_MASK	(_PAGE_RW | _PAGE_USER)/* Extended mode bits */#define _PAGE_EXT_ESZ0		0x0010	/* ESZ0-bit: Size of page */#define _PAGE_EXT_ESZ1		0x0020	/* ESZ1-bit: Size of page */#define _PAGE_EXT_ESZ2		0x0040	/* ESZ2-bit: Size of page */#define _PAGE_EXT_ESZ3		0x0080	/* ESZ3-bit: Size of page */#define _PAGE_EXT_USER_EXEC	0x0100	/* EPR0-bit: User space executable */#define _PAGE_EXT_USER_WRITE	0x0200	/* EPR1-bit: User space writable */#define _PAGE_EXT_USER_READ	0x0400	/* EPR2-bit: User space readable */#define _PAGE_EXT_KERN_EXEC	0x0800	/* EPR3-bit: Kernel space executable */#define _PAGE_EXT_KERN_WRITE	0x1000	/* EPR4-bit: Kernel space writable */#define _PAGE_EXT_KERN_READ	0x2000	/* EPR5-bit: Kernel space readable *//* Wrapper for extended mode pgprot twiddling */#define _PAGE_EXT(x)		((unsigned long long)(x) << 32)/* software: moves to PTEA.TC (Timing Control) */#define _PAGE_PCC_AREA5	0x00000000	/* use BSC registers for area5 */#define _PAGE_PCC_AREA6	0x80000000	/* use BSC registers for area6 *//* software: moves to PTEA.SA[2:0] (Space Attributes) */#define _PAGE_PCC_IODYN 0x00000001	/* IO space, dynamically sized bus */#define _PAGE_PCC_IO8	0x20000000	/* IO space, 8 bit bus */#define _PAGE_PCC_IO16	0x20000001	/* IO space, 16 bit bus */#define _PAGE_PCC_COM8	0x40000000	/* Common Memory space, 8 bit bus */#define _PAGE_PCC_COM16	0x40000001	/* Common Memory space, 16 bit bus */#define _PAGE_PCC_ATR8	0x60000000	/* Attribute Memory space, 8 bit bus */#define _PAGE_PCC_ATR16	0x60000001	/* Attribute Memory space, 6 bit bus *//* Mask which drops unused bits from the PTEL value */#if defined(CONFIG_CPU_SH3)#define _PAGE_CLEAR_FLAGS	(_PAGE_PROTNONE | _PAGE_ACCESSED| \				 _PAGE_FILE	| _PAGE_SZ1	| \				 _PAGE_HW_SHARED)#elif defined(CONFIG_X2TLB)/* Get rid of the legacy PR/SZ bits when using extended mode */#define _PAGE_CLEAR_FLAGS	(_PAGE_PROTNONE | _PAGE_ACCESSED | \				 _PAGE_FILE | _PAGE_PR_MASK | _PAGE_SZ_MASK)#else#define _PAGE_CLEAR_FLAGS	(_PAGE_PROTNONE | _PAGE_ACCESSED | _PAGE_FILE)#endif#define _PAGE_FLAGS_HARDWARE_MASK	(0x1fffffff & ~(_PAGE_CLEAR_FLAGS))/* Hardware flags, page size encoding */#if defined(CONFIG_X2TLB)# if defined(CONFIG_PAGE_SIZE_4KB)#  define _PAGE_FLAGS_HARD	_PAGE_EXT(_PAGE_EXT_ESZ0)# elif defined(CONFIG_PAGE_SIZE_8KB)#  define _PAGE_FLAGS_HARD	_PAGE_EXT(_PAGE_EXT_ESZ1)# elif defined(CONFIG_PAGE_SIZE_64KB)#  define _PAGE_FLAGS_HARD	_PAGE_EXT(_PAGE_EXT_ESZ2)# endif#else# if defined(CONFIG_PAGE_SIZE_4KB)#  define _PAGE_FLAGS_HARD	_PAGE_SZ0# elif defined(CONFIG_PAGE_SIZE_64KB)#  define _PAGE_FLAGS_HARD	_PAGE_SZ1# endif#endif#if defined(CONFIG_X2TLB)# if defined(CONFIG_HUGETLB_PAGE_SIZE_64K)#  define _PAGE_SZHUGE	(_PAGE_EXT_ESZ2)# elif defined(CONFIG_HUGETLB_PAGE_SIZE_256K)#  define _PAGE_SZHUGE	(_PAGE_EXT_ESZ0 | _PAGE_EXT_ESZ2)# elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB)#  define _PAGE_SZHUGE	(_PAGE_EXT_ESZ0 | _PAGE_EXT_ESZ1 | _PAGE_EXT_ESZ2)# elif defined(CONFIG_HUGETLB_PAGE_SIZE_4MB)#  define _PAGE_SZHUGE	(_PAGE_EXT_ESZ3)# elif defined(CONFIG_HUGETLB_PAGE_SIZE_64MB)#  define _PAGE_SZHUGE	(_PAGE_EXT_ESZ2 | _PAGE_EXT_ESZ3)# endif#else# if defined(CONFIG_HUGETLB_PAGE_SIZE_64K)#  define _PAGE_SZHUGE	(_PAGE_SZ1)# elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB)#  define _PAGE_SZHUGE	(_PAGE_SZ0 | _PAGE_SZ1)# endif#endif/* * Stub out _PAGE_SZHUGE if we don't have a good definition for it, * to make pte_mkhuge() happy. */#ifndef _PAGE_SZHUGE# define _PAGE_SZHUGE	(_PAGE_FLAGS_HARD)#endif#define _PAGE_CHG_MASK \	(PTE_MASK | _PAGE_ACCESSED | _PAGE_CACHABLE | _PAGE_DIRTY)#ifndef __ASSEMBLY__#if defined(CONFIG_X2TLB) /* SH-X2 TLB */#define PAGE_NONE	__pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE | \				 _PAGE_ACCESSED | _PAGE_FLAGS_HARD)#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \				 _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_READ  | \					   _PAGE_EXT_KERN_WRITE | \					   _PAGE_EXT_USER_READ  | \					   _PAGE_EXT_USER_WRITE))#define PAGE_EXECREAD	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \				 _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_EXEC | \					   _PAGE_EXT_KERN_READ | \					   _PAGE_EXT_USER_EXEC | \					   _PAGE_EXT_USER_READ))#define PAGE_COPY	PAGE_EXECREAD#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \				 _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_READ | \					   _PAGE_EXT_USER_READ))#define PAGE_WRITEONLY	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \				 _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_WRITE | \					   _PAGE_EXT_USER_WRITE))#define PAGE_RWX	__pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \				 _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_WRITE | \					   _PAGE_EXT_KERN_READ  | \					   _PAGE_EXT_KERN_EXEC  | \					   _PAGE_EXT_USER_WRITE | \					   _PAGE_EXT_USER_READ  | \					   _PAGE_EXT_USER_EXEC))#define PAGE_KERNEL	__pgprot(_PAGE_PRESENT | _PAGE_CACHABLE | \				 _PAGE_DIRTY | _PAGE_ACCESSED | \				 _PAGE_HW_SHARED | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_READ | \					   _PAGE_EXT_KERN_WRITE | \					   _PAGE_EXT_KERN_EXEC))#define PAGE_KERNEL_NOCACHE \			__pgprot(_PAGE_PRESENT | _PAGE_DIRTY | \				 _PAGE_ACCESSED | _PAGE_HW_SHARED | \				 _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_READ | \					   _PAGE_EXT_KERN_WRITE | \					   _PAGE_EXT_KERN_EXEC))#define PAGE_KERNEL_RO	__pgprot(_PAGE_PRESENT | _PAGE_CACHABLE | \				 _PAGE_DIRTY | _PAGE_ACCESSED | \				 _PAGE_HW_SHARED | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_READ | \					   _PAGE_EXT_KERN_EXEC))#define PAGE_KERNEL_PCC(slot, type) \			__pgprot(_PAGE_PRESENT | _PAGE_DIRTY | \				 _PAGE_ACCESSED | _PAGE_FLAGS_HARD | \				 _PAGE_EXT(_PAGE_EXT_KERN_READ | \					   _PAGE_EXT_KERN_WRITE | \					   _PAGE_EXT_KERN_EXEC) \				 (slot ? _PAGE_PCC_AREA5 : _PAGE_PCC_AREA6) | \				 (type))#elif defined(CONFIG_MMU) /* SH-X TLB */#define PAGE_NONE	__pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE | \				 _PAGE_ACCESSED | _PAGE_FLAGS_HARD)#define PAGE_SHARED	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \				 _PAGE_CACHABLE | _PAGE_ACCESSED | \				 _PAGE_FLAGS_HARD)#define PAGE_COPY	__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_CACHABLE | \				 _PAGE_ACCESSED | _PAGE_FLAGS_HARD)#define PAGE_READONLY	__pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_CACHABLE | \				 _PAGE_ACCESSED | _PAGE_FLAGS_HARD)#define PAGE_EXECREAD	PAGE_READONLY#define PAGE_RWX	PAGE_SHARED#define PAGE_WRITEONLY	PAGE_SHARED#define PAGE_KERNEL	__pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_CACHABLE | \				 _PAGE_DIRTY | _PAGE_ACCESSED | \

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?