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 + -
显示快捷键?