17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 560972f37Sjb145095 * Common Development and Distribution License (the "License"). 660972f37Sjb145095 * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*125be069SJason Beloro * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate /* 277c478bd9Sstevel@tonic-gate * VM - Hardware Address Translation management. 287c478bd9Sstevel@tonic-gate * 297c478bd9Sstevel@tonic-gate * This file describes the contents of the sun reference mmu (sfmmu) 307c478bd9Sstevel@tonic-gate * specific hat data structures and the sfmmu specific hat procedures. 317c478bd9Sstevel@tonic-gate * The machine independent interface is described in <vm/hat.h>. 327c478bd9Sstevel@tonic-gate */ 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #ifndef _VM_MACH_SFMMU_H 357c478bd9Sstevel@tonic-gate #define _VM_MACH_SFMMU_H 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate #include <sys/x_call.h> 387c478bd9Sstevel@tonic-gate #include <sys/hypervisor_api.h> 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #ifdef __cplusplus 417c478bd9Sstevel@tonic-gate extern "C" { 427c478bd9Sstevel@tonic-gate #endif 437c478bd9Sstevel@tonic-gate 447c478bd9Sstevel@tonic-gate /* 457c478bd9Sstevel@tonic-gate * Define UTSB_PHYS if user TSB is always accessed via physical address. 467c478bd9Sstevel@tonic-gate * On sun4v platform, user TSB is accessed via physical address. 477c478bd9Sstevel@tonic-gate */ 487c478bd9Sstevel@tonic-gate #define UTSB_PHYS 1 497c478bd9Sstevel@tonic-gate 507c478bd9Sstevel@tonic-gate /* 517c478bd9Sstevel@tonic-gate * Hypervisor TSB info 527c478bd9Sstevel@tonic-gate */ 5305d3dc4bSpaulsan #define NHV_TSB_INFO 4 547c478bd9Sstevel@tonic-gate 557c478bd9Sstevel@tonic-gate #ifndef _ASM 567c478bd9Sstevel@tonic-gate 577c478bd9Sstevel@tonic-gate struct hv_tsb_block { 587c478bd9Sstevel@tonic-gate uint64_t hv_tsb_info_pa; /* hypervisor TSB info PA */ 597c478bd9Sstevel@tonic-gate uint64_t hv_tsb_info_cnt; /* hypervisor TSB info count */ 607c478bd9Sstevel@tonic-gate hv_tsb_info_t hv_tsb_info[NHV_TSB_INFO]; /* hypervisor TSB info */ 617c478bd9Sstevel@tonic-gate }; 627c478bd9Sstevel@tonic-gate 637c478bd9Sstevel@tonic-gate #endif /* _ASM */ 647c478bd9Sstevel@tonic-gate 657c478bd9Sstevel@tonic-gate #ifdef _ASM 667c478bd9Sstevel@tonic-gate 677c478bd9Sstevel@tonic-gate /* 6805d3dc4bSpaulsan * This macro is used to set private/shared secondary context register in 6905d3dc4bSpaulsan * sfmmu_alloc_ctx(). 7005d3dc4bSpaulsan * Input: 7105d3dc4bSpaulsan * cnum = cnum 7205d3dc4bSpaulsan * is_shctx = sfmmu private/shared flag (0: private, 1: shared) 732f0fcb93SJason Beloro * tmp2 is only used in the sun4u version of this macro 7405d3dc4bSpaulsan */ 751426d65aSsm142603 #define SET_SECCTX(cnum, is_shctx, tmp1, tmp2, label) \ 7605d3dc4bSpaulsan mov MMU_SCONTEXT, tmp1; \ 7705d3dc4bSpaulsan movrnz is_shctx, MMU_SCONTEXT1, tmp1; \ 7805d3dc4bSpaulsan stxa cnum, [tmp1]ASI_MMU_CTX; /* set 2nd ctx reg. */ \ 792f0fcb93SJason Beloro membar #Sync; \ 8005d3dc4bSpaulsan 8105d3dc4bSpaulsan /* 827c478bd9Sstevel@tonic-gate * This macro is used in the MMU code to check if TL should be lowered from 837c478bd9Sstevel@tonic-gate * 2 to 1 to pop trapstat's state. See the block comment in trapstat.c 847c478bd9Sstevel@tonic-gate * for details. 857c478bd9Sstevel@tonic-gate */ 867c478bd9Sstevel@tonic-gate 877c478bd9Sstevel@tonic-gate #define TSTAT_CHECK_TL1(label, scr1, scr2) \ 887c478bd9Sstevel@tonic-gate rdpr %tpc, scr1; \ 897c478bd9Sstevel@tonic-gate sethi %hi(KERNELBASE), scr2; \ 907c478bd9Sstevel@tonic-gate or scr2, %lo(KERNELBASE), scr2; \ 917c478bd9Sstevel@tonic-gate cmp scr1, scr2; \ 927c478bd9Sstevel@tonic-gate bgeu %xcc, 9f; \ 937c478bd9Sstevel@tonic-gate nop; \ 947c478bd9Sstevel@tonic-gate wrpr %g0, 1, %gl; \ 957c478bd9Sstevel@tonic-gate ba label; \ 967c478bd9Sstevel@tonic-gate wrpr %g0, 1, %tl; \ 977c478bd9Sstevel@tonic-gate 9: 987c478bd9Sstevel@tonic-gate 997c478bd9Sstevel@tonic-gate /* 1007c478bd9Sstevel@tonic-gate * The following macros allow us to share majority of the 1017c478bd9Sstevel@tonic-gate * SFMMU code between sun4u and sun4v platforms. 1027c478bd9Sstevel@tonic-gate */ 1037c478bd9Sstevel@tonic-gate 1047c478bd9Sstevel@tonic-gate #define SETUP_TSB_ASI(qlp, tmp) 1057c478bd9Sstevel@tonic-gate 1067c478bd9Sstevel@tonic-gate #define SETUP_UTSB_ATOMIC_ASI(tmp1, tmp2) 1077c478bd9Sstevel@tonic-gate 1087c478bd9Sstevel@tonic-gate /* 1097c478bd9Sstevel@tonic-gate * Macro to swtich to alternate global register on sun4u platforms 1107c478bd9Sstevel@tonic-gate * (not applicable to sun4v platforms) 1117c478bd9Sstevel@tonic-gate */ 1127c478bd9Sstevel@tonic-gate #define USE_ALTERNATE_GLOBALS(scr) 1137c478bd9Sstevel@tonic-gate 1147c478bd9Sstevel@tonic-gate /* 1157c478bd9Sstevel@tonic-gate * Macro to set %gl register value on sun4v platforms 1167c478bd9Sstevel@tonic-gate * (not applicable to sun4u platforms) 1177c478bd9Sstevel@tonic-gate */ 1187c478bd9Sstevel@tonic-gate #define SET_GL_REG(val) \ 1197c478bd9Sstevel@tonic-gate wrpr %g0, val, %gl 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate /* 12260972f37Sjb145095 * Get pseudo-tagacc value and context from the MMU fault area. Pseudo-tagacc 12360972f37Sjb145095 * is the faulting virtual address OR'd with 0 for KCONTEXT, INVALID_CONTEXT 12460972f37Sjb145095 * (1) for invalid context, and USER_CONTEXT (2) for user context. 1257c478bd9Sstevel@tonic-gate * 1267c478bd9Sstevel@tonic-gate * In: 12760972f37Sjb145095 * tagacc, ctxtype = scratch registers 1287c478bd9Sstevel@tonic-gate * Out: 1297c478bd9Sstevel@tonic-gate * tagacc = MMU data tag access register value 13060972f37Sjb145095 * ctx = context type (KCONTEXT, INVALID_CONTEXT or USER_CONTEXT) 1317c478bd9Sstevel@tonic-gate */ 13260972f37Sjb145095 #define GET_MMU_D_PTAGACC_CTXTYPE(ptagacc, ctxtype) \ 13360972f37Sjb145095 MMU_FAULT_STATUS_AREA(ctxtype); \ 13460972f37Sjb145095 ldx [ctxtype + MMFSA_D_ADDR], ptagacc; \ 13560972f37Sjb145095 ldx [ctxtype + MMFSA_D_CTX], ctxtype; \ 13660972f37Sjb145095 srlx ptagacc, MMU_PAGESHIFT, ptagacc; /* align to page boundary */ \ 13760972f37Sjb145095 cmp ctxtype, USER_CONTEXT_TYPE; \ 13860972f37Sjb145095 sllx ptagacc, MMU_PAGESHIFT, ptagacc; \ 13960972f37Sjb145095 movgu %icc, USER_CONTEXT_TYPE, ctxtype; \ 14060972f37Sjb145095 or ptagacc, ctxtype, ptagacc 1417c478bd9Sstevel@tonic-gate 1427c478bd9Sstevel@tonic-gate /* 1437c478bd9Sstevel@tonic-gate * Synthesize/get data tag access register value from the MMU fault area 1447c478bd9Sstevel@tonic-gate * 1457c478bd9Sstevel@tonic-gate * In: 1467c478bd9Sstevel@tonic-gate * tagacc, scr1 = scratch registers 1477c478bd9Sstevel@tonic-gate * Out: 1487c478bd9Sstevel@tonic-gate * tagacc = MMU data tag access register value 1497c478bd9Sstevel@tonic-gate */ 1507c478bd9Sstevel@tonic-gate #define GET_MMU_D_TAGACC(tagacc, scr1) \ 15160972f37Sjb145095 GET_MMU_D_PTAGACC_CTXTYPE(tagacc, scr1) 1527c478bd9Sstevel@tonic-gate 1537c478bd9Sstevel@tonic-gate /* 1547c478bd9Sstevel@tonic-gate * Synthesize/get data tag target register value from the MMU fault area 1557c478bd9Sstevel@tonic-gate * 1567c478bd9Sstevel@tonic-gate * In: 1577c478bd9Sstevel@tonic-gate * ttarget, scr1 = scratch registers 1587c478bd9Sstevel@tonic-gate * Out: 1597c478bd9Sstevel@tonic-gate * ttarget = MMU data tag target register value 1607c478bd9Sstevel@tonic-gate */ 1617c478bd9Sstevel@tonic-gate #define GET_MMU_D_TTARGET(ttarget, scr1) \ 1627c478bd9Sstevel@tonic-gate MMU_FAULT_STATUS_AREA(ttarget); \ 1637c478bd9Sstevel@tonic-gate ldx [ttarget + MMFSA_D_CTX], scr1; \ 1647c478bd9Sstevel@tonic-gate sllx scr1, TTARGET_CTX_SHIFT, scr1; \ 1657c478bd9Sstevel@tonic-gate ldx [ttarget + MMFSA_D_ADDR], ttarget; \ 1667c478bd9Sstevel@tonic-gate srlx ttarget, TTARGET_VA_SHIFT, ttarget; \ 1677c478bd9Sstevel@tonic-gate or ttarget, scr1, ttarget 1687c478bd9Sstevel@tonic-gate 1697c478bd9Sstevel@tonic-gate /* 17060972f37Sjb145095 * Synthesize/get data/instruction psuedo tag access register values 17160972f37Sjb145095 * from the MMU fault area (context is 0 for kernel, 1 for invalid, 2 for user) 1727c478bd9Sstevel@tonic-gate * 1737c478bd9Sstevel@tonic-gate * In: 1747c478bd9Sstevel@tonic-gate * dtagacc, itagacc, scr1, scr2 = scratch registers 1757c478bd9Sstevel@tonic-gate * Out: 17660972f37Sjb145095 * dtagacc = MMU data tag access register value w/psuedo-context 17760972f37Sjb145095 * itagacc = MMU instruction tag access register value w/pseudo-context 1787c478bd9Sstevel@tonic-gate */ 1797c478bd9Sstevel@tonic-gate #define GET_MMU_BOTH_TAGACC(dtagacc, itagacc, scr1, scr2) \ 1807c478bd9Sstevel@tonic-gate MMU_FAULT_STATUS_AREA(scr1); \ 1817c478bd9Sstevel@tonic-gate ldx [scr1 + MMFSA_D_ADDR], scr2; \ 1827c478bd9Sstevel@tonic-gate ldx [scr1 + MMFSA_D_CTX], dtagacc; \ 18360972f37Sjb145095 srlx scr2, MMU_PAGESHIFT, scr2; /* align to page boundary */ \ 18460972f37Sjb145095 cmp dtagacc, USER_CONTEXT_TYPE; \ 1857c478bd9Sstevel@tonic-gate sllx scr2, MMU_PAGESHIFT, scr2; \ 18660972f37Sjb145095 movgu %icc, USER_CONTEXT_TYPE, dtagacc; \ 1877c478bd9Sstevel@tonic-gate or scr2, dtagacc, dtagacc; \ 1887c478bd9Sstevel@tonic-gate ldx [scr1 + MMFSA_I_ADDR], scr2; \ 1897c478bd9Sstevel@tonic-gate ldx [scr1 + MMFSA_I_CTX], itagacc; \ 1907c478bd9Sstevel@tonic-gate srlx scr2, MMU_PAGESHIFT, scr2; /* align to page boundry */ \ 19160972f37Sjb145095 cmp itagacc, USER_CONTEXT_TYPE; \ 1927c478bd9Sstevel@tonic-gate sllx scr2, MMU_PAGESHIFT, scr2; \ 19360972f37Sjb145095 movgu %icc, USER_CONTEXT_TYPE, itagacc; \ 1947c478bd9Sstevel@tonic-gate or scr2, itagacc, itagacc 1957c478bd9Sstevel@tonic-gate 1967c478bd9Sstevel@tonic-gate /* 1977c478bd9Sstevel@tonic-gate * Synthesize/get MMU data fault address from the MMU fault area 1987c478bd9Sstevel@tonic-gate * 1997c478bd9Sstevel@tonic-gate * In: 2007c478bd9Sstevel@tonic-gate * daddr, scr1 = scratch registers 2017c478bd9Sstevel@tonic-gate * Out: 2027c478bd9Sstevel@tonic-gate * daddr = MMU data fault address 2037c478bd9Sstevel@tonic-gate */ 2047c478bd9Sstevel@tonic-gate #define GET_MMU_D_ADDR(daddr, scr1) \ 2057c478bd9Sstevel@tonic-gate MMU_FAULT_STATUS_AREA(scr1); \ 2067c478bd9Sstevel@tonic-gate ldx [scr1 + MMFSA_D_ADDR], daddr 2077c478bd9Sstevel@tonic-gate 2087c478bd9Sstevel@tonic-gate /* 20960972f37Sjb145095 * Get pseudo-tagacc value and context from the MMU fault area. Pseudo-tagacc 21060972f37Sjb145095 * is the faulting virtual address OR'd with 0 for KCONTEXT, INVALID_CONTEXT 21160972f37Sjb145095 * (1) for invalid context, and USER_CONTEXT (2) for user context. 21260972f37Sjb145095 * 21360972f37Sjb145095 * In: 21460972f37Sjb145095 * tagacc, ctxtype = scratch registers 21560972f37Sjb145095 * Out: 21660972f37Sjb145095 * tagacc = MMU instruction tag access register value 21760972f37Sjb145095 * ctxtype = context type (KCONTEXT, INVALID_CONTEXT or USER_CONTEXT) 21860972f37Sjb145095 */ 21960972f37Sjb145095 #define GET_MMU_I_PTAGACC_CTXTYPE(ptagacc, ctxtype) \ 22060972f37Sjb145095 MMU_FAULT_STATUS_AREA(ctxtype); \ 22160972f37Sjb145095 ldx [ctxtype + MMFSA_I_ADDR], ptagacc; \ 22260972f37Sjb145095 ldx [ctxtype + MMFSA_I_CTX], ctxtype; \ 22360972f37Sjb145095 srlx ptagacc, MMU_PAGESHIFT, ptagacc; /* align to page boundary */ \ 22460972f37Sjb145095 cmp ctxtype, USER_CONTEXT_TYPE; \ 22560972f37Sjb145095 sllx ptagacc, MMU_PAGESHIFT, ptagacc; \ 22660972f37Sjb145095 movgu %icc, USER_CONTEXT_TYPE, ctxtype; \ 22760972f37Sjb145095 or ptagacc, ctxtype, ptagacc 22860972f37Sjb145095 22960972f37Sjb145095 /* 2307c478bd9Sstevel@tonic-gate * Load ITLB entry 2317c478bd9Sstevel@tonic-gate * 2327c478bd9Sstevel@tonic-gate * In: 2337c478bd9Sstevel@tonic-gate * tte = reg containing tte 2347c478bd9Sstevel@tonic-gate * scr1, scr2, scr3, scr4 = scratch registers 2357c478bd9Sstevel@tonic-gate */ 2367c478bd9Sstevel@tonic-gate #define ITLB_STUFF(tte, scr1, scr2, scr3, scr4) \ 2377c478bd9Sstevel@tonic-gate mov %o0, scr1; \ 2387c478bd9Sstevel@tonic-gate mov %o1, scr2; \ 2397c478bd9Sstevel@tonic-gate mov %o2, scr3; \ 2407c478bd9Sstevel@tonic-gate mov %o3, scr4; \ 2417c478bd9Sstevel@tonic-gate MMU_FAULT_STATUS_AREA(%o2); \ 2427c478bd9Sstevel@tonic-gate ldx [%o2 + MMFSA_I_ADDR], %o0; \ 2437c478bd9Sstevel@tonic-gate ldx [%o2 + MMFSA_I_CTX], %o1; \ 2447c478bd9Sstevel@tonic-gate mov tte, %o2; \ 2457c478bd9Sstevel@tonic-gate mov MAP_ITLB, %o3; \ 2467c478bd9Sstevel@tonic-gate ta MMU_MAP_ADDR; \ 2477c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 2487c478bd9Sstevel@tonic-gate brnz,a,pn %o0, ptl1_panic; \ 2497c478bd9Sstevel@tonic-gate mov PTL1_BAD_HCALL, %g1; \ 2507c478bd9Sstevel@tonic-gate /* END CSTYLED */ \ 2517c478bd9Sstevel@tonic-gate mov scr1, %o0; \ 2527c478bd9Sstevel@tonic-gate mov scr2, %o1; \ 2537c478bd9Sstevel@tonic-gate mov scr3, %o2; \ 2547c478bd9Sstevel@tonic-gate mov scr4, %o3 2557c478bd9Sstevel@tonic-gate 2567c478bd9Sstevel@tonic-gate /* 2577c478bd9Sstevel@tonic-gate * Load DTLB entry 2587c478bd9Sstevel@tonic-gate * 2597c478bd9Sstevel@tonic-gate * In: 2607c478bd9Sstevel@tonic-gate * tte = reg containing tte 2617c478bd9Sstevel@tonic-gate * scr1, scr2, scr3, scr4 = scratch registers 2627c478bd9Sstevel@tonic-gate */ 2637c478bd9Sstevel@tonic-gate #define DTLB_STUFF(tte, scr1, scr2, scr3, scr4) \ 2647c478bd9Sstevel@tonic-gate mov %o0, scr1; \ 2657c478bd9Sstevel@tonic-gate mov %o1, scr2; \ 2667c478bd9Sstevel@tonic-gate mov %o2, scr3; \ 2677c478bd9Sstevel@tonic-gate mov %o3, scr4; \ 2687c478bd9Sstevel@tonic-gate MMU_FAULT_STATUS_AREA(%o2); \ 2697c478bd9Sstevel@tonic-gate ldx [%o2 + MMFSA_D_ADDR], %o0; \ 2707c478bd9Sstevel@tonic-gate ldx [%o2 + MMFSA_D_CTX], %o1; \ 2717c478bd9Sstevel@tonic-gate mov tte, %o2; \ 2727c478bd9Sstevel@tonic-gate mov MAP_DTLB, %o3; \ 2737c478bd9Sstevel@tonic-gate ta MMU_MAP_ADDR; \ 2747c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 2757c478bd9Sstevel@tonic-gate brnz,a,pn %o0, ptl1_panic; \ 2767c478bd9Sstevel@tonic-gate mov PTL1_BAD_HCALL, %g1; \ 2777c478bd9Sstevel@tonic-gate /* END CSTYLED */ \ 2787c478bd9Sstevel@tonic-gate mov scr1, %o0; \ 2797c478bd9Sstevel@tonic-gate mov scr2, %o1; \ 2807c478bd9Sstevel@tonic-gate mov scr3, %o2; \ 2817c478bd9Sstevel@tonic-gate mov scr4, %o3 2827c478bd9Sstevel@tonic-gate 2837c478bd9Sstevel@tonic-gate /* 2847c478bd9Sstevel@tonic-gate * Returns PFN given the TTE and vaddr 2857c478bd9Sstevel@tonic-gate * 2867c478bd9Sstevel@tonic-gate * In: 2877c478bd9Sstevel@tonic-gate * tte = reg containing tte 2887c478bd9Sstevel@tonic-gate * vaddr = reg containing vaddr 2897c478bd9Sstevel@tonic-gate * scr1, scr2, scr3 = scratch registers 2907c478bd9Sstevel@tonic-gate * Out: 2917c478bd9Sstevel@tonic-gate * tte = PFN value 2927c478bd9Sstevel@tonic-gate */ 2937c478bd9Sstevel@tonic-gate #define TTETOPFN(tte, vaddr, label, scr1, scr2, scr3) \ 2947c478bd9Sstevel@tonic-gate and tte, TTE_SZ_BITS, scr1; /* scr1 = ttesz */ \ 2957c478bd9Sstevel@tonic-gate sllx tte, TTE_PA_LSHIFT, tte; \ 2967c478bd9Sstevel@tonic-gate sllx scr1, 1, scr2; \ 2977c478bd9Sstevel@tonic-gate add scr2, scr1, scr2; /* mulx 3 */ \ 2987c478bd9Sstevel@tonic-gate add scr2, MMU_PAGESHIFT + TTE_PA_LSHIFT, scr3; \ 2997c478bd9Sstevel@tonic-gate /* CSTYLED */ \ 3007c478bd9Sstevel@tonic-gate brz,pt scr2, label/**/1; \ 3017c478bd9Sstevel@tonic-gate srlx tte, scr3, tte; \ 3027c478bd9Sstevel@tonic-gate sllx tte, scr2, tte; \ 3037c478bd9Sstevel@tonic-gate set 1, scr1; \ 3047c478bd9Sstevel@tonic-gate add scr2, MMU_PAGESHIFT, scr3; \ 3057c478bd9Sstevel@tonic-gate sllx scr1, scr3, scr1; \ 3067c478bd9Sstevel@tonic-gate sub scr1, 1, scr1; /* scr1=TTE_PAGE_OFFSET(ttesz) */ \ 3077c478bd9Sstevel@tonic-gate and vaddr, scr1, scr2; \ 3087c478bd9Sstevel@tonic-gate srln scr2, MMU_PAGESHIFT, scr2; \ 3097c478bd9Sstevel@tonic-gate or tte, scr2, tte; \ 3107c478bd9Sstevel@tonic-gate /* CSTYLED */ \ 3117c478bd9Sstevel@tonic-gate label/**/1: 3127c478bd9Sstevel@tonic-gate 3137c478bd9Sstevel@tonic-gate /* 3147c478bd9Sstevel@tonic-gate * TTE_SET_REF_ML is a macro that updates the reference bit if it is 3157c478bd9Sstevel@tonic-gate * not already set. 3167c478bd9Sstevel@tonic-gate * 3177c478bd9Sstevel@tonic-gate * Parameters: 3187c478bd9Sstevel@tonic-gate * tte = reg containing tte 3197c478bd9Sstevel@tonic-gate * ttepa = physical pointer to tte 3207c478bd9Sstevel@tonic-gate * tsbarea = tsb miss area 3217c478bd9Sstevel@tonic-gate * tmp1 = tmp reg 3220a90a7fdSAmritpal Sandhu * tmp2 = tmp reg 3237c478bd9Sstevel@tonic-gate * label = temporary label 3247c478bd9Sstevel@tonic-gate */ 3257c478bd9Sstevel@tonic-gate 3260a90a7fdSAmritpal Sandhu #define TTE_SET_REF_ML(tte, ttepa, tsbarea, tmp1, tmp2, label) \ 3277c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 3287c478bd9Sstevel@tonic-gate /* check reference bit */ \ 3297c478bd9Sstevel@tonic-gate btst TTE_REF_INT, tte; \ 3307c478bd9Sstevel@tonic-gate bnz,pt %xcc, label/**/2; /* if ref bit set-skip ahead */ \ 3317c478bd9Sstevel@tonic-gate nop; \ 3327c478bd9Sstevel@tonic-gate /* update reference bit */ \ 3337c478bd9Sstevel@tonic-gate label/**/1: \ 3347c478bd9Sstevel@tonic-gate or tte, TTE_REF_INT, tmp1; \ 3357c478bd9Sstevel@tonic-gate casxa [ttepa]ASI_MEM, tte, tmp1; /* update ref bit */ \ 3367c478bd9Sstevel@tonic-gate cmp tte, tmp1; \ 3377c478bd9Sstevel@tonic-gate bne,a,pn %xcc, label/**/1; \ 3387c478bd9Sstevel@tonic-gate ldxa [ttepa]ASI_MEM, tte; /* MMU_READTTE through pa */ \ 3397c478bd9Sstevel@tonic-gate or tte, TTE_REF_INT, tte; \ 3407c478bd9Sstevel@tonic-gate label/**/2: \ 3417c478bd9Sstevel@tonic-gate /* END CSTYLED */ 3427c478bd9Sstevel@tonic-gate 3437c478bd9Sstevel@tonic-gate 3447c478bd9Sstevel@tonic-gate /* 3457c478bd9Sstevel@tonic-gate * TTE_SET_REFMOD_ML is a macro that updates the reference and modify bits 3467c478bd9Sstevel@tonic-gate * if not already set. 3477c478bd9Sstevel@tonic-gate * 3487c478bd9Sstevel@tonic-gate * Parameters: 3497c478bd9Sstevel@tonic-gate * tte = reg containing tte 3507c478bd9Sstevel@tonic-gate * ttepa = physical pointer to tte 3517c478bd9Sstevel@tonic-gate * tsbarea = tsb miss area 3527c478bd9Sstevel@tonic-gate * tmp1 = tmp reg 3530a90a7fdSAmritpal Sandhu * tmp2 = tmp reg 3547c478bd9Sstevel@tonic-gate * label = temporary label 3557c478bd9Sstevel@tonic-gate * exitlabel = label where to jump to if write perm bit not set. 3567c478bd9Sstevel@tonic-gate */ 3577c478bd9Sstevel@tonic-gate 3580a90a7fdSAmritpal Sandhu #define TTE_SET_REFMOD_ML(tte, ttepa, tsbarea, tmp1, tmp2, label, \ 3597c478bd9Sstevel@tonic-gate exitlabel) \ 3607c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 3617c478bd9Sstevel@tonic-gate /* check reference bit */ \ 3627c478bd9Sstevel@tonic-gate btst TTE_WRPRM_INT, tte; \ 3637c478bd9Sstevel@tonic-gate bz,pn %xcc, exitlabel; /* exit if wr_perm no set */ \ 3647c478bd9Sstevel@tonic-gate btst TTE_HWWR_INT, tte; \ 3657c478bd9Sstevel@tonic-gate bnz,pn %xcc, label/**/2; /* nothing to do */ \ 3667c478bd9Sstevel@tonic-gate nop; \ 3677c478bd9Sstevel@tonic-gate /* update reference bit */ \ 3687c478bd9Sstevel@tonic-gate label/**/1: \ 3697c478bd9Sstevel@tonic-gate or tte, TTE_HWWR_INT | TTE_REF_INT, tmp1; \ 3707c478bd9Sstevel@tonic-gate casxa [ttepa]ASI_MEM, tte, tmp1; /* update ref/mod bit */ \ 3717c478bd9Sstevel@tonic-gate cmp tte, tmp1; \ 3727c478bd9Sstevel@tonic-gate bne,a,pn %xcc, label/**/1; \ 3737c478bd9Sstevel@tonic-gate ldxa [ttepa]ASI_MEM, tte; /* MMU_READTTE through pa */ \ 3747c478bd9Sstevel@tonic-gate or tte, TTE_HWWR_INT | TTE_REF_INT, tte; \ 3757c478bd9Sstevel@tonic-gate label/**/2: \ 3767c478bd9Sstevel@tonic-gate /* END CSTYLED */ 37705d3dc4bSpaulsan /* 37805d3dc4bSpaulsan * Get TSB base register from the scratchpad for 37905d3dc4bSpaulsan * shared contexts 38005d3dc4bSpaulsan * 38105d3dc4bSpaulsan * In: 38205d3dc4bSpaulsan * tsbmiss = pointer to tsbmiss area 38305d3dc4bSpaulsan * tsbmissoffset = offset to right tsb pointer 38405d3dc4bSpaulsan * tsbreg = scratch 38505d3dc4bSpaulsan * Out: 38605d3dc4bSpaulsan * tsbreg = tsbreg from the specified scratchpad register 38705d3dc4bSpaulsan */ 38805d3dc4bSpaulsan #define GET_UTSBREG_SHCTX(tsbmiss, tsbmissoffset, tsbreg) \ 38905d3dc4bSpaulsan ldx [tsbmiss + tsbmissoffset], tsbreg 39005d3dc4bSpaulsan 3917c478bd9Sstevel@tonic-gate 3927c478bd9Sstevel@tonic-gate /* 3937c478bd9Sstevel@tonic-gate * Get the location of the TSB entry in the first TSB to probe 3947c478bd9Sstevel@tonic-gate * 3957c478bd9Sstevel@tonic-gate * In: 3967c478bd9Sstevel@tonic-gate * tagacc = tag access register (not clobbered) 3977c478bd9Sstevel@tonic-gate * tsbe, tmp1, tmp2 = scratch registers 3987c478bd9Sstevel@tonic-gate * Out: 3997c478bd9Sstevel@tonic-gate * tsbe = pointer to the tsbe in the 1st TSB 4007c478bd9Sstevel@tonic-gate */ 4017c478bd9Sstevel@tonic-gate 4027c478bd9Sstevel@tonic-gate #define GET_1ST_TSBE_PTR(tagacc, tsbe, tmp1, tmp2) \ 4037c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 4047c478bd9Sstevel@tonic-gate mov SCRATCHPAD_UTSBREG1, tmp1 ;\ 4057c478bd9Sstevel@tonic-gate ldxa [tmp1]ASI_SCRATCHPAD, tsbe /* get tsbreg */ ;\ 4067c478bd9Sstevel@tonic-gate and tsbe, TSB_SOFTSZ_MASK, tmp2 /* tmp2=szc */ ;\ 4077c478bd9Sstevel@tonic-gate andn tsbe, TSB_SOFTSZ_MASK, tsbe /* tsbbase */ ;\ 4087c478bd9Sstevel@tonic-gate mov TSB_ENTRIES(0), tmp1 /* nentries in TSB size 0 */ ;\ 4097c478bd9Sstevel@tonic-gate sllx tmp1, tmp2, tmp1 /* tmp1 = nentries in TSB */ ;\ 4107c478bd9Sstevel@tonic-gate sub tmp1, 1, tmp1 /* mask = nentries - 1 */ ;\ 4117c478bd9Sstevel@tonic-gate srlx tagacc, MMU_PAGESHIFT, tmp2 ;\ 4127c478bd9Sstevel@tonic-gate and tmp2, tmp1, tmp1 /* tsbent = virtpage & mask */ ;\ 4137c478bd9Sstevel@tonic-gate sllx tmp1, TSB_ENTRY_SHIFT, tmp1 /* entry num --> ptr */ ;\ 4147c478bd9Sstevel@tonic-gate add tsbe, tmp1, tsbe /* add entry offset to TSB base */ ;\ 4157c478bd9Sstevel@tonic-gate /* END CSTYLED */ 4167c478bd9Sstevel@tonic-gate 4177c478bd9Sstevel@tonic-gate 4187c478bd9Sstevel@tonic-gate /* 4197c478bd9Sstevel@tonic-gate * Will probe the first TSB, and if it finds a match, will insert it 4207c478bd9Sstevel@tonic-gate * into the TLB and retry. 4217c478bd9Sstevel@tonic-gate * 4227c478bd9Sstevel@tonic-gate * tsbe_ptr = precomputed first TSB entry pointer (in, ro) 4237c478bd9Sstevel@tonic-gate * vpg_4m = 4M virtual page number for tag matching (in, ro) 4247c478bd9Sstevel@tonic-gate * label = where to branch to if this is a miss (text) 4257c478bd9Sstevel@tonic-gate * %asi = atomic ASI to use for the TSB access 4267c478bd9Sstevel@tonic-gate * 4277c478bd9Sstevel@tonic-gate * For trapstat, we have to explicily use these registers. 4287c478bd9Sstevel@tonic-gate * g4 = location tag will be retrieved into from TSB (out) 4297c478bd9Sstevel@tonic-gate * g5 = location data(tte) will be retrieved into from TSB (out) 4307c478bd9Sstevel@tonic-gate */ 4317c478bd9Sstevel@tonic-gate #define PROBE_1ST_DTSB(tsbe_ptr, vpg_4m, label) /* g4/g5 clobbered */ \ 4327c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 4337c478bd9Sstevel@tonic-gate ldda [tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\ 4347c478bd9Sstevel@tonic-gate cmp %g4, vpg_4m /* compare tag w/ TSB */ ;\ 4357c478bd9Sstevel@tonic-gate bne,pn %xcc, label/**/1 /* branch if !match */ ;\ 4367c478bd9Sstevel@tonic-gate nop ;\ 4377c478bd9Sstevel@tonic-gate brgez,pn %g5, label/**/1 ;\ 4387c478bd9Sstevel@tonic-gate nop ;\ 4397c478bd9Sstevel@tonic-gate TT_TRACE(trace_tsbhit) ;\ 4407c478bd9Sstevel@tonic-gate DTLB_STUFF(%g5, %g1, %g2, %g3, %g4) ;\ 4417c478bd9Sstevel@tonic-gate /* trapstat expects tte in %g5 */ ;\ 4427c478bd9Sstevel@tonic-gate retry /* retry faulted instruction */ ;\ 4437c478bd9Sstevel@tonic-gate label/**/1: \ 4447c478bd9Sstevel@tonic-gate /* END CSTYLED */ 4457c478bd9Sstevel@tonic-gate 4467c478bd9Sstevel@tonic-gate 4477c478bd9Sstevel@tonic-gate /* 4487c478bd9Sstevel@tonic-gate * Same as above, only if the TTE doesn't have the execute 4497c478bd9Sstevel@tonic-gate * bit set, will branch to exec_fault directly. 4507c478bd9Sstevel@tonic-gate */ 4517c478bd9Sstevel@tonic-gate #define PROBE_1ST_ITSB(tsbe_ptr, vpg_4m, label) \ 4527c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 4537c478bd9Sstevel@tonic-gate ldda [tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\ 4547c478bd9Sstevel@tonic-gate cmp %g4, vpg_4m /* compare tag w/ TSB */ ;\ 4557c478bd9Sstevel@tonic-gate bne,pn %xcc, label/**/1 /* branch if !match */ ;\ 4567c478bd9Sstevel@tonic-gate nop ;\ 4577c478bd9Sstevel@tonic-gate brgez,pn %g5, label/**/1 ;\ 4587c478bd9Sstevel@tonic-gate nop ;\ 4597c478bd9Sstevel@tonic-gate andcc %g5, TTE_EXECPRM_INT, %g0 /* check execute bit */ ;\ 4607c478bd9Sstevel@tonic-gate bz,pn %icc, exec_fault ;\ 4617c478bd9Sstevel@tonic-gate nop ;\ 4627c478bd9Sstevel@tonic-gate TT_TRACE(trace_tsbhit) ;\ 4637c478bd9Sstevel@tonic-gate ITLB_STUFF(%g5, %g1, %g2, %g3, %g4) ;\ 4647c478bd9Sstevel@tonic-gate retry /* retry faulted instruction */ ;\ 4657c478bd9Sstevel@tonic-gate label/**/1: \ 4667c478bd9Sstevel@tonic-gate /* END CSTYLED */ 4677c478bd9Sstevel@tonic-gate 4687c478bd9Sstevel@tonic-gate /* 4697c478bd9Sstevel@tonic-gate * vpg_4m = 4M virtual page number for tag matching (in) 4707c478bd9Sstevel@tonic-gate * tsbe_ptr = precomputed second TSB entry pointer (in) 4717c478bd9Sstevel@tonic-gate * label = label to use to make branch targets unique (text) 4727c478bd9Sstevel@tonic-gate * 4737c478bd9Sstevel@tonic-gate * For trapstat, we have to explicity use these registers. 4747c478bd9Sstevel@tonic-gate * g4 = tag portion of TSBE (out) 4757c478bd9Sstevel@tonic-gate * g5 = data portion of TSBE (out) 4767c478bd9Sstevel@tonic-gate */ 4777c478bd9Sstevel@tonic-gate #define PROBE_2ND_DTSB(tsbe_ptr, vpg_4m, label) \ 4787c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 4797c478bd9Sstevel@tonic-gate ldda [tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\ 4807c478bd9Sstevel@tonic-gate /* since we are looking at 2nd tsb, if it's valid, it must be 4M */ ;\ 4817c478bd9Sstevel@tonic-gate cmp %g4, vpg_4m ;\ 4827c478bd9Sstevel@tonic-gate bne,pn %xcc, label/**/1 ;\ 4837c478bd9Sstevel@tonic-gate nop ;\ 4847c478bd9Sstevel@tonic-gate brgez,pn %g5, label/**/1 ;\ 4857c478bd9Sstevel@tonic-gate nop ;\ 4867c478bd9Sstevel@tonic-gate mov tsbe_ptr, %g1 /* trace_tsbhit wants ptr in %g1 */ ;\ 4877c478bd9Sstevel@tonic-gate TT_TRACE(trace_tsbhit) ;\ 4887c478bd9Sstevel@tonic-gate DTLB_STUFF(%g5, %g1, %g2, %g3, %g4) ;\ 4897c478bd9Sstevel@tonic-gate /* trapstat expects tte in %g5 */ ;\ 4907c478bd9Sstevel@tonic-gate retry /* retry faulted instruction */ ;\ 4917c478bd9Sstevel@tonic-gate label/**/1: \ 4927c478bd9Sstevel@tonic-gate /* END CSTYLED */ 4937c478bd9Sstevel@tonic-gate 4947c478bd9Sstevel@tonic-gate 4957c478bd9Sstevel@tonic-gate /* 4967c478bd9Sstevel@tonic-gate * Same as above, with the following additions: 4977c478bd9Sstevel@tonic-gate * If the TTE found is not executable, branch directly 4987c478bd9Sstevel@tonic-gate * to exec_fault. If a TSB miss, branch to TSB miss handler. 4997c478bd9Sstevel@tonic-gate */ 5007c478bd9Sstevel@tonic-gate #define PROBE_2ND_ITSB(tsbe_ptr, vpg_4m) \ 5017c478bd9Sstevel@tonic-gate /* BEGIN CSTYLED */ \ 5027c478bd9Sstevel@tonic-gate ldda [tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\ 5037c478bd9Sstevel@tonic-gate cmp %g4, vpg_4m /* compare tag w/ TSB */ ;\ 5047c478bd9Sstevel@tonic-gate bne,pn %xcc, sfmmu_tsb_miss_tt /* branch if !match */ ;\ 5057c478bd9Sstevel@tonic-gate nop ;\ 5067c478bd9Sstevel@tonic-gate brgez,pn %g5, sfmmu_tsb_miss_tt ;\ 5077c478bd9Sstevel@tonic-gate nop ;\ 5087c478bd9Sstevel@tonic-gate andcc %g5, TTE_EXECPRM_INT, %g0 /* check execute bit */ ;\ 5097c478bd9Sstevel@tonic-gate bz,pn %icc, exec_fault ;\ 5107c478bd9Sstevel@tonic-gate mov tsbe_ptr, %g1 /* trap trace wants ptr in %g1 */ ;\ 5117c478bd9Sstevel@tonic-gate TT_TRACE(trace_tsbhit) ;\ 5127c478bd9Sstevel@tonic-gate ITLB_STUFF(%g5, %g1, %g2, %g3, %g4) ;\ 5137c478bd9Sstevel@tonic-gate retry /* retry faulted instruction */ \ 5147c478bd9Sstevel@tonic-gate /* END CSTYLED */ 5157c478bd9Sstevel@tonic-gate 51605d3dc4bSpaulsan /* 51705d3dc4bSpaulsan * 1. Get ctx1. The traptype is supplied by caller. 51805d3dc4bSpaulsan * 2. If iTSB miss, store in MMFSA_I_CTX 51905d3dc4bSpaulsan * 3. if dTSB miss, store in MMFSA_D_CTX 52005d3dc4bSpaulsan * 4. Thus the [D|I]TLB_STUFF will work as expected. 52105d3dc4bSpaulsan */ 52205d3dc4bSpaulsan #define SAVE_CTX1(traptype, ctx1, tmp, label) \ 52305d3dc4bSpaulsan /* BEGIN CSTYLED */ \ 52405d3dc4bSpaulsan mov MMU_SCONTEXT1, tmp ;\ 52505d3dc4bSpaulsan ldxa [tmp]ASI_MMU_CTX, ctx1 ;\ 52605d3dc4bSpaulsan MMU_FAULT_STATUS_AREA(tmp) ;\ 52705d3dc4bSpaulsan cmp traptype, FAST_IMMU_MISS_TT ;\ 52805d3dc4bSpaulsan be,a,pn %icc, label ;\ 52905d3dc4bSpaulsan stx ctx1, [tmp + MMFSA_I_CTX] ;\ 53005d3dc4bSpaulsan cmp traptype, T_INSTR_MMU_MISS ;\ 53105d3dc4bSpaulsan be,a,pn %icc, label ;\ 53205d3dc4bSpaulsan stx ctx1, [tmp + MMFSA_I_CTX] ;\ 53305d3dc4bSpaulsan stx ctx1, [tmp + MMFSA_D_CTX] ;\ 53405d3dc4bSpaulsan label: 53505d3dc4bSpaulsan /* END CSTYLED */ 53605d3dc4bSpaulsan 5377c478bd9Sstevel@tonic-gate #endif /* _ASM */ 5387c478bd9Sstevel@tonic-gate 5397c478bd9Sstevel@tonic-gate #ifdef __cplusplus 5407c478bd9Sstevel@tonic-gate } 5417c478bd9Sstevel@tonic-gate #endif 5427c478bd9Sstevel@tonic-gate 5437c478bd9Sstevel@tonic-gate #endif /* _VM_MACH_SFMMU_H */ 544