11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _ASM_M32R_PGTABLE_H 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _ASM_M32R_PGTABLE_H 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm-generic/4level-fixup.h> 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef __KERNEL__ 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The Linux memory management assumes a three-level page table setup. On 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the M32R, we use that, but "fold" the mid level into the top-level page 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * table, so that we physically have the same two-level page table as the 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * M32R mmu expects. 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file contains the functions and defines necessary to modify and use 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the M32R page table tree. 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* CAUTION!: If you change macro definitions in this file, you might have to 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * change arch/m32r/mmu.S manually. 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASSEMBLY__ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/threads.h> 241977f032722c27ee3730284582fd3991ad9ac81bJiri Slaby#include <linux/bitops.h> 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/processor.h> 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/addrspace.h> 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/page.h> 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 298c65b4a60450590e79a28e9717ceffa9e4debb3fTim Schmielaustruct mm_struct; 308c65b4a60450590e79a28e9717ceffa9e4debb3fTim Schmielaustruct vm_area_struct; 318c65b4a60450590e79a28e9717ceffa9e4debb3fTim Schmielau 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern pgd_t swapper_pg_dir[1024]; 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void paging_init(void); 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ZERO_PAGE is a global shared page that is always zero: used 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for zero-mapped memory areas etc.. 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern unsigned long empty_zero_page[1024]; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !__ASSEMBLY__ */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASSEMBLY__ 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/pgtable-2level.h> 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pgtable_cache_init() do { } while (0) 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PMD_SIZE (1UL << PMD_SHIFT) 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PMD_MASK (~(PMD_SIZE - 1)) 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PGDIR_SIZE (1UL << PGDIR_SHIFT) 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PGDIR_MASK (~(PGDIR_SIZE - 1)) 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USER_PTRS_PER_PGD (TASK_SIZE / PGDIR_SIZE) 56d455a3696c72283923e6870e9e4fe1daa861d7cdHugh Dickins#define FIRST_USER_ADDRESS 0 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASSEMBLY__ 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Just any arbitrary offset to the start of the vmalloc VM area: the 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * current 8MB value just means that there will be a 8MB "hole" after the 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * physical memory until the kernel virtual memory starts. That means that 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * any out-of-bounds memory accesses will hopefully be caught. 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The vmalloc() routines leaves a hole of 4kB between each vmalloced 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * area for the same reason. ;) 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VMALLOC_START KSEG2 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define VMALLOC_END KSEG3 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * M32R TLB format 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * [0] [1:19] [20:23] [24:31] 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * +-----------------------+----+-------------+ 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * | VPN |0000| ASID | 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * +-----------------------+----+-------------+ 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * +-+---------------------+----+-+---+-+-+-+-+ 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * |0 PPN |0000|N|AC |L|G|V| | 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * +-+---------------------+----+-+---+-+-+-+-+ 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RWX 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_DIRTY 0 /* software: page changed */ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_FILE 0 /* when !present: nonlinear file 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mapping */ 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_PRESENT 1 /* Valid: page is valid */ 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_GLOBAL 2 /* Global */ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_LARGE 3 /* Large */ 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_EXEC 4 /* Execute */ 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_WRITE 5 /* Write */ 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_READ 6 /* Read */ 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_NONCACHABLE 7 /* Non cachable */ 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_ACCESSED 8 /* software: page referenced */ 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_BIT_PROTNONE 9 /* software: if not present */ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_DIRTY (1UL << _PAGE_BIT_DIRTY) 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_FILE (1UL << _PAGE_BIT_FILE) 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_PRESENT (1UL << _PAGE_BIT_PRESENT) 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_GLOBAL (1UL << _PAGE_BIT_GLOBAL) 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_LARGE (1UL << _PAGE_BIT_LARGE) 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_EXEC (1UL << _PAGE_BIT_EXEC) 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_WRITE (1UL << _PAGE_BIT_WRITE) 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_READ (1UL << _PAGE_BIT_READ) 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_NONCACHABLE (1UL << _PAGE_BIT_NONCACHABLE) 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_ACCESSED (1UL << _PAGE_BIT_ACCESSED) 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_PROTNONE (1UL << _PAGE_BIT_PROTNONE) 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_TABLE \ 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ( _PAGE_PRESENT | _PAGE_WRITE | _PAGE_READ | _PAGE_ACCESSED \ 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | _PAGE_DIRTY ) 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _KERNPG_TABLE \ 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ( _PAGE_PRESENT | _PAGE_WRITE | _PAGE_READ | _PAGE_ACCESSED \ 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | _PAGE_DIRTY ) 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _PAGE_CHG_MASK \ 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ( PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY ) 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_MMU 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_NONE \ 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_SHARED \ 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PRESENT | _PAGE_WRITE | _PAGE_READ | _PAGE_ACCESSED) 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_SHARED_EXEC \ 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PRESENT | _PAGE_EXEC | _PAGE_WRITE | _PAGE_READ \ 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | _PAGE_ACCESSED) 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_COPY \ 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_ACCESSED) 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_COPY_EXEC \ 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PRESENT | _PAGE_EXEC | _PAGE_READ | _PAGE_ACCESSED) 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_READONLY \ 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_ACCESSED) 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_READONLY_EXEC \ 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __pgprot(_PAGE_PRESENT | _PAGE_EXEC | _PAGE_READ | _PAGE_ACCESSED) 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __PAGE_KERNEL \ 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ( _PAGE_PRESENT | _PAGE_EXEC | _PAGE_WRITE | _PAGE_READ | _PAGE_DIRTY \ 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | _PAGE_ACCESSED ) 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __PAGE_KERNEL_RO ( __PAGE_KERNEL & ~_PAGE_WRITE ) 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __PAGE_KERNEL_NOCACHE ( __PAGE_KERNEL | _PAGE_NONCACHABLE) 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL) 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL) 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO) 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_NONE __pgprot(0) 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_SHARED __pgprot(0) 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_SHARED_EXEC __pgprot(0) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_COPY __pgprot(0) 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_COPY_EXEC __pgprot(0) 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_READONLY __pgprot(0) 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_READONLY_EXEC __pgprot(0) 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_KERNEL __pgprot(0) 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_KERNEL_RO __pgprot(0) 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PAGE_KERNEL_NOCACHE __pgprot(0) 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_MMU */ 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* xwr */ 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P000 PAGE_NONE 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P001 PAGE_READONLY 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P010 PAGE_COPY 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P011 PAGE_COPY 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P100 PAGE_READONLY_EXEC 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P101 PAGE_READONLY_EXEC 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P110 PAGE_COPY_EXEC 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __P111 PAGE_COPY_EXEC 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S000 PAGE_NONE 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S001 PAGE_READONLY 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S010 PAGE_SHARED 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S011 PAGE_SHARED 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S100 PAGE_READONLY_EXEC 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S101 PAGE_READONLY_EXEC 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S110 PAGE_SHARED_EXEC 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __S111 PAGE_SHARED_EXEC 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* page table for 0-4MB for everybody */ 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pte_present(x) (pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE)) 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pmd_none(x) (!pmd_val(x)) 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pmd_bad(x) ((pmd_val(x) & ~PAGE_MASK) != _KERNPG_TABLE) 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The following only work if pte_present() is true. 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Undefined behaviour if not.. 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int pte_dirty(pte_t pte) 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte_val(pte) & _PAGE_DIRTY; 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int pte_young(pte_t pte) 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte_val(pte) & _PAGE_ACCESSED; 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int pte_write(pte_t pte) 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte_val(pte) & _PAGE_WRITE; 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The following only works if pte_present() is not true. 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int pte_file(pte_t pte) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte_val(pte) & _PAGE_FILE; 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2177e675137a8e1a4d45822746456dd389b65745bf6Nick Pigginstatic inline int pte_special(pte_t pte) 2187e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin{ 2197e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin return 0; 2207e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin} 2217e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_mkclean(pte_t pte) 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pte_val(pte) &= ~_PAGE_DIRTY; 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_mkold(pte_t pte) 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pte_val(pte) &= ~_PAGE_ACCESSED; 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_wrprotect(pte_t pte) 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pte_val(pte) &= ~_PAGE_WRITE; 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_mkdirty(pte_t pte) 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pte_val(pte) |= _PAGE_DIRTY; 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_mkyoung(pte_t pte) 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pte_val(pte) |= _PAGE_ACCESSED; 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_mkwrite(pte_t pte) 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pte_val(pte) |= _PAGE_WRITE; 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2587e675137a8e1a4d45822746456dd389b65745bf6Nick Pigginstatic inline pte_t pte_mkspecial(pte_t pte) 2597e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin{ 2607e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin return pte; 2617e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin} 2627e675137a8e1a4d45822746456dd389b65745bf6Nick Piggin 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return test_and_clear_bit(_PAGE_BIT_ACCESSED, ptep); 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds clear_bit(_PAGE_BIT_WRITE, ptep); 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Macro and implementation to make a page protection as uncachable. 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pgprot_t pgprot_noncached(pgprot_t _prot) 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long prot = pgprot_val(_prot); 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds prot |= _PAGE_NONCACHABLE; 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return __pgprot(prot); 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pgprot_writecombine(prot) pgprot_noncached(prot) 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Conversion functions: convert a page and protection to a page entry, 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and a page entry and page directory to the page they refer to. 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), pgprot) 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline pte_t pte_modify(pte_t pte, pgprot_t newprot) 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds set_pte(&pte, __pte((pte_val(pte) & _PAGE_CHG_MASK) \ 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | pgprot_val(newprot))); 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return pte; 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Conversion functions: convert a page and protection to a page entry, 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and a page entry and page directory to the page they refer to. 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void pmd_set(pmd_t * pmdp, pte_t * ptep) 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pmd_val(*pmdp) = (((unsigned long) ptep) & PAGE_MASK); 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 31046a82b2d5591335277ed2930611f6acb4ce654edDave McCracken#define pmd_page_vaddr(pmd) \ 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef CONFIG_DISCONTIGMEM 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pmd_page(pmd) (mem_map + ((pmd_val(pmd) >> PAGE_SHIFT) - PFN_BASE)) 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !CONFIG_DISCONTIGMEM */ 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* to find an entry in a page-table-directory. */ 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pgd_index(address) \ 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* to find an entry in a kernel page-table-directory */ 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pgd_offset_k(address) pgd_offset(&init_mm, address) 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pmd_index(address) \ 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pte_index(address) \ 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pte_offset_kernel(dir, address) \ 33246a82b2d5591335277ed2930611f6acb4ce654edDave McCracken ((pte_t *)pmd_page_vaddr(*(dir)) + pte_index(address)) 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pte_offset_map(dir, address) \ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address)) 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define pte_unmap(pte) do { } while (0) 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Encode and de-code a swap entry */ 33823c9bbbac57ae50dceadfda37b49785ec04dd42fHirokazu Takata#define __swp_type(x) (((x).val >> 2) & 0x1f) 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __swp_offset(x) ((x).val >> 10) 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __swp_entry(type, offset) \ 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((swp_entry_t) { ((type) << 2) | ((offset) << 10) }) 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* !__ASSEMBLY__ */ 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define kern_addr_valid(addr) (1) 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __HAVE_ARCH_PTEP_GET_AND_CLEAR 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __HAVE_ARCH_PTEP_SET_WRPROTECT 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __HAVE_ARCH_PTE_SAME 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm-generic/pgtable.h> 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __KERNEL__ */ 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _ASM_M32R_PGTABLE_H */ 359