zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

pte.h (14336B) - Raw


      1 /*-
      2  * SPDX-License-Identifier: BSD-4-Clause
      3  *
      4  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
      5  * Copyright (C) 1995, 1996 TooLs GmbH.
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. All advertising materials mentioning features or use of this software
     17  *    must display the following acknowledgement:
     18  *	This product includes software developed by TooLs GmbH.
     19  * 4. The name of TooLs GmbH may not be used to endorse or promote products
     20  *    derived from this software without specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
     23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     28  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     29  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     30  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     31  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  *
     33  *	$NetBSD: pte.h,v 1.2 1998/08/31 14:43:40 tsubai Exp $
     34  */
     35 
     36 #ifndef	_MACHINE_PTE_H_
     37 #define	_MACHINE_PTE_H_
     38 
     39 #if defined(AIM)
     40 
     41 /*
     42  * Page Table Entries
     43  */
     44 #ifndef	LOCORE
     45 
     46 /* 32-bit PTE */
     47 struct pte {
     48 	u_int32_t pte_hi;
     49 	u_int32_t pte_lo;
     50 };
     51 
     52 struct pteg {
     53 	struct	pte pt[8];
     54 };
     55 
     56 /* 64-bit (long) PTE */
     57 struct lpte {
     58 	u_int64_t pte_hi;
     59 	u_int64_t pte_lo;
     60 };
     61 
     62 struct lpteg {
     63 	struct lpte pt[8];
     64 };
     65 
     66 /* Partition table entry */
     67 struct pate {
     68 	u_int64_t pagetab;
     69 	u_int64_t proctab;
     70 };
     71 
     72 /* Process table entry */
     73 struct prte {
     74 	u_int64_t proctab0;
     75 	u_int64_t proctab1;
     76 };
     77 
     78 typedef	struct pte pte_t;
     79 typedef	struct lpte lpte_t;
     80 #endif	/* LOCORE */
     81 
     82 /* 32-bit PTE definitions */
     83 
     84 /* High word: */
     85 #define	PTE_VALID	0x80000000
     86 #define	PTE_VSID_SHFT	7
     87 #define	PTE_HID		0x00000040
     88 #define	PTE_API		0x0000003f
     89 /* Low word: */
     90 #define	PTE_RPGN	0xfffff000
     91 #define	PTE_REF		0x00000100
     92 #define	PTE_CHG		0x00000080
     93 #define	PTE_WIMG	0x00000078
     94 #define	PTE_W		0x00000040
     95 #define	PTE_I		0x00000020
     96 #define	PTE_M		0x00000010
     97 #define	PTE_G		0x00000008
     98 #define	PTE_PP		0x00000003
     99 #define	PTE_SO		0x00000000	/* Super. Only       (U: XX, S: RW) */
    100 #define PTE_SW		0x00000001	/* Super. Write-Only (U: RO, S: RW) */
    101 #define	PTE_BW		0x00000002	/* Supervisor        (U: RW, S: RW) */
    102 #define	PTE_BR		0x00000003	/* Both Read Only    (U: RO, S: RO) */
    103 #define	PTE_RW		PTE_BW
    104 #define	PTE_RO		PTE_BR
    105 
    106 #define	PTE_EXEC	0x00000200	/* pseudo bit in attrs; page is exec */
    107 
    108 /* 64-bit PTE definitions */
    109 
    110 /* High quadword: */
    111 #define LPTE_VSID_SHIFT		12
    112 #define LPTE_AVPN_MASK		0xFFFFFFFFFFFFFF80ULL
    113 #define LPTE_AVA_MASK		0x3FFFFFFFFFFFFF80ULL
    114 #define LPTE_API		0x0000000000000F80ULL
    115 #define LPTE_SWBITS		0x0000000000000078ULL
    116 #define LPTE_WIRED		0x0000000000000010ULL
    117 #define LPTE_LOCKED		0x0000000000000008ULL
    118 #define LPTE_BIG		0x0000000000000004ULL	/* 4kb/16Mb page */
    119 #define LPTE_HID		0x0000000000000002ULL
    120 #define LPTE_VALID		0x0000000000000001ULL
    121 
    122 /* Low quadword: */
    123 #define	LP_4K_16M	0x38	/* 4KB base, 16MB actual page size */
    124 
    125 #define EXTEND_PTE(x)	UINT64_C(x)	/* make constants 64-bit */
    126 #define	LPTE_RPGN	0xfffffffffffff000ULL
    127 #define	LPTE_LP_MASK	0x00000000000ff000ULL
    128 #define	LPTE_LP_SHIFT	12
    129 #define	LPTE_LP_4K_16M	((unsigned long long)(LP_4K_16M) << LPTE_LP_SHIFT)
    130 #define	LPTE_REF	EXTEND_PTE( PTE_REF )
    131 #define	LPTE_CHG	EXTEND_PTE( PTE_CHG )
    132 #define	LPTE_WIMG	EXTEND_PTE( PTE_WIMG )
    133 #define	LPTE_W		EXTEND_PTE( PTE_W )
    134 #define	LPTE_I		EXTEND_PTE( PTE_I )
    135 #define	LPTE_M		EXTEND_PTE( PTE_M )
    136 #define	LPTE_G		EXTEND_PTE( PTE_G )
    137 #define	LPTE_NOEXEC	0x0000000000000004ULL
    138 #define	LPTE_PP		EXTEND_PTE( PTE_PP )
    139 
    140 #define	LPTE_SO		EXTEND_PTE( PTE_SO )	/* Super. Only */
    141 #define	LPTE_SW		EXTEND_PTE( PTE_SW )	/* Super. Write-Only */
    142 #define	LPTE_BW		EXTEND_PTE( PTE_BW )	/* Supervisor */
    143 #define	LPTE_BR		EXTEND_PTE( PTE_BR )	/* Both Read Only */
    144 #define	LPTE_RW		LPTE_BW
    145 #define	LPTE_RO		LPTE_BR
    146 
    147 /* HPT superpage definitions */
    148 #define	HPT_SP_SHIFT		(VM_LEVEL_0_ORDER + PAGE_SHIFT)
    149 #define	HPT_SP_SIZE		(1 << HPT_SP_SHIFT)
    150 #define	HPT_SP_MASK		(HPT_SP_SIZE - 1)
    151 #define	HPT_SP_PAGES		(1 << VM_LEVEL_0_ORDER)
    152 
    153 /* POWER ISA 3.0 Radix Table Definitions */
    154 #define	RPTE_VALID		0x8000000000000000ULL
    155 #define	RPTE_LEAF		0x4000000000000000ULL /* is a PTE: always 1 */
    156 #define	RPTE_SW0		0x2000000000000000ULL
    157 #define	RPTE_RPN_MASK		0x00FFFFFFFFFFF000ULL
    158 #define	RPTE_RPN_SHIFT		12
    159 #define	RPTE_SW1		0x0000000000000800ULL
    160 #define	RPTE_SW2		0x0000000000000400ULL
    161 #define	RPTE_SW3		0x0000000000000200ULL
    162 #define	RPTE_R			0x0000000000000100ULL
    163 #define	RPTE_C			0x0000000000000080ULL
    164 
    165 #define	RPTE_MANAGED		RPTE_SW1
    166 #define	RPTE_WIRED		RPTE_SW2
    167 #define	RPTE_PROMOTED		RPTE_SW3
    168 
    169 #define	RPTE_ATTR_MASK		0x0000000000000030ULL
    170 #define	RPTE_ATTR_MEM		0x0000000000000000ULL /* PTE M */
    171 #define	RPTE_ATTR_SAO		0x0000000000000010ULL /* PTE WIM */
    172 #define	RPTE_ATTR_GUARDEDIO	0x0000000000000020ULL /* PTE IMG */
    173 #define	RPTE_ATTR_UNGUARDEDIO	0x0000000000000030ULL /* PTE IM */
    174 
    175 #define	RPTE_EAA_MASK		0x000000000000000FULL
    176 #define	RPTE_EAA_P		0x0000000000000008ULL /* Supervisor only */
    177 #define	RPTE_EAA_R		0x0000000000000004ULL /* Read allowed */
    178 #define	RPTE_EAA_W		0x0000000000000002ULL /* Write (+read) */
    179 #define	RPTE_EAA_X		0x0000000000000001ULL /* Execute allowed */
    180 
    181 #define	RPDE_VALID		RPTE_VALID
    182 #define	RPDE_LEAF		RPTE_LEAF             /* is a PTE: always 0 */
    183 #define	RPDE_NLB_MASK		0x00FFFFFFFFFFFF00ULL
    184 #define	RPDE_NLB_SHIFT		8
    185 #define	RPDE_NLS_MASK		0x000000000000001FULL
    186 
    187 #define	PG_FRAME		(0x000ffffffffff000ul)
    188 #define	PG_PS_FRAME		(0x000fffffffe00000ul)
    189 /*
    190  * Extract bits from address
    191  */
    192 #define	ADDR_SR_SHFT	28
    193 #define	ADDR_PIDX	0x0ffff000UL
    194 #define	ADDR_PIDX_SHFT	12
    195 #define	ADDR_API_SHFT	22
    196 #define	ADDR_API_SHFT64	16
    197 #define	ADDR_POFF	0x00000fffUL
    198 
    199 /*
    200  * Bits in DSISR:
    201  */
    202 #define	DSISR_DIRECT	0x80000000
    203 #define	DSISR_NOTFOUND	0x40000000
    204 #define	DSISR_PROTECT	0x08000000
    205 #define	DSISR_INVRX	0x04000000
    206 #define	DSISR_STORE	0x02000000
    207 #define	DSISR_DABR	0x00400000
    208 #define	DSISR_SEGMENT	0x00200000
    209 #define	DSISR_EAR	0x00100000
    210 
    211 /*
    212  * Bits in SRR1 on ISI:
    213  */
    214 #define	ISSRR1_NOTFOUND	0x40000000
    215 #define	ISSRR1_DIRECT	0x10000000
    216 #define	ISSRR1_PROTECT	0x08000000
    217 #define	ISSRR1_SEGMENT	0x00200000
    218 
    219 #else /* BOOKE */
    220 
    221 #include <machine/tlb.h>
    222 
    223 /*
    224  * Flags for pte_remove() routine.
    225  */
    226 #define PTBL_HOLD	0x00000001	/* do not unhold ptbl pages */
    227 #define PTBL_UNHOLD	0x00000002	/* unhold and attempt to free ptbl pages */
    228 
    229 #define PTBL_HOLD_FLAG(pmap)	(((pmap) == kernel_pmap) ? PTBL_HOLD : PTBL_UNHOLD)
    230 
    231 /*
    232  * Page Table Entry definitions and macros.
    233  *
    234  * RPN need only be 32-bit because Book-E has 36-bit addresses, and the smallest
    235  * page size is 4k (12-bit mask), so RPN can really fit into 24 bits.
    236  */
    237 #ifndef	LOCORE
    238 typedef uint64_t pte_t;
    239 #endif
    240 
    241 /* RPN mask, TLB0 4K pages */
    242 #define PTE_PA_MASK	PAGE_MASK
    243 
    244 #if defined(BOOKE_E500)
    245 
    246 /* PTE bits assigned to MAS2, MAS3 flags */
    247 #define	PTE_MAS2_SHIFT	19
    248 #define PTE_W		(MAS2_W << PTE_MAS2_SHIFT)
    249 #define PTE_I		(MAS2_I << PTE_MAS2_SHIFT)
    250 #define PTE_M		(MAS2_M << PTE_MAS2_SHIFT)
    251 #define PTE_G		(MAS2_G << PTE_MAS2_SHIFT)
    252 #define PTE_MAS2_MASK	(MAS2_G | MAS2_M | MAS2_I | MAS2_W)
    253 
    254 #define PTE_MAS3_SHIFT	2
    255 #define PTE_UX		(MAS3_UX << PTE_MAS3_SHIFT)
    256 #define PTE_SX		(MAS3_SX << PTE_MAS3_SHIFT)
    257 #define PTE_UW		(MAS3_UW << PTE_MAS3_SHIFT)
    258 #define PTE_SW		(MAS3_SW << PTE_MAS3_SHIFT)
    259 #define PTE_UR		(MAS3_UR << PTE_MAS3_SHIFT)
    260 #define PTE_SR		(MAS3_SR << PTE_MAS3_SHIFT)
    261 #define PTE_MAS3_MASK	((MAS3_UX | MAS3_SX | MAS3_UW	\
    262 			| MAS3_SW | MAS3_UR | MAS3_SR) << PTE_MAS3_SHIFT)
    263 
    264 #define	PTE_PS_SHIFT	8
    265 #define	PTE_PS_4KB	(2 << PTE_PS_SHIFT)
    266 
    267 #endif
    268 
    269 /* Other PTE flags */
    270 #define PTE_VALID	0x00000001	/* Valid */
    271 #define PTE_MODIFIED	0x00001000	/* Modified */
    272 #define PTE_WIRED	0x00002000	/* Wired */
    273 #define PTE_MANAGED	0x00000002	/* Managed */
    274 #define PTE_REFERENCED	0x00040000	/* Referenced */
    275 
    276 /*
    277  * Page Table Entry definitions and macros.
    278  *
    279  * We use the hardware page table entry format:
    280  *
    281  * 63       24 23 19 18 17 14  13 12 11  8  7  6  5  4  3  2  1  0
    282  * ---------------------------------------------------------------
    283  * ARPN(12:51) WIMGE  R U0:U3 SW0 C  PSIZE UX SX UW SW UR SR SW1 V
    284  * ---------------------------------------------------------------
    285  */
    286 
    287 /* PTE fields. */
    288 #define PTE_TSIZE_SHIFT		(63-54)
    289 #define PTE_TSIZE_MASK		0x7
    290 #define PTE_TSIZE_SHIFT_DIRECT	(63-55)
    291 #define PTE_TSIZE_MASK_DIRECT	0xf
    292 #define PTE_PS_DIRECT(ps)	(ps<<PTE_TSIZE_SHIFT_DIRECT)	/* Direct Entry Page Size */
    293 #define PTE_PS(ps)		(ps<<PTE_TSIZE_SHIFT)	/* Page Size */
    294 
    295 /* Macro argument must of pte_t type. */
    296 #define PTE_TSIZE(pte)		(int)((*pte >> PTE_TSIZE_SHIFT) & PTE_TSIZE_MASK)
    297 #define PTE_TSIZE_DIRECT(pte)	(int)((*pte >> PTE_TSIZE_SHIFT_DIRECT) & PTE_TSIZE_MASK_DIRECT)
    298 
    299 /* Macro argument must of pte_t type. */
    300 #define	PTE_ARPN_SHIFT		12
    301 #define	PTE_FLAGS_MASK		0x00ffffff
    302 #define PTE_RPN_FROM_PA(pa)	(((pa) & ~PAGE_MASK) << PTE_ARPN_SHIFT)
    303 #define PTE_PA(pte)		((vm_paddr_t)(*pte >> PTE_ARPN_SHIFT) & ~PAGE_MASK)
    304 #define PTE_ISVALID(pte)	((*pte) & PTE_VALID)
    305 #define PTE_ISWIRED(pte)	((*pte) & PTE_WIRED)
    306 #define PTE_ISMANAGED(pte)	((*pte) & PTE_MANAGED)
    307 #define PTE_ISMODIFIED(pte)	((*pte) & PTE_MODIFIED)
    308 #define PTE_ISREFERENCED(pte)	((*pte) & PTE_REFERENCED)
    309 
    310 #endif /* BOOKE */
    311 
    312 /* Book-E page table format, broken out for the generic pmap.h. */
    313 #ifdef __powerpc64__
    314 
    315 #include <machine/tlb.h>
    316 
    317 /*
    318  * The virtual address is:
    319  *
    320  * 4K page size
    321  *   +-----+-----------+-------+-------------+-------------+----------------+
    322  *   |  -  |  pg_root  |pdir_l1|     dir#    |     pte#    | off in 4K page |
    323  *   +-----+-----------+-------+-------------+-------------+----------------+
    324  *    63 52 51       39 38   30 29    ^    21 20    ^    12 11             0
    325  *                                    |             |
    326  *                                index in 1 page of pointers
    327  *
    328  * 1st level - Root page table
    329  *
    330  * pp2d consists of PG_ROOT_NENTRIES entries, each being a pointer to
    331  * second level entity, i.e. the page table directory (pdir).
    332  */
    333 #define PG_ROOT_H		51
    334 #define PG_ROOT_L		39
    335 #define PG_ROOT_SIZE		(1UL << PG_ROOT_L)	/* va range mapped by pp2d */
    336 #define PG_ROOT_SHIFT		PG_ROOT_L
    337 #define PG_ROOT_NUM		(PG_ROOT_H - PG_ROOT_L + 1)
    338 #define PG_ROOT_MASK		((1 << PG_ROOT_NUM) - 1)
    339 #define PG_ROOT_IDX(va)		((va >> PG_ROOT_SHIFT) & PG_ROOT_MASK)
    340 #define PG_ROOT_NENTRIES	(1 << PG_ROOT_NUM)
    341 #define PG_ROOT_ENTRY_SHIFT	3	/* log2 (sizeof(struct pte_entry **)) */
    342 
    343 /*
    344  * 2nd level - page directory directory (pdir l1)
    345  *
    346  * pdir consists of PDIR_NENTRIES entries, each being a pointer to
    347  * second level entity, i.e. the actual page table (ptbl).
    348  */
    349 #define PDIR_L1_H		(PG_ROOT_L-1)
    350 #define PDIR_L1_L		30
    351 #define PDIR_L1_NUM		(PDIR_L1_H-PDIR_L1_L+1)
    352 #define PDIR_L1_SIZE		(1 << PDIR_L1_L)	/* va range mapped by pdir */
    353 #define PDIR_L1_MASK		((1<<PDIR_L1_NUM)-1)
    354 #define PDIR_L1_SHIFT		PDIR_L1_L
    355 #define PDIR_L1_NENTRIES	(1<<PDIR_L1_NUM)
    356 #define PDIR_L1_IDX(va)		(((va) >> PDIR_L1_SHIFT) & PDIR_L1_MASK)
    357 #define PDIR_L1_ENTRY_SHIFT	3	/* log2 (sizeof(struct pte_entry *)) */
    358 #define PDIR_L1_PAGES		((PDIR_L1_NENTRIES * (1<<PDIR_L1_ENTRY_SHIFT)) / PAGE_SIZE)
    359 
    360 /*
    361  * 3rd level - page table directory (pdir)
    362  *
    363  * pdir consists of PDIR_NENTRIES entries, each being a pointer to
    364  * second level entity, i.e. the actual page table (ptbl).
    365  */
    366 #define PDIR_H			(PDIR_L1_L-1)
    367 #define PDIR_L			21
    368 #define PDIR_NUM		(PDIR_H-PDIR_L+1)
    369 #define PDIR_SIZE		(1 << PDIR_L)	/* va range mapped by pdir */
    370 #define PDIR_MASK		((1<<PDIR_NUM)-1)
    371 #define PDIR_SHIFT		PDIR_L
    372 #define PDIR_NENTRIES		(1<<PDIR_NUM)
    373 #define PDIR_IDX(va)		(((va) >> PDIR_SHIFT) & PDIR_MASK)
    374 #define PDIR_ENTRY_SHIFT	3	/* log2 (sizeof(struct pte_entry *)) */
    375 #define PDIR_PAGES		((PDIR_NENTRIES * (1<<PDIR_ENTRY_SHIFT)) / PAGE_SIZE)
    376 
    377 /*
    378  * 4th level - page table (ptbl)
    379  *
    380  * Page table covers PTBL_NENTRIES page table entries. Page
    381  * table entry (pte) is 64 bit wide and defines mapping
    382  * for a single page.
    383  */
    384 #define PTBL_H			(PDIR_L-1)
    385 #define PTBL_L			PAGE_SHIFT
    386 #define PTBL_NUM		(PTBL_H-PTBL_L+1)
    387 #define PTBL_MASK		((1<<PTBL_NUM)-1)
    388 #define PTBL_SHIFT		PTBL_L
    389 #define PTBL_SIZE		PAGE_SIZE	/* va range mapped by ptbl entry */
    390 #define PTBL_NENTRIES		(1<<PTBL_NUM)
    391 #define PTBL_IDX(va)		((va >> PTBL_SHIFT) & PTBL_MASK)
    392 #define PTBL_ENTRY_SHIFT	 3	/* log2 (sizeof (struct pte_entry)) */
    393 #define PTBL_PAGES		((PTBL_NENTRIES * (1<<PTBL_ENTRY_SHIFT)) / PAGE_SIZE)
    394 
    395 #else
    396 /*
    397  * 1st level - page table directory (pdir)
    398  *
    399  * pdir consists of 1024 entries, each being a pointer to
    400  * second level entity, i.e. the actual page table (ptbl).
    401  */
    402 #define PDIR_SHIFT	22
    403 #define PDIR_SIZE	(1 << PDIR_SHIFT)	/* va range mapped by pdir */
    404 #define PDIR_MASK	(~(PDIR_SIZE - 1))
    405 #define PDIR_NENTRIES	1024			/* number of page tables in pdir */
    406 
    407 /* Returns pdir entry number for given va */
    408 #define PDIR_IDX(va)	((va) >> PDIR_SHIFT)
    409 
    410 #define PDIR_ENTRY_SHIFT 2	/* entry size is 2^2 = 4 bytes */
    411 
    412 /*
    413  * 2nd level - page table (ptbl)
    414  *
    415  * Page table covers 1024 page table entries. Page
    416  * table entry (pte) is 32 bit wide and defines mapping
    417  * for a single page.
    418  */
    419 #define PTBL_SHIFT	PAGE_SHIFT
    420 #define PTBL_SIZE	PAGE_SIZE		/* va range mapped by ptbl entry */
    421 #define PTBL_MASK	((PDIR_SIZE - 1) & ~((1 << PAGE_SHIFT) - 1))
    422 #define PTBL_NENTRIES	1024			/* number of pages mapped by ptbl */
    423 
    424 /* Returns ptbl entry number for given va */
    425 #define PTBL_IDX(va)	(((va) & PTBL_MASK) >> PTBL_SHIFT)
    426 
    427 /* Size of ptbl in pages, 1024 entries, each sizeof(struct pte_entry). */
    428 #define PTBL_PAGES	2
    429 #define PTBL_ENTRY_SHIFT 3	/* entry size is 2^3 = 8 bytes */
    430 
    431 #endif
    432 #endif /* _MACHINE_PTE_H_ */