1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #ifndef _SYS_MMU_H 28*7c478bd9Sstevel@tonic-gate #define _SYS_MMU_H 29*7c478bd9Sstevel@tonic-gate 30*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 31*7c478bd9Sstevel@tonic-gate 32*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 33*7c478bd9Sstevel@tonic-gate extern "C" { 34*7c478bd9Sstevel@tonic-gate #endif 35*7c478bd9Sstevel@tonic-gate 36*7c478bd9Sstevel@tonic-gate /* 37*7c478bd9Sstevel@tonic-gate * Definitions for the SOFT MMU 38*7c478bd9Sstevel@tonic-gate */ 39*7c478bd9Sstevel@tonic-gate 40*7c478bd9Sstevel@tonic-gate #define FAST_IMMU_MISS_TT 0x64 41*7c478bd9Sstevel@tonic-gate #define FAST_DMMU_MISS_TT 0x68 42*7c478bd9Sstevel@tonic-gate #define FAST_PROT_TT 0x6c 43*7c478bd9Sstevel@tonic-gate 44*7c478bd9Sstevel@tonic-gate /* 45*7c478bd9Sstevel@tonic-gate * Constants defining alternate spaces 46*7c478bd9Sstevel@tonic-gate * and register layouts within them, 47*7c478bd9Sstevel@tonic-gate * and a few other interesting assembly constants. 48*7c478bd9Sstevel@tonic-gate */ 49*7c478bd9Sstevel@tonic-gate 50*7c478bd9Sstevel@tonic-gate /* 51*7c478bd9Sstevel@tonic-gate * vaddr offsets of various registers 52*7c478bd9Sstevel@tonic-gate */ 53*7c478bd9Sstevel@tonic-gate #define MMU_TTARGET 0x00 /* TSB tag target */ 54*7c478bd9Sstevel@tonic-gate #define MMU_PCONTEXT 0x08 /* primary context number */ 55*7c478bd9Sstevel@tonic-gate #define MMU_SCONTEXT 0x10 /* secondary context number */ 56*7c478bd9Sstevel@tonic-gate #define MMU_SFSR 0x18 /* sync fault status reg */ 57*7c478bd9Sstevel@tonic-gate #define MMU_SFAR 0x20 /* sync fault addr reg */ 58*7c478bd9Sstevel@tonic-gate #define MMU_TSB 0x28 /* tsb base and config */ 59*7c478bd9Sstevel@tonic-gate #define MMU_TAG_ACCESS 0x30 /* tlb tag access */ 60*7c478bd9Sstevel@tonic-gate #define MMU_VAW 0x38 /* virtual watchpoint */ 61*7c478bd9Sstevel@tonic-gate #define MMU_PAW 0x40 /* physical watchpoint */ 62*7c478bd9Sstevel@tonic-gate #define MMU_TSB_PX 0x48 /* i/d tsb primary extension reg */ 63*7c478bd9Sstevel@tonic-gate #define MMU_TSB_SX 0x50 /* d tsb secondary extension reg */ 64*7c478bd9Sstevel@tonic-gate #define MMU_TSB_NX 0x58 /* i/d tsb nucleus extension reg */ 65*7c478bd9Sstevel@tonic-gate #define MMU_TAG_ACCESS_EXT 0x60 /* tlb tag access extension reg */ 66*7c478bd9Sstevel@tonic-gate 67*7c478bd9Sstevel@tonic-gate 68*7c478bd9Sstevel@tonic-gate 69*7c478bd9Sstevel@tonic-gate /* 70*7c478bd9Sstevel@tonic-gate * Synchronous Fault Status Register Layout 71*7c478bd9Sstevel@tonic-gate * 72*7c478bd9Sstevel@tonic-gate * IMMU and DMMU maintain their own SFSR Register 73*7c478bd9Sstevel@tonic-gate * ______________________________________________________________________ 74*7c478bd9Sstevel@tonic-gate * | Reserved | ASI | Reserved | FT | E | Cntx | PRIV | W | OW | FV| 75*7c478bd9Sstevel@tonic-gate * |--------------|------|----------|----|---|------|------|---|----|---| 76*7c478bd9Sstevel@tonic-gate * 63 24 23 16 15 14 13 7 6 5 4 3 2 1 0 77*7c478bd9Sstevel@tonic-gate * 78*7c478bd9Sstevel@tonic-gate */ 79*7c478bd9Sstevel@tonic-gate #define SFSR_FV 0x00000001 /* fault valid */ 80*7c478bd9Sstevel@tonic-gate #define SFSR_OW 0x00000002 /* overwrite */ 81*7c478bd9Sstevel@tonic-gate #define SFSR_W 0x00000004 /* data write */ 82*7c478bd9Sstevel@tonic-gate #define SFSR_PR 0x00000008 /* privilege mode */ 83*7c478bd9Sstevel@tonic-gate #define SFSR_CTX 0x00000030 /* context id */ 84*7c478bd9Sstevel@tonic-gate #define SFSR_E 0x00000040 /* side-effect */ 85*7c478bd9Sstevel@tonic-gate #define SFSR_FT 0x00003F80 /* fault type mask */ 86*7c478bd9Sstevel@tonic-gate #define SFSR_ASI 0x00FF0000 /* ASI */ 87*7c478bd9Sstevel@tonic-gate 88*7c478bd9Sstevel@tonic-gate /* 89*7c478bd9Sstevel@tonic-gate * Definition of FT (Fault Type) bit field of sfsr. 90*7c478bd9Sstevel@tonic-gate */ 91*7c478bd9Sstevel@tonic-gate #define FT_NONE 0x00 92*7c478bd9Sstevel@tonic-gate #define FT_PRIV 0x01 /* privilege violation */ 93*7c478bd9Sstevel@tonic-gate #define FT_SPEC_LD 0x02 /* speculative ld to e page */ 94*7c478bd9Sstevel@tonic-gate #define FT_ATOMIC_NC 0x04 /* atomic to nc page */ 95*7c478bd9Sstevel@tonic-gate #define FT_ILL_ALT 0x08 /* illegal lda/sta */ 96*7c478bd9Sstevel@tonic-gate #define FT_NFO 0x10 /* normal access to nfo page */ 97*7c478bd9Sstevel@tonic-gate #define FT_RANGE 0x20 /* dmmu or immu address out of range */ 98*7c478bd9Sstevel@tonic-gate #define FT_RANGE_REG 0x40 /* jump to reg out of range */ 99*7c478bd9Sstevel@tonic-gate #define SFSR_FT_SHIFT 7 /* amt. to shift right to get flt type */ 100*7c478bd9Sstevel@tonic-gate #define X_FAULT_TYPE(x) (((x) & SFSR_FT) >> SFSR_FT_SHIFT) 101*7c478bd9Sstevel@tonic-gate 102*7c478bd9Sstevel@tonic-gate /* 103*7c478bd9Sstevel@tonic-gate * Defines for CT (ConText id) bit field of sfsr. 104*7c478bd9Sstevel@tonic-gate */ 105*7c478bd9Sstevel@tonic-gate #define CT_PRIMARY 0x0 /* primary */ 106*7c478bd9Sstevel@tonic-gate #define CT_SECONDARY 0x1 /* secondary */ 107*7c478bd9Sstevel@tonic-gate #define CT_NUCLEUS 0x2 /* nucleus */ 108*7c478bd9Sstevel@tonic-gate #define SFSR_CT_SHIFT 4 109*7c478bd9Sstevel@tonic-gate 110*7c478bd9Sstevel@tonic-gate #define SFSR_ASI_SHIFT 16 111*7c478bd9Sstevel@tonic-gate 112*7c478bd9Sstevel@tonic-gate /* 113*7c478bd9Sstevel@tonic-gate * MMU TAG TARGET register Layout 114*7c478bd9Sstevel@tonic-gate * 115*7c478bd9Sstevel@tonic-gate * +-----+---------+------+-------------------------+ 116*7c478bd9Sstevel@tonic-gate * | 000 | context | -- | virtual address [63:22] | 117*7c478bd9Sstevel@tonic-gate * +-----+---------+------+-------------------------+ 118*7c478bd9Sstevel@tonic-gate * 63 61 60 48 47 42 41 0 119*7c478bd9Sstevel@tonic-gate */ 120*7c478bd9Sstevel@tonic-gate #define TTARGET_CTX_SHIFT 48 121*7c478bd9Sstevel@tonic-gate #define TTARGET_VA_SHIFT 22 122*7c478bd9Sstevel@tonic-gate 123*7c478bd9Sstevel@tonic-gate /* 124*7c478bd9Sstevel@tonic-gate * MMU TAG ACCESS register Layout 125*7c478bd9Sstevel@tonic-gate * 126*7c478bd9Sstevel@tonic-gate * +-------------------------+------------------+ 127*7c478bd9Sstevel@tonic-gate * | virtual address [63:13] | context [12:0] | 128*7c478bd9Sstevel@tonic-gate * +-------------------------+------------------+ 129*7c478bd9Sstevel@tonic-gate * 63 13 12 0 130*7c478bd9Sstevel@tonic-gate */ 131*7c478bd9Sstevel@tonic-gate #define TAGACC_CTX_MASK 0x1FFF 132*7c478bd9Sstevel@tonic-gate #define TAGACC_SHIFT 13 133*7c478bd9Sstevel@tonic-gate #define TAGACC_VADDR_MASK (~TAGACC_CTX_MASK) 134*7c478bd9Sstevel@tonic-gate #define TAGACC_CTX_LSHIFT (64 - TAGACC_SHIFT) 135*7c478bd9Sstevel@tonic-gate 136*7c478bd9Sstevel@tonic-gate /* 137*7c478bd9Sstevel@tonic-gate * MMU DEMAP Register Layout 138*7c478bd9Sstevel@tonic-gate * 139*7c478bd9Sstevel@tonic-gate * +-------------------------+------+------+---------+-----+ 140*7c478bd9Sstevel@tonic-gate * | virtual address [63:13] | rsvd | type | context | 0 | 141*7c478bd9Sstevel@tonic-gate * +-------------------------+------+------+---------+-----+ 142*7c478bd9Sstevel@tonic-gate * 63 13 12 8 7 6 5 4 3 0 143*7c478bd9Sstevel@tonic-gate */ 144*7c478bd9Sstevel@tonic-gate #define DEMAP_PRIMARY (CT_PRIMARY << SFSR_CT_SHIFT) 145*7c478bd9Sstevel@tonic-gate #define DEMAP_SECOND (CT_SECONDARY << SFSR_CT_SHIFT) 146*7c478bd9Sstevel@tonic-gate #define DEMAP_NUCLEUS (CT_NUCLEUS << SFSR_CT_SHIFT) 147*7c478bd9Sstevel@tonic-gate #define DEMAP_TYPE_SHIFT 6 148*7c478bd9Sstevel@tonic-gate #define DEMAP_PAGE_TYPE (0 << DEMAP_TYPE_SHIFT) 149*7c478bd9Sstevel@tonic-gate #define DEMAP_CTX_TYPE (1 << DEMAP_TYPE_SHIFT) 150*7c478bd9Sstevel@tonic-gate #define DEMAP_ALL_TYPE (2 << DEMAP_TYPE_SHIFT) 151*7c478bd9Sstevel@tonic-gate 152*7c478bd9Sstevel@tonic-gate /* 153*7c478bd9Sstevel@tonic-gate * TLB DATA ACCESS Address Layout 154*7c478bd9Sstevel@tonic-gate * 155*7c478bd9Sstevel@tonic-gate * +-------------+---------------+---+ 156*7c478bd9Sstevel@tonic-gate * + Not used | tlb entry | 0 | 157*7c478bd9Sstevel@tonic-gate * +-------------+---------------+---+ 158*7c478bd9Sstevel@tonic-gate * 63 9 8 3 2 0 159*7c478bd9Sstevel@tonic-gate */ 160*7c478bd9Sstevel@tonic-gate #define DTACC_SHIFT 0x3 161*7c478bd9Sstevel@tonic-gate #define DTACC_INC 0x8 162*7c478bd9Sstevel@tonic-gate 163*7c478bd9Sstevel@tonic-gate /* 164*7c478bd9Sstevel@tonic-gate * TSB Register Layout 165*7c478bd9Sstevel@tonic-gate * 166*7c478bd9Sstevel@tonic-gate * split will always be 0. It will not be supported by software. 167*7c478bd9Sstevel@tonic-gate * 168*7c478bd9Sstevel@tonic-gate * +----------------------+-------+-----+-------+ 169*7c478bd9Sstevel@tonic-gate * + tsb_base va [63:13] | split | - | size | 170*7c478bd9Sstevel@tonic-gate * +----------------------+-------+-----+-------+ 171*7c478bd9Sstevel@tonic-gate * 63 13 12 11 3 2 0 172*7c478bd9Sstevel@tonic-gate */ 173*7c478bd9Sstevel@tonic-gate #define TSBBASE_SHIFT 13 174*7c478bd9Sstevel@tonic-gate #define TSB_SZ_MASK 0x7 175*7c478bd9Sstevel@tonic-gate 176*7c478bd9Sstevel@tonic-gate /* 177*7c478bd9Sstevel@tonic-gate * MMU TAG READ register Layout 178*7c478bd9Sstevel@tonic-gate * 179*7c478bd9Sstevel@tonic-gate * +-------------------------+------------------+ 180*7c478bd9Sstevel@tonic-gate * | virtual address [63:13] | context [12:0] | 181*7c478bd9Sstevel@tonic-gate * +-------------------------+------------------+ 182*7c478bd9Sstevel@tonic-gate * 63 13 12 0 183*7c478bd9Sstevel@tonic-gate */ 184*7c478bd9Sstevel@tonic-gate #define TAGREAD_CTX_MASK 0x1FFF 185*7c478bd9Sstevel@tonic-gate #define TAGREAD_SHIFT 13 186*7c478bd9Sstevel@tonic-gate #define TAGREAD_VADDR_MASK (~TAGREAD_CTX_MASK) 187*7c478bd9Sstevel@tonic-gate 188*7c478bd9Sstevel@tonic-gate /* 189*7c478bd9Sstevel@tonic-gate * MMU TAG ACCESS EXTENSION register Layout 190*7c478bd9Sstevel@tonic-gate * 191*7c478bd9Sstevel@tonic-gate * DTLB only 192*7c478bd9Sstevel@tonic-gate * +-----+-------+-------+-----+ 193*7c478bd9Sstevel@tonic-gate * | - | pgsz1 | pgsz0 | - | 194*7c478bd9Sstevel@tonic-gate * +-----+-------+-------+-----+ 195*7c478bd9Sstevel@tonic-gate * 63 21 19 18 16 15 0 196*7c478bd9Sstevel@tonic-gate */ 197*7c478bd9Sstevel@tonic-gate #define TAGACCEXT_SHIFT 16 198*7c478bd9Sstevel@tonic-gate #define TAGACCEXT_MKSZPAIR(SZ1, SZ0) (((SZ1) << 3) | (SZ0)) 199*7c478bd9Sstevel@tonic-gate 200*7c478bd9Sstevel@tonic-gate /* 201*7c478bd9Sstevel@tonic-gate * MMU PRIMARY/SECONDARY CONTEXT register 202*7c478bd9Sstevel@tonic-gate */ 203*7c478bd9Sstevel@tonic-gate #define CTXREG_CTX_MASK 0x1FFF 204*7c478bd9Sstevel@tonic-gate #define CTXREG_EXT_SHIFT 16 205*7c478bd9Sstevel@tonic-gate #define CTXREG_NEXT_SHIFT 58 206*7c478bd9Sstevel@tonic-gate 207*7c478bd9Sstevel@tonic-gate /* 208*7c478bd9Sstevel@tonic-gate * The kernel always runs in KCONTEXT, and no user mappings 209*7c478bd9Sstevel@tonic-gate * are ever valid in it (so any user access pagefaults). 210*7c478bd9Sstevel@tonic-gate */ 211*7c478bd9Sstevel@tonic-gate #define KCONTEXT 0 212*7c478bd9Sstevel@tonic-gate 213*7c478bd9Sstevel@tonic-gate /* 214*7c478bd9Sstevel@tonic-gate * FLUSH_ADDR is used in the flush instruction to guarantee stores to mmu 215*7c478bd9Sstevel@tonic-gate * registers complete. It is selected so it won't miss in the tlb. 216*7c478bd9Sstevel@tonic-gate */ 217*7c478bd9Sstevel@tonic-gate #define FLUSH_ADDR (KERNELBASE + 2 * MMU_PAGESIZE4M) 218*7c478bd9Sstevel@tonic-gate 219*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 220*7c478bd9Sstevel@tonic-gate } 221*7c478bd9Sstevel@tonic-gate #endif 222*7c478bd9Sstevel@tonic-gate 223*7c478bd9Sstevel@tonic-gate #endif /* _SYS_MMU_H */ 224