1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 4*7c478bd9Sstevel@tonic-gate */ 5*7c478bd9Sstevel@tonic-gate 6*7c478bd9Sstevel@tonic-gate #ifndef _SYS_MMU_H 7*7c478bd9Sstevel@tonic-gate #define _SYS_MMU_H 8*7c478bd9Sstevel@tonic-gate 9*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 10*7c478bd9Sstevel@tonic-gate 11*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 12*7c478bd9Sstevel@tonic-gate extern "C" { 13*7c478bd9Sstevel@tonic-gate #endif 14*7c478bd9Sstevel@tonic-gate 15*7c478bd9Sstevel@tonic-gate #ifndef _ASM 16*7c478bd9Sstevel@tonic-gate #include <sys/types.h> 17*7c478bd9Sstevel@tonic-gate #endif 18*7c478bd9Sstevel@tonic-gate #include <sys/hypervisor_api.h> 19*7c478bd9Sstevel@tonic-gate 20*7c478bd9Sstevel@tonic-gate /* 21*7c478bd9Sstevel@tonic-gate * Definitions for the SOFT MMU 22*7c478bd9Sstevel@tonic-gate */ 23*7c478bd9Sstevel@tonic-gate 24*7c478bd9Sstevel@tonic-gate #define FAST_IMMU_MISS_TT 0x64 25*7c478bd9Sstevel@tonic-gate #define FAST_DMMU_MISS_TT 0x68 26*7c478bd9Sstevel@tonic-gate #define FAST_PROT_TT 0x6c 27*7c478bd9Sstevel@tonic-gate 28*7c478bd9Sstevel@tonic-gate /* 29*7c478bd9Sstevel@tonic-gate * Constants defining alternate spaces 30*7c478bd9Sstevel@tonic-gate * and register layouts within them, 31*7c478bd9Sstevel@tonic-gate * and a few other interesting assembly constants. 32*7c478bd9Sstevel@tonic-gate */ 33*7c478bd9Sstevel@tonic-gate 34*7c478bd9Sstevel@tonic-gate /* 35*7c478bd9Sstevel@tonic-gate * vaddr offsets of various registers 36*7c478bd9Sstevel@tonic-gate */ 37*7c478bd9Sstevel@tonic-gate #define MMU_PCONTEXT 0x08 /* primary context number */ 38*7c478bd9Sstevel@tonic-gate #define MMU_SCONTEXT 0x10 /* secondary context number */ 39*7c478bd9Sstevel@tonic-gate 40*7c478bd9Sstevel@tonic-gate /* 41*7c478bd9Sstevel@tonic-gate * Pseudo Synchronous Fault Status Register Layout 42*7c478bd9Sstevel@tonic-gate * 43*7c478bd9Sstevel@tonic-gate * IMMU and DMMU maintain their own pseudo SFSR Register 44*7c478bd9Sstevel@tonic-gate * 45*7c478bd9Sstevel@tonic-gate * +------------------------------------------------+ 46*7c478bd9Sstevel@tonic-gate * | Reserved | Context | FT | 47*7c478bd9Sstevel@tonic-gate * +----------------------|-------------------------+ 48*7c478bd9Sstevel@tonic-gate * 63 32 31 16 15 0 49*7c478bd9Sstevel@tonic-gate * 50*7c478bd9Sstevel@tonic-gate */ 51*7c478bd9Sstevel@tonic-gate #define SFSR_FT 0x0000FFFF /* fault type mask */ 52*7c478bd9Sstevel@tonic-gate #define SFSR_CTX 0xFFFF0000 /* fault context mask */ 53*7c478bd9Sstevel@tonic-gate 54*7c478bd9Sstevel@tonic-gate /* 55*7c478bd9Sstevel@tonic-gate * Definition of FT (Fault Type) bit field of sfsr. 56*7c478bd9Sstevel@tonic-gate */ 57*7c478bd9Sstevel@tonic-gate #define FT_NONE 0x00 58*7c478bd9Sstevel@tonic-gate #define FT_PRIV MMFSA_F_PRIV /* privilege violation */ 59*7c478bd9Sstevel@tonic-gate #define FT_SPEC_LD MMFSA_F_SOPG /* speculative ld to e page */ 60*7c478bd9Sstevel@tonic-gate #define FT_ATOMIC_NC MMFSA_F_NCATM /* atomic to nc page */ 61*7c478bd9Sstevel@tonic-gate #define FT_ILL_ALT MMFSA_F_INVASI /* illegal lda/sta */ 62*7c478bd9Sstevel@tonic-gate #define FT_NFO MMFSA_F_NFO /* normal access to nfo page */ 63*7c478bd9Sstevel@tonic-gate #define FT_RANGE MMFSA_F_INVVA /* dmmu or immu address out of range */ 64*7c478bd9Sstevel@tonic-gate #define FT_NEW_FMISS MMFSA_F_FMISS /* fast miss */ 65*7c478bd9Sstevel@tonic-gate #define FT_NEW_FPROT MMFSA_F_FPROT /* fast protection */ 66*7c478bd9Sstevel@tonic-gate #define FT_NEW_MISS MMFSA_F_MISS /* mmu miss */ 67*7c478bd9Sstevel@tonic-gate #define FT_NEW_INVRA MMFSA_F_INVRA /* invalid RA */ 68*7c478bd9Sstevel@tonic-gate #define FT_NEW_PROT MMFSA_F_PROT /* protection violation */ 69*7c478bd9Sstevel@tonic-gate #define FT_NEW_PRVACT MMFSA_F_PRVACT /* privileged action */ 70*7c478bd9Sstevel@tonic-gate #define FT_NEW_WPT MMFSA_F_WPT /* watchpoint hit */ 71*7c478bd9Sstevel@tonic-gate #define FT_NEW_UNALIGN MMFSA_F_UNALIGN /* unaligned access */ 72*7c478bd9Sstevel@tonic-gate #define FT_NEW_INVPGSZ MMFSA_F_INVPGSZ /* invalid page size */ 73*7c478bd9Sstevel@tonic-gate 74*7c478bd9Sstevel@tonic-gate #define SFSR_FT_SHIFT 0 /* amt. to shift right to get flt type */ 75*7c478bd9Sstevel@tonic-gate #define SFSR_CTX_SHIFT 16 /* to shift right to get context */ 76*7c478bd9Sstevel@tonic-gate #define X_FAULT_TYPE(x) (((x) & SFSR_FT) >> SFSR_FT_SHIFT) 77*7c478bd9Sstevel@tonic-gate #define X_FAULT_CTX(x) (((x) & SFSR_CTX) >> SFSR_CTX_SHIFT) 78*7c478bd9Sstevel@tonic-gate 79*7c478bd9Sstevel@tonic-gate /* 80*7c478bd9Sstevel@tonic-gate * MMU TAG TARGET register Layout 81*7c478bd9Sstevel@tonic-gate * 82*7c478bd9Sstevel@tonic-gate * +-----+---------+------+-------------------------+ 83*7c478bd9Sstevel@tonic-gate * | 000 | context | -- | virtual address [63:22] | 84*7c478bd9Sstevel@tonic-gate * +-----+---------+------+-------------------------+ 85*7c478bd9Sstevel@tonic-gate * 63 61 60 48 47 42 41 0 86*7c478bd9Sstevel@tonic-gate */ 87*7c478bd9Sstevel@tonic-gate #define TTARGET_CTX_SHIFT 48 88*7c478bd9Sstevel@tonic-gate #define TTARGET_VA_SHIFT 22 89*7c478bd9Sstevel@tonic-gate 90*7c478bd9Sstevel@tonic-gate /* 91*7c478bd9Sstevel@tonic-gate * MMU TAG ACCESS register Layout 92*7c478bd9Sstevel@tonic-gate * 93*7c478bd9Sstevel@tonic-gate * +-------------------------+------------------+ 94*7c478bd9Sstevel@tonic-gate * | virtual address [63:13] | context [12:0] | 95*7c478bd9Sstevel@tonic-gate * +-------------------------+------------------+ 96*7c478bd9Sstevel@tonic-gate * 63 13 12 0 97*7c478bd9Sstevel@tonic-gate */ 98*7c478bd9Sstevel@tonic-gate #define TAGACC_CTX_MASK 0x1FFF 99*7c478bd9Sstevel@tonic-gate #define TAGACC_SHIFT 13 100*7c478bd9Sstevel@tonic-gate #define TAGACC_VADDR_MASK (~TAGACC_CTX_MASK) 101*7c478bd9Sstevel@tonic-gate #define TAGACC_CTX_LSHIFT (64 - TAGACC_SHIFT) 102*7c478bd9Sstevel@tonic-gate 103*7c478bd9Sstevel@tonic-gate /* 104*7c478bd9Sstevel@tonic-gate * MMU PRIMARY/SECONDARY CONTEXT register 105*7c478bd9Sstevel@tonic-gate */ 106*7c478bd9Sstevel@tonic-gate #define CTXREG_CTX_MASK 0x1FFF 107*7c478bd9Sstevel@tonic-gate 108*7c478bd9Sstevel@tonic-gate /* 109*7c478bd9Sstevel@tonic-gate * The kernel always runs in KCONTEXT, and no user mappings 110*7c478bd9Sstevel@tonic-gate * are ever valid in it (so any user access pagefaults). 111*7c478bd9Sstevel@tonic-gate */ 112*7c478bd9Sstevel@tonic-gate #define KCONTEXT 0 113*7c478bd9Sstevel@tonic-gate 114*7c478bd9Sstevel@tonic-gate /* 115*7c478bd9Sstevel@tonic-gate * FLUSH_ADDR is used in the flush instruction to guarantee stores to mmu 116*7c478bd9Sstevel@tonic-gate * registers complete. It is selected so it won't miss in the tlb. 117*7c478bd9Sstevel@tonic-gate */ 118*7c478bd9Sstevel@tonic-gate #define FLUSH_ADDR (KERNELBASE + 2 * MMU_PAGESIZE4M) 119*7c478bd9Sstevel@tonic-gate 120*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 121*7c478bd9Sstevel@tonic-gate } 122*7c478bd9Sstevel@tonic-gate #endif 123*7c478bd9Sstevel@tonic-gate 124*7c478bd9Sstevel@tonic-gate #endif /* _SYS_MMU_H */ 125