1*d00b7f60Smiod /* $OpenBSD: pte.h,v 1.17 2024/04/14 19:08:09 miod Exp $ */ 2f842aaf8Sart /* $NetBSD: pte.h,v 1.7 2001/07/31 06:55:46 eeh Exp $ */ 3f842aaf8Sart 4f842aaf8Sart /* 5f842aaf8Sart * Copyright (c) 1996-1999 Eduardo Horvath 6f842aaf8Sart * 7f842aaf8Sart * Redistribution and use in source and binary forms, with or without 8f842aaf8Sart * modification, are permitted provided that the following conditions 9f842aaf8Sart * are met: 10f842aaf8Sart * 1. Redistributions of source code must retain the above copyright 11f842aaf8Sart * notice, this list of conditions and the following disclaimer. 12f842aaf8Sart * 13f842aaf8Sart * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND 14f842aaf8Sart * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15f842aaf8Sart * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16f842aaf8Sart * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE 17f842aaf8Sart * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18f842aaf8Sart * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19f842aaf8Sart * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20f842aaf8Sart * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21f842aaf8Sart * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22f842aaf8Sart * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23f842aaf8Sart * SUCH DAMAGE. 24f842aaf8Sart * 25f842aaf8Sart */ 26f842aaf8Sart 2743d4f7a5Sderaadt #ifndef _MACHINE_PTE_H_ 2843d4f7a5Sderaadt #define _MACHINE_PTE_H_ 2943d4f7a5Sderaadt 30f842aaf8Sart /* virtual address to virtual page number */ 31f842aaf8Sart #define VA_SUN4U_VPG(va) (((int)(va) >> 13) & 31) 32f842aaf8Sart 33f842aaf8Sart /* virtual address to offset within page */ 34f842aaf8Sart #define VA_SUN4U_OFF(va) (((int)(va)) & 0x1FFF) 35f842aaf8Sart 36f842aaf8Sart /* When we go to 64-bit VAs we need to handle the hole */ 37f842aaf8Sart #define VA_VPG(va) VA_SUN4U_VPG(va) 38f842aaf8Sart #define VA_OFF(va) VA_SUN4U_OFF(va) 39f842aaf8Sart 40f842aaf8Sart #define PG_SHIFT4U 13 41f842aaf8Sart #define MMU_PAGE_ALIGN 8192 42f842aaf8Sart 43f842aaf8Sart /* If you know where a tte is in the tsb, how do you find its va? */ 44f842aaf8Sart #define TSBVA(i) ((tsb[(i)].tag.f.tag_va<<22)|(((i)<<13)&0x3ff000)) 45f842aaf8Sart 46f842aaf8Sart #ifndef _LOCORE 47f842aaf8Sart /* 48f842aaf8Sart * This is the spitfire TTE. 49f842aaf8Sart */ 50e78c98cbSmiod #if 0 /* We don't use bitfields anyway. */ 51f842aaf8Sart struct sun4u_tag_fields { 52f842aaf8Sart u_int64_t tag_g:1, /* global flag */ 53f842aaf8Sart tag_ctxt:15, /* context for mapping */ 54f842aaf8Sart tag_unassigned:6, 55f842aaf8Sart tag_va:42; /* virtual address bits<64:22> */ 56f842aaf8Sart }; 57f842aaf8Sart union sun4u_tag { struct sun4u_tag_fields f; int64_t tag; }; 58f842aaf8Sart struct sun4u_data_fields { 59f842aaf8Sart u_int64_t data_v:1, /* valid bit */ 60f842aaf8Sart data_size:2, /* page size [8K*8**<SIZE>] */ 61f842aaf8Sart data_nfo:1, /* no-fault only */ 62f842aaf8Sart data_ie:1, /* invert endianness [inefficient] */ 63f842aaf8Sart data_soft2:2, /* reserved for S/W */ 64f842aaf8Sart data_pa:36, /* physical address */ 65f842aaf8Sart data_accessed:1,/* S/W accessed bit */ 66f842aaf8Sart data_modified:1,/* S/W modified bit */ 67f842aaf8Sart data_realw:1, /* S/W real writable bit (to manage modified) */ 68f842aaf8Sart data_tsblock:1, /* S/W TSB locked entry */ 69f842aaf8Sart data_exec:1, /* S/W Executable */ 70f842aaf8Sart data_onlyexec:1,/* S/W Executable only */ 71f842aaf8Sart data_lock:1, /* lock into TLB */ 72f842aaf8Sart data_cacheable:2, /* cacheability control */ 73f842aaf8Sart data_e:1, /* explicit accesses only */ 74f842aaf8Sart data_priv:1, /* privileged page */ 75f842aaf8Sart data_w:1, /* writeable */ 76f842aaf8Sart data_g:1; /* same as tag_g */ 77f842aaf8Sart }; 78f842aaf8Sart union sun4u_data { struct sun4u_data_fields f; int64_t data; }; 79f842aaf8Sart struct sun4u_tte { 80f842aaf8Sart union sun4u_tag tag; 81f842aaf8Sart union sun4u_data data; 82f842aaf8Sart }; 83f842aaf8Sart #else 84f842aaf8Sart struct sun4u_tte { 85f842aaf8Sart int64_t tag; 86f842aaf8Sart int64_t data; 87f842aaf8Sart }; 88f842aaf8Sart #endif 89f842aaf8Sart typedef struct sun4u_tte pte_t; 90f842aaf8Sart 91f842aaf8Sart /* Assembly routine to flush a mapping */ 92*d00b7f60Smiod extern void (*sp_tlb_flush_pte)(vaddr_t, uint64_t); 93*d00b7f60Smiod extern void (*sp_tlb_flush_ctx)(uint64_t); 9492e5c4ffSkettenis 9592e5c4ffSkettenis #if defined(MULTIPROCESSOR) 96*d00b7f60Smiod void smp_tlb_flush_pte(vaddr_t, uint64_t); 97*d00b7f60Smiod void smp_tlb_flush_ctx(uint64_t); 9892e5c4ffSkettenis #define tlb_flush_pte(va,ctx) smp_tlb_flush_pte(va, ctx) 9992e5c4ffSkettenis #define tlb_flush_ctx(ctx) smp_tlb_flush_ctx(ctx) 10092e5c4ffSkettenis #else 101*d00b7f60Smiod #define tlb_flush_pte(va,ctx) (*sp_tlb_flush_pte)(va, ctx) 102*d00b7f60Smiod #define tlb_flush_ctx(ctx) (*sp_tlb_flush_ctx)(ctx) 10392e5c4ffSkettenis #endif 104f842aaf8Sart 105f842aaf8Sart #endif /* _LOCORE */ 106f842aaf8Sart 107f842aaf8Sart /* TSB tag masks */ 108f842aaf8Sart #define CTX_MASK ((1<<13)-1) 109f842aaf8Sart #define TSB_TAG_CTX_SHIFT 48 110f842aaf8Sart #define TSB_TAG_VA_SHIFT 22 111f842aaf8Sart 112649a4de9Skettenis #define TSB_TAG_LOCKED 0x0000040000000000LL 113649a4de9Skettenis 114649a4de9Skettenis #define TSB_TAG_G 0x8000000000000000LL 115f842aaf8Sart #define TSB_TAG_CTX(t) ((((int64_t)(t))>>TSB_TAG_CTX_SHIFT)&CTX_MASK) 116f842aaf8Sart #define TSB_TAG_VA(t) ((((int64_t)(t))<<TSB_TAG_VA_SHIFT)) 117f842aaf8Sart #define TSB_TAG(g,ctx,va) ((((u_int64_t)((g)!=0))<<63)|(((u_int64_t)(ctx)&CTX_MASK)<<TSB_TAG_CTX_SHIFT)|(((u_int64_t)va)>>TSB_TAG_VA_SHIFT)) 118f842aaf8Sart 119f842aaf8Sart /* Page sizes */ 120f842aaf8Sart #define PGSZ_8K 0 121f842aaf8Sart #define PGSZ_64K 1 122f842aaf8Sart #define PGSZ_512K 2 123f842aaf8Sart #define PGSZ_4M 3 124f842aaf8Sart 125da4ba485Skettenis #define SUN4U_PGSZ_SHIFT 61 126da4ba485Skettenis #define SUN4U_TLB_SZ(s) (((uint64_t)(s)) << SUN4U_PGSZ_SHIFT) 127f842aaf8Sart 128f842aaf8Sart /* TLB data masks */ 129da4ba485Skettenis #define SUN4U_TLB_V 0x8000000000000000LL 130da4ba485Skettenis #define SUN4U_TLB_8K SUN4U_TLB_SZ(PGSZ_8K) 131da4ba485Skettenis #define SUN4U_TLB_64K SUN4U_TLB_SZ(PGSZ_64K) 132da4ba485Skettenis #define SUN4U_TLB_512K SUN4U_TLB_SZ(PGSZ_512K) 133da4ba485Skettenis #define SUN4U_TLB_4M SUN4U_TLB_SZ(PGSZ_4M) 134da4ba485Skettenis #define SUN4U_TLB_SZ_MASK 0x6000000000000000LL 135da4ba485Skettenis #define SUN4U_TLB_NFO 0x1000000000000000LL 136da4ba485Skettenis #define SUN4U_TLB_IE 0x0800000000000000LL 137da4ba485Skettenis #define SUN4U_TLB_SOFT2_MASK 0x07fc000000000000LL 1387396f89dSkettenis #define SUN4U_TLB_RESERVED_MASK 0x0003800000000000LL 13948e59a2bSkettenis #define SUN4U_TLB_PA_MASK 0x00007fffffffe000LL 140da4ba485Skettenis #define SUN4U_TLB_SOFT_MASK 0x0000000000001f80LL 141f842aaf8Sart /* S/W bits */ 142da4ba485Skettenis #define SUN4U_TLB_ACCESS 0x0000000000000200LL 143da4ba485Skettenis #define SUN4U_TLB_MODIFY 0x0000000000000800LL 144da4ba485Skettenis #define SUN4U_TLB_REAL_W 0x0000000000000400LL 145da4ba485Skettenis #define SUN4U_TLB_TSB_LOCK 0x0000000000001000LL 146da4ba485Skettenis #define SUN4U_TLB_EXEC 0x0000000000000100LL 147da4ba485Skettenis #define SUN4U_TLB_EXEC_ONLY 0x0000000000000080LL 148f842aaf8Sart /* H/W bits */ 149da4ba485Skettenis #define SUN4U_TLB_L 0x0000000000000040LL 150da4ba485Skettenis #define SUN4U_TLB_CACHE_MASK 0x0000000000000030LL 151da4ba485Skettenis #define SUN4U_TLB_CP 0x0000000000000020LL 152da4ba485Skettenis #define SUN4U_TLB_CV 0x0000000000000010LL 153da4ba485Skettenis #define SUN4U_TLB_E 0x0000000000000008LL 154da4ba485Skettenis #define SUN4U_TLB_P 0x0000000000000004LL 155da4ba485Skettenis #define SUN4U_TLB_W 0x0000000000000002LL 156da4ba485Skettenis #define SUN4U_TLB_G 0x0000000000000001LL 157f842aaf8Sart 158da4ba485Skettenis #define SUN4U_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \ 159da4ba485Skettenis (((valid)?SUN4U_TLB_V:0LL)|SUN4U_TLB_SZ(sz)|\ 160da4ba485Skettenis (((u_int64_t)(pa))&SUN4U_TLB_PA_MASK)|\ 161da4ba485Skettenis ((cache)?((aliased)?SUN4U_TLB_CP:SUN4U_TLB_CACHE_MASK):SUN4U_TLB_E)|\ 162da4ba485Skettenis ((priv)?SUN4U_TLB_P:0LL)|((write)?SUN4U_TLB_W:0LL)|((g)?SUN4U_TLB_G:0LL)|\ 163da4ba485Skettenis ((ie)?SUN4U_TLB_IE:0LL)) 164da4ba485Skettenis 165da4ba485Skettenis #define SUN4V_PGSZ_SHIFT 0 166da4ba485Skettenis #define SUN4V_TLB_SZ(s) (((uint64_t)(s))<<SUN4V_PGSZ_SHIFT) 167da4ba485Skettenis 168da4ba485Skettenis /* TLB data masks */ 169da4ba485Skettenis #define SUN4V_TLB_V 0x8000000000000000LL 170da4ba485Skettenis #define SUN4V_TLB_8K SUN4V_TLB_SZ(PGSZ_8K) 171da4ba485Skettenis #define SUN4V_TLB_64K SUN4V_TLB_SZ(PGSZ_64K) 172da4ba485Skettenis #define SUN4V_TLB_512K SUN4V_TLB_SZ(PGSZ_512K) 173da4ba485Skettenis #define SUN4V_TLB_4M SUN4V_TLB_SZ(PGSZ_4M) 174da4ba485Skettenis #define SUN4V_TLB_SZ_MASK 0x000000000000000fLL 175da4ba485Skettenis #define SUN4V_TLB_NFO 0x4000000000000000LL 176da4ba485Skettenis #define SUN4V_TLB_IE 0x0000000000001000LL 177da4ba485Skettenis #define SUN4V_TLB_SOFT2_MASK 0x3f00000000000000LL 178da4ba485Skettenis #define SUN4V_TLB_PA_MASK 0x00ffffffffffe000LL 179da4ba485Skettenis #define SUN4V_TLB_SOFT_MASK 0x0000000000000030LL 180da4ba485Skettenis /* S/W bits */ 181da4ba485Skettenis #define SUN4V_TLB_ACCESS 0x0000000000000010LL 182da4ba485Skettenis #define SUN4V_TLB_MODIFY 0x0000000000000020LL 183da4ba485Skettenis #define SUN4V_TLB_REAL_W 0x2000000000000000LL 184da4ba485Skettenis #define SUN4V_TLB_TSB_LOCK 0x1000000000000000LL 185da4ba485Skettenis #define SUN4V_TLB_EXEC SUN4V_TLB_X 186da4ba485Skettenis #define SUN4V_TLB_EXEC_ONLY 0x0200000000000000LL 187da4ba485Skettenis /* H/W bits */ 188da4ba485Skettenis #define SUN4V_TLB_CACHE_MASK 0x0000000000000600LL 189da4ba485Skettenis #define SUN4V_TLB_CP 0x0000000000000400LL 190da4ba485Skettenis #define SUN4V_TLB_CV 0x0000000000000200LL 191da4ba485Skettenis #define SUN4V_TLB_E 0x0000000000000800LL 192da4ba485Skettenis #define SUN4V_TLB_P 0x0000000000000100LL 193da4ba485Skettenis #define SUN4V_TLB_X 0x0000000000000080LL 194da4ba485Skettenis #define SUN4V_TLB_W 0x0000000000000040LL 195da4ba485Skettenis #define SUN4V_TLB_G 0x0000000000000000LL 196da4ba485Skettenis 197da4ba485Skettenis #define SUN4V_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \ 198da4ba485Skettenis (((valid)?SUN4V_TLB_V:0LL)|SUN4V_TLB_SZ(sz)|\ 199da4ba485Skettenis (((u_int64_t)(pa))&SUN4V_TLB_PA_MASK)|\ 200da4ba485Skettenis ((cache)?((aliased)?SUN4V_TLB_CP:SUN4V_TLB_CACHE_MASK):SUN4V_TLB_E)|\ 201da4ba485Skettenis ((priv)?SUN4V_TLB_P:0LL)|((write)?SUN4V_TLB_W:0LL)|((g)?SUN4V_TLB_G:0LL)|\ 202da4ba485Skettenis ((ie)?SUN4V_TLB_IE:0LL)) 203da4ba485Skettenis 20443d4f7a5Sderaadt #endif /* _MACHINE_PTE_H_ */ 205