1f9bac91bSBenno Rice /*- 251369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 351369649SPedro F. Giffuni * 4f9bac91bSBenno Rice * Copyright (C) 1995, 1996 Wolfgang Solfrank. 5f9bac91bSBenno Rice * Copyright (C) 1995, 1996 TooLs GmbH. 6f9bac91bSBenno Rice * All rights reserved. 7f9bac91bSBenno Rice * 8f9bac91bSBenno Rice * Redistribution and use in source and binary forms, with or without 9f9bac91bSBenno Rice * modification, are permitted provided that the following conditions 10f9bac91bSBenno Rice * are met: 11f9bac91bSBenno Rice * 1. Redistributions of source code must retain the above copyright 12f9bac91bSBenno Rice * notice, this list of conditions and the following disclaimer. 13f9bac91bSBenno Rice * 2. Redistributions in binary form must reproduce the above copyright 14f9bac91bSBenno Rice * notice, this list of conditions and the following disclaimer in the 15f9bac91bSBenno Rice * documentation and/or other materials provided with the distribution. 16f9bac91bSBenno Rice * 3. All advertising materials mentioning features or use of this software 17f9bac91bSBenno Rice * must display the following acknowledgement: 18f9bac91bSBenno Rice * This product includes software developed by TooLs GmbH. 19f9bac91bSBenno Rice * 4. The name of TooLs GmbH may not be used to endorse or promote products 20f9bac91bSBenno Rice * derived from this software without specific prior written permission. 21f9bac91bSBenno Rice * 22f9bac91bSBenno Rice * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 23f9bac91bSBenno Rice * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24f9bac91bSBenno Rice * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25f9bac91bSBenno Rice * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26f9bac91bSBenno Rice * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27f9bac91bSBenno Rice * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 28f9bac91bSBenno Rice * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29f9bac91bSBenno Rice * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30f9bac91bSBenno Rice * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31f9bac91bSBenno Rice * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32f9bac91bSBenno Rice * 33f9bac91bSBenno Rice * $NetBSD: pte.h,v 1.2 1998/08/31 14:43:40 tsubai Exp $ 34f9bac91bSBenno Rice * $FreeBSD$ 35f9bac91bSBenno Rice */ 36f9bac91bSBenno Rice 37f9bac91bSBenno Rice #ifndef _MACHINE_PTE_H_ 38f9bac91bSBenno Rice #define _MACHINE_PTE_H_ 39f9bac91bSBenno Rice 40ffb56695SRafal Jaworowski #if defined(AIM) 41ffb56695SRafal Jaworowski 42f9bac91bSBenno Rice /* 43f9bac91bSBenno Rice * Page Table Entries 44f9bac91bSBenno Rice */ 45f9bac91bSBenno Rice #ifndef LOCORE 46f9bac91bSBenno Rice 4758d7d1a8SPeter Grehan /* 32-bit PTE */ 48f9bac91bSBenno Rice struct pte { 4958d7d1a8SPeter Grehan u_int32_t pte_hi; 5058d7d1a8SPeter Grehan u_int32_t pte_lo; 51f9bac91bSBenno Rice }; 525244eac9SBenno Rice 535244eac9SBenno Rice struct pteg { 545244eac9SBenno Rice struct pte pt[8]; 555244eac9SBenno Rice }; 5658d7d1a8SPeter Grehan 5758d7d1a8SPeter Grehan /* 64-bit (long) PTE */ 5858d7d1a8SPeter Grehan struct lpte { 5958d7d1a8SPeter Grehan u_int64_t pte_hi; 6058d7d1a8SPeter Grehan u_int64_t pte_lo; 6158d7d1a8SPeter Grehan }; 6258d7d1a8SPeter Grehan 6358d7d1a8SPeter Grehan struct lpteg { 6458d7d1a8SPeter Grehan struct lpte pt[8]; 6558d7d1a8SPeter Grehan }; 6658d7d1a8SPeter Grehan 6710d0cdfcSJustin Hibbits /* Partition table entry */ 6810d0cdfcSJustin Hibbits struct pate { 6910d0cdfcSJustin Hibbits u_int64_t pagetab; 7010d0cdfcSJustin Hibbits u_int64_t proctab; 7110d0cdfcSJustin Hibbits }; 7210d0cdfcSJustin Hibbits 73*5d67b612SJustin Hibbits typedef struct pte pte_t; 74*5d67b612SJustin Hibbits typedef struct lpte lpte_t; 75f9bac91bSBenno Rice #endif /* LOCORE */ 7658d7d1a8SPeter Grehan 7758d7d1a8SPeter Grehan /* 32-bit PTE definitions */ 7858d7d1a8SPeter Grehan 79f9bac91bSBenno Rice /* High word: */ 80f9bac91bSBenno Rice #define PTE_VALID 0x80000000 81f9bac91bSBenno Rice #define PTE_VSID_SHFT 7 82f9bac91bSBenno Rice #define PTE_HID 0x00000040 83f9bac91bSBenno Rice #define PTE_API 0x0000003f 84f9bac91bSBenno Rice /* Low word: */ 85f9bac91bSBenno Rice #define PTE_RPGN 0xfffff000 86f9bac91bSBenno Rice #define PTE_REF 0x00000100 87f9bac91bSBenno Rice #define PTE_CHG 0x00000080 88f9bac91bSBenno Rice #define PTE_WIMG 0x00000078 89f9bac91bSBenno Rice #define PTE_W 0x00000040 90f9bac91bSBenno Rice #define PTE_I 0x00000020 91f9bac91bSBenno Rice #define PTE_M 0x00000010 92f9bac91bSBenno Rice #define PTE_G 0x00000008 93f9bac91bSBenno Rice #define PTE_PP 0x00000003 945244eac9SBenno Rice #define PTE_SO 0x00000000 /* Super. Only (U: XX, S: RW) */ 955244eac9SBenno Rice #define PTE_SW 0x00000001 /* Super. Write-Only (U: RO, S: RW) */ 965244eac9SBenno Rice #define PTE_BW 0x00000002 /* Supervisor (U: RW, S: RW) */ 975244eac9SBenno Rice #define PTE_BR 0x00000003 /* Both Read Only (U: RO, S: RO) */ 985244eac9SBenno Rice #define PTE_RW PTE_BW 995244eac9SBenno Rice #define PTE_RO PTE_BR 100f9bac91bSBenno Rice 1018207b362SBenno Rice #define PTE_EXEC 0x00000200 /* pseudo bit in attrs; page is exec */ 1028207b362SBenno Rice 10358d7d1a8SPeter Grehan /* 64-bit PTE definitions */ 10458d7d1a8SPeter Grehan 10558d7d1a8SPeter Grehan /* High quadword: */ 10658d7d1a8SPeter Grehan #define LPTE_VSID_SHIFT 12 10703479763SNathan Whitehorn #define LPTE_AVPN_MASK 0xFFFFFFFFFFFFFF80ULL 10858d7d1a8SPeter Grehan #define LPTE_API 0x0000000000000F80ULL 109c2f25537SNathan Whitehorn #define LPTE_SWBITS 0x0000000000000078ULL 110c2f25537SNathan Whitehorn #define LPTE_WIRED 0x0000000000000010ULL 111c2f25537SNathan Whitehorn #define LPTE_LOCKED 0x0000000000000008ULL 11258d7d1a8SPeter Grehan #define LPTE_BIG 0x0000000000000004ULL /* 4kb/16Mb page */ 11358d7d1a8SPeter Grehan #define LPTE_HID 0x0000000000000002ULL 11458d7d1a8SPeter Grehan #define LPTE_VALID 0x0000000000000001ULL 11558d7d1a8SPeter Grehan 11658d7d1a8SPeter Grehan /* Low quadword: */ 11758d7d1a8SPeter Grehan #define EXTEND_PTE(x) UINT64_C(x) /* make constants 64-bit */ 11858d7d1a8SPeter Grehan #define LPTE_RPGN 0xfffffffffffff000ULL 11958d7d1a8SPeter Grehan #define LPTE_REF EXTEND_PTE( PTE_REF ) 12058d7d1a8SPeter Grehan #define LPTE_CHG EXTEND_PTE( PTE_CHG ) 12158d7d1a8SPeter Grehan #define LPTE_WIMG EXTEND_PTE( PTE_WIMG ) 12258d7d1a8SPeter Grehan #define LPTE_W EXTEND_PTE( PTE_W ) 12358d7d1a8SPeter Grehan #define LPTE_I EXTEND_PTE( PTE_I ) 12458d7d1a8SPeter Grehan #define LPTE_M EXTEND_PTE( PTE_M ) 12558d7d1a8SPeter Grehan #define LPTE_G EXTEND_PTE( PTE_G ) 12658d7d1a8SPeter Grehan #define LPTE_NOEXEC 0x0000000000000004ULL 12758d7d1a8SPeter Grehan #define LPTE_PP EXTEND_PTE( PTE_PP ) 12858d7d1a8SPeter Grehan 12958d7d1a8SPeter Grehan #define LPTE_SO EXTEND_PTE( PTE_SO ) /* Super. Only */ 13058d7d1a8SPeter Grehan #define LPTE_SW EXTEND_PTE( PTE_SW ) /* Super. Write-Only */ 13158d7d1a8SPeter Grehan #define LPTE_BW EXTEND_PTE( PTE_BW ) /* Supervisor */ 13258d7d1a8SPeter Grehan #define LPTE_BR EXTEND_PTE( PTE_BR ) /* Both Read Only */ 13358d7d1a8SPeter Grehan #define LPTE_RW LPTE_BW 13458d7d1a8SPeter Grehan #define LPTE_RO LPTE_BR 13558d7d1a8SPeter Grehan 136dddf2858SNathan Whitehorn /* POWER ISA 3.0 Radix Table Definitions */ 137dddf2858SNathan Whitehorn #define RPTE_VALID 0x8000000000000000ULL 138dddf2858SNathan Whitehorn #define RPTE_LEAF 0x4000000000000000ULL /* is a PTE: always 1 */ 139dddf2858SNathan Whitehorn #define RPTE_SW0 0x2000000000000000ULL 140dddf2858SNathan Whitehorn #define RPTE_RPN_MASK 0x00FFFFFFFFFFF000ULL 141dddf2858SNathan Whitehorn #define RPTE_RPN_SHIFT 12 142dddf2858SNathan Whitehorn #define RPTE_SW1 0x0000000000000800ULL 143dddf2858SNathan Whitehorn #define RPTE_SW2 0x0000000000000400ULL 144dddf2858SNathan Whitehorn #define RPTE_SW3 0x0000000000000200ULL 145dddf2858SNathan Whitehorn #define RPTE_R 0x0000000000000100ULL 146dddf2858SNathan Whitehorn #define RPTE_C 0x0000000000000080ULL 147dddf2858SNathan Whitehorn 148dddf2858SNathan Whitehorn #define RPTE_ATTR_MASK 0x0000000000000030ULL 149dddf2858SNathan Whitehorn #define RPTE_ATTR_MEM 0x0000000000000000ULL /* PTE M */ 150dddf2858SNathan Whitehorn #define RPTE_ATTR_SAO 0x0000000000000010ULL /* PTE WIM */ 151dddf2858SNathan Whitehorn #define RPTE_ATTR_GUARDEDIO 0x0000000000000020ULL /* PTE IMG */ 152dddf2858SNathan Whitehorn #define RPTE_ATTR_UNGUARDEDIO 0x0000000000000030ULL /* PTE IM */ 153dddf2858SNathan Whitehorn 154dddf2858SNathan Whitehorn #define RPTE_EAA_MASK 0x000000000000000FULL 155dddf2858SNathan Whitehorn #define RPTE_EAA_P 0x0000000000000008ULL /* Supervisor only */ 156dddf2858SNathan Whitehorn #define RPTE_EAA_R 0x0000000000000004ULL /* Read allowed */ 157dddf2858SNathan Whitehorn #define RPTE_EAA_W 0x0000000000000002ULL /* Write (+read) */ 158dddf2858SNathan Whitehorn #define RPTE_EAA_X 0x0000000000000001ULL /* Execute allowed */ 159dddf2858SNathan Whitehorn 160dddf2858SNathan Whitehorn #define RPDE_VALID RPTE_VALID 161dddf2858SNathan Whitehorn #define RPDE_LEAF RPTE_LEAF /* is a PTE: always 0 */ 162dddf2858SNathan Whitehorn #define RPDE_NLB_MASK 0x0FFFFFFFFFFFFF00ULL 163dddf2858SNathan Whitehorn #define RPDE_NLB_SHIFT 8 164dddf2858SNathan Whitehorn #define RPDE_NLS_MASK 0x000000000000001FULL 165dddf2858SNathan Whitehorn 166f9bac91bSBenno Rice /* 167f9bac91bSBenno Rice * Extract bits from address 168f9bac91bSBenno Rice */ 169f9bac91bSBenno Rice #define ADDR_SR_SHFT 28 170c3e289e1SNathan Whitehorn #define ADDR_PIDX 0x0ffff000UL 171f9bac91bSBenno Rice #define ADDR_PIDX_SHFT 12 172f9bac91bSBenno Rice #define ADDR_API_SHFT 22 17352a7870dSNathan Whitehorn #define ADDR_API_SHFT64 16 174c3e289e1SNathan Whitehorn #define ADDR_POFF 0x00000fffUL 175f9bac91bSBenno Rice 176f9bac91bSBenno Rice /* 177f9bac91bSBenno Rice * Bits in DSISR: 178f9bac91bSBenno Rice */ 179f9bac91bSBenno Rice #define DSISR_DIRECT 0x80000000 180f9bac91bSBenno Rice #define DSISR_NOTFOUND 0x40000000 181f9bac91bSBenno Rice #define DSISR_PROTECT 0x08000000 182f9bac91bSBenno Rice #define DSISR_INVRX 0x04000000 183f9bac91bSBenno Rice #define DSISR_STORE 0x02000000 184f9bac91bSBenno Rice #define DSISR_DABR 0x00400000 185f9bac91bSBenno Rice #define DSISR_SEGMENT 0x00200000 186f9bac91bSBenno Rice #define DSISR_EAR 0x00100000 187f9bac91bSBenno Rice 188f9bac91bSBenno Rice /* 189f9bac91bSBenno Rice * Bits in SRR1 on ISI: 190f9bac91bSBenno Rice */ 191f9bac91bSBenno Rice #define ISSRR1_NOTFOUND 0x40000000 192f9bac91bSBenno Rice #define ISSRR1_DIRECT 0x10000000 193f9bac91bSBenno Rice #define ISSRR1_PROTECT 0x08000000 194f9bac91bSBenno Rice #define ISSRR1_SEGMENT 0x00200000 195f9bac91bSBenno Rice 19617f4cae4SRafal Jaworowski #else /* BOOKE */ 197ffb56695SRafal Jaworowski 198ffb56695SRafal Jaworowski #include <machine/tlb.h> 199ffb56695SRafal Jaworowski 200ffb56695SRafal Jaworowski /* 201ffb56695SRafal Jaworowski * Flags for pte_remove() routine. 202ffb56695SRafal Jaworowski */ 203ffb56695SRafal Jaworowski #define PTBL_HOLD 0x00000001 /* do not unhold ptbl pages */ 204ffb56695SRafal Jaworowski #define PTBL_UNHOLD 0x00000002 /* unhold and attempt to free ptbl pages */ 205ffb56695SRafal Jaworowski 206ffb56695SRafal Jaworowski #define PTBL_HOLD_FLAG(pmap) (((pmap) == kernel_pmap) ? PTBL_HOLD : PTBL_UNHOLD) 207ffb56695SRafal Jaworowski 208ffb56695SRafal Jaworowski /* 209ffb56695SRafal Jaworowski * Page Table Entry definitions and macros. 21092f6e934SJustin Hibbits * 21192f6e934SJustin Hibbits * RPN need only be 32-bit because Book-E has 36-bit addresses, and the smallest 21292f6e934SJustin Hibbits * page size is 4k (12-bit mask), so RPN can really fit into 24 bits. 213ffb56695SRafal Jaworowski */ 214ffb56695SRafal Jaworowski #ifndef LOCORE 21564a982eaSJustin Hibbits typedef uint64_t pte_t; 216ffb56695SRafal Jaworowski #endif 217ffb56695SRafal Jaworowski 218ffb56695SRafal Jaworowski /* RPN mask, TLB0 4K pages */ 219ffb56695SRafal Jaworowski #define PTE_PA_MASK PAGE_MASK 220ffb56695SRafal Jaworowski 22117f4cae4SRafal Jaworowski #if defined(BOOKE_E500) 22217f4cae4SRafal Jaworowski 223ffb56695SRafal Jaworowski /* PTE bits assigned to MAS2, MAS3 flags */ 22464a982eaSJustin Hibbits #define PTE_MAS2_SHIFT 19 22564a982eaSJustin Hibbits #define PTE_W (MAS2_W << PTE_MAS2_SHIFT) 22664a982eaSJustin Hibbits #define PTE_I (MAS2_I << PTE_MAS2_SHIFT) 22764a982eaSJustin Hibbits #define PTE_M (MAS2_M << PTE_MAS2_SHIFT) 22864a982eaSJustin Hibbits #define PTE_G (MAS2_G << PTE_MAS2_SHIFT) 229ffb56695SRafal Jaworowski #define PTE_MAS2_MASK (MAS2_G | MAS2_M | MAS2_I | MAS2_W) 230ffb56695SRafal Jaworowski 23164a982eaSJustin Hibbits #define PTE_MAS3_SHIFT 2 232ffb56695SRafal Jaworowski #define PTE_UX (MAS3_UX << PTE_MAS3_SHIFT) 233ffb56695SRafal Jaworowski #define PTE_SX (MAS3_SX << PTE_MAS3_SHIFT) 234ffb56695SRafal Jaworowski #define PTE_UW (MAS3_UW << PTE_MAS3_SHIFT) 235ffb56695SRafal Jaworowski #define PTE_SW (MAS3_SW << PTE_MAS3_SHIFT) 236ffb56695SRafal Jaworowski #define PTE_UR (MAS3_UR << PTE_MAS3_SHIFT) 237ffb56695SRafal Jaworowski #define PTE_SR (MAS3_SR << PTE_MAS3_SHIFT) 238ffb56695SRafal Jaworowski #define PTE_MAS3_MASK ((MAS3_UX | MAS3_SX | MAS3_UW \ 239ffb56695SRafal Jaworowski | MAS3_SW | MAS3_UR | MAS3_SR) << PTE_MAS3_SHIFT) 240ffb56695SRafal Jaworowski 24164a982eaSJustin Hibbits #define PTE_PS_SHIFT 8 24264a982eaSJustin Hibbits #define PTE_PS_4KB (2 << PTE_PS_SHIFT) 24364a982eaSJustin Hibbits 24417f4cae4SRafal Jaworowski #elif defined(BOOKE_PPC4XX) 24517f4cae4SRafal Jaworowski 24617f4cae4SRafal Jaworowski #define PTE_WL1 TLB_WL1 24717f4cae4SRafal Jaworowski #define PTE_IL2I TLB_IL2I 24817f4cae4SRafal Jaworowski #define PTE_IL2D TLB_IL2D 24917f4cae4SRafal Jaworowski 25017f4cae4SRafal Jaworowski #define PTE_W TLB_W 25117f4cae4SRafal Jaworowski #define PTE_I TLB_I 25217f4cae4SRafal Jaworowski #define PTE_M TLB_M 25317f4cae4SRafal Jaworowski #define PTE_G TLB_G 25417f4cae4SRafal Jaworowski 25517f4cae4SRafal Jaworowski #define PTE_UX TLB_UX 25617f4cae4SRafal Jaworowski #define PTE_SX TLB_SX 25717f4cae4SRafal Jaworowski #define PTE_UW TLB_UW 25817f4cae4SRafal Jaworowski #define PTE_SW TLB_SW 25917f4cae4SRafal Jaworowski #define PTE_UR TLB_UR 26017f4cae4SRafal Jaworowski #define PTE_SR TLB_SR 26117f4cae4SRafal Jaworowski 26217f4cae4SRafal Jaworowski #endif 26317f4cae4SRafal Jaworowski 264ffb56695SRafal Jaworowski /* Other PTE flags */ 26564a982eaSJustin Hibbits #define PTE_VALID 0x00000001 /* Valid */ 26664a982eaSJustin Hibbits #define PTE_MODIFIED 0x00001000 /* Modified */ 26764a982eaSJustin Hibbits #define PTE_WIRED 0x00002000 /* Wired */ 26864a982eaSJustin Hibbits #define PTE_MANAGED 0x00000002 /* Managed */ 26964a982eaSJustin Hibbits #define PTE_REFERENCED 0x00040000 /* Referenced */ 270ffb56695SRafal Jaworowski 271e683c328SJustin Hibbits /* 272e683c328SJustin Hibbits * Page Table Entry definitions and macros. 273e683c328SJustin Hibbits * 274e683c328SJustin Hibbits * We use the hardware page table entry format: 275e683c328SJustin Hibbits * 276e683c328SJustin Hibbits * 63 24 23 19 18 17 14 13 12 11 8 7 6 5 4 3 2 1 0 277e683c328SJustin Hibbits * --------------------------------------------------------------- 278e683c328SJustin Hibbits * ARPN(12:51) WIMGE R U0:U3 SW0 C PSIZE UX SX UW SW UR SR SW1 V 279e683c328SJustin Hibbits * --------------------------------------------------------------- 280e683c328SJustin Hibbits */ 281e683c328SJustin Hibbits 282e683c328SJustin Hibbits /* PTE fields. */ 283e683c328SJustin Hibbits #define PTE_TSIZE_SHIFT (63-54) 284e683c328SJustin Hibbits #define PTE_TSIZE_MASK 0x7 285e683c328SJustin Hibbits #define PTE_TSIZE_SHIFT_DIRECT (63-55) 286e683c328SJustin Hibbits #define PTE_TSIZE_MASK_DIRECT 0xf 287e683c328SJustin Hibbits #define PTE_PS_DIRECT(ps) (ps<<PTE_TSIZE_SHIFT_DIRECT) /* Direct Entry Page Size */ 288e683c328SJustin Hibbits #define PTE_PS(ps) (ps<<PTE_TSIZE_SHIFT) /* Page Size */ 289e683c328SJustin Hibbits 290e683c328SJustin Hibbits /* Macro argument must of pte_t type. */ 291e683c328SJustin Hibbits #define PTE_TSIZE(pte) (int)((*pte >> PTE_TSIZE_SHIFT) & PTE_TSIZE_MASK) 292e683c328SJustin Hibbits #define PTE_TSIZE_DIRECT(pte) (int)((*pte >> PTE_TSIZE_SHIFT_DIRECT) & PTE_TSIZE_MASK_DIRECT) 293e683c328SJustin Hibbits 294ffb56695SRafal Jaworowski /* Macro argument must of pte_t type. */ 29564a982eaSJustin Hibbits #define PTE_ARPN_SHIFT 12 296debd17c5SJustin Hibbits #define PTE_FLAGS_MASK 0x00ffffff 29764a982eaSJustin Hibbits #define PTE_RPN_FROM_PA(pa) (((pa) & ~PAGE_MASK) << PTE_ARPN_SHIFT) 29864a982eaSJustin Hibbits #define PTE_PA(pte) ((vm_paddr_t)(*pte >> PTE_ARPN_SHIFT) & ~PAGE_MASK) 29964a982eaSJustin Hibbits #define PTE_ISVALID(pte) ((*pte) & PTE_VALID) 30064a982eaSJustin Hibbits #define PTE_ISWIRED(pte) ((*pte) & PTE_WIRED) 30164a982eaSJustin Hibbits #define PTE_ISMANAGED(pte) ((*pte) & PTE_MANAGED) 30264a982eaSJustin Hibbits #define PTE_ISMODIFIED(pte) ((*pte) & PTE_MODIFIED) 30364a982eaSJustin Hibbits #define PTE_ISREFERENCED(pte) ((*pte) & PTE_REFERENCED) 304ffb56695SRafal Jaworowski 3050936003eSJustin Hibbits #endif /* BOOKE */ 306*5d67b612SJustin Hibbits 307*5d67b612SJustin Hibbits /* Book-E page table format, broken out for the generic pmap.h. */ 308*5d67b612SJustin Hibbits #ifdef __powerpc64__ 309*5d67b612SJustin Hibbits 310*5d67b612SJustin Hibbits #include <machine/tlb.h> 311*5d67b612SJustin Hibbits 312*5d67b612SJustin Hibbits /* 313*5d67b612SJustin Hibbits * The virtual address is: 314*5d67b612SJustin Hibbits * 315*5d67b612SJustin Hibbits * 4K page size 316*5d67b612SJustin Hibbits * +-----+-----+-----+-------+-------------+-------------+----------------+ 317*5d67b612SJustin Hibbits * | - |p2d#h| - | p2d#l | dir# | pte# | off in 4K page | 318*5d67b612SJustin Hibbits * +-----+-----+-----+-------+-------------+-------------+----------------+ 319*5d67b612SJustin Hibbits * 63 62 61 60 59 40 39 30 29 ^ 21 20 ^ 12 11 0 320*5d67b612SJustin Hibbits * | | 321*5d67b612SJustin Hibbits * index in 1 page of pointers 322*5d67b612SJustin Hibbits * 323*5d67b612SJustin Hibbits * 1st level - pointers to page table directory (pp2d) 324*5d67b612SJustin Hibbits * 325*5d67b612SJustin Hibbits * pp2d consists of PP2D_NENTRIES entries, each being a pointer to 326*5d67b612SJustin Hibbits * second level entity, i.e. the page table directory (pdir). 327*5d67b612SJustin Hibbits */ 328*5d67b612SJustin Hibbits #define PP2D_H_H 61 329*5d67b612SJustin Hibbits #define PP2D_H_L 60 330*5d67b612SJustin Hibbits #define PP2D_L_H 39 331*5d67b612SJustin Hibbits #define PP2D_L_L 30 /* >30 would work with no page table pool */ 332*5d67b612SJustin Hibbits #define PP2D_SIZE (1 << PP2D_L_L) /* va range mapped by pp2d */ 333*5d67b612SJustin Hibbits #define PP2D_L_SHIFT PP2D_L_L 334*5d67b612SJustin Hibbits #define PP2D_L_NUM (PP2D_L_H-PP2D_L_L+1) 335*5d67b612SJustin Hibbits #define PP2D_L_MASK ((1<<PP2D_L_NUM)-1) 336*5d67b612SJustin Hibbits #define PP2D_H_SHIFT (PP2D_H_L-PP2D_L_NUM) 337*5d67b612SJustin Hibbits #define PP2D_H_NUM (PP2D_H_H-PP2D_H_L+1) 338*5d67b612SJustin Hibbits #define PP2D_H_MASK (((1<<PP2D_H_NUM)-1)<<PP2D_L_NUM) 339*5d67b612SJustin Hibbits #define PP2D_IDX(va) (((va >> PP2D_H_SHIFT) & PP2D_H_MASK) | ((va >> PP2D_L_SHIFT) & PP2D_L_MASK)) 340*5d67b612SJustin Hibbits #define PP2D_NENTRIES (1<<(PP2D_L_NUM+PP2D_H_NUM)) 341*5d67b612SJustin Hibbits #define PP2D_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry **)) */ 342*5d67b612SJustin Hibbits 343*5d67b612SJustin Hibbits /* 344*5d67b612SJustin Hibbits * 2nd level - page table directory (pdir) 345*5d67b612SJustin Hibbits * 346*5d67b612SJustin Hibbits * pdir consists of PDIR_NENTRIES entries, each being a pointer to 347*5d67b612SJustin Hibbits * second level entity, i.e. the actual page table (ptbl). 348*5d67b612SJustin Hibbits */ 349*5d67b612SJustin Hibbits #define PDIR_H (PP2D_L_L-1) 350*5d67b612SJustin Hibbits #define PDIR_L 21 351*5d67b612SJustin Hibbits #define PDIR_NUM (PDIR_H-PDIR_L+1) 352*5d67b612SJustin Hibbits #define PDIR_SIZE (1 << PDIR_L) /* va range mapped by pdir */ 353*5d67b612SJustin Hibbits #define PDIR_MASK ((1<<PDIR_NUM)-1) 354*5d67b612SJustin Hibbits #define PDIR_SHIFT PDIR_L 355*5d67b612SJustin Hibbits #define PDIR_NENTRIES (1<<PDIR_NUM) 356*5d67b612SJustin Hibbits #define PDIR_IDX(va) (((va) >> PDIR_SHIFT) & PDIR_MASK) 357*5d67b612SJustin Hibbits #define PDIR_ENTRY_SHIFT 3 /* log2 (sizeof(struct pte_entry *)) */ 358*5d67b612SJustin Hibbits #define PDIR_PAGES ((PDIR_NENTRIES * (1<<PDIR_ENTRY_SHIFT)) / PAGE_SIZE) 359*5d67b612SJustin Hibbits 360*5d67b612SJustin Hibbits /* 361*5d67b612SJustin Hibbits * 3rd level - page table (ptbl) 362*5d67b612SJustin Hibbits * 363*5d67b612SJustin Hibbits * Page table covers PTBL_NENTRIES page table entries. Page 364*5d67b612SJustin Hibbits * table entry (pte) is 64 bit wide and defines mapping 365*5d67b612SJustin Hibbits * for a single page. 366*5d67b612SJustin Hibbits */ 367*5d67b612SJustin Hibbits #define PTBL_H (PDIR_L-1) 368*5d67b612SJustin Hibbits #define PTBL_L PAGE_SHIFT 369*5d67b612SJustin Hibbits #define PTBL_NUM (PTBL_H-PTBL_L+1) 370*5d67b612SJustin Hibbits #define PTBL_MASK ((1<<PTBL_NUM)-1) 371*5d67b612SJustin Hibbits #define PTBL_SHIFT PTBL_L 372*5d67b612SJustin Hibbits #define PTBL_SIZE PAGE_SIZE /* va range mapped by ptbl entry */ 373*5d67b612SJustin Hibbits #define PTBL_NENTRIES (1<<PTBL_NUM) 374*5d67b612SJustin Hibbits #define PTBL_IDX(va) ((va >> PTBL_SHIFT) & PTBL_MASK) 375*5d67b612SJustin Hibbits #define PTBL_ENTRY_SHIFT 3 /* log2 (sizeof (struct pte_entry)) */ 376*5d67b612SJustin Hibbits #define PTBL_PAGES ((PTBL_NENTRIES * (1<<PTBL_ENTRY_SHIFT)) / PAGE_SIZE) 377*5d67b612SJustin Hibbits 378*5d67b612SJustin Hibbits #define KERNEL_LINEAR_MAX 0xc000000040000000 379*5d67b612SJustin Hibbits #else 380*5d67b612SJustin Hibbits /* 381*5d67b612SJustin Hibbits * 1st level - page table directory (pdir) 382*5d67b612SJustin Hibbits * 383*5d67b612SJustin Hibbits * pdir consists of 1024 entries, each being a pointer to 384*5d67b612SJustin Hibbits * second level entity, i.e. the actual page table (ptbl). 385*5d67b612SJustin Hibbits */ 386*5d67b612SJustin Hibbits #define PDIR_SHIFT 22 387*5d67b612SJustin Hibbits #define PDIR_SIZE (1 << PDIR_SHIFT) /* va range mapped by pdir */ 388*5d67b612SJustin Hibbits #define PDIR_MASK (~(PDIR_SIZE - 1)) 389*5d67b612SJustin Hibbits #define PDIR_NENTRIES 1024 /* number of page tables in pdir */ 390*5d67b612SJustin Hibbits 391*5d67b612SJustin Hibbits /* Returns pdir entry number for given va */ 392*5d67b612SJustin Hibbits #define PDIR_IDX(va) ((va) >> PDIR_SHIFT) 393*5d67b612SJustin Hibbits 394*5d67b612SJustin Hibbits #define PDIR_ENTRY_SHIFT 2 /* entry size is 2^2 = 4 bytes */ 395*5d67b612SJustin Hibbits 396*5d67b612SJustin Hibbits /* 397*5d67b612SJustin Hibbits * 2nd level - page table (ptbl) 398*5d67b612SJustin Hibbits * 399*5d67b612SJustin Hibbits * Page table covers 1024 page table entries. Page 400*5d67b612SJustin Hibbits * table entry (pte) is 32 bit wide and defines mapping 401*5d67b612SJustin Hibbits * for a single page. 402*5d67b612SJustin Hibbits */ 403*5d67b612SJustin Hibbits #define PTBL_SHIFT PAGE_SHIFT 404*5d67b612SJustin Hibbits #define PTBL_SIZE PAGE_SIZE /* va range mapped by ptbl entry */ 405*5d67b612SJustin Hibbits #define PTBL_MASK ((PDIR_SIZE - 1) & ~((1 << PAGE_SHIFT) - 1)) 406*5d67b612SJustin Hibbits #define PTBL_NENTRIES 1024 /* number of pages mapped by ptbl */ 407*5d67b612SJustin Hibbits 408*5d67b612SJustin Hibbits /* Returns ptbl entry number for given va */ 409*5d67b612SJustin Hibbits #define PTBL_IDX(va) (((va) & PTBL_MASK) >> PTBL_SHIFT) 410*5d67b612SJustin Hibbits 411*5d67b612SJustin Hibbits /* Size of ptbl in pages, 1024 entries, each sizeof(struct pte_entry). */ 412*5d67b612SJustin Hibbits #define PTBL_PAGES 2 413*5d67b612SJustin Hibbits #define PTBL_ENTRY_SHIFT 3 /* entry size is 2^3 = 8 bytes */ 414*5d67b612SJustin Hibbits 415*5d67b612SJustin Hibbits #endif 416f9bac91bSBenno Rice #endif /* _MACHINE_PTE_H_ */ 417