1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2a88b5ba8SSam Ravnborg/* sun4v_tlb_miss.S: Sun4v TLB miss handlers. 3a88b5ba8SSam Ravnborg * 4a88b5ba8SSam Ravnborg * Copyright (C) 2006 <davem@davemloft.net> 5a88b5ba8SSam Ravnborg */ 6a88b5ba8SSam Ravnborg 7a88b5ba8SSam Ravnborg .text 8a88b5ba8SSam Ravnborg .align 32 9a88b5ba8SSam Ravnborg 10a88b5ba8SSam Ravnborg /* Load ITLB fault information into VADDR and CTX, using BASE. */ 11a88b5ba8SSam Ravnborg#define LOAD_ITLB_INFO(BASE, VADDR, CTX) \ 12a88b5ba8SSam Ravnborg ldx [BASE + HV_FAULT_I_ADDR_OFFSET], VADDR; \ 13a88b5ba8SSam Ravnborg ldx [BASE + HV_FAULT_I_CTX_OFFSET], CTX; 14a88b5ba8SSam Ravnborg 15a88b5ba8SSam Ravnborg /* Load DTLB fault information into VADDR and CTX, using BASE. */ 16a88b5ba8SSam Ravnborg#define LOAD_DTLB_INFO(BASE, VADDR, CTX) \ 17a88b5ba8SSam Ravnborg ldx [BASE + HV_FAULT_D_ADDR_OFFSET], VADDR; \ 18a88b5ba8SSam Ravnborg ldx [BASE + HV_FAULT_D_CTX_OFFSET], CTX; 19a88b5ba8SSam Ravnborg 20a88b5ba8SSam Ravnborg /* DEST = (VADDR >> 22) 21a88b5ba8SSam Ravnborg * 22a88b5ba8SSam Ravnborg * Branch to ZERO_CTX_LABEL if context is zero. 23a88b5ba8SSam Ravnborg */ 24a88b5ba8SSam Ravnborg#define COMPUTE_TAG_TARGET(DEST, VADDR, CTX, ZERO_CTX_LABEL) \ 25a88b5ba8SSam Ravnborg srlx VADDR, 22, DEST; \ 26a88b5ba8SSam Ravnborg brz,pn CTX, ZERO_CTX_LABEL; \ 27a88b5ba8SSam Ravnborg nop; 28a88b5ba8SSam Ravnborg 29a88b5ba8SSam Ravnborg /* Create TSB pointer. This is something like: 30a88b5ba8SSam Ravnborg * 31a88b5ba8SSam Ravnborg * index_mask = (512 << (tsb_reg & 0x7UL)) - 1UL; 32a88b5ba8SSam Ravnborg * tsb_base = tsb_reg & ~0x7UL; 33a88b5ba8SSam Ravnborg * tsb_index = ((vaddr >> HASH_SHIFT) & tsb_mask); 34a88b5ba8SSam Ravnborg * tsb_ptr = tsb_base + (tsb_index * 16); 35a88b5ba8SSam Ravnborg */ 36a88b5ba8SSam Ravnborg#define COMPUTE_TSB_PTR(TSB_PTR, VADDR, HASH_SHIFT, TMP1, TMP2) \ 37a88b5ba8SSam Ravnborg and TSB_PTR, 0x7, TMP1; \ 38a88b5ba8SSam Ravnborg mov 512, TMP2; \ 39a88b5ba8SSam Ravnborg andn TSB_PTR, 0x7, TSB_PTR; \ 40a88b5ba8SSam Ravnborg sllx TMP2, TMP1, TMP2; \ 41a88b5ba8SSam Ravnborg srlx VADDR, HASH_SHIFT, TMP1; \ 42a88b5ba8SSam Ravnborg sub TMP2, 1, TMP2; \ 43a88b5ba8SSam Ravnborg and TMP1, TMP2, TMP1; \ 44a88b5ba8SSam Ravnborg sllx TMP1, 4, TMP1; \ 45a88b5ba8SSam Ravnborg add TSB_PTR, TMP1, TSB_PTR; 46a88b5ba8SSam Ravnborg 47a88b5ba8SSam Ravnborgsun4v_itlb_miss: 48a88b5ba8SSam Ravnborg /* Load MMU Miss base into %g2. */ 49a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 50a88b5ba8SSam Ravnborg 51a88b5ba8SSam Ravnborg /* Load UTSB reg into %g1. */ 52a88b5ba8SSam Ravnborg mov SCRATCHPAD_UTSBREG1, %g1 53a88b5ba8SSam Ravnborg ldxa [%g1] ASI_SCRATCHPAD, %g1 54a88b5ba8SSam Ravnborg 55a88b5ba8SSam Ravnborg LOAD_ITLB_INFO(%g2, %g4, %g5) 56a88b5ba8SSam Ravnborg COMPUTE_TAG_TARGET(%g6, %g4, %g5, kvmap_itlb_4v) 57a88b5ba8SSam Ravnborg COMPUTE_TSB_PTR(%g1, %g4, PAGE_SHIFT, %g3, %g7) 58a88b5ba8SSam Ravnborg 59a88b5ba8SSam Ravnborg /* Load TSB tag/pte into %g2/%g3 and compare the tag. */ 60a88b5ba8SSam Ravnborg ldda [%g1] ASI_QUAD_LDD_PHYS_4V, %g2 61a88b5ba8SSam Ravnborg cmp %g2, %g6 62a88b5ba8SSam Ravnborg bne,a,pn %xcc, tsb_miss_page_table_walk 63a88b5ba8SSam Ravnborg mov FAULT_CODE_ITLB, %g3 64a88b5ba8SSam Ravnborg andcc %g3, _PAGE_EXEC_4V, %g0 65a88b5ba8SSam Ravnborg be,a,pn %xcc, tsb_do_fault 66a88b5ba8SSam Ravnborg mov FAULT_CODE_ITLB, %g3 67a88b5ba8SSam Ravnborg 68a88b5ba8SSam Ravnborg /* We have a valid entry, make hypervisor call to load 69a88b5ba8SSam Ravnborg * I-TLB and return from trap. 70a88b5ba8SSam Ravnborg * 71a88b5ba8SSam Ravnborg * %g3: PTE 72a88b5ba8SSam Ravnborg * %g4: vaddr 73a88b5ba8SSam Ravnborg */ 74a88b5ba8SSam Ravnborgsun4v_itlb_load: 75a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g6 76a88b5ba8SSam Ravnborg mov %o0, %g1 ! save %o0 77a88b5ba8SSam Ravnborg mov %o1, %g2 ! save %o1 78a88b5ba8SSam Ravnborg mov %o2, %g5 ! save %o2 79a88b5ba8SSam Ravnborg mov %o3, %g7 ! save %o3 80a88b5ba8SSam Ravnborg mov %g4, %o0 ! vaddr 81a88b5ba8SSam Ravnborg ldx [%g6 + HV_FAULT_I_CTX_OFFSET], %o1 ! ctx 82a88b5ba8SSam Ravnborg mov %g3, %o2 ! PTE 83a88b5ba8SSam Ravnborg mov HV_MMU_IMMU, %o3 ! flags 84a88b5ba8SSam Ravnborg ta HV_MMU_MAP_ADDR_TRAP 85a88b5ba8SSam Ravnborg brnz,pn %o0, sun4v_itlb_error 86a88b5ba8SSam Ravnborg mov %g2, %o1 ! restore %o1 87a88b5ba8SSam Ravnborg mov %g1, %o0 ! restore %o0 88a88b5ba8SSam Ravnborg mov %g5, %o2 ! restore %o2 89a88b5ba8SSam Ravnborg mov %g7, %o3 ! restore %o3 90a88b5ba8SSam Ravnborg 91a88b5ba8SSam Ravnborg retry 92a88b5ba8SSam Ravnborg 93a88b5ba8SSam Ravnborgsun4v_dtlb_miss: 94a88b5ba8SSam Ravnborg /* Load MMU Miss base into %g2. */ 95a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 96a88b5ba8SSam Ravnborg 97a88b5ba8SSam Ravnborg /* Load UTSB reg into %g1. */ 98a88b5ba8SSam Ravnborg mov SCRATCHPAD_UTSBREG1, %g1 99a88b5ba8SSam Ravnborg ldxa [%g1] ASI_SCRATCHPAD, %g1 100a88b5ba8SSam Ravnborg 101a88b5ba8SSam Ravnborg LOAD_DTLB_INFO(%g2, %g4, %g5) 102a88b5ba8SSam Ravnborg COMPUTE_TAG_TARGET(%g6, %g4, %g5, kvmap_dtlb_4v) 103a88b5ba8SSam Ravnborg COMPUTE_TSB_PTR(%g1, %g4, PAGE_SHIFT, %g3, %g7) 104a88b5ba8SSam Ravnborg 105a88b5ba8SSam Ravnborg /* Load TSB tag/pte into %g2/%g3 and compare the tag. */ 106a88b5ba8SSam Ravnborg ldda [%g1] ASI_QUAD_LDD_PHYS_4V, %g2 107a88b5ba8SSam Ravnborg cmp %g2, %g6 108a88b5ba8SSam Ravnborg bne,a,pn %xcc, tsb_miss_page_table_walk 109a88b5ba8SSam Ravnborg mov FAULT_CODE_DTLB, %g3 110a88b5ba8SSam Ravnborg 111a88b5ba8SSam Ravnborg /* We have a valid entry, make hypervisor call to load 112a88b5ba8SSam Ravnborg * D-TLB and return from trap. 113a88b5ba8SSam Ravnborg * 114a88b5ba8SSam Ravnborg * %g3: PTE 115a88b5ba8SSam Ravnborg * %g4: vaddr 116a88b5ba8SSam Ravnborg */ 117a88b5ba8SSam Ravnborgsun4v_dtlb_load: 118a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g6 119a88b5ba8SSam Ravnborg mov %o0, %g1 ! save %o0 120a88b5ba8SSam Ravnborg mov %o1, %g2 ! save %o1 121a88b5ba8SSam Ravnborg mov %o2, %g5 ! save %o2 122a88b5ba8SSam Ravnborg mov %o3, %g7 ! save %o3 123a88b5ba8SSam Ravnborg mov %g4, %o0 ! vaddr 124a88b5ba8SSam Ravnborg ldx [%g6 + HV_FAULT_D_CTX_OFFSET], %o1 ! ctx 125a88b5ba8SSam Ravnborg mov %g3, %o2 ! PTE 126a88b5ba8SSam Ravnborg mov HV_MMU_DMMU, %o3 ! flags 127a88b5ba8SSam Ravnborg ta HV_MMU_MAP_ADDR_TRAP 128a88b5ba8SSam Ravnborg brnz,pn %o0, sun4v_dtlb_error 129a88b5ba8SSam Ravnborg mov %g2, %o1 ! restore %o1 130a88b5ba8SSam Ravnborg mov %g1, %o0 ! restore %o0 131a88b5ba8SSam Ravnborg mov %g5, %o2 ! restore %o2 132a88b5ba8SSam Ravnborg mov %g7, %o3 ! restore %o3 133a88b5ba8SSam Ravnborg 134a88b5ba8SSam Ravnborg retry 135a88b5ba8SSam Ravnborg 136a88b5ba8SSam Ravnborgsun4v_dtlb_prot: 137a88b5ba8SSam Ravnborg SET_GL(1) 138a88b5ba8SSam Ravnborg 139a88b5ba8SSam Ravnborg /* Load MMU Miss base into %g5. */ 140a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g5 141a88b5ba8SSam Ravnborg 142a88b5ba8SSam Ravnborg ldx [%g5 + HV_FAULT_D_ADDR_OFFSET], %g5 143a88b5ba8SSam Ravnborg rdpr %tl, %g1 144a88b5ba8SSam Ravnborg cmp %g1, 1 145a88b5ba8SSam Ravnborg bgu,pn %xcc, winfix_trampoline 146a88b5ba8SSam Ravnborg mov FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4 147a88b5ba8SSam Ravnborg ba,pt %xcc, sparc64_realfault_common 148a88b5ba8SSam Ravnborg nop 149a88b5ba8SSam Ravnborg 150a88b5ba8SSam Ravnborg /* Called from trap table: 151a88b5ba8SSam Ravnborg * %g4: vaddr 152a88b5ba8SSam Ravnborg * %g5: context 153a88b5ba8SSam Ravnborg * %g6: TAG TARGET 154a88b5ba8SSam Ravnborg */ 155a88b5ba8SSam Ravnborgsun4v_itsb_miss: 156a88b5ba8SSam Ravnborg mov SCRATCHPAD_UTSBREG1, %g1 157a88b5ba8SSam Ravnborg ldxa [%g1] ASI_SCRATCHPAD, %g1 158a88b5ba8SSam Ravnborg brz,pn %g5, kvmap_itlb_4v 159a88b5ba8SSam Ravnborg mov FAULT_CODE_ITLB, %g3 160a88b5ba8SSam Ravnborg ba,a,pt %xcc, sun4v_tsb_miss_common 161a88b5ba8SSam Ravnborg 162a88b5ba8SSam Ravnborg /* Called from trap table: 163a88b5ba8SSam Ravnborg * %g4: vaddr 164a88b5ba8SSam Ravnborg * %g5: context 165a88b5ba8SSam Ravnborg * %g6: TAG TARGET 166a88b5ba8SSam Ravnborg */ 167a88b5ba8SSam Ravnborgsun4v_dtsb_miss: 168a88b5ba8SSam Ravnborg mov SCRATCHPAD_UTSBREG1, %g1 169a88b5ba8SSam Ravnborg ldxa [%g1] ASI_SCRATCHPAD, %g1 170a88b5ba8SSam Ravnborg brz,pn %g5, kvmap_dtlb_4v 171a88b5ba8SSam Ravnborg mov FAULT_CODE_DTLB, %g3 172a88b5ba8SSam Ravnborg 173a88b5ba8SSam Ravnborg /* fallthrough */ 174a88b5ba8SSam Ravnborg 175a88b5ba8SSam Ravnborgsun4v_tsb_miss_common: 176a88b5ba8SSam Ravnborg COMPUTE_TSB_PTR(%g1, %g4, PAGE_SHIFT, %g5, %g7) 177a88b5ba8SSam Ravnborg 178a88b5ba8SSam Ravnborg sub %g2, TRAP_PER_CPU_FAULT_INFO, %g2 179a88b5ba8SSam Ravnborg 1809e695d2eSDavid Miller#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) 181a88b5ba8SSam Ravnborg mov SCRATCHPAD_UTSBREG2, %g5 182a88b5ba8SSam Ravnborg ldxa [%g5] ASI_SCRATCHPAD, %g5 183a88b5ba8SSam Ravnborg cmp %g5, -1 184a88b5ba8SSam Ravnborg be,pt %xcc, 80f 185a88b5ba8SSam Ravnborg nop 18637b3a8ffSDavid S. Miller COMPUTE_TSB_PTR(%g5, %g4, REAL_HPAGE_SHIFT, %g2, %g7) 187a88b5ba8SSam Ravnborg 188a88b5ba8SSam Ravnborg /* That clobbered %g2, reload it. */ 189a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 190a88b5ba8SSam Ravnborg sub %g2, TRAP_PER_CPU_FAULT_INFO, %g2 191a88b5ba8SSam Ravnborg 192a88b5ba8SSam Ravnborg80: stx %g5, [%g2 + TRAP_PER_CPU_TSB_HUGE_TEMP] 193a88b5ba8SSam Ravnborg#endif 194a88b5ba8SSam Ravnborg 195a88b5ba8SSam Ravnborg ba,pt %xcc, tsb_miss_page_table_walk_sun4v_fastpath 196a88b5ba8SSam Ravnborg ldx [%g2 + TRAP_PER_CPU_PGD_PADDR], %g7 197a88b5ba8SSam Ravnborg 198a88b5ba8SSam Ravnborgsun4v_itlb_error: 1994ccb9272Sbob picco rdpr %tl, %g1 2004ccb9272Sbob picco cmp %g1, 1 2014ccb9272Sbob picco ble,pt %icc, sun4v_bad_ra 2024ccb9272Sbob picco or %g0, FAULT_CODE_BAD_RA | FAULT_CODE_ITLB, %g1 2034ccb9272Sbob picco 204a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_itlb_vaddr), %g1 205a88b5ba8SSam Ravnborg stx %g4, [%g1 + %lo(sun4v_err_itlb_vaddr)] 206a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_itlb_ctx), %g1 207a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g6 208a88b5ba8SSam Ravnborg ldx [%g6 + HV_FAULT_I_CTX_OFFSET], %o1 209a88b5ba8SSam Ravnborg stx %o1, [%g1 + %lo(sun4v_err_itlb_ctx)] 210a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_itlb_pte), %g1 211a88b5ba8SSam Ravnborg stx %g3, [%g1 + %lo(sun4v_err_itlb_pte)] 212a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_itlb_error), %g1 213a88b5ba8SSam Ravnborg stx %o0, [%g1 + %lo(sun4v_err_itlb_error)] 214a88b5ba8SSam Ravnborg 2154ccb9272Sbob picco sethi %hi(1f), %g7 216a88b5ba8SSam Ravnborg rdpr %tl, %g4 217a88b5ba8SSam Ravnborg ba,pt %xcc, etraptl1 2184ccb9272Sbob picco1: or %g7, %lo(1f), %g7 219a88b5ba8SSam Ravnborg mov %l4, %o1 220a88b5ba8SSam Ravnborg call sun4v_itlb_error_report 221a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 222a88b5ba8SSam Ravnborg 223a88b5ba8SSam Ravnborg /* NOTREACHED */ 224a88b5ba8SSam Ravnborg 225a88b5ba8SSam Ravnborgsun4v_dtlb_error: 2264ccb9272Sbob picco rdpr %tl, %g1 2274ccb9272Sbob picco cmp %g1, 1 2284ccb9272Sbob picco ble,pt %icc, sun4v_bad_ra 2294ccb9272Sbob picco or %g0, FAULT_CODE_BAD_RA | FAULT_CODE_DTLB, %g1 2304ccb9272Sbob picco 231a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_dtlb_vaddr), %g1 232a88b5ba8SSam Ravnborg stx %g4, [%g1 + %lo(sun4v_err_dtlb_vaddr)] 233a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_dtlb_ctx), %g1 234a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g6 235a88b5ba8SSam Ravnborg ldx [%g6 + HV_FAULT_D_CTX_OFFSET], %o1 236a88b5ba8SSam Ravnborg stx %o1, [%g1 + %lo(sun4v_err_dtlb_ctx)] 237a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_dtlb_pte), %g1 238a88b5ba8SSam Ravnborg stx %g3, [%g1 + %lo(sun4v_err_dtlb_pte)] 239a88b5ba8SSam Ravnborg sethi %hi(sun4v_err_dtlb_error), %g1 240a88b5ba8SSam Ravnborg stx %o0, [%g1 + %lo(sun4v_err_dtlb_error)] 241a88b5ba8SSam Ravnborg 2424ccb9272Sbob picco sethi %hi(1f), %g7 243a88b5ba8SSam Ravnborg rdpr %tl, %g4 244a88b5ba8SSam Ravnborg ba,pt %xcc, etraptl1 2454ccb9272Sbob picco1: or %g7, %lo(1f), %g7 246a88b5ba8SSam Ravnborg mov %l4, %o1 247a88b5ba8SSam Ravnborg call sun4v_dtlb_error_report 248a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 249a88b5ba8SSam Ravnborg 250a88b5ba8SSam Ravnborg /* NOTREACHED */ 251a88b5ba8SSam Ravnborg 2524ccb9272Sbob piccosun4v_bad_ra: 2534ccb9272Sbob picco or %g0, %g4, %g5 2544ccb9272Sbob picco ba,pt %xcc, sparc64_realfault_common 2554ccb9272Sbob picco or %g1, %g0, %g4 2564ccb9272Sbob picco 2574ccb9272Sbob picco /* NOTREACHED */ 2584ccb9272Sbob picco 259a88b5ba8SSam Ravnborg /* Instruction Access Exception, tl0. */ 260a88b5ba8SSam Ravnborgsun4v_iacc: 261a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 262a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_I_TYPE_OFFSET], %g3 263a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_I_ADDR_OFFSET], %g4 264a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_I_CTX_OFFSET], %g5 265a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 266a88b5ba8SSam Ravnborg or %g5, %g3, %g5 267a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 268a88b5ba8SSam Ravnborg rd %pc, %g7 269a88b5ba8SSam Ravnborg mov %l4, %o1 270a88b5ba8SSam Ravnborg mov %l5, %o2 271a88b5ba8SSam Ravnborg call sun4v_insn_access_exception 272a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 273a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 274a88b5ba8SSam Ravnborg 275a88b5ba8SSam Ravnborg /* Instruction Access Exception, tl1. */ 276a88b5ba8SSam Ravnborgsun4v_iacc_tl1: 277a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 278a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_I_TYPE_OFFSET], %g3 279a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_I_ADDR_OFFSET], %g4 280a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_I_CTX_OFFSET], %g5 281a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 282a88b5ba8SSam Ravnborg or %g5, %g3, %g5 283a88b5ba8SSam Ravnborg ba,pt %xcc, etraptl1 284a88b5ba8SSam Ravnborg rd %pc, %g7 285a88b5ba8SSam Ravnborg mov %l4, %o1 286a88b5ba8SSam Ravnborg mov %l5, %o2 287a88b5ba8SSam Ravnborg call sun4v_insn_access_exception_tl1 288a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 289a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 290a88b5ba8SSam Ravnborg 291a88b5ba8SSam Ravnborg /* Data Access Exception, tl0. */ 292a88b5ba8SSam Ravnborgsun4v_dacc: 293a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 294a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_TYPE_OFFSET], %g3 295a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4 296a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_CTX_OFFSET], %g5 297a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 298a88b5ba8SSam Ravnborg or %g5, %g3, %g5 299a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 300a88b5ba8SSam Ravnborg rd %pc, %g7 301a88b5ba8SSam Ravnborg mov %l4, %o1 302a88b5ba8SSam Ravnborg mov %l5, %o2 303a88b5ba8SSam Ravnborg call sun4v_data_access_exception 304a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 305a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 306a88b5ba8SSam Ravnborg 307a88b5ba8SSam Ravnborg /* Data Access Exception, tl1. */ 308a88b5ba8SSam Ravnborgsun4v_dacc_tl1: 309a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 310a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_TYPE_OFFSET], %g3 311a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4 312a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_CTX_OFFSET], %g5 313a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 314a88b5ba8SSam Ravnborg or %g5, %g3, %g5 315a88b5ba8SSam Ravnborg ba,pt %xcc, etraptl1 316a88b5ba8SSam Ravnborg rd %pc, %g7 317a88b5ba8SSam Ravnborg mov %l4, %o1 318a88b5ba8SSam Ravnborg mov %l5, %o2 319a88b5ba8SSam Ravnborg call sun4v_data_access_exception_tl1 320a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 321a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 322a88b5ba8SSam Ravnborg 323a88b5ba8SSam Ravnborg /* Memory Address Unaligned. */ 324a88b5ba8SSam Ravnborgsun4v_mna: 325a88b5ba8SSam Ravnborg /* Window fixup? */ 326a88b5ba8SSam Ravnborg rdpr %tl, %g2 327a88b5ba8SSam Ravnborg cmp %g2, 1 328a88b5ba8SSam Ravnborg ble,pt %icc, 1f 329a88b5ba8SSam Ravnborg nop 330a88b5ba8SSam Ravnborg 331a88b5ba8SSam Ravnborg SET_GL(1) 332a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 333a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_ADDR_OFFSET], %g5 334a88b5ba8SSam Ravnborg mov HV_FAULT_TYPE_UNALIGNED, %g3 335a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_CTX_OFFSET], %g4 336a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 337a88b5ba8SSam Ravnborg or %g4, %g3, %g4 338a88b5ba8SSam Ravnborg ba,pt %xcc, winfix_mna 339a88b5ba8SSam Ravnborg rdpr %tpc, %g3 340a88b5ba8SSam Ravnborg /* not reached */ 341a88b5ba8SSam Ravnborg 342a88b5ba8SSam Ravnborg1: ldxa [%g0] ASI_SCRATCHPAD, %g2 343a88b5ba8SSam Ravnborg mov HV_FAULT_TYPE_UNALIGNED, %g3 344a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4 345a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_CTX_OFFSET], %g5 346a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 347a88b5ba8SSam Ravnborg or %g5, %g3, %g5 348a88b5ba8SSam Ravnborg 349a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 350a88b5ba8SSam Ravnborg rd %pc, %g7 351a88b5ba8SSam Ravnborg mov %l4, %o1 352a88b5ba8SSam Ravnborg mov %l5, %o2 353a88b5ba8SSam Ravnborg call sun4v_do_mna 354a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 355a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 3560ae2d26fSBabu Moger nop 357a88b5ba8SSam Ravnborg 358a88b5ba8SSam Ravnborg /* Privileged Action. */ 359a88b5ba8SSam Ravnborgsun4v_privact: 360a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 361a88b5ba8SSam Ravnborg rd %pc, %g7 362a88b5ba8SSam Ravnborg call do_privact 363a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 364a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 365a88b5ba8SSam Ravnborg 366a88b5ba8SSam Ravnborg /* Unaligned ldd float, tl0. */ 367a88b5ba8SSam Ravnborgsun4v_lddfmna: 368a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 369a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_TYPE_OFFSET], %g3 370a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4 371a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_CTX_OFFSET], %g5 372a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 373a88b5ba8SSam Ravnborg or %g5, %g3, %g5 374a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 375a88b5ba8SSam Ravnborg rd %pc, %g7 376a88b5ba8SSam Ravnborg mov %l4, %o1 377a88b5ba8SSam Ravnborg mov %l5, %o2 378a88b5ba8SSam Ravnborg call handle_lddfmna 379a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 380a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 381a88b5ba8SSam Ravnborg 382a88b5ba8SSam Ravnborg /* Unaligned std float, tl0. */ 383a88b5ba8SSam Ravnborgsun4v_stdfmna: 384a88b5ba8SSam Ravnborg ldxa [%g0] ASI_SCRATCHPAD, %g2 385a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_TYPE_OFFSET], %g3 386a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_ADDR_OFFSET], %g4 387a88b5ba8SSam Ravnborg ldx [%g2 + HV_FAULT_D_CTX_OFFSET], %g5 388a88b5ba8SSam Ravnborg sllx %g3, 16, %g3 389a88b5ba8SSam Ravnborg or %g5, %g3, %g5 390a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 391a88b5ba8SSam Ravnborg rd %pc, %g7 392a88b5ba8SSam Ravnborg mov %l4, %o1 393a88b5ba8SSam Ravnborg mov %l5, %o2 394a88b5ba8SSam Ravnborg call handle_stdfmna 395a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 396a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 397a88b5ba8SSam Ravnborg 398a88b5ba8SSam Ravnborg#define BRANCH_ALWAYS 0x10680000 399a88b5ba8SSam Ravnborg#define NOP 0x01000000 400a88b5ba8SSam Ravnborg#define SUN4V_DO_PATCH(OLD, NEW) \ 401a88b5ba8SSam Ravnborg sethi %hi(NEW), %g1; \ 402a88b5ba8SSam Ravnborg or %g1, %lo(NEW), %g1; \ 403a88b5ba8SSam Ravnborg sethi %hi(OLD), %g2; \ 404a88b5ba8SSam Ravnborg or %g2, %lo(OLD), %g2; \ 405a88b5ba8SSam Ravnborg sub %g1, %g2, %g1; \ 406a88b5ba8SSam Ravnborg sethi %hi(BRANCH_ALWAYS), %g3; \ 407a88b5ba8SSam Ravnborg sll %g1, 11, %g1; \ 408a88b5ba8SSam Ravnborg srl %g1, 11 + 2, %g1; \ 409a88b5ba8SSam Ravnborg or %g3, %lo(BRANCH_ALWAYS), %g3; \ 410a88b5ba8SSam Ravnborg or %g3, %g1, %g3; \ 411a88b5ba8SSam Ravnborg stw %g3, [%g2]; \ 412a88b5ba8SSam Ravnborg sethi %hi(NOP), %g3; \ 413a88b5ba8SSam Ravnborg or %g3, %lo(NOP), %g3; \ 414a88b5ba8SSam Ravnborg stw %g3, [%g2 + 0x4]; \ 415a88b5ba8SSam Ravnborg flush %g2; 416a88b5ba8SSam Ravnborg 417a88b5ba8SSam Ravnborg .globl sun4v_patch_tlb_handlers 418a88b5ba8SSam Ravnborg .type sun4v_patch_tlb_handlers,#function 419a88b5ba8SSam Ravnborgsun4v_patch_tlb_handlers: 420a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_iamiss, sun4v_itlb_miss) 421a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl1_iamiss, sun4v_itlb_miss) 422a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_damiss, sun4v_dtlb_miss) 423a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl1_damiss, sun4v_dtlb_miss) 424a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_daprot, sun4v_dtlb_prot) 425a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl1_daprot, sun4v_dtlb_prot) 426a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_iax, sun4v_iacc) 427a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl1_iax, sun4v_iacc_tl1) 428a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_dax, sun4v_dacc) 429a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl1_dax, sun4v_dacc_tl1) 430a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_mna, sun4v_mna) 431a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl1_mna, sun4v_mna) 432a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_lddfmna, sun4v_lddfmna) 433a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_stdfmna, sun4v_stdfmna) 434a88b5ba8SSam Ravnborg SUN4V_DO_PATCH(tl0_privact, sun4v_privact) 435a88b5ba8SSam Ravnborg retl 436a88b5ba8SSam Ravnborg nop 437a88b5ba8SSam Ravnborg .size sun4v_patch_tlb_handlers,.-sun4v_patch_tlb_handlers 438